commit 62de970149add26a0f3f9abf41a5608e2a665384 Author: Colin Diem Date: Mon Jun 6 02:04:50 2022 -0400 initial commit. diff --git a/data/i96.csv b/data/i96.csv new file mode 100644 index 0000000..78ef2f1 --- /dev/null +++ b/data/i96.csv @@ -0,0 +1,295 @@ +Property Address,Property Name,RBA,City,State,Zip,County Name,Land Area (AC),Parcel Number 1(Min),PropertyType,True Owner Address,True Owner City State Zip,True Owner Contact,True Owner Name,True Owner Phone,Secondary Type,Owner Name,Owner Phone +47677-47695 Avante Dr,,11600,Wixom,MI,48393-3697,Oakland,0.98,22-08-200-031,Industrial,47695 Avante Dr,"Wixom, MI 48393 ",,"Gateway Management Company, LLC",2489214260,Warehouse,"Gateway Management Company, LLC",2489214260 +28033 Center Oaks Ct,,12200,Wixom,MI,48393-3344,Oakland,1.05,22-07-326-018,Flex,7125 Orchard Lake Rd Suite # 306,"West Bloomfield, MI 48322 ",Lewis Wagner,"Star Builders, Inc.",2488653010,Light Manufacturing,"Star Builders, Inc.",2488653010 +45295 Grand River Ave,,10540,Novi,MI,48375-1019,Oakland,1.66,22-15-351-044,Industrial,,,,,,Warehouse,Diversified Deveveloping Llc, +2175 Fyke Dr,,15000,Milford,MI,48381,Oakland,3.64,16-25-100-060,Industrial,47133 W 9 Mile Rd,"Novi, MI 48374 ",Amar Abro,Amar Abro,9032208725,Manufacturing,Amar Abro,9032208725 +55800 Grand River Ave,Unit 31A,10800,New Hudson,MI,48165-8711,Oakland,2.35,21-03-402-018,Flex,55800 Grand River Ave Suite # 150,"New Hudson, MI 48165-8711",Mark Evangelista,Evangelista Corporation,2488880400,Light Manufacturing,Evangelista Corporation,2488880400 +25873-25921 Meadowbrook Rd,Building 4,17726,Novi,MI,48375-1851,Oakland,2.31,22-23-230-004,Flex,41200-41218 Bridge St,"Novi, MI 48375-1301",Bill McKeever,Certified Management,2484766700,R&D,Certified Management,2484766700 +25460 Trans X Rd,,12907,Novi,MI,48375,Oakland,1.50,22-23-151-027,Industrial,45605 W 9 Mile Rd,"Novi, MI 48374",Defrim Cizmja,"Cizmja, Defrim",2487675062,Warehouse,"Cizmja, Defrim",2487675062 +41180 Vincenti Ct,,14440,Novi,MI,48375-1922,Oakland,1.03,22-24-100-034,Industrial,4038 Foxpointe Dr,"West Bloomfield, MI 48323 ",Donald Hoexter,Hawthorne Management Co,2812988840,Manufacturing,Hawthorne Management Co,2812988840 +2045 E West Maple Rd,Bldg D,11000,Commerce Township,MI,48390-3801,Oakland,7.77,17-26-476-011,Flex,2045 E W Maple,"Commerce Township, MI 48390 ",,Cunnington Family Commerce Ltd. Par,,Light Distribution,Cunnington Family Commerce Ltd. Par, +42900 W 9 Mile Rd,,14400,Novi,MI,48375-4123,Oakland,0.80,22-26-376-020,Industrial,,,,,,Warehouse,GRUTZA LIV TRUST, +43700 W 12 Mile Rd,,15400,Novi,MI,48377,Oakland,,22-10-400-053,Industrial,29850-29864 Northwestern Hwy,"Southfield, MI 48034",Amer Asmar,Amer Asmar,2485575454,Warehouse,Amer Asmar,2485575454 +46845 W 12 Mile Rd,Cougar Cutting Products,14000,Novi,MI,48377-3200,Oakland,1.49,22-16-126-013,Industrial,P.O. Box 508,"Novi, MI 48376-0508",Martin Schmitt,Beck Property Management,2483488864,Warehouse,Beck Property Management,2483488864 +30503-30505 Andersen Ct,,12000,Wixom,MI,48393,Oakland,0.85,22-05-276-004,Industrial,333 Osprey St,"Walled Lake, MI 48390 ",,"A.I. Properties, LLC",2486691075,Warehouse,"A.I. Properties, LLC",2486691075 +47840 Anna Ct,,13585,Wixom,MI,48393-3687,Oakland,1.05,22-08-227-021,Industrial,47840 Anna Ct,"Wixom, MI 48393-3687",Mike Murray,Lyons Tool & Manufacturing Corporation,2483449644,Manufacturing,Lyons Tool & Manufacturing Corporation,2483449644 +48009 Anna Ct,,12000,Wixom,MI,48393,Oakland,1.28,22-08-227-019,Industrial,1395 Energy Way,"Highland, MI 48357",George Gudzinski,Commercial Fabricating,2488871595,Warehouse,Commercial Fabricating,2488871595 +29757 Anthony Dr,,14314,Wixom,MI,48393-3606,Oakland,1.00,22-05-476-037,Industrial,29757 Anthony Dr,"Wixom, MI 48393-3606",Michael Kuehnl,"Kuehnl, Michael H",2488671689,Warehouse,"Kuehnl, Michael H",2488671689 +29769 Anthony Dr,,12920,Wixom,MI,48393-3606,Oakland,0.93,22-05-476-036,Industrial,,,,,,Warehouse,, +47400 Avante Dr,,12714,Wixom,MI,48393-3615,Oakland,1.94,22-08-200-028,Industrial,47400 Avante Dr,"Wixom, MI 48393-3615",Daniel Booth,Nostalgic Motor Cars,2483494884,Warehouse,Nostalgic Motor Cars,2483494884 +777 Baseline Rd,,15000,Northville,MI,48167,Oakland,4.00,22-34-478-001,Industrial,115 N Center St Suite # 204,"Northville, MI 48167 ",Donald Samhat,Donald L Samhat PC,2483498560,Warehouse,Donald L Samhat PC,2483498560 +28214 Beck Rd,R & K Tool,17200,Wixom,MI,48393-3623,Oakland,1.84,22-09-300-036,Industrial,28214 Beck Rd,"Wixom, MI 48393-3623",,Professional Sprinkler Incorporated,2483495740,Manufacturing,Professional Sprinkler Incorporated,2483495740 +28294 Beck Rd,,16380,Wixom,MI,48393-3623,Oakland,1.87,22-09-300-034,Industrial,2550 E Buno Rd,"Milford, MI 48381 ",,Preventive Maintenance Tech,2483746405,Warehouse,Preventive Maintenance Tech,2483746405 +28381 Beck Rd,Bldg K,13560,Wixom,MI,48393-4731,Oakland,0.85,22-08-426-028,Flex,28345 Beck Rd Suite # 100,"Wixom, MI 48393-4733",Charley Damas,Canton Business Center,2483448970,Light Manufacturing,Canton Business Center,2483448970 +28389 Beck Rd,Bldg J,14000,Wixom,MI,48393-4732,Oakland,1.68,22-08-426-027,Flex,28345 Beck Rd Suite # 100,"Wixom, MI 48393-4733",Charley Damas,Canton Business Center,2483448970,Light Manufacturing,Canton Business Center,2483448970 +28700 Beck Rd,,16356,Wixom,MI,48393-3604,Oakland,1.73,22-09-152-001,Flex,39830 Grand River Ave Suite # B1-A,"Novi, MI 48375-2140",,NMB Technologies Corporation,2484492933,R&D,NMB Technologies Corporation,2484492933 +29592 Beck Rd,,17461,Wixom,MI,48393-2821,Oakland,1.35,22-04-351-017,Industrial,28265 Beck Rd,"Wixom, MI 48393-4719",Karam Bahnam,USA To Go,2487737992,Manufacturing,USA To Go,2487737992 +29650 Beck Rd,,14195,Wixom,MI,48393-2822,Oakland,1.35,22-04-351-012,Industrial,32367 Eight Mile Rd,"Farmington Hills, MI 48336 ",Donna Dancik,Donna Dancik,2482318985,Warehouse,Donna Dancik,2482318985 +1006 Benstein Rd,,12000,Walled Lake,MI,48390-2912,Oakland,8.56,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,2488516320,Warehouse,1006 Benstein Llc,2488516320 +1036 Benstein Rd,,12000,Walled Lake,MI,48390-2913,Oakland,8.56,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,2488516320,Warehouse,1006 Benstein Llc,2488516320 +1042 Benstein Rd,,12000,Walled Lake,MI,48390-2914,Oakland,8.42,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,2488516320,Warehouse,1006 Benstein Llc,2488516320 +1046 Benstein Rd,,12000,Walled Lake,MI,48390-2915,Oakland,8.56,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,2488516320,Warehouse,1006 Benstein Llc,2488516320 +1200 Benstein Rd,,12000,Commerce Township,MI,48390,Oakland,7.91,17-28-476-020,Industrial,2078 Winner St,"Commerce Township, MI 48390",Steven Steinway,Preferred Health Products Inc,2486694300,Warehouse,Preferred Health Products Inc,2486694300 +8601 Boulder Ct,BTV Systems,14480,Walled Lake,MI,48390,Oakland,1.52,17-13-300-101,Industrial,8601 Boulder Ct,"Walled Lake, MI 48390 ",,Real Green Systems,2483605296,Distribution,Real Green Systems,2483605296 +8680 Boulder Ct,,15338,Walled Lake,MI,48390,Oakland,2.64,17-13-300-098,Industrial,8700 Boulder Ct,"Walled Lake, MI 48390 ",,Boulder Development Inc,2483604700,Warehouse,Boulder Development Inc,2483604700 +8681 Boulder Ct,,12500,Walled Lake,MI,48390,Oakland,2.00,17-13-300-100,Industrial,8700 Boulder Ct,"Walled Lake, MI 48390 ",Dave Smith,Boulder Development Inc,2483604700,Warehouse,Boulder Development Inc,2483604700 +41100 Bridge St,,11920,Novi,MI,48375-1300,Oakland,0.74,22-13-351-015,Flex,3565 Bradford Square Dr,"Ann Arbor, MI 48103",John Varick,John F Varick,7349046211,R&D,John F Varick,7349046211 +41280 Bridge St,,16980,Novi,MI,48375,Oakland,1.32,22-13-351-021,Flex,3944 Winterset Ln,"West Bloomfield, MI 48033 ",Taher Rasheed,"Rasheed Family Investments,LLC",3138553318,R&D,"Rasheed Family Investments,LLC",3138553318 +Cabot Dr,,10000,Novi,MI,48377,Oakland,2.40,22-12-200-054,Flex,,,,,,,, +28350 Cabot Dr,,12014,Novi,MI,48377-2919,Oakland,3.67,22-12-400-047,Flex,39000 Country Club Dr,"Farmington Hills, MI 48331 ",,Northern Equities Management Company,2488486400,,Northern Equities Management Company,2488486400 +29185 Cabot Dr,,12230,Novi,MI,48377-2936,Oakland,2.48,22-12-200-028,Flex,39000 Country Club Dr,"Farmington Hills, MI 48331 ",Neil Sosin,Northern Equities Group,2488486400,R&D,Northern Equities Group,2488486400 +47119 Cartier Ct,,15720,Wixom,MI,48393-2872,Oakland,1.31,22-04-152-013,Industrial,26899 Northwestern Hwy Suite # 306,"Southfield, MI 48033 ",Howard Baum,Howard Baum Development Company,2487903600,Warehouse,Howard Baum Development Company,2487903600 +47167 Cartier Ct,,15895,Wixom,MI,48393,Oakland,2.15,22-04-152-005,Industrial,3641 Loblolly Bay Rd,"Labelle, FL 33935",John Leekley,John Robert Leekley,3135068129,Distribution,John Robert Leekley,3135068129 +47110 Cartier Dr,Dantom,11650,Wixom,MI,48393,Oakland,2.01,22-04-151-009,Industrial,326 E 4th St Suite # 200,"Royal Oak, MI 48067-2706",Todd Wyett,Versa Development,2489961081,Warehouse,Versa Development,2489961081 +47140 Cartier Dr,,13650,Wixom,MI,48393-2876,Oakland,3.61,22-04-151-008,Industrial,47140 Cartier Dr,"Wixom, MI 48393-2876",Craig O'Donnell,"AEL Michigan, LLC",2486684966,Warehouse,"AEL Michigan, LLC",2486684966 +28043 Center Oaks Ct,,17500,Wixom,MI,48393-3344,Oakland,1.23,22-07-326-041,Industrial,28043 Center Oaks Ct,"Wixom, MI 48393 ",Karen Wilson,"Wersborg, LLC",2489609586,Warehouse,"Wersborg, LLC",2489609586 +28044 Center Oaks Ct,,15140,Wixom,MI,48393-3343,Oakland,1.52,22-07-326-037,Industrial,500 Woodward Ave Suite # 3500,"Detroit, MI 48226-3416",Kevin Didio,Clark Hill’s Automotive and Manufacturing Practice,3133099461,Warehouse,Clark Hill’s Automotive and Manufacturing Practice,3133099461 +28064 Center Oaks Ct,,12186,Wixom,MI,48393,Oakland,1.42,22-07-326-022,Flex,28064 Center Oaks Ct Suite # A,"Wixom, MI 48393 ",Bertran Gili,Metrologic Group Services Inc.,2484269090,R&D,Metrologic Group Services Inc.,2484269090 +50950 Century Ct,,14250,Wixom,MI,48393,Oakland,1.03,22-06-101-060,Industrial,39475 W 13 Mile Rd Suite # 205,"Novi, MI 48377-2301",Chad Zamler,Zamler Development,2488359003,Warehouse,Zamler Development,2488359003 +51004 Century Ct,,14250,Wixom,MI,48393,Oakland,1.03,22-06-101-059,Industrial,39475 W 13 Mile Rd Suite # 205,"Novi, MI 48377-2301",Chad Zamler,"Century Construction & Management, LLC",2482543311,Manufacturing,"Century Construction & Management, LLC",2482543311 +51056 Century Ct,,16992,Wixom,MI,48393,Oakland,1.12,22-06-101-058,Industrial,39475 W 13 Mile Rd Suite # 205,"Novi, MI 48377-2301",Chad Zamler,Zamler Development,2488359003,Manufacturing,Zamler Development,2488359003 +30587 Century Dr,Zimmerman,13222,Wixom,MI,48393-2062,Oakland,1.87,22-06-101-011,Industrial,,,,,,Warehouse,Fz Re Llc, +31267 Century Dr,,17000,Wixom,MI,48393-2065,Oakland,1.11,22-06-101-001,Industrial,33527-33529 7 Mile Rd,"Livonia, MI 48152-3079",,Gargaro Construction Company,2484734141,Warehouse,Gargaro Construction Company,2484734141 +2299 Childs Lake Rd,Bills Tree,11900,Milford,MI,48381,Oakland,6.59,16-24-101-002,Industrial,2299 Childs Lake Rd,"Milford, MI 48381 ",Mike Bockelman,Bockelman Development,8008782876,Manufacturing,Bockelman Development,8008782876 +1287 S Commerce Rd,AT&T,10072,Walled Lake,MI,48390,Oakland,2.26,17-27-451-002,Flex,3566 Michael Ave SW,"Grand Rapids, MI 49509 ",,Mi Bell Telephone Co,6165305600,Telecom Hotel/Data Hosting,Mi Bell Telephone Co,6165305600 +2599 Crumb Rd,Elsey Construction Products,18000,Walled Lake,MI,48390-2814,Oakland,5.00,17-25-326-008,Industrial,2599 Crumb Rd,"Walled Lake, MI 48390-2814",,Elsey Construction Products,2486248177,Warehouse,Elsey Construction Products,2486248177 +1011 Decker Rd,,12100,Walled Lake,MI,48390-3219,Oakland,2.25,17-35-126-016,Industrial,1 Towne Sq Suite # 1835,"Southfield, MI 48076-3700",,Siegel & Greenfield,2483865900,Manufacturing,Siegel & Greenfield,2483865900 +50322 Dennis Ct,Scott's Lawn Service,18000,Wixom,MI,48393-2025,Oakland,3.51,17-31-352-006,Industrial,,,,,,Warehouse,Shs Development Company, +50384-50388 Dennis Ct,Bldg G,10783,Wixom,MI,48393-2025,Oakland,1.02,17-31-352-004,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322-4515",Kelly Woodley,"First Holding Management Company, LLC",2488553330,Warehouse,"First Holding Management Company, LLC",2488553330 +50400 Dennis Ct,,11525,Wixom,MI,48393-2048,Oakland,1.20,17-31-352-002,Flex,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322-4515",Kelly Woodley,"First Holding Management Company, LLC",2488553330,Light Manufacturing,"First Holding Management Company, LLC",2488553330 +50420 Dennis Ct,,10383,Wixom,MI,48393-2076,Oakland,0.69,17-31-352-001,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322-4515",Kelly Woodley,"First Holding Management Company, LLC",2488553330,Warehouse,"First Holding Management Company, LLC",2488553330 +50200-50210 Dennis Industrial Ct,Bldg D,13417,Wixom,MI,48393-2021,Oakland,0.69,17-31-352-009,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322-4515",Kelly Woodley,"First Holding Management Company, LLC",2488553330,Warehouse,"First Holding Management Company, LLC",2488553330 +50240-50250 Dennis Industrial Ct,Bldg F,15504,Wixom,MI,48393-2024,Oakland,3.51,17-31-352-007,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322-4515",Kelly Woodley,"First Holding Management Company, LLC",2488553330,Warehouse,"First Holding Management Company, LLC",2488553330 +50394 Dennis Industrial Pky,Bldg C,14000,Wixom,MI,48393-2026,Oakland,11.81,17-31-352-003,Flex,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322-4515",Kelly Woodley,"First Holding Management Company, LLC",2488553330,Light Manufacturing,"First Holding Management Company, LLC",2488553330 +46470 Desoto Ct,Bldg B,15555,Novi,MI,48377-1731,Oakland,1.16,22-04-379-002,Industrial,46470 Desoto Ct,"Novi, MI 48377-1731",Jin Hong,TREK Inc.,2486682131,Manufacturing,TREK Inc.,2486682131 +48575 Downing Dr,,10000,Wixom,MI,48393-3503,Oakland,1.65,22-08-100-041,Industrial,331 Metty Dr,"Ann Arbor, MI 48103-9155",Robert Hoffman,Ducks Unlimited Inc,7346232035,Warehouse,Ducks Unlimited Inc,7346232035 +48590-48596 Downing Dr,,16000,Wixom,MI,48393-3501,Oakland,2.17,22-08-100-026,Industrial,30380 S Hill Ct,"New Hudson, MI 48165",Dennis Sinacoloa,Sinacola Construction,2484379777,Warehouse,Sinacola Construction,2484379777 +48602 Downing Dr,,14909,Wixom,MI,48393-3504,Oakland,2.00,22-08-100-032,Industrial,7205 Deer Lake Rd,"Clarkston, MI 48346",William Hannon,HANNON MARINE STORAGE LLC,2486206447,Warehouse,HANNON MARINE STORAGE LLC,2486206447 +1925 Easy St,,10800,Commerce Township,MI,48390-3221,Oakland,0.90,17-26-426-030,Industrial,1977 E West Maple Rd,"Walled Lake, MI 48390 ",,Advance Plumbing & Heating Supply Co.,2486697474,Warehouse,Advance Plumbing & Heating Supply Co.,2486697474 +1941-1951 Easy St,,16348,Commerce Township,MI,48390-3221,Oakland,1.32,17-26-426-031,Industrial,2175 E W Maple Rd,"Commerce Township, MI 48382",Bruce Bullard,Bruce Bullard,2486680077,Warehouse,Bruce Bullard,2486680077 +2005-2035 Easy St,,11385,Commerce Township,MI,48390-3223,Oakland,0.89,17-26-426-061,Industrial,3646 E Elder Rd,"West Bloomfield, MI 48324 ",Joel Rosenberg,"Easy Street Investments, LLC",2483609394,Warehouse,"Easy Street Investments, LLC",2483609394 +2121 Easy St,,18000,Commerce Township,MI,48390-3225,Oakland,1.65,17-26-426-015,Industrial,,,Alan Edelson,Alan Edelson,,Warehouse,Alan Edelson, +2431 Fyke Dr,,11154,Milford,MI,48381,Oakland,5.15,16-25-100-014,Industrial,,,,,,Warehouse,Nevada Associates Llc, +8177 Goldie St,,10736,Walled Lake,MI,48390,Oakland,4.66,17-13-400-009,Industrial,8177 Goldie St,"Walled Lake, MI 48390 ",Richard White,CA Hull Co Inc,2486948025,Manufacturing,CA Hull Co Inc,2486948025 +8225 Goldie St,,14885,Commerce Township,MI,48390-4109,Oakland,9.01,17-13-400-008,Industrial,8177 Goldie St,"Walled Lake, MI 48390 ",Joseph Malloure,CA Hull Co Inc,2486948025,Warehouse,CA Hull Co Inc,2486948025 +8230 Goldie St,,12000,Commerce Township,MI,48390-4108,Oakland,1.03,17-13-400-044,Industrial,32235 Craftsbury,"Farmington Hills, MI 48334-3429",Marion Johnsee,Marion Johnsee,,Distribution,Marion Johnsee, +8232 Goldie St,,12000,Commerce Township,MI,48390-4108,Oakland,1.03,17-13-400-043,Industrial,32235 Craftsbury,"Farmington Hills, MI 48334-3429",Marion Johnsee,Marion Johnsee,,Warehouse,Marion Johnsee, +8240-8246 Goldie St,,16000,Commerce Township,MI,48390-4108,Oakland,1.48,17-13-400-047,Industrial,8246 Goldie St,"Commerce Township, MI 48390-4108",Dan Wissner,Direct Connect Systems,8004455714,Manufacturing,Direct Connect Systems,8004455714 +28011 Grand Oaks Ct,Century Architectural Hardware,11640,Wixom,MI,48393-3340,Oakland,1.49,22-07-401-015,Industrial,3145 Copper Rd,"Fenton, MI 48430 ",Adam Cole,Excel Medical Products Llc,8107144775,Warehouse,Excel Medical Products Llc,8107144775 +28021 Grand Oaks Ct,,15660,Wixom,MI,48393-3340,Oakland,1.26,22-07-401-016,Industrial,28021 Grand Oaks Ct,"Wixom, MI 48393-3340",Beth Ancona,Ancona Controls,2486245600,Warehouse,Ancona Controls,2486245600 +28061 Grand Oaks Ct,,13992,Wixom,MI,48393-3340,Oakland,1.40,22-07-401-020,Industrial,38250 French Pond,"Farmington Hills, MI 48331",Jon Williamson,Jon P Williamson,2484891106,Warehouse,Jon P Williamson,2484891106 +39586 Grand River Ave,Keford Collision,16000,Novi,MI,48375-2102,Oakland,2.35,22-24-426-007,Industrial,,,,,,Warehouse,C & L Land Holding - Novi Body Shop LLC,2484269600 +40020 Grand River Ave,Bldg A,14924,Novi,MI,48375-2112,Oakland,1.60,22-24-401-019,Flex,6111 N Shore Dr,"West Bloomfield, MI 48324",,Steven Kopitz,2488826012,Light Manufacturing,Steven Kopitz,2488826012 +40024 Grand River Ave,Bldg B,12330,Novi,MI,48375,Oakland,1.32,22-24-401-019,Flex,6111 N Shore Dr,"West Bloomfield, MI 48324",,Steven Kopitz,2488826012,Light Manufacturing,Steven Kopitz,2488826012 +40028 Grand River Ave,Bldg C,12330,Novi,MI,48375-2167,Oakland,1.32,22-24-401-019,Flex,6111 N Shore Dr,"West Bloomfield, MI 48324",,Steven Kopitz,2488826012,Light Manufacturing,Steven Kopitz,2488826012 +40220 Grand River Ave,,11464,Novi,MI,48375-2116,Oakland,4.91,22-24-401-026,Flex,39500 High Pointe Blvd,"Novi, MI 48375-5505",,"AJR Development, Inc.",2483806150,R&D,"AJR Development, Inc.",2483806150 +40375 Grand River Ave,,13883,Novi,MI,48375-2123,Oakland,0.82,22-24-451-002,Industrial,40375 Grand River Ave,"Novi, MI 48375-2123",Thelma Lacy,Thelma C. Lacy,,Warehouse,Thelma C. Lacy, +40850 Grand River Ave,Bldg A,13500,Novi,MI,48375-5705,Oakland,1.60,22-24-100-012,Industrial,41106 Clermont Ave,"Novi, MI 48375-5702",Sanjay Seth,Seth Investments LLC,2486150313,Warehouse,Seth Investments LLC,2486150313 +40950 Grand River Ave,,12000,Novi,MI,48375-2816,Oakland,1.06,22-24-100-057,Industrial,2112 Prestwick Dr,"Farmington Hills, MI 48335",Alan wood,Alan Wood,2486157574,Warehouse,Alan Wood,2486157574 +44375 Grand River Ave,,13000,Novi,MI,48375-1156,Oakland,1.15,22-15-378-014,Industrial,13821 Elmira St,"Detroit, MI 48227",John Debono,Shaw & Slavsky Inc,3138343990,Warehouse,Shaw & Slavsky Inc,3138343990 +45031-45033 Grand River Ave,,15586,Novi,MI,48375-1015,Oakland,2.23,22-15-351-025,Industrial,45033 Grand River,"Novi, MI 48375-1015",Daniel Mansfield,Daniel C. Mansfield,,Warehouse,Daniel C. Mansfield, +45500 Grand River Ave,,13423,Novi,MI,48374-1305,Oakland,10.05,22-16-426-005,Industrial,P.O.Box 8018,"Novi, MI 48376-8018",,DeMaria Building Co.,2483488710,Warehouse,DeMaria Building Co.,2483488710 +46001 Grand River Ave,,12552,Novi,MI,48374-1319,Oakland,1.00,22-16-451-054,Industrial,6761 E Ten Mile Rd,"Center Line, MI 48015 ",,Servall Inc.,5867541818,Warehouse,Servall Inc.,5867541818 +46035 Grand River Ave,,17214,Novi,MI,48374-1319,Oakland,7.67,22-16-451-005,Industrial,138 W Fisher Fwy,"Detroit, MI 48201",Victor Giller,Paradise Properties Inc,2484784890,Manufacturing,Paradise Properties Inc,2484784890 +46085 Grand River Ave,,10622,Novi,MI,48374-1319,Oakland,3.74,22-16-451-041,Industrial,3500 Ridge Rd,"Highland, MI 48356",Robert Massard,Robert Massard,2488870417,Warehouse,Robert Massard,2488870417 +46089 Grand River Ave,,12032,Novi,MI,48374-1319,Oakland,1.03,22-16-451-042,Industrial,46089 Grand River Ave,"Novi, MI 48374-1319",,Slaco Tool & Manufacturing,2484499911,Manufacturing,Slaco Tool & Manufacturing,2484499911 +46400 Grand River Ave,Bell Fork Lift,14073,Novi,MI,48374-1323,Oakland,1.60,22-16-251-017,Industrial,34660 Centaur Dr Suite # 34660,"Clinton Township, MI 48035 ",,Bell Fork Fort Inc,5867925773,Warehouse,Bell Fork Fort Inc,5867925773 +46700 Grand River Ave,,10800,Novi,MI,48374-1326,Oakland,19.22,22-16-176-020,Industrial,,,,,,Warehouse,, +47087 Grand River Ave,,15000,Novi,MI,48374-1340,Oakland,3.00,22-16-151-002,Industrial,47087 Grand River Ave,"Novi, MI 48374-1340",Mike McCowan,Mike McCowan,2483498877,Manufacturing,Mike McCowan,2483498877 +48545 Grand River Ave,,12220,Novi,MI,48374-1245,Oakland,5.00,22-17-101-015,Industrial,,,,,,Warehouse,WmLBaker & NABaker LLC, +48595 Grand River Ave,,10347,Novi,MI,48374-1245,Oakland,5.02,22-17-101-016,Industrial,21565 Flanders St,"Farmington Hills, MI 48335",Christine Walker,"Walker, William & Christine",5175489049,Warehouse,"Walker, William & Christine",5175489049 +48735 Grand River Ave,,10195,Novi,MI,48374-1247,Oakland,5.98,22-17-101-014,Industrial,24700 Northwestern Hwy Suite # 700,"Southfield, MI 48075 ",Daniel Irvin,Novi Cartage LLC,5867161700,Truck Terminal,Novi Cartage LLC,5867161700 +51722 Grand River Ave,South Building,14000,Wixom,MI,48393,Oakland,7.34,21-12-251-012,Industrial,51722 Grand River Ave,"Lyon Township, MI 48393 ",,United Rentals,2483442800,Warehouse,United Rentals,2483442800 +53115-53125 Grand River Ave,,12018,New Hudson,MI,48165,Oakland,2.00,21-11-276-006,Industrial,53125 Grand River Ave,"New Hudson, MI 48165 ",Richard Similuk,Rjs Group Llc,2486738761,Warehouse,Rjs Group Llc,2486738761 +53205 Grand River Ave,,14800,New Hudson,MI,48165,Oakland,4.00,21-11-276-011,Industrial,4706 Product Dr Suite # 7,"Milford, MI 48381",James Solomon,Crystal Property Management LLC,5179804480,Warehouse,Crystal Property Management LLC,5179804480 +53400 Grand River Ave,Building A,16200,New Hudson,MI,48165-8521,Oakland,2.07,21-11-226-004,Flex,53400 Grand River Ave,"New Hudson, MI 48165-8521",Kim Gasior,Jerry Baker,2484373000,Light Manufacturing,Jerry Baker,2484373000 +53583 Grand River Ave,,10608,Wixom,MI,48393,Oakland,2.15,21-11-251-027,Industrial,54360 Belcrest Dr,"Milford, MI 48381",John Dolan,John Dolan,2484374445,Warehouse,John Dolan,2484374445 +53655 Grand River Ave,,12913,New Hudson,MI,48165-8523,Oakland,1.61,21-11-251-016,Industrial,5000 Dryden Ln,"Bloomfield Hills, MI 48304",Michael Reilly,Micahel J Reilly,2486466134,Warehouse,Micahel J Reilly,2486466134 +54750 Grand River Ave,,12500,New Hudson,MI,48165,Oakland,2.00,21-02-376-019,Industrial,1503 Mystic Hills Dr,"Milford, MI 48380-4489",Edward Swadish,"Swadish, Edward Frank",2487673967,Warehouse,"Swadish, Edward Frank",2487673967 +54790 Grand River Ave,,14240,New Hudson,MI,48165-8526,Oakland,1.78,21-02-376-018,Industrial,8051 Locklin Ln,"Commerce Township, MI 48382 ",,"Union Bay Associates, LLC",,Warehouse,"Union Bay Associates, LLC", +55820 Grand River Ave,,10500,New Hudson,MI,48165-8706,Oakland,2.30,21-03-402-018,Flex,,,,,,,Wrobo Development, +55860 Grand River Ave,,10814,New Hudson,MI,48165-9717,Oakland,1.20,21-03-401-001,Flex,7071 Orchard Lake Rd,"West Bloomfield, MI 48322-3613",Cristy Evangelista,Evangelista Development LLC,2486261114,Light Manufacturing,Evangelista Development LLC,2486261114 +56405 Grand River Ave,Insulgard,12000,New Hudson,MI,48165,Oakland,2.88,21-03-376-022,Industrial,58000 Grand River Ave,"New Hudson, MI 48165 ",,Charter Township of Lyon,2484372240,Warehouse,Charter Township of Lyon,2484372240 +28850 Haas Rd,P.B. Brodak Roofing & Sheet Metal Co.,16700,Wixom,MI,48393,Oakland,2.62,21-11-276-014,Industrial,,,,,,Manufacturing,Brodak Enterprises Inc, +3295 Haggerty Rd,,18000,Commerce Township,MI,48390-1725,Oakland,1.34,17-24-228-028,Industrial,3225 Haggerty Rd,"Commerce Township, MI 48390 ",Robin Dubuc,Thomas Craig Properties LLC,2486246140,Manufacturing,Thomas Craig Properties LLC,2486246140 +4270 Haggerty Rd,,10000,Walled Lake,MI,48390,Oakland,1.64,17-13-400-014,Industrial,4278 Haggerty Rd,"Walled Lake, MI 48390 ",Kim Jensen,Jensen Building Products,2483634144,Warehouse,Jensen Building Products,2483634144 +4278 Haggerty Rd,Building 1,15000,Walled Lake,MI,48390,Oakland,0.95,17-13-400-015,Industrial,,,,,,Manufacturing,Rrpnn Llc, +4370 Haggerty Rd,,10600,Commerce Township,MI,48390,Oakland,0.97,17-13-400-022,Industrial,2287 E West Maple Rd,"Commerce Township, MI 48390-3820",Luai Poota,Luai's Automotive LLC,,Warehouse,Luai's Automotive LLC, +4400 Haggerty Rd,,11998,Commerce Township,MI,48390,Oakland,0.77,17-13-400-029,Industrial,3157 Pikewood Ct,"Commerce Township, MI 48382-2234",Robert Booth,Booth Robert A & Patricia,2486842234,Manufacturing,Booth Robert A & Patricia,2486842234 +4440 Haggerty Rd,Wison Marine Oakland,10500,Commerce Township,MI,48390-1317,Oakland,1.20,17-13-400-019,Industrial,6095 Grand River Rd,"Brighton, MI 48114",Ronald Wilson,Ronald Wilson,5175463774,Service,Ronald Wilson,5175463774 +22495-22499 Heslip Dr,,12596,Novi,MI,48375-4138,Oakland,0.80,22-26-376-009,Industrial,RT 3 Box 382,"Traverse City, MI 49684-9803",Frank Martin,Frank Martin,,Warehouse,Frank Martin, +22500 Heslip Dr,,16438,Novi,MI,48375-4139,Oakland,1.62,22-26-377-024,Industrial,6980 Lakemont Cir,"West Bloomfield, MI 48323-2070",Larry Morianti,Larry P Morianti,2486819098,Warehouse,Larry P Morianti,2486819098 +22515 Heslip Dr,,10380,Novi,MI,48375-4140,Oakland,1.19,22-26-376-014,Industrial,22419 Paddington Ct,"Novi, MI 48374",Ghazwan Ismail,Ghazwan Ismail,7342764000,Warehouse,Ghazwan Ismail,7342764000 +22575 Heslip Dr,W.S Equipment,15440,Novi,MI,48375-4140,Oakland,1.07,22-26-376-018,Industrial,19850 Marilyn St,"Northville, MI 48167-2626",Dennis Kubica,Kubica Corporation,3137249000,Warehouse,Kubica Corporation,3137249000 +22605 Heslip Dr,Cav Tool,11680,Novi,MI,48375-4142,Oakland,1.34,22-26-376-016,Industrial,28214 Beck Rd,"Wixom, MI 48393 ",,R & K Holding LLC,,Warehouse,R & K Holding LLC, +22755-22759 Heslip Dr,Global Office Building,16407,Novi,MI,48375-4144,Oakland,1.21,22-26-326-014,Industrial,22759 Heslip Dr,"Novi, MI 48375-4144",,"Heslip Holdings, LLC",2484499100,Warehouse,"Heslip Holdings, LLC",2484499100 +22777 Heslip Dr,,14458,Novi,MI,48375-4144,Oakland,1.06,22-26-326-010,Industrial,22777 Heslip Dr,"Novi, MI 48375-4144",Christine Ellis,Facet international marketing,7344533500,Warehouse,Facet international marketing,7344533500 +22781 Heslip Dr,,14458,Novi,MI,48375-4144,Oakland,1.06,22-26-326-010,Industrial,,,,,,,Jade Group Llc, +2000 E Highland Rd,,12330,Highland,MI,48356-3058,Oakland,2.04,11-23-227-001,Industrial,2000 E Highland Rd,"Highland, MI 48356-3058",Michael Seacord,Seaco Investments Llc,2483430109,Warehouse,Seaco Investments Llc,2483430109 +5410A E Highland Rd,,11986,White Lake,MI,48383,Oakland,2.31,12-20-151-007,Industrial,,,,,,Warehouse,Highland Road Real Estate Llc, +30100 S Hill Rd,,13000,New Hudson,MI,48165,Oakland,1.46,21-02-376-023,Industrial,30100 S Hill Rd,"New Hudson, MI 48165 ",Dan Cheresko,"Lyon Mechanical, Inc.",2484371047,Warehouse,"Lyon Mechanical, Inc.",2484371047 +335 S Houghton St,,15732,Milford,MI,48381,Oakland,0.79,16-11-376-028,Industrial,,,,,,Service,Houghton Street Associates, +29575 Hudson Dr,Unit 4,11983,Novi,MI,48377,Oakland,1.04,22-04-377-002,Flex,53400 Grand River Ave,"New Hudson, MI 48165-8521",Kim Gasior,Jerry Baker,2484373000,Light Manufacturing,Jerry Baker,2484373000 +29580 Hudson Dr,,11000,Novi,MI,48377-1733,Oakland,1.09,22-04-378-004,Industrial,1695 Balsam Way,"Milford, MI 48381",Nosh Sinishtaj,Nosh Sinishtaj,2484083420,Warehouse,Nosh Sinishtaj,2484083420 +41115 Jo Dr,Micro Craft,17825,Novi,MI,48375-1916,Oakland,2.82,22-24-100-058,Industrial,41115 Jo Dr,"Novi, MI 48375-1916",,Vincenti Investment Company2,,Manufacturing,Vincenti Investment Company2, +41123 Jo Dr,,16224,Novi,MI,48375-1933,Oakland,1.26,22-24-100-061,Industrial,1000 E Mandoline,"Madison Heights, MI 48071-1475",Edward Sherman,Dot Development Company,2485884350,Warehouse,Dot Development Company,2485884350 +949 Ladd Rd,,15523,Commerce Township,MI,48390,Oakland,3.39,17-34-101-010,Industrial,949 Ladd Rd,"Walled Lake, MI 48390",Lawrence Montgomery,"Montgomery, Lawrence & Catherine",2486681640,Warehouse,"Montgomery, Lawrence & Catherine",2486681640 +415 N Lafayette St,,18000,South Lyon,MI,48178,Oakland,4.24,21-19-476-008,Industrial,415 N Lafayette St,"South Lyon, MI 48178",Charles Pullum,Pullum Window Corporation,2484914700,Warehouse,Pullum Window Corporation,2484914700 +46918 Liberty Dr,,17902,Wixom,MI,48393-3600,Oakland,1.34,22-09-151-012,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,5172443001,Warehouse,Dart Container Corporation,5172443001 +46919 Liberty Dr,,13700,Wixom,MI,48393-3602,Oakland,0.96,22-09-152-005,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,5172443001,Manufacturing,Dart Container Corporation,5172443001 +46953 Liberty Dr,,11900,Wixom,MI,48393-3603,Oakland,1.71,22-09-152-007,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,5172443001,Warehouse,Dart Container Corporation,5172443001 +46968 Liberty Dr,Lot 12,11974,Wixom,MI,48393-3693,Oakland,1.18,22-09-301-008,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,5172443001,Warehouse,Dart Container Corporation,5172443001 +46974 Liberty Dr,,11996,Wixom,MI,48393-3601,Oakland,1.03,22-09-301-005,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,5172443001,Manufacturing,Dart Container Corporation,5172443001 +46980 Liberty Dr,,13324,Wixom,MI,48393-3601,Oakland,1.03,22-09-301-004,Industrial,24073-24083 Research Dr,"Farmington Hills, MI 48335-2632",Amy Chen,Tung Thih Electronics USA,2484789512,Warehouse,Tung Thih Electronics USA,2484789512 +46981-46983 Liberty Dr,,13578,Wixom,MI,48393-3694,Oakland,0.98,22-09-152-008,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,5172443001,Warehouse,Dart Container Corporation,5172443001 +46986 Liberty Dr,Lot 15,13240,Wixom,MI,48393-3601,Oakland,1.03,22-09-301-003,Industrial,500 Hogsback Rd,"Mason, MI 48854 ",,Dart Container Corporation,5176763800,Warehouse,Dart Container Corporation,5176763800 +46987-46989 Liberty Dr,,13688,Wixom,MI,48393,Oakland,1.09,22-09-152-009,Industrial,432 Hogsback Rd,"Mason, MI 48854 ",Bob Dart,Dart,5176763803,Warehouse,Dart,5176763803 +46992 Liberty Dr,,16972,Wixom,MI,48393-3601,Oakland,1.03,22-09-301-002,Industrial,500 Hogsback Rd,"Mason, MI 48854-9547",,Dart Container Corporation,5176763800,Warehouse,Dart Container Corporation,5176763800 +29108 Lorie Ln,,10116,Wixom,MI,48393-3640,Oakland,0.89,22-08-200-034,Flex,29777 Telegraph Rd Suite # 2475,"Southfield, MI 48034-1303",Richard Delonis,Szura & Delonis Plc,2487163600,,Szura & Delonis Plc,2487163600 +29318 Lorie Ln,,13330,Wixom,MI,48393,Oakland,0.80,22-08-227-023,Industrial,2289 Mayfair Dr,"White Lake, MI 48383",Paul Fus,Paul E Fus,2486852761,Warehouse,Paul E Fus,2486852761 +29420 Lorie Ln,,10000,Wixom,MI,48393,Oakland,0.81,22-08-227-002,Industrial,29421 Lorie Ln,"Wixom, MI 48393 ",Arturo Rodriguez,"Roligi Investments, LLC",2483489991,Warehouse,"Roligi Investments, LLC",2483489991 +29431 Lorie Ln,,15712,Wixom,MI,48393,Oakland,0.72,22-08-226-002,Industrial,29431 Lorie Ln,"Wixom, MI 48393 ",Bud Conrad,BC Manufacturing Inc,2483440101,Manufacturing,BC Manufacturing Inc,2483440101 +55353 Lyon Industrial Dr,,13796,New Hudson,MI,48165,Oakland,1.14,21-03-402-025,Industrial,34750 Norflok St,"Livonia, MI 48152-4041",Giovanni Agazzi,Grone Construction Co,2484743786,Warehouse,Grone Construction Co,2484743786 +55375 Lyon Industrial Dr,,13800,New Hudson,MI,48165,Oakland,1.14,21-03-402-024,Industrial,,,Steve Agazzi,P & N,,Warehouse,P & N, +55378 Lyon Industrial Dr,,11114,New Hudson,MI,48165,Oakland,1.67,21-03-402-003,Industrial,55378 Lyon Industrial Dr,"New Hudson, MI 48165",,DENNIS ROGGERS,2484469771,Warehouse,DENNIS ROGGERS,2484469771 +55390 Lyon Industrial Dr,Unit 13,17200,New Hudson,MI,48165,Oakland,1.32,21-03-402-023,Industrial,7125 Orchard Lake Rd Suite # 200,"West Bloomfield, MI 48322-3615",,Singh Development Company,2488651600,Manufacturing,Singh Development Company,2488651600 +55412 Lyon Industrial Dr,Lyon Industrial,14800,New Hudson,MI,48165,Oakland,1.39,21-03-402-022,Industrial,7125 Orchard Lake Rd Suite # 200,"West Bloomfield, MI 48322-3615",,Singh Development Company,2488651600,Warehouse,Singh Development Company,2488651600 +46605 Magellan Dr,,14843,Novi,MI,48377,Oakland,0.68,22-09-326-016,Industrial,,,,,,Warehouse,Ntc America Corporation, +46665 Magellan Dr,Unit 14,17000,Novi,MI,48377-2442,Oakland,1.20,22-09-177-007,Industrial,46665 Magellan Dr,"Novi, MI 48377 ",,Access Interactive,2485673000,Warehouse,Access Interactive,2485673000 +46695 Magellan Dr,Dantom,16048,Novi,MI,48377,Oakland,1.51,22-09-177-006,Industrial,50 Old Webster Rd,"Oxford, MA 01540 ",Valentin Gapontsev,IPG Photonics,5083731100,Warehouse,IPG Photonics,5083731100 +46725 Magellan Dr,,16052,Novi,MI,48377-2453,Oakland,1.20,22-09-177-005,Industrial,46725 Magellan Dr,"Novi, MI 48377-2453",Frank Kemmer,Vsc,2489262540,Warehouse,Vsc,2489262540 +46755 Magellan Dr,,14021,Novi,MI,48377-2453,Oakland,1.17,22-09-177-012,Industrial,30100 Telegraph Rd Suite # 322,"Bingham Farms, MI 48025-4514",Morton Noveck,Noveck & Nasholtz PLC,2486427111,Manufacturing,Noveck & Nasholtz PLC,2486427111 +46785 Magellan Dr,,16040,Novi,MI,48377-2453,Oakland,1.11,22-09-177-011,Industrial,550 S Ocean Blvd Suite # 2204,"Boca Raton, FL 33432 ",Iris Phelps,"17242 Boulevard, LLC",5619829470,Warehouse,"17242 Boulevard, LLC",5619829470 +46926 Magellan Dr,,11000,Wixom,MI,48393,Oakland,1.16,22-09-102-002,Industrial,560 N Carney Dr,"Saint Clair, MI 48079",Geri Schmidt,Geri Schmidt,8103290855,Warehouse,Geri Schmidt,8103290855 +46934-46942 Magellan Dr,,11565,Wixom,MI,48393,Oakland,1.07,22-09-102-003,Industrial,1484 Andover Blvd,"Howell, MI 48843",Nathan Donnellon,Nathan Donnellon,7344803778,Manufacturing,Nathan Donnellon,7344803778 +46950 Magellan Dr,Lot 4,15330,Wixom,MI,48393,Oakland,1.17,22-09-102-004,Industrial,46950 Magellan Dr Suite # C-1,"Wixom, MI 48393 ",Weihua Li,QOMO HiteVision,2488692121,Warehouse,QOMO HiteVision,2488692121 +125 S Main St,,15000,Milford,MI,48381-1996,Oakland,0.81,16-11-301-002,Industrial,,,,,,Warehouse,Kindred Properties Llc, +1920 W Maple Rd,,15200,Commerce Township,MI,48390-2953,Oakland,1.10,17-33-253-002,Industrial,1920 W Maple Rd,"Commerce Township, MI 48390-2953",Conrad Lindstrom,"American Manufacturing Innovators, Inc.",2486695990,Warehouse,"American Manufacturing Innovators, Inc.",2486695990 +4170 Martin Rd,,10000,Commerce Township,MI,48390-4116,Oakland,0.66,17-13-326-026,Industrial,3281 W Shore Dr,"Orchard Lake, MI 48324",David Moellering,Moe-Jo LLC,2486817999,Manufacturing,Moe-Jo LLC,2486817999 +4224 Martin Rd,APPCO Control,10000,Commerce Township,MI,48390-4118,Oakland,0.86,17-13-326-003,Industrial,5645 Sashabaw Rd,"Clarkston, MI 48346",Gina Iacobelli,Independence Management Corp.,2486251188,Warehouse,Independence Management Corp.,2486251188 +4999 McCarthy Dr,,14800,Milford,MI,48381-3947,Oakland,2.74,16-35-451-026,Industrial,32733 Folsom Rd,"Farmington Hills, MI 48336-4425",James Struble,Ranger Contracting Incorporated,2484712277,Manufacturing,Ranger Contracting Incorporated,2484712277 +25715-25737 Meadowbrook Rd,,17193,Novi,MI,48375-1849,Oakland,1.39,22-23-226-020,Industrial,,,,,,Warehouse,"RTN Holdings, LLC", +25775 Meadowbrook Rd,,17605,Novi,MI,48375-1849,Oakland,1.39,22-23-226-033,Flex,25775 Meadowbrook Rd,"Novi, MI 48375-1849",Joseph Khalifeh,Biotech Clinical Laboratories,2484269800,Light Manufacturing,Biotech Clinical Laboratories,2484269800 +25849-25869 Meadowbrook Rd,Building 2,17728,Novi,MI,48375,Oakland,2.31,22-23-230-002,Flex,41200-41218 Bridge St,"Novi, MI 48375-1301",Bill McKeever,Certified Management,2484766700,R&D,Certified Management,2484766700 +25873-25893 Meadowbrook Rd,Building 3,17726,Novi,MI,48375-1851,Oakland,2.31,22-23-230-003,Flex,41200-41218 Bridge St,"Novi, MI 48375-1301",,Certified Management,2484766700,R&D,Certified Management,2484766700 +1025 Metro Dr,,14074,Walled Lake,MI,48390,Oakland,3.24,17-27-351-023,Industrial,PO BOX 725,"WALLED LAKE, MI 48390",Gary Mapes,Metro Enviromental Services,3136244799,Warehouse,Metro Enviromental Services,3136244799 +5350 Milford Rd,,10742,New Hudson,MI,48165,Oakland,7.26,21-04-201-010,Industrial,1 N Lexington Ave,"White Plains, NY 10601-1712",Mark Comora,FORTISTAR,9144214900,Warehouse,FORTISTAR,9144214900 +29111 Milford Rd,"Mac Dermid, Inc.",14459,New Hudson,MI,48165-9741,Oakland,5.60,21-09-226-016,Flex,1401 Blake St,"Denver, CO 80202-1383",,"MacDermid Group, Inc.",7204793060,Light Manufacturing,"MacDermid Group, Inc.",7204793060 +31250 S Milford Rd,,10041,Milford,MI,48381,Oakland,7.56,21-03-126-017,Industrial,,,,,,Warehouse,Mcnabb D S Living Trust, +385 N Mill St,,18000,South Lyon,MI,48178-1262,Oakland,1.33,21-20-326-011,Industrial,6659 Seven Mile Rd,"South Lyon, MI 48178 ",Michael Mannella,Michael Mannella,,Warehouse,Michael Mannella, +465 N Mill St,,13743,South Lyon,MI,48178,Oakland,1.95,21-20-326-014,Industrial,,,Linda Turman,Linda S Turman,2489610441,Manufacturing,Linda S Turman,2489610441 +521 N Mill St,,14920,South Lyon,MI,48178,Oakland,2.00,21-20-326-013,Industrial,48755 W 10 Mile Rd,"Novi, MI 48374 ",,Pardonnet George,,Warehouse,Pardonnet George, +201 S Mill St,,16000,South Lyon,MI,48178,Oakland,1.39,21-29-176-025,Industrial,42411 Palmer Rd,"Canton, MI 48188-1990",Adam Aldrin,Mill Street Investment Llc,7345162509,Manufacturing,Mill Street Investment Llc,7345162509 +3250 New Farm Ct,,10400,Commerce Township,MI,48390-1702,Oakland,0.75,17-24-229-006,Flex,31393 W 13 Mile Rd Suite # 150,"Farmington Hills, MI 48334-2297",Charlie Cassar,Sam Cassar Company,2488514477,Light Manufacturing,Sam Cassar Company,2488514477 +3280 New Farm Ct,,10400,Commerce Township,MI,48390-1754,Oakland,0.74,17-24-229-007,Flex,31393 W 13 Mile Rd Suite # 150,"Farmington Hills, MI 48334-2297",Charlie Cassar,Sam Cassar Company,2488514477,Light Manufacturing,Sam Cassar Company,2488514477 +3310 New Farm Ct,,10400,Commerce Township,MI,48390-1755,Oakland,0.70,17-24-229-008,Flex,31393 W 13 Mile Rd Suite # 150,"Farmington Hills, MI 48334-2297",Charlie Cassar,Sam Cassar Company,2488514477,Light Manufacturing,Sam Cassar Company,2488514477 +25100 Novi Rd,Collex Collision Experts,10166,Novi,MI,48375-1636,Oakland,4.31,22-23-152-004,Industrial,11995 El Camino Real,"San Diego, CA 92130-2544",,Realty Income Corporation,8779246266,Service,Realty Income Corporation,8779246266 +25800 Novi Rd,,12260,Novi,MI,48375-1650,Oakland,4.50,22-23-151-004,Industrial,25125 Trans-X Rd,"Novi, MI 48375 ",,"ACE CUTTING EQUIPMENT & Supply, Inc.",2484494944,Warehouse,"ACE CUTTING EQUIPMENT & Supply, Inc.",2484494944 +28005 Oakland Oaks Ct,,12078,Wixom,MI,48393-3342,Oakland,1.30,22-07-326-001,Industrial,,,,,,Warehouse,"MB Investments, LLC", +28016 Oakland Oaks Ct,Bldg D,16306,Wixom,MI,48393-3341,Oakland,1.07,22-07-326-031,Industrial,28026 Oakland Oaks Ct,"Wixom, MI 48393 ",,Hosco,2489121750,Warehouse,Hosco,2489121750 +28036 Oakland Oaks Ct,,11224,Wixom,MI,48393-3348,Oakland,1.01,22-07-326-011,Flex,46701 Commerce Center Dr,"Plymouth, MI 48170-2475",Gerald Cox,Gerald L Cox,7345279125,Light Manufacturing,Gerald L Cox,7345279125 +28046 Oakland Oaks Ct,,18000,Wixom,MI,48393-3348,Oakland,1.20,22-07-326-036,Industrial,,,,,,Warehouse,"Galaxie 11, LLC", +3170 E Oakley Park,,13500,Commerce Township,MI,48390,Oakland,0.45,17-24-228-001,Industrial,8101 Richardson Rd Suite # 101,"Commerce Township, MI 48390 ",Chris Konja,Askar Brands,2483634580,Warehouse,Askar Brands,2483634580 +3331 Oakley Park Rd,,10276,Commerce Township,MI,48390,Oakland,1.30,17-13-400-055,Industrial,4104 Pioneer Rd,"Walled Lake, MI 48390 ",Jeanne Kunzman,Jeanne Kunzman,2483602700,Warehouse,Jeanne Kunzman,2483602700 +2550 E Oakley Park Rd,Finished Basements Plus,15550,Commerce Township,MI,48390-1663,Oakland,0.91,17-24-126-012,Industrial,2965 Vero Dr,"Highland, MI 48356",Stephen Iverson,Stephen Iverson,2489397905,Warehouse,Stephen Iverson,2489397905 +3250 E Oakley Park Rd,,11407,Commerce Township,MI,48390-1648,Oakland,0.87,17-24-226-003,Industrial,35441 Edmunds Grv,"New Baltimore, MI 48047",Thomas Lubinski,Thomas D Lubinski,,Warehouse,Thomas D Lubinski, +3260 Old Farm,California Closets,11100,Commerce Township,MI,48390,Oakland,0.76,17-24-228-021,Industrial,,,,,,Warehouse,Michigan Solar Solutions, +4755 Old Plank Rd,,13252,Milford,MI,48381-4066,Oakland,15.39,16-36-351-016,Industrial,,,,,,Warehouse,T M Ford Development Co, +4827 Old Plank Rd,,11600,Milford,MI,48381,Oakland,2.12,16-36-351-018,Industrial,48733 West Rd,"Wixom, MI 48393-3544",,Clearlink Wireless,2484497362,Warehouse,Clearlink Wireless,2484497362 +28361 W Park Dr,,13339,Novi,MI,48377,Oakland,3.98,22-09-300-047,Industrial,30660 W 8 Mile Rd,"Farmington Hills, MI 48336",Thomas Earle,PISI Industrial LLC,,Manufacturing,PISI Industrial LLC, +46425 Peary Ct,,15798,Novi,MI,48377-1732,Oakland,1.59,22-04-378-014,Industrial,46425 Peary Ct,"Novi, MI 48377 ",John Gauruder,Gauruder Investments Llc,2483476448,Warehouse,Gauruder Investments Llc,2483476448 +4335 Pineview Dr,,13691,Walled Lake,MI,48390,Oakland,1.07,17-13-300-079,Industrial,,,,,,Warehouse,Heinzmann Family Llc, +4350 Pineview Dr,,11500,Commerce Township,MI,48390-4113,Oakland,1.12,17-13-300-077,Industrial,,,,,,Warehouse,NCLS Properties LLC, +4359 Pineview Rd,,14000,Walled Lake,MI,48390,Oakland,1.53,17-13-300-080,Flex,4359 Pineview Rd,"Walled Lake, MI 48390 ",,"Sundberg-Ferar, Inc.",2483603800,R&D,"Sundberg-Ferar, Inc.",2483603800 +4077 Pioneer Dr,,10032,Walled Lake,MI,48390,Oakland,1.14,17-13-326-034,Flex,7205 Deer Lake Rd,"Clarkston, MI 48346 ",Bill Hannon,Bill Hannon,2486206447,Light Manufacturing,Bill Hannon,2486206447 +4295 Plant Dr,,11016,Walled Lake,MI,48390,Oakland,1.25,17-13-400-049,Industrial,,,,,,Warehouse,Pechota Investments, +20801 Pontiac Trl,,14480,South Lyon,MI,48178,Oakland,6.15,21-31-400-075,Industrial,306 Andrus Dr,"Murray, KY 42071-2180",,Hutson,2702267770,Warehouse,Hutson,2702267770 +50140 Pontiac Trl,,15846,Wixom,MI,48393-2019,Oakland,2.35,17-31-452-012,Industrial,50140 Pontiac Trl,"Wixom, MI 48393-2019",,Creative Machine,2486694230,Warehouse,Creative Machine,2486694230 +51100 Pontiac Trl,,12500,Wixom,MI,48393-2041,Oakland,,17-31-351-016,Industrial,23900 Orchard Rd Suite # 240,"Farmington Hills, MI 48336 ",James Barnett,Barnett Industrial Properties LLC,2486154700,,Barnett Industrial Properties LLC,2486154700 +51800 Pontiac Trl,,16000,Milford,MI,48393-1932,Oakland,6.72,16-36-451-019,Industrial,4875 Product Dr,"Wixom, MI 48393 ",Troy Clogg,"CTR Landholders, LLC",2486850123,Manufacturing,"CTR Landholders, LLC",2486850123 +862 N Pontiac Trl,,12453,Walled Lake,MI,48390,Oakland,,17-34-227-009,Industrial,861 N Pontiac Trail,"Walled Lake, MI 48390 ",James Maher,Maher Group,2489266631,Showroom,Maher Group,2489266631 +53162 Pontiac Trail,,13600,Milford,MI,48381,Oakland,2.80,16-35-451-012,Industrial,56558 Pontiac Trl,"New Hudson, MI 48165-9728",David Kolb,Hines Park Ford,2484376700,Warehouse,Hines Park Ford,2484376700 +1270 N Pontiac Trail,,16000,Walled Lake,MI,48390-3139,Oakland,6.57,17-26-351-014,Industrial,1270 N Pontiac Trail,"Walled Lake, MI 48390-3139",,Professional Movers.com,2489269999,Warehouse,Professional Movers.com,2489269999 +4715 Product Dr,,12000,Wixom,MI,48393,Oakland,1.94,16-36-451-015,Industrial,28920 Vintage Dr,"New Hudson, MI 48165 ",,Jim Wisti,2484377517,Warehouse,Jim Wisti,2484377517 +4715 Product Dr,,10918,Wixom,MI,48393,Oakland,7.59,16-36-451-015,Industrial,28920 Vintage Dr,"New Hudson, MI 48165 ",,Jim Wisti,2484377517,Warehouse,Jim Wisti,2484377517 +28780 Reilly Rd,,11400,New Hudson,MI,48165,Oakland,2.22,21-11-251-025,Industrial,28780 Reilly Rd,"New Hudson, MI 48165",,JOHN KNAPP,2483882992,Warehouse,JOHN KNAPP,2483882992 +30029 Research Dr,,14440,New Hudson,MI,48165-8548,Oakland,1.05,21-03-401-008,Flex,30029 Research Dr,"New Hudson, MI 48165-8548",Aaron Hoffmann,American Temperature Service Inc,2483485133,R&D,American Temperature Service Inc,2483485133 +30158 Research Dr,,11142,New Hudson,MI,48165,Oakland,1.26,21-03-253-010,Industrial,,,,,,Warehouse,Dbl Properties Llc, +30163 Research Dr,,17739,New Hudson,MI,48165,Oakland,3.34,21-03-253-002,Industrial,,,,,,Warehouse,Wdkk Development Llc, +22325 Roethel Dr,,15957,Novi,MI,48375-4710,Oakland,2.18,22-35-127-017,Industrial,,,,,,Warehouse,Holloway Investments Llc, +46590 Ryan Ct,,10120,Novi,MI,48377,Oakland,1.80,22-04-376-002,Flex,46590 Ryan Ct,"Novi, MI 48377 ",,SUN-TEC Corporation,2486693100,Light Manufacturing,SUN-TEC Corporation,2486693100 +28200 Samuel Linden Ct,,11089,Novi,MI,48377,Oakland,3.98,22-09-300-046,Industrial,,,,,,Warehouse,Tiny's Properties Llc, +28200 W Samuel Linden Ct,,13320,Novi,MI,48377,Oakland,3.98,22-09-300-047,Industrial,30660 W 8 Mile Rd,"Farmington Hills, MI 48336",Thomas Earle,PISI Industrial LLC,,Warehouse,PISI Industrial LLC, +25555-25701 Seeley Rd,Novi Mfg (U-Haul),10921,Novi,MI,48375-2053,Oakland,6.83,22-24-100-006,Industrial,2721 N Central Ave Suite # 500,"Phoenix, AZ 85004-1127",,U Haul Real Estate Co.,6022636555,Warehouse,U Haul Real Estate Co.,6022636555 +4922 Technical Dr,"George Landry, Inc.",10450,Milford,MI,48381-3950,Oakland,2.00,16-35-351-020,Industrial,,,,,,Warehouse,Martin Preston Development, +4935 Technical Dr,,11142,Milford,MI,48381,Oakland,2.01,16-35-351-022,Industrial,,,,,,Warehouse,NESBIT VAUGHAN B RT, +4936 Technical Dr,,15341,Milford,MI,48381-3950,Oakland,2.50,16-35-351-019,Industrial,,,,,,Warehouse,Arthurs Michigan Group, +52365 Ten Mile Rd,,18000,South Lyon,MI,48178-9757,Oakland,,21-25-100-015,Flex,32233 Schoolcraft,"Livonia, MI 48150",Gareth Zebley,"Cambrian Of Lyon, LLC",5175360298,,"Cambrian Of Lyon, LLC",5175360298 +42780 W Ten Mile Rd,,15000,Novi,MI,48375,Oakland,7.42,22-23-376-013,Industrial,2245 Keith Rd,"West Bloomfield, MI 48324",Mark Garmo,Mark Garmo,2483663052,Warehouse,Mark Garmo,2483663052 +42950 W Ten Mile Rd,K & P Sheward,14400,Novi,MI,48375,Oakland,1.00,22-23-351-050,Industrial,1334 Maplelawn Dr,"Troy, MI 48084-5341",Darren Frankel,Stuart Frankel Development Co.,2486492924,Manufacturing,Stuart Frankel Development Co.,2486492924 +1699 Traditional Dr,,10000,Commerce Township,MI,48390-2973,Oakland,0.88,17-33-226-022,Industrial,1699 Traditional Dr,"Commerce Township, MI 48390-2973",Robert Savage,Buildmaster Inc,2489600033,Warehouse,Buildmaster Inc,2489600033 +25005 Trans-X Rd,,11218,Novi,MI,48375-2437,Oakland,2.09,22-23-326-013,Industrial,25005 Trans-X Rd,"Novi, MI 48375-2437",,Monte Costella & Co.,2483477744,Warehouse,Monte Costella & Co.,2483477744 +25220 Trans-X Rd,Trans X,13250,Novi,MI,48375-2440,Oakland,6.06,22-23-151-034,Industrial,25220 Trans-X Rd,"Novi, MI 48375-2440",Alan Wormser,Barry's Lets Rent It,2488550480,Warehouse,Barry's Lets Rent It,2488550480 +25285 Trans-X Rd,,14925,Novi,MI,48375-2441,Oakland,2.99,22-23-151-030,Industrial,25285 Trans-X Rd,"Novi, MI 48375-2441",Terry Sweeney,Sweeney Concrete Material,2483741111,Warehouse,Sweeney Concrete Material,2483741111 +57425 Travis Rd,,11000,New Hudson,MI,48165-9753,Oakland,2.00,21-09-276-002,Industrial,7774 Bentgrass,"Howell, MI 48843 ",Joe Bonadeo,"DENA Investments, LLC",,Warehouse,"DENA Investments, LLC", +57450 Travis Rd,,14500,New Hudson,MI,48165,Oakland,2.00,21-09-226-015,Flex,57450 Travis Rd,"New Hudson, MI 48165",Douglas Ross,Networks Enterprises Inc,2484468590,,Networks Enterprises Inc,2484468590 +50706 Varsity Ct,,17434,Wixom,MI,48393-2072,Oakland,4.02,22-06-101-050,Flex,47757 West Rd Suite # C-103,"Wixom, MI 48393 ",,GMT Logistics,2483478889,R&D,GMT Logistics,2483478889 +22635 Venture Dr,,11979,Novi,MI,48375-4182,Oakland,1.35,22-26-401-030,Industrial,22635 Venture Dr,"Novi, MI 48375-4182",,Bollfilter Corporation,2487738200,Manufacturing,Bollfilter Corporation,2487738200 +22920 Venture Dr,,10318,Novi,MI,48375-4188,Oakland,1.40,22-26-401-040,Flex,500 S Harvey St,"Plymouth, MI 48170",Bill Lawton,Community Financial Credit Union,7344531200,R&D,Community Financial Credit Union,7344531200 +22960 Venture Dr,Bldg B,16880,Novi,MI,48375-4188,Oakland,1.86,22-26-401-039,Industrial,38281 Schoolcraft Rd Suite # H,"Livonia, MI 48150-5052",,Aidata USA Co Ltd.,2483800578,Distribution,Aidata USA Co Ltd.,2483800578 +23000 Venture Dr,Bldg A,16800,Novi,MI,48375-4186,Oakland,1.60,22-26-401-034,Industrial,,,,"J & L Ventures, LLC",,Manufacturing,"J & L Ventures, LLC", +41144 Vincenti Ct,Automatic Value,14650,Novi,MI,48375-1922,Oakland,1.03,22-24-100-033,Industrial,35980 Industrial Rd Suite # A-4,"Livonia, MI 48150-1274",,ATEQ Corp.,7348383100,Warehouse,ATEQ Corp.,7348383100 +41216 Vincenti Ct,,16401,Novi,MI,48375-1925,Oakland,1.03,22-24-100-035,Industrial,25200 W Six Mile Rd,"Redford, MI 48240 ",Charles Schweiger,Drum Handlers Inc,3135348034,Warehouse,Drum Handlers Inc,3135348034 +41249-41255 Vincenti Ct,Moshler,14400,Novi,MI,48375-1927,Oakland,1.30,22-24-100-024,Flex,18184 Buckingham Ave,"Beverly Hills, MI 48025 ",Kirk Nicola,"Paw Print Inn, Inc",,Light Manufacturing,"Paw Print Inn, Inc", +41252 Vincenti Ct,,11376,Novi,MI,48375-1925,Oakland,1.03,22-24-100-036,Flex,42300 W 9 Mile Rd,"Novi, MI 48375-4103",Raffi Kuredjian,"Lathrup Industries, Inc.",2483491009,Telecom Hotel/Data Hosting,"Lathrup Industries, Inc.",2483491009 +41287 Vincenti Ct,,10168,Novi,MI,48375-1927,Oakland,1.13,22-24-100-023,Industrial,38281 Schoolcraft Rd Suite # M,"Livonia, MI 48150-5052",Mark Prokurat,"Silver-Clip, LLC",7343546551,Warehouse,"Silver-Clip, LLC",7343546551 +41290-41292 Vincenti Ct,,14427,Novi,MI,48375-1925,Oakland,1.03,22-24-100-037,Industrial,1146 Chestnut Ln S,"South Lyon, MI 48178",,Kevin James VanOrd,2484269108,Warehouse,Kevin James VanOrd,2484269108 +41326 Vincenti Ct,Cummins,14300,Novi,MI,48375-1926,Oakland,1.03,22-24-100-038,Industrial,53435 Grand River Ave,"New Hudson, MI 48165 ",,Raymon Wilkinson,2484865115,Warehouse,Raymon Wilkinson,2484865115 +41365-41367 Vincenti Ct,,11000,Novi,MI,48375-1928,Oakland,1.10,22-24-100-048,Industrial,347 N Main St,"Milford, MI 48381-1924",,Hawthorne Management Co.,2482587777,Warehouse,Hawthorne Management Co.,2482587777 +41369 Vincenti Ct,,12464,Novi,MI,48375-1928,Oakland,1.37,22-24-100-047,Flex,41131-41135 Vincenti Ct,"Novi, MI 48375-1924",Thomas Rzeznik,Danlaw,2484765571,Light Manufacturing,Danlaw,2484765571 +2750 W Maple,,10325,Commerce Township,MI,48390-3838,Oakland,1.48,17-36-100-027,Industrial,2750 W Maple,"Commerce Township, MI 48390-3838",Bob Keslacy,B K Imported Auto Care Inc,2489607715,Warehouse,B K Imported Auto Care Inc,2489607715 +2287 E W Maple,,15990,Commerce Township,MI,48390-3829,Oakland,2.27,17-25-376-028,Industrial,28975 Orchard Lake Rd,"Farmington Hills, MI 48333",,U.S. Tool & Cutter,2485537745,Service,U.S. Tool & Cutter,2485537745 +2325 E W Maple,,13084,Commerce Township,MI,48390-3831,Oakland,2.02,17-25-376-021,Industrial,2325 Maple Rd,"Birmingham, MI 48009 ",,Kenneth W McQuillan,,Warehouse,Kenneth W McQuillan, +28776 Wall St,,11540,Wixom,MI,48393-3516,Oakland,0.86,22-08-177-008,Industrial,"43000 W 9 Mile Rd Suite # 302, 306","Novi, MI 48375-4175",Ying Li,Brightlines,2483806688,Warehouse,Brightlines,2483806688 +28930 Wall St,,10056,Wixom,MI,48393-3520,Oakland,0.76,22-08-177-003,Industrial,10638-10662 Northend Ave,"Oak Park, MI 48220-2137",,Robin Aire Heating & Cooling,2485413300,Manufacturing,Robin Aire Heating & Cooling,2485413300 +29001 Wall St,,14368,Wixom,MI,48393-3523,Oakland,9.50,22-08-176-001,Industrial,29001 Wall St,"Wixom, MI 48393-3523",,Walter Toebe Construction Company,2483497500,Warehouse,Walter Toebe Construction Company,2483497500 +29249 Wall St,,16210,Wixom,MI,48393-3527,Oakland,1.31,22-08-126-010,Industrial,9414 Peer Rd,"South Lyon, MI 48179",,Steven P Russell,2484869703,Warehouse,Steven P Russell,2484869703 +29305-29335 Wall St,,12114,Wixom,MI,48393-3529,Oakland,0.64,22-08-126-012,Industrial,29305 Wall St,"Wixom, MI 48393-3529",James Holton,James N & Camille M Holton,2485798722,Manufacturing,James N & Camille M Holton,2485798722 +3170 Walnut Lake Ct,,10500,Commerce Township,MI,48390-1743,Oakland,1.80,17-25-226-025,Industrial,3170 Walnut Lake Rd,"Commerce Township, MI 48390-1743",,Fisher Fuel,2486244449,Warehouse,Fisher Fuel,2486244449 +3181 Walnut Lake Ct,,14160,Commerce Township,MI,48390-1744,Oakland,1.77,17-25-226-031,Industrial,3181 Walnut Lake Ct,"Commerce Township, MI 48390-1744",Lena Moore,Club Pet Inc.,2486694501,Warehouse,Club Pet Inc.,2486694501 +3200 Walnut Lake Ct,,16960,Commerce Township,MI,48390-1745,Oakland,1.86,17-25-226-030,Industrial,,,Satish Tummala,"Tummala, Satish",2486686793,Warehouse,"Tummala, Satish",2486686793 +46969 West Rd,,16080,Wixom,MI,48393,Oakland,1.44,22-09-102-012,Industrial,1411 West Lake Dr,"Novi, MI 48377",Michael Condon,Michael Condon,2486698830,Warehouse,Michael Condon,2486698830 +47850-47874 West Rd,Bldg 2,16370,Wixom,MI,48393-3667,Oakland,4.44,22-05-476-029,Industrial,S Emerson,"Brighton, MI 48116",Manesh Shah,Manesh Shah,,Warehouse,Manesh Shah, +47974-47998 West Rd,Bldg 3,11356,Wixom,MI,48393-3669,Oakland,4.18,22-05-476-029,Industrial,12336 W Emerson Dr,"Brighton, MI 48116",Manesh Shah,General Chemical Corporation,2485875600,Warehouse,General Chemical Corporation,2485875600 +48090 West Rd,,10421,Wixom,MI,48393,Oakland,3.62,22-05-476-050,Industrial,,,,,,Warehouse,, +48141-48143 West Rd,,16400,Wixom,MI,48393,Oakland,1.00,22-08-200-006,Industrial,1771 Long Lake Shore Dr,"Bloomfield Hills, MI 48302 ",Pjeter Stanaj,Pjeter Stanaj,2483386660,Warehouse,Pjeter Stanaj,2483386660 +48145-48147 West Rd,,15378,Wixom,MI,48393,Oakland,5.00,22-08-200-006,Industrial,1771 Long Lake Shore Dr,"Bloomfield Hills, MI 48302 ",Pjeter Stanaj,Pjeter Stanaj,2483386660,Warehouse,Pjeter Stanaj,2483386660 +48152 West Rd,,14350,Wixom,MI,48393,Oakland,1.29,22-05-476-055,Industrial,23179 Telegraph Rd,"Southfield, MI 48033-4126",Darryl Rogers,International Development Company,2483534800,Warehouse,International Development Company,2483534800 +48168 West Rd,,13263,Wixom,MI,48393-3673,Oakland,0.93,22-05-476-054,Industrial,23179 Telegraph Rd,"Southfield, MI 48033-4126",Darryl Rogers,International Development Company,2483534800,Warehouse,International Development Company,2483534800 +48473 West Rd,Build to Suit,11850,Wixom,MI,48393,Oakland,2.74,22-08-100-064,Industrial,,,,,,,, +48553 West Rd,,13080,Wixom,MI,48393-3537,Oakland,2.43,22-08-100-049,Industrial,29350 Wall St,"Wixom, MI 48393-3528",Vivek Bedi,"2V Industries, Inc.",2486247943,Warehouse,"2V Industries, Inc.",2486247943 +49175-49201 West Rd,,16700,Wixom,MI,48393-3552,Oakland,1.91,22-08-100-029,Industrial,,,,,,Manufacturing,49175 West Road Llc, +49287-49295 West Rd,,13000,Wixom,MI,48393-3553,Oakland,2.00,22-08-100-056,Industrial,49287-49295 West Rd,"Wixom, MI 48393-3553",Wes Umlor,Diffin-Umlor & Associates,2484377803,Warehouse,Diffin-Umlor & Associates,2484377803 +1625 E West Maple Rd,,10845,Walled Lake,MI,48390-3772,Oakland,1.32,17-35-126-010,Industrial,1754 Fairway Dr,"Birmingham, MI 48009-1866",,Armando C Decapite,2482588919,Manufacturing,Armando C Decapite,2482588919 +2065 E West Maple Rd,Bldg C,11000,Commerce Township,MI,48390-3858,Oakland,6.95,17-26-476-011,Flex,5373 Pontiac Trl,"West Bloomfield, MI 48323-1562",,Commerce Place,2486262628,Light Distribution,Commerce Place,2486262628 +2075 E West Maple Rd,Bldg B,11000,Commerce Township,MI,48390-3816,Oakland,6.95,17-26-476-011,Flex,5373 Pontiac Trl,"West Bloomfield, MI 48323-1562",,Commerce Place,2486262628,Light Distribution,Commerce Place,2486262628 +2085 E West Maple Rd,Bldg A,11258,Commerce Township,MI,48390-3802,Oakland,6.95,17-26-476-011,Flex,5373 Pontiac Trl,"West Bloomfield, MI 48323-1562",Laurie Cunnington,Commerce Place,2486262628,,Commerce Place,2486262628 +2420 E West Maple Rd,,10800,Commerce Township,MI,48390-3832,Oakland,2.60,17-36-100-031,Industrial,2280 E W Maple,"Commerce Township, MI 48390-3828",Gregg Williams,Williams International,2486245200,Warehouse,Williams International,2486245200 +1200 W West Maple Rd,,10880,Walled Lake,MI,48390,Oakland,2.00,17-34-151-011,Industrial,1060 W Maple Rd,"Walled Lake, MI 48390-2935",,Dedoes,2486247710,Manufacturing,Dedoes,2486247710 +1502 W West Maple Rd,,10000,Walled Lake,MI,48390,Oakland,0.33,17-33-276-013,Industrial,1502 W West Maple Rd,"Walled Lake, MI 48390 ",Brian Vieaux,Casey's Of Walled Lake,2486695200,Warehouse,Casey's Of Walled Lake,2486695200 +29632 West Tech Dr,,11325,Wixom,MI,48393-3561,Oakland,1.28,22-05-351-014,Industrial,,,Russell Taylor,Russell Taylor,,Warehouse,Russell Taylor, +29659 West Tech Dr,,17864,Wixom,MI,48393-3561,Oakland,1.25,22-05-352-008,Industrial,150 W Jefferson,"Detroit, MI 48226 ",,"Commercial Properties III, LLC",2489606800,Manufacturing,"Commercial Properties III, LLC",2489606800 +29706 West Tech Dr,,12031,Wixom,MI,48393-3562,Oakland,1.48,22-05-351-012,Industrial,31475 Myrna St,"Livonia, MI 48154",Darin Dingman,Darin Dingman,,Warehouse,Darin Dingman, +30700 Wixom Rd,Aramark,16068,Wixom,MI,48393-2416,Oakland,2.13,22-05-106-032,Industrial,49397 Schafer Ave,"Wixom, MI 48393 ",William Clark,Maple Technology Centre LLC,2486246140,Warehouse,Maple Technology Centre LLC,2486246140 +28930 S Wixom Rd,,14000,Wixom,MI,48393,Oakland,8.50,22-08-100-013,Flex,4840 Wyoming St,"Dearborn, MI 48126-3723",Carl Bumgardner,"Royal Truck & Trailer Sales & Service, Inc.",3138464000,,"Royal Truck & Trailer Sales & Service, Inc.",3138464000 +29020 S Wixom Rd,,17999,Wixom,MI,48393,Oakland,3.19,22-08-100-059,Flex,29020 S Wixom Rd,"Wixom, MI 48393",Jeffery Weinger,"Retail & Commercial Construction, Inc.",2483449900,Light Manufacturing,"Retail & Commercial Construction, Inc.",2483449900 +30178 S Wixom Rd,"Rockwell Medical, Inc.",17240,Wixom,MI,48393,Oakland,0.50,22-05-301-002,Industrial,23179 Telegraph Rd,"Southfield, MI 48033-4126",Darryl Rogers,International Development Company,2483534800,Manufacturing,International Development Company,2483534800 +30681-30691 S Wixom Rd,,15229,Wixom,MI,48393-2415,Oakland,2.63,22-06-200-046,Industrial,30681-30691 S Wixom Rd,"Wixom, MI 48393-2415",Lake Nelson,MICHIGAN HARDWOOD DISTRIBUTORS,2486690790,Manufacturing,MICHIGAN HARDWOOD DISTRIBUTORS,2486690790 +30687 S Wixom Rd,,12000,Wixom,MI,48393,Oakland,2.63,22-06-200-010,Industrial,1561 Chanticlair Cir,"Wixom, MI 48393",Adella Nelson,Nelson Talle Properties Llc,2486246135,Warehouse,Nelson Talle Properties Llc,2486246135 +48932 Wixom Tech Dr,,16205,Wixom,MI,48393,Oakland,4.02,22-05-351-010,Industrial,375 Park Ave Suite # 1709,"New York, NY 10152-0002",,"Clayton, Dubilier & Rice",2124075200,Warehouse,"Clayton, Dubilier & Rice",2124075200 +48985 Wixom Tech Dr,,17125,Wixom,MI,48393-3557,Oakland,1.71,22-05-351-007,Industrial,48985 Wixom Tech Dr Suite # 1st,"Wixom, MI 48393-3557",Randy Stevens,"Lee Stevens Machinery, Inc.",2489268400,Warehouse,"Lee Stevens Machinery, Inc.",2489268400 +49113 Wixom Tech Dr,,14156,Wixom,MI,48393-3559,Oakland,1.01,22-05-351-003,Industrial,28065 Oakland Oaks Ct,"Wixom, MI 48393 ",Yassin Burgol,Yassin Burgol,2486681111,Manufacturing,Yassin Burgol,2486681111 +49145 Wixom Tech Dr,,12836,Wixom,MI,48393-3569,Oakland,1.94,22-05-351-002,Industrial,29532 Southfiled Rd Suite # 201,"Southfield, MI 48076",,Douglas Capital Partners,2486557902,Warehouse,Douglas Capital Partners,2486557902 +Yew Dr,Lot 2 Proposed Building,10000,Milford,MI,48381,Oakland,,16-25-100-062,Industrial,,,,,,Warehouse,"Fyke Street Properties, LLC",2486350123 +3130 E Oakley Park Rd,,13000,Walled Lake,MI,48390,Oakland,0.80,17-24-226-003,Industrial,3170 Oakley Park Rd,"Walled Lake, MI 48390",,Marotta Company,2486699170,Warehouse,Marotta Company,2486699170 +21043 Old Novi Rd,,14755,Northville,MI,48167-2527,Oakland,1.43,22-34-477-003,Industrial,21043 Old Novi Rd,"Northville, MI 48167-2527",,Northville Fabricating Inc.,,Warehouse,Northville Fabricating Inc., \ No newline at end of file diff --git a/data/i96e.csv b/data/i96e.csv new file mode 100644 index 0000000..3c287d8 --- /dev/null +++ b/data/i96e.csv @@ -0,0 +1,302 @@ +Description Address L Name,Property Address L Custom Building Address,Property Name L Custom Property Name,RBA L Custom SF Building,Property Address P,City P,State P,No Zip,Zip P,County Name C Territory,Land Area (AC) L Custom,Parcel Number L Custom,Property Type L Tag,True Owner Address C Address: Main Address 1 Full Adress,True Owner City State Zip C Address: Main City,True Owner Contact P Full Name,True Owner Name L Custom True Owner,True Owner Phone P Work,Secondary Type L Custom,Owner Name L Custom Owners Name,Owner Phone L owner Phone,Owner Name Name C Name,Assignee L Assignee,C Tag Industrial,Market Area L Custom,Owner C Tag,Status L,C Description +47677-47695 Avante Dr Wixom MI 48393,47677-47695 Avante Dr Wixom MI 48393,,"11,600",47677-47695 Avante Dr,Wixom,MI,48393-3697,48393,Oakland County,0.98,22-08-200-031,Industrial,47695 Avante Dr,"Wixom, MI 48393 ",,"Gateway Management Company, LLC",(248) 921-4260,Warehouse,,,"Gateway Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28033 Center Oaks Ct Wixom MI 48393,28033 Center Oaks Ct Wixom MI 48393,,"12,200",28033 Center Oaks Ct,Wixom,MI,48393-3344,48393,Oakland County,1.05,22-07-326-018,Industrial,7125 Orchard Lake Rd Suite # 306,"West Bloomfield, MI 48322 ",Lewis Wagner,"Star Builders, Inc.",(248) 865-3010,Light Manufacturing,,,"Star Builders, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +45295 Grand River Ave Novi MI 48375,45295 Grand River Ave Novi MI 48375,,"10,540",45295 Grand River Ave,Novi,MI,48375-1019,48375,Oakland County,1.66,22-15-351-044,Industrial,,,,,,Warehouse,,,Diversified Deveveloping Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2175 Fyke Dr Milford MI 48381,2175 Fyke Dr Milford MI 48381,,"15,000",2175 Fyke Dr,Milford,MI,48381,48381,Oakland County,3.64,16-25-100-060,Industrial,47133 W 9 Mile Rd,"Novi, MI 48374 ",Amar Abro,Amar Abro,(903) 220-8725,Manufacturing,,,Amar Abro,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55800 Grand River Ave New Hudson MI 48165,55800 Grand River Ave New Hudson MI 48165,Unit 31A,"10,800",55800 Grand River Ave,New Hudson,MI,48165-8711,48165,Oakland County,2.35,21-03-402-018,Industrial,55800 Grand River Ave Suite # 150,"New Hudson, MI 48165",Mark Evangelista,Evangelista Corporation,(248) 888-0400,Light Manufacturing,,,Evangelista Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25873-25921 Meadowbrook Rd Novi MI 48375,25873-25921 Meadowbrook Rd Novi MI 48375,Building 4,"17,726",25873-25921 Meadowbrook Rd,Novi,MI,48375-1851,48375,Oakland County,2.31,22-23-230-004,Industrial,41200-41218 Bridge St,"Novi, MI 48375",Bill McKeever,Certified Management,(248) 476-6700,R&D,,,Certified Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25460 Trans X Rd Novi MI 48375,25460 Trans X Rd Novi MI 48375,,"12,907",25460 Trans X Rd,Novi,MI,48375,48375,Oakland County,1.5,22-23-151-027,Industrial,45605 W 9 Mile Rd,"Novi, MI 48374",Defrim Cizmja,"Cizmja, Defrim",(248) 767-5062,Warehouse,,,"Cizmja, Defrim",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41180 Vincenti Ct Novi MI 48375,41180 Vincenti Ct Novi MI 48375,,"14,440",41180 Vincenti Ct,Novi,MI,48375-1922,48375,Oakland County,1.03,22-24-100-034,Industrial,4038 Foxpointe Dr,"West Bloomfield, MI 48323 ",Donald Hoexter,Hawthorne Management Co,(281) 298-8840,Manufacturing,,,Hawthorne Management Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2045 E West Maple Rd Commerce Township MI 48390,2045 E West Maple Rd Commerce Township MI 48390,Bldg D,"11,000",2045 E West Maple Rd,Commerce Township,MI,48390-3801,48390,Oakland County,7.77,17-26-476-011,Industrial,2045 E W Maple,"Commerce Township, MI 48390 ",,Cunnington Family Commerce Ltd. Par,,Light Distribution,,,Cunnington Family Commerce Ltd. Par,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +42900 W 9 Mile Rd Novi MI 48375,42900 W 9 Mile Rd Novi MI 48375,,"14,400",42900 W 9 Mile Rd,Novi,MI,48375-4123,48375,Oakland County,0.8,22-26-376-020,Industrial,,,,,,Warehouse,,,GRUTZA LIV TRUST,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +43700 W 12 Mile Rd Novi MI 48377,43700 W 12 Mile Rd Novi MI 48377,,"15,400",43700 W 12 Mile Rd,Novi,MI,48377,48377,Oakland County,,22-10-400-053,Industrial,29850-29864 Northwestern Hwy,"Southfield, MI 48034",Amer Asmar,Amer Asmar,(248) 557-5454,Warehouse,,,Amer Asmar,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46845 W 12 Mile Rd Novi MI 48377,46845 W 12 Mile Rd Novi MI 48377,Cougar Cutting Products,"14,000",46845 W 12 Mile Rd,Novi,MI,48377-3200,48377,Oakland County,1.49,22-16-126-013,Industrial,P.O. Box 508,"Novi, MI 48376",Martin Schmitt,Beck Property Management,(248) 348-8864,Warehouse,,,Beck Property Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30503-30505 Andersen Ct Wixom MI 48393,30503-30505 Andersen Ct Wixom MI 48393,,"12,000",30503-30505 Andersen Ct,Wixom,MI,48393,48393,Oakland County,0.85,22-05-276-004,Industrial,333 Osprey St,"Walled Lake, MI 48390 ",,"A.I. Properties, LLC",(248) 669-1075,Warehouse,,,"A.I. Properties, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47840 Anna Ct Wixom MI 48393,47840 Anna Ct Wixom MI 48393,,"13,585",47840 Anna Ct,Wixom,MI,48393-3687,48393,Oakland County,1.05,22-08-227-021,Industrial,47840 Anna Ct,"Wixom, MI 48393",Mike Murray,Lyons Tool & Manufacturing Corporation,(248) 344-9644,Manufacturing,,,Lyons Tool & Manufacturing Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48009 Anna Ct Wixom MI 48393,48009 Anna Ct Wixom MI 48393,,"12,000",48009 Anna Ct,Wixom,MI,48393,48393,Oakland County,1.28,22-08-227-019,Industrial,1395 Energy Way,"Highland, MI 48357",George Gudzinski,Commercial Fabricating,(248) 887-1595,Warehouse,,,Commercial Fabricating,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29757 Anthony Dr Wixom MI 48393,29757 Anthony Dr Wixom MI 48393,,"14,314",29757 Anthony Dr,Wixom,MI,48393-3606,48393,Oakland County,1,22-05-476-037,Industrial,29757 Anthony Dr,"Wixom, MI 48393",Michael Kuehnl,"Kuehnl, Michael H",(248) 867-1689,Warehouse,,,"Kuehnl, Michael H",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29769 Anthony Dr Wixom MI 48393,29769 Anthony Dr Wixom MI 48393,,"12,920",29769 Anthony Dr,Wixom,MI,48393-3606,48393,Oakland County,0.93,22-05-476-036,Industrial,,,,,,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47400 Avante Dr Wixom MI 48393,47400 Avante Dr Wixom MI 48393,,"12,714",47400 Avante Dr,Wixom,MI,48393-3615,48393,Oakland County,1.94,22-08-200-028,Industrial,47400 Avante Dr,"Wixom, MI 48393",Daniel Booth,Nostalgic Motor Cars,(248) 349-4884,Warehouse,,,Nostalgic Motor Cars,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28214 Beck Rd Wixom MI 48393,28214 Beck Rd Wixom MI 48393,R & K Tool,"17,200",28214 Beck Rd,Wixom,MI,48393-3623,48393,Oakland County,1.84,22-09-300-036,Industrial,28214 Beck Rd,"Wixom, MI 48393",,Professional Sprinkler Incorporated,(248) 349-5740,Manufacturing,,,Professional Sprinkler Incorporated,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28294 Beck Rd Wixom MI 48393,28294 Beck Rd Wixom MI 48393,,"16,380",28294 Beck Rd,Wixom,MI,48393-3623,48393,Oakland County,1.87,22-09-300-034,Industrial,2550 E Buno Rd,"Milford, MI 48381 ",,Preventive Maintenance Tech,(248) 374-6405,Warehouse,,,Preventive Maintenance Tech,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28381 Beck Rd Wixom MI 48393,28381 Beck Rd Wixom MI 48393,Bldg K,"13,560",28381 Beck Rd,Wixom,MI,48393-4731,48393,Oakland County,0.85,22-08-426-028,Industrial,28345 Beck Rd Suite # 100,"Wixom, MI 48393",Charley Damas,Canton Business Center,(248) 344-8970,Light Manufacturing,,,Canton Business Center,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28389 Beck Rd Wixom MI 48393,28389 Beck Rd Wixom MI 48393,Bldg J,"14,000",28389 Beck Rd,Wixom,MI,48393-4732,48393,Oakland County,1.68,22-08-426-027,Industrial,28345 Beck Rd Suite # 100,"Wixom, MI 48393",Charley Damas,Canton Business Center,(248) 344-8970,Light Manufacturing,,,Canton Business Center,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28700 Beck Rd Wixom MI 48393,28700 Beck Rd Wixom MI 48393,,"16,356",28700 Beck Rd,Wixom,MI,48393-3604,48393,Oakland County,1.73,22-09-152-001,Industrial,39830 Grand River Ave Suite # B1-A,"Novi, MI 48375",,NMB Technologies Corporation,(248) 449-2933,R&D,,,NMB Technologies Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29592 Beck Rd Wixom MI 48393,29592 Beck Rd Wixom MI 48393,,"17,461",29592 Beck Rd,Wixom,MI,48393-2821,48393,Oakland County,1.35,22-04-351-017,Industrial,28265 Beck Rd,"Wixom, MI 48393",Karam Bahnam,USA To Go,(248) 773-7992,Manufacturing,,,USA To Go,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29650 Beck Rd Wixom MI 48393,29650 Beck Rd Wixom MI 48393,,"14,195",29650 Beck Rd,Wixom,MI,48393-2822,48393,Oakland County,1.35,22-04-351-012,Industrial,32367 Eight Mile Rd,"Farmington Hills, MI 48336 ",Donna Dancik,Donna Dancik,(248) 231-8985,Warehouse,,,Donna Dancik,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1006 Benstein Rd Walled Lake MI 48390,1006 Benstein Rd Walled Lake MI 48390,,"12,000",1006 Benstein Rd,Walled Lake,MI,48390-2912,48390,Oakland County,8.56,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,(248) 851-6320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1036 Benstein Rd Walled Lake MI 48390,1036 Benstein Rd Walled Lake MI 48390,,"12,000",1036 Benstein Rd,Walled Lake,MI,48390-2913,48390,Oakland County,8.56,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,(248) 851-6320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1042 Benstein Rd Walled Lake MI 48390,1042 Benstein Rd Walled Lake MI 48390,,"12,000",1042 Benstein Rd,Walled Lake,MI,48390-2914,48390,Oakland County,8.42,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,(248) 851-6320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1046 Benstein Rd Walled Lake MI 48390,1046 Benstein Rd Walled Lake MI 48390,,"12,000",1046 Benstein Rd,Walled Lake,MI,48390-2915,48390,Oakland County,8.56,17-33-226-012,Industrial,28454 Woodward Ave,"Royal Oak, MI 48067",,1006 Benstein Llc,(248) 851-6320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1200 Benstein Rd Commerce Township MI 48390,1200 Benstein Rd Commerce Township MI 48390,,"12,000",1200 Benstein Rd,Commerce Township,MI,48390,48390,Oakland County,7.91,17-28-476-020,Industrial,2078 Winner St,"Commerce Township, MI 48390",Steven Steinway,Preferred Health Products Inc,(248) 669-4300,Warehouse,,,Preferred Health Products Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8601 Boulder Ct Walled Lake MI 48390,8601 Boulder Ct Walled Lake MI 48390,BTV Systems,"14,480",8601 Boulder Ct,Walled Lake,MI,48390,48390,Oakland County,1.52,17-13-300-101,Industrial,8601 Boulder Ct,"Walled Lake, MI 48390 ",,Real Green Systems,(248) 360-5296,Distribution,,,Real Green Systems,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8680 Boulder Ct Walled Lake MI 48390,8680 Boulder Ct Walled Lake MI 48390,,"15,338",8680 Boulder Ct,Walled Lake,MI,48390,48390,Oakland County,2.64,17-13-300-098,Industrial,8700 Boulder Ct,"Walled Lake, MI 48390 ",,Boulder Development Inc,(248) 360-4700,Warehouse,,,Boulder Development Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8681 Boulder Ct Walled Lake MI 48390,8681 Boulder Ct Walled Lake MI 48390,,"12,500",8681 Boulder Ct,Walled Lake,MI,48390,48390,Oakland County,2,17-13-300-100,Industrial,8700 Boulder Ct,"Walled Lake, MI 48390 ",Dave Smith,Boulder Development Inc,(248) 360-4700,Warehouse,,,Boulder Development Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41100 Bridge St Novi MI 48375,41100 Bridge St Novi MI 48375,,"11,920",41100 Bridge St,Novi,MI,48375-1300,48375,Oakland County,0.74,22-13-351-015,Industrial,3565 Bradford Square Dr,"Ann Arbor, MI 48103",John Varick,John F Varick,(734) 904-6211,R&D,,,John F Varick,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41280 Bridge St Novi MI 48375,41280 Bridge St Novi MI 48375,,"16,980",41280 Bridge St,Novi,MI,48375,48375,Oakland County,1.32,22-13-351-021,Industrial,3944 Winterset Ln,"West Bloomfield, MI 48033 ",Taher Rasheed,"Rasheed Family Investments,LLC",(313) 855-3318,R&D,,,"Rasheed Family Investments,LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +Cabot Dr Novi MI 48377,Cabot Dr Novi MI 48377,,"10,000",Cabot Dr,Novi,MI,48377,48377,Oakland County,2.4,22-12-200-054,Industrial,,,,,,,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28350 Cabot Dr Novi MI 48377,28350 Cabot Dr Novi MI 48377,,"12,014",28350 Cabot Dr,Novi,MI,48377-2919,48377,Oakland County,3.67,22-12-400-047,Industrial,39000 Country Club Dr,"Farmington Hills, MI 48331 ",,Northern Equities Management Company,(248) 848-6400,,,,Northern Equities Management Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29185 Cabot Dr Novi MI 48377,29185 Cabot Dr Novi MI 48377,,"12,230",29185 Cabot Dr,Novi,MI,48377-2936,48377,Oakland County,2.48,22-12-200-028,Industrial,39000 Country Club Dr,"Farmington Hills, MI 48331 ",Neil Sosin,Northern Equities Group,(248) 848-6400,R&D,,,Northern Equities Group,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47119 Cartier Ct Wixom MI 48393,47119 Cartier Ct Wixom MI 48393,,"15,720",47119 Cartier Ct,Wixom,MI,48393-2872,48393,Oakland County,1.31,22-04-152-013,Industrial,26899 Northwestern Hwy Suite # 306,"Southfield, MI 48033 ",Howard Baum,Howard Baum Development Company,(248) 790-3600,Warehouse,,,Howard Baum Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47167 Cartier Ct Wixom MI 48393,47167 Cartier Ct Wixom MI 48393,,"15,895",47167 Cartier Ct,Wixom,MI,48393,48393,Oakland County,2.15,22-04-152-005,Industrial,3641 Loblolly Bay Rd,"Labelle, FL 33935",John Leekley,John Robert Leekley,(313) 506-8129,Distribution,,,John Robert Leekley,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47110 Cartier Dr Wixom MI 48393,47110 Cartier Dr Wixom MI 48393,Dantom,"11,650",47110 Cartier Dr,Wixom,MI,48393,48393,Oakland County,2.01,22-04-151-009,Industrial,326 E 4th St Suite # 200,"Royal Oak, MI 48067",Todd Wyett,Versa Development,(248) 996-1081,Warehouse,,,Versa Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47140 Cartier Dr Wixom MI 48393,47140 Cartier Dr Wixom MI 48393,,"13,650",47140 Cartier Dr,Wixom,MI,48393-2876,48393,Oakland County,3.61,22-04-151-008,Industrial,47140 Cartier Dr,"Wixom, MI 48393",Craig O'Donnell,"AEL Michigan, LLC",(248) 668-4966,Warehouse,,,"AEL Michigan, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28043 Center Oaks Ct Wixom MI 48393,28043 Center Oaks Ct Wixom MI 48393,,"17,500",28043 Center Oaks Ct,Wixom,MI,48393-3344,48393,Oakland County,1.23,22-07-326-041,Industrial,28043 Center Oaks Ct,"Wixom, MI 48393 ",Karen Wilson,"Wersborg, LLC",(248) 960-9586,Warehouse,,,"Wersborg, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28044 Center Oaks Ct Wixom MI 48393,28044 Center Oaks Ct Wixom MI 48393,,"15,140",28044 Center Oaks Ct,Wixom,MI,48393-3343,48393,Oakland County,1.52,22-07-326-037,Industrial,500 Woodward Ave Suite # 3500,"Detroit, MI 48226",Kevin Didio,Clark Hill’s Automotive and Manufacturing Practice,(313) 309-9461,Warehouse,,,Clark Hill’s Automotive and Manufacturing Practice,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28064 Center Oaks Ct Wixom MI 48393,28064 Center Oaks Ct Wixom MI 48393,,"12,186",28064 Center Oaks Ct,Wixom,MI,48393,48393,Oakland County,1.42,22-07-326-022,Industrial,28064 Center Oaks Ct Suite # A,"Wixom, MI 48393 ",Bertran Gili,Metrologic Group Services Inc.,(248) 426-9090,R&D,,,Metrologic Group Services Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50950 Century Ct Wixom MI 48393,50950 Century Ct Wixom MI 48393,,"14,250",50950 Century Ct,Wixom,MI,48393,48393,Oakland County,1.03,22-06-101-060,Industrial,39475 W 13 Mile Rd Suite # 205,"Novi, MI 48377",Chad Zamler,Zamler Development,(248) 835-9003,Warehouse,,,Zamler Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51004 Century Ct Wixom MI 48393,51004 Century Ct Wixom MI 48393,,"14,250",51004 Century Ct,Wixom,MI,48393,48393,Oakland County,1.03,22-06-101-059,Industrial,39475 W 13 Mile Rd Suite # 205,"Novi, MI 48377",Chad Zamler,"Century Construction & Management, LLC",(248) 254-3311,Manufacturing,,,"Century Construction & Management, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51056 Century Ct Wixom MI 48393,51056 Century Ct Wixom MI 48393,,"16,992",51056 Century Ct,Wixom,MI,48393,48393,Oakland County,1.12,22-06-101-058,Industrial,39475 W 13 Mile Rd Suite # 205,"Novi, MI 48377",Chad Zamler,Zamler Development,(248) 835-9003,Manufacturing,,,Zamler Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30587 Century Dr Wixom MI 48393,30587 Century Dr Wixom MI 48393,Zimmerman,"13,222",30587 Century Dr,Wixom,MI,48393-2062,48393,Oakland County,1.87,22-06-101-011,Industrial,,,,,,Warehouse,,,Fz Re Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +31267 Century Dr Wixom MI 48393,31267 Century Dr Wixom MI 48393,,"17,000",31267 Century Dr,Wixom,MI,48393-2065,48393,Oakland County,1.11,22-06-101-001,Industrial,33527-33529 7 Mile Rd,"Livonia, MI 48152",,Gargaro Construction Company,(248) 473-4141,Warehouse,,,Gargaro Construction Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2299 Childs Lake Rd Milford MI 48381,2299 Childs Lake Rd Milford MI 48381,Bills Tree,"11,900",2299 Childs Lake Rd,Milford,MI,48381,48381,Oakland County,6.59,16-24-101-002,Industrial,2299 Childs Lake Rd,"Milford, MI 48381 ",Mike Bockelman,Bockelman Development,(800) 878-2876,Manufacturing,,,Bockelman Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1287 S Commerce Rd Walled Lake MI 48390,1287 S Commerce Rd Walled Lake MI 48390,AT&T,"10,072",1287 S Commerce Rd,Walled Lake,MI,48390,48390,Oakland County,2.26,17-27-451-002,Industrial,3566 Michael Ave SW,"Grand Rapids, MI 49509 ",,Mi Bell Telephone Co,(616) 530-5600,Telecom Hotel/Data Hosting,,,Mi Bell Telephone Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2599 Crumb Rd Walled Lake MI 48390,2599 Crumb Rd Walled Lake MI 48390,Elsey Construction Products,"18,000",2599 Crumb Rd,Walled Lake,MI,48390-2814,48390,Oakland County,5,17-25-326-008,Industrial,2599 Crumb Rd,"Walled Lake, MI 48390",,Elsey Construction Products,(248) 624-8177,Warehouse,,,Elsey Construction Products,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1011 Decker Rd Walled Lake MI 48390,1011 Decker Rd Walled Lake MI 48390,,"12,100",1011 Decker Rd,Walled Lake,MI,48390-3219,48390,Oakland County,2.25,17-35-126-016,Industrial,1 Towne Sq Suite # 1835,"Southfield, MI 48076",,Siegel & Greenfield,(248) 386-5900,Manufacturing,,,Siegel & Greenfield,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50322 Dennis Ct Wixom MI 48393,50322 Dennis Ct Wixom MI 48393,Scott's Lawn Service,"18,000",50322 Dennis Ct,Wixom,MI,48393-2025,48393,Oakland County,3.51,17-31-352-006,Industrial,,,,,,Warehouse,,,Shs Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50384-50388 Dennis Ct Wixom MI 48393,50384-50388 Dennis Ct Wixom MI 48393,Bldg G,"10,783",50384-50388 Dennis Ct,Wixom,MI,48393-2025,48393,Oakland County,1.02,17-31-352-004,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322",Kelly Woodley,"First Holding Management Company, LLC",(248) 855-3330,Warehouse,,,"First Holding Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50400 Dennis Ct Wixom MI 48393,50400 Dennis Ct Wixom MI 48393,,"11,525",50400 Dennis Ct,Wixom,MI,48393-2048,48393,Oakland County,1.2,17-31-352-002,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322",Kelly Woodley,"First Holding Management Company, LLC",(248) 855-3330,Light Manufacturing,,,"First Holding Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50420 Dennis Ct Wixom MI 48393,50420 Dennis Ct Wixom MI 48393,,"10,383",50420 Dennis Ct,Wixom,MI,48393-2076,48393,Oakland County,0.69,17-31-352-001,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322",Kelly Woodley,"First Holding Management Company, LLC",(248) 855-3330,Warehouse,,,"First Holding Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50200-50210 Dennis Industrial Ct Wixom MI 48393,50200-50210 Dennis Industrial Ct Wixom MI 48393,Bldg D,"13,417",50200-50210 Dennis Industrial Ct,Wixom,MI,48393-2021,48393,Oakland County,0.69,17-31-352-009,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322",Kelly Woodley,"First Holding Management Company, LLC",(248) 855-3330,Warehouse,,,"First Holding Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50240-50250 Dennis Industrial Ct Wixom MI 48393,50240-50250 Dennis Industrial Ct Wixom MI 48393,Bldg F,"15,504",50240-50250 Dennis Industrial Ct,Wixom,MI,48393-2024,48393,Oakland County,3.51,17-31-352-007,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322",Kelly Woodley,"First Holding Management Company, LLC",(248) 855-3330,Warehouse,,,"First Holding Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50394 Dennis Industrial Pky Wixom MI 48393,50394 Dennis Industrial Pky Wixom MI 48393,Bldg C,"14,000",50394 Dennis Industrial Pky,Wixom,MI,48393-2026,48393,Oakland County,11.81,17-31-352-003,Industrial,6960 Orchard Lake Rd Suite # 300,"West Bloomfield, MI 48322",Kelly Woodley,"First Holding Management Company, LLC",(248) 855-3330,Light Manufacturing,,,"First Holding Management Company, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46470 Desoto Ct Novi MI 48377,46470 Desoto Ct Novi MI 48377,Bldg B,"15,555",46470 Desoto Ct,Novi,MI,48377-1731,48377,Oakland County,1.16,22-04-379-002,Industrial,46470 Desoto Ct,"Novi, MI 48377",Jin Hong,TREK Inc.,(248) 668-2131,Manufacturing,,,TREK Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48575 Downing Dr Wixom MI 48393,48575 Downing Dr Wixom MI 48393,,"10,000",48575 Downing Dr,Wixom,MI,48393-3503,48393,Oakland County,1.65,22-08-100-041,Industrial,331 Metty Dr,"Ann Arbor, MI 48103",Robert Hoffman,Ducks Unlimited Inc,(734) 623-2035,Warehouse,,,Ducks Unlimited Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48590-48596 Downing Dr Wixom MI 48393,48590-48596 Downing Dr Wixom MI 48393,,"16,000",48590-48596 Downing Dr,Wixom,MI,48393-3501,48393,Oakland County,2.17,22-08-100-026,Industrial,30380 S Hill Ct,"New Hudson, MI 48165",Dennis Sinacoloa,Sinacola Construction,(248) 437-9777,Warehouse,,,Sinacola Construction,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48602 Downing Dr Wixom MI 48393,48602 Downing Dr Wixom MI 48393,,"14,909",48602 Downing Dr,Wixom,MI,48393-3504,48393,Oakland County,2,22-08-100-032,Industrial,7205 Deer Lake Rd,"Clarkston, MI 48346",William Hannon,HANNON MARINE STORAGE LLC,(248) 620-6447,Warehouse,,,HANNON MARINE STORAGE LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1925 Easy St Commerce Township MI 48390,1925 Easy St Commerce Township MI 48390,,"10,800",1925 Easy St,Commerce Township,MI,48390-3221,48390,Oakland County,0.9,17-26-426-030,Industrial,1977 E West Maple Rd,"Walled Lake, MI 48390 ",,Advance Plumbing & Heating Supply Co.,(248) 669-7474,Warehouse,,,Advance Plumbing & Heating Supply Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1941-1951 Easy St Commerce Township MI 48390,1941-1951 Easy St Commerce Township MI 48390,,"16,348",1941-1951 Easy St,Commerce Township,MI,48390-3221,48390,Oakland County,1.32,17-26-426-031,Industrial,2175 E W Maple Rd,"Commerce Township, MI 48382",Bruce Bullard,Bruce Bullard,(248) 668-0077,Warehouse,,,Bruce Bullard,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2005-2035 Easy St Commerce Township MI 48390,2005-2035 Easy St Commerce Township MI 48390,,"11,385",2005-2035 Easy St,Commerce Township,MI,48390-3223,48390,Oakland County,0.89,17-26-426-061,Industrial,3646 E Elder Rd,"West Bloomfield, MI 48324 ",Joel Rosenberg,"Easy Street Investments, LLC",(248) 360-9394,Warehouse,,,"Easy Street Investments, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2121 Easy St Commerce Township MI 48390,2121 Easy St Commerce Township MI 48390,,"18,000",2121 Easy St,Commerce Township,MI,48390-3225,48390,Oakland County,1.65,17-26-426-015,Industrial,,,Alan Edelson,Alan Edelson,,Warehouse,,,Alan Edelson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2431 Fyke Dr Milford MI 48381,2431 Fyke Dr Milford MI 48381,,"11,154",2431 Fyke Dr,Milford,MI,48381,48381,Oakland County,5.15,16-25-100-014,Industrial,,,,,,Warehouse,,,Nevada Associates Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8177 Goldie St Walled Lake MI 48390,8177 Goldie St Walled Lake MI 48390,,"10,736",8177 Goldie St,Walled Lake,MI,48390,48390,Oakland County,4.66,17-13-400-009,Industrial,8177 Goldie St,"Walled Lake, MI 48390 ",Richard White,CA Hull Co Inc,(248) 694-8025,Manufacturing,,,CA Hull Co Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8225 Goldie St Commerce Township MI 48390,8225 Goldie St Commerce Township MI 48390,,"14,885",8225 Goldie St,Commerce Township,MI,48390-4109,48390,Oakland County,9.01,17-13-400-008,Industrial,8177 Goldie St,"Walled Lake, MI 48390 ",Joseph Malloure,CA Hull Co Inc,(248) 694-8025,Warehouse,,,CA Hull Co Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8230 Goldie St Commerce Township MI 48390,8230 Goldie St Commerce Township MI 48390,,"12,000",8230 Goldie St,Commerce Township,MI,48390-4108,48390,Oakland County,1.03,17-13-400-044,Industrial,32235 Craftsbury,"Farmington Hills, MI 48334",Marion Johnsee,Marion Johnsee,,Distribution,,,Marion Johnsee,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8232 Goldie St Commerce Township MI 48390,8232 Goldie St Commerce Township MI 48390,,"12,000",8232 Goldie St,Commerce Township,MI,48390-4108,48390,Oakland County,1.03,17-13-400-043,Industrial,32235 Craftsbury,"Farmington Hills, MI 48334",Marion Johnsee,Marion Johnsee,,Warehouse,,,Marion Johnsee,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8240-8246 Goldie St Commerce Township MI 48390,8240-8246 Goldie St Commerce Township MI 48390,,"16,000",8240-8246 Goldie St,Commerce Township,MI,48390-4108,48390,Oakland County,1.48,17-13-400-047,Industrial,8246 Goldie St,"Commerce Township, MI 48390",Dan Wissner,Direct Connect Systems,(800) 445-5714,Manufacturing,,,Direct Connect Systems,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28011 Grand Oaks Ct Wixom MI 48393,28011 Grand Oaks Ct Wixom MI 48393,Century Architectural Hardware,"11,640",28011 Grand Oaks Ct,Wixom,MI,48393-3340,48393,Oakland County,1.49,22-07-401-015,Industrial,3145 Copper Rd,"Fenton, MI 48430 ",Adam Cole,Excel Medical Products Llc,(810) 714-4775,Warehouse,,,Excel Medical Products Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28021 Grand Oaks Ct Wixom MI 48393,28021 Grand Oaks Ct Wixom MI 48393,,"15,660",28021 Grand Oaks Ct,Wixom,MI,48393-3340,48393,Oakland County,1.26,22-07-401-016,Industrial,28021 Grand Oaks Ct,"Wixom, MI 48393-3340",Beth Ancona,Ancona Controls,(248) 624-5600,Warehouse,,,Ancona Controls,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28061 Grand Oaks Ct Wixom MI 48393,28061 Grand Oaks Ct Wixom MI 48393,,"13,992",28061 Grand Oaks Ct,Wixom,MI,48393-3340,48393,Oakland County,1.4,22-07-401-020,Industrial,38250 French Pond,"Farmington Hills, MI 48331",Jon Williamson,Jon P Williamson,(248) 489-1106,Warehouse,,,Jon P Williamson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +39586 Grand River Ave Novi MI 48375,39586 Grand River Ave Novi MI 48375,Keford Collision,"16,000",39586 Grand River Ave,Novi,MI,48375-2102,48375,Oakland County,2.35,22-24-426-007,Industrial,,,,,,Warehouse,,,C & L Land Holding - Novi Body Shop LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40020 Grand River Ave Novi MI 48375,40020 Grand River Ave Novi MI 48375,Bldg A,"14,924",40020 Grand River Ave,Novi,MI,48375-2112,48375,Oakland County,1.6,22-24-401-019,Industrial,6111 N Shore Dr,"West Bloomfield, MI 48324",,Steven Kopitz,(248) 882-6012,Light Manufacturing,,,Steven Kopitz,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40024 Grand River Ave Novi MI 48375,40024 Grand River Ave Novi MI 48375,Bldg B,"12,330",40024 Grand River Ave,Novi,MI,48375,48375,Oakland County,1.32,22-24-401-019,Industrial,6111 N Shore Dr,"West Bloomfield, MI 48324",,Steven Kopitz,(248) 882-6012,Light Manufacturing,,,Steven Kopitz,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40028 Grand River Ave Novi MI 48375,40028 Grand River Ave Novi MI 48375,Bldg C,"12,330",40028 Grand River Ave,Novi,MI,48375-2167,48375,Oakland County,1.32,22-24-401-019,Industrial,6111 N Shore Dr,"West Bloomfield, MI 48324",,Steven Kopitz,(248) 882-6012,Light Manufacturing,,,Steven Kopitz,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40220 Grand River Ave Novi MI 48375,40220 Grand River Ave Novi MI 48375,,"11,464",40220 Grand River Ave,Novi,MI,48375-2116,48375,Oakland County,4.91,22-24-401-026,Industrial,39500 High Pointe Blvd,"Novi, MI 48375",,"AJR Development, Inc.",(248) 380-6150,R&D,,,"AJR Development, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40375 Grand River Ave Novi MI 48375,40375 Grand River Ave Novi MI 48375,,"13,883",40375 Grand River Ave,Novi,MI,48375-2123,48375,Oakland County,0.82,22-24-451-002,Industrial,40375 Grand River Ave,"Novi, MI 48375",Thelma Lacy,Thelma C. Lacy,,Warehouse,,,Thelma C. Lacy,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40850 Grand River Ave Novi MI 48375,40850 Grand River Ave Novi MI 48375,Bldg A,"13,500",40850 Grand River Ave,Novi,MI,48375-5705,48375,Oakland County,1.6,22-24-100-012,Industrial,41106 Clermont Ave,"Novi, MI 48375",Sanjay Seth,Seth Investments LLC,(248) 615-0313,Warehouse,,,Seth Investments LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40950 Grand River Ave Novi MI 48375,40950 Grand River Ave Novi MI 48375,,"12,000",40950 Grand River Ave,Novi,MI,48375-2816,48375,Oakland County,1.06,22-24-100-057,Industrial,2112 Prestwick Dr,"Farmington Hills, MI 48335",Alan wood,Alan Wood,(248) 615-7574,Warehouse,,,Alan Wood,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +44375 Grand River Ave Novi MI 48375,44375 Grand River Ave Novi MI 48375,,"13,000",44375 Grand River Ave,Novi,MI,48375-1156,48375,Oakland County,1.15,22-15-378-014,Industrial,13821 Elmira St,"Detroit, MI 48227",John Debono,Shaw & Slavsky Inc,(313) 834-3990,Warehouse,,,Shaw & Slavsky Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +45031-45033 Grand River Ave Novi MI 48375,45031-45033 Grand River Ave Novi MI 48375,,"15,586",45031-45033 Grand River Ave,Novi,MI,48375-1015,48375,Oakland County,2.23,22-15-351-025,Industrial,45033 Grand River,"Novi, MI 48375",Daniel Mansfield,Daniel C. Mansfield,,Warehouse,,,Daniel C. Mansfield,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +45500 Grand River Ave Novi MI 48374,45500 Grand River Ave Novi MI 48374,,"13,423",45500 Grand River Ave,Novi,MI,48374-1305,48374,Oakland County,10.05,22-16-426-005,Industrial,P.O.Box 8018,"Novi, MI 48376",,DeMaria Building Co.,(248) 348-8710,Warehouse,,,DeMaria Building Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46001 Grand River Ave Novi MI 48374,46001 Grand River Ave Novi MI 48374,,"12,552",46001 Grand River Ave,Novi,MI,48374-1319,48374,Oakland County,1,22-16-451-054,Industrial,6761 E Ten Mile Rd,"Center Line, MI 48015 ",,Servall Inc.,(586) 754-1818,Warehouse,,,Servall Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46035 Grand River Ave Novi MI 48374,46035 Grand River Ave Novi MI 48374,,"17,214",46035 Grand River Ave,Novi,MI,48374-1319,48374,Oakland County,7.67,22-16-451-005,Industrial,138 W Fisher Fwy,"Detroit, MI 48201",Victor Giller,Paradise Properties Inc,(248) 478-4890,Manufacturing,,,Paradise Properties Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46085 Grand River Ave Novi MI 48374,46085 Grand River Ave Novi MI 48374,,"10,622",46085 Grand River Ave,Novi,MI,48374-1319,48374,Oakland County,3.74,22-16-451-041,Industrial,3500 Ridge Rd,"Highland, MI 48356",Robert Massard,Robert Massard,(248) 887-0417,Warehouse,,,Robert Massard,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46089 Grand River Ave Novi MI 48374,46089 Grand River Ave Novi MI 48374,,"12,032",46089 Grand River Ave,Novi,MI,48374-1319,48374,Oakland County,1.03,22-16-451-042,Industrial,46089 Grand River Ave,"Novi, MI 48374",,Slaco Tool & Manufacturing,(248) 449-9911,Manufacturing,,,Slaco Tool & Manufacturing,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46400 Grand River Ave Novi MI 48374,46400 Grand River Ave Novi MI 48374,Bell Fork Lift,"14,073",46400 Grand River Ave,Novi,MI,48374-1323,48374,Oakland County,1.6,22-16-251-017,Industrial,34660 Centaur Dr Suite # 34660,"Clinton Township, MI 48035 ",,Bell Fork Fort Inc,(586) 792-5773,Warehouse,,,Bell Fork Fort Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46700 Grand River Ave Novi MI 48374,46700 Grand River Ave Novi MI 48374,,"10,800",46700 Grand River Ave,Novi,MI,48374-1326,48374,Oakland County,19.22,22-16-176-020,Industrial,,,,,,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47087 Grand River Ave Novi MI 48374,47087 Grand River Ave Novi MI 48374,,"15,000",47087 Grand River Ave,Novi,MI,48374-1340,48374,Oakland County,3,22-16-151-002,Industrial,47087 Grand River Ave,"Novi, MI 48374",Mike McCowan,Mike McCowan,(248) 349-8877,Manufacturing,,,Mike McCowan,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48545 Grand River Ave Novi MI 48374,48545 Grand River Ave Novi MI 48374,,"12,220",48545 Grand River Ave,Novi,MI,48374-1245,48374,Oakland County,5,22-17-101-015,Industrial,,,,,,Warehouse,,,WmLBaker & NABaker LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48595 Grand River Ave Novi MI 48374,48595 Grand River Ave Novi MI 48374,,"10,347",48595 Grand River Ave,Novi,MI,48374-1245,48374,Oakland County,5.02,22-17-101-016,Industrial,21565 Flanders St,"Farmington Hills, MI 48335",Christine Walker,"Walker, William & Christine",(517) 548-9049,Warehouse,,,"Walker, William & Christine",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48735 Grand River Ave Novi MI 48374,48735 Grand River Ave Novi MI 48374,,"10,195",48735 Grand River Ave,Novi,MI,48374-1247,48374,Oakland County,5.98,22-17-101-014,Industrial,24700 Northwestern Hwy Suite # 700,"Southfield, MI 48075 ",Daniel Irvin,Novi Cartage LLC,(586) 716-1700,Truck Terminal,,,Novi Cartage LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51722 Grand River Ave Wixom MI 48393,51722 Grand River Ave Wixom MI 48393,South Building,"14,000",51722 Grand River Ave,Wixom,MI,48393,48393,Oakland County,7.34,21-12-251-012,Industrial,51722 Grand River Ave,"Lyon Township, MI 48393 ",,United Rentals,(248) 344-2800,Warehouse,,,United Rentals,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53115-53125 Grand River Ave New Hudson MI 48165,53115-53125 Grand River Ave New Hudson MI 48165,,"12,018",53115-53125 Grand River Ave,New Hudson,MI,48165,48165,Oakland County,2,21-11-276-006,Industrial,53125 Grand River Ave,"New Hudson, MI 48165 ",Richard Similuk,Rjs Group Llc,(248) 673-8761,Warehouse,,,Rjs Group Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53205 Grand River Ave New Hudson MI 48165,53205 Grand River Ave New Hudson MI 48165,,"14,800",53205 Grand River Ave,New Hudson,MI,48165,48165,Oakland County,4,21-11-276-011,Industrial,4706 Product Dr Suite # 7,"Milford, MI 48381",James Solomon,Crystal Property Management LLC,(517) 980-4480,Warehouse,,,Crystal Property Management LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53400 Grand River Ave New Hudson MI 48165,53400 Grand River Ave New Hudson MI 48165,Building A,"16,200",53400 Grand River Ave,New Hudson,MI,48165-8521,48165,Oakland County,2.07,21-11-226-004,Industrial,53400 Grand River Ave,"New Hudson, MI 48165",Kim Gasior,Jerry Baker,(248) 437-3000,Light Manufacturing,,,Jerry Baker,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53583 Grand River Ave Wixom MI 48393,53583 Grand River Ave Wixom MI 48393,,"10,608",53583 Grand River Ave,Wixom,MI,48393,48393,Oakland County,2.15,21-11-251-027,Industrial,54360 Belcrest Dr,"Milford, MI 48381",John Dolan,John Dolan,(248) 437-4445,Warehouse,,,John Dolan,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53655 Grand River Ave New Hudson MI 48165,53655 Grand River Ave New Hudson MI 48165,,"12,913",53655 Grand River Ave,New Hudson,MI,48165-8523,48165,Oakland County,1.61,21-11-251-016,Industrial,5000 Dryden Ln,"Bloomfield Hills, MI 48304",Michael Reilly,Micahel J Reilly,(248) 646-6134,Warehouse,,,Micahel J Reilly,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +54750 Grand River Ave New Hudson MI 48165,54750 Grand River Ave New Hudson MI 48165,,"12,500",54750 Grand River Ave,New Hudson,MI,48165,48165,Oakland County,2,21-02-376-019,Industrial,1503 Mystic Hills Dr,"Milford, MI 48380",Edward Swadish,"Swadish, Edward Frank",(248) 767-3967,Warehouse,,,"Swadish, Edward Frank",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +54790 Grand River Ave New Hudson MI 48165,54790 Grand River Ave New Hudson MI 48165,,"14,240",54790 Grand River Ave,New Hudson,MI,48165-8526,48165,Oakland County,1.78,21-02-376-018,Industrial,8051 Locklin Ln,"Commerce Township, MI 48382 ",,"Union Bay Associates, LLC",,Warehouse,,,"Union Bay Associates, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55820 Grand River Ave New Hudson MI 48165,55820 Grand River Ave New Hudson MI 48165,,"10,500",55820 Grand River Ave,New Hudson,MI,48165-8706,48165,Oakland County,2.3,21-03-402-018,Industrial,,,,,,,,,Wrobo Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55860 Grand River Ave New Hudson MI 48165,55860 Grand River Ave New Hudson MI 48165,,"10,814",55860 Grand River Ave,New Hudson,MI,48165-9717,48165,Oakland County,1.2,21-03-401-001,Industrial,7071 Orchard Lake Rd,"West Bloomfield, MI 48322",Cristy Evangelista,Evangelista Development LLC,(248) 626-1114,Light Manufacturing,,,Evangelista Development LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +56405 Grand River Ave New Hudson MI 48165,56405 Grand River Ave New Hudson MI 48165,Insulgard,"12,000",56405 Grand River Ave,New Hudson,MI,48165,48165,Oakland County,2.88,21-03-376-022,Industrial,58000 Grand River Ave,"New Hudson, MI 48165 ",,Charter Township of Lyon,(248) 437-2240,Warehouse,,,Charter Township of Lyon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28850 Haas Rd Wixom MI 48393,28850 Haas Rd Wixom MI 48393,P.B. Brodak Roofing & Sheet Metal Co.,"16,700",28850 Haas Rd,Wixom,MI,48393,48393,Oakland County,2.62,21-11-276-014,Industrial,,,,,,Manufacturing,,,Brodak Enterprises Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3295 Haggerty Rd Commerce Township MI 48390,3295 Haggerty Rd Commerce Township MI 48390,,"18,000",3295 Haggerty Rd,Commerce Township,MI,48390-1725,48390,Oakland County,1.34,17-24-228-028,Industrial,3225 Haggerty Rd,"Commerce Township, MI 48390 ",Robin Dubuc,Thomas Craig Properties LLC,(248) 624-6140,Manufacturing,,,Thomas Craig Properties LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4270 Haggerty Rd Walled Lake MI 48390,4270 Haggerty Rd Walled Lake MI 48390,,"10,000",4270 Haggerty Rd,Walled Lake,MI,48390,48390,Oakland County,1.64,17-13-400-014,Industrial,4278 Haggerty Rd,"Walled Lake, MI 48390 ",Kim Jensen,Jensen Building Products,(248) 363-4144,Warehouse,,,Jensen Building Products,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4278 Haggerty Rd Walled Lake MI 48390,4278 Haggerty Rd Walled Lake MI 48390,Building 1,"15,000",4278 Haggerty Rd,Walled Lake,MI,48390,48390,Oakland County,0.95,17-13-400-015,Industrial,,,,,,Manufacturing,,,Rrpnn Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4370 Haggerty Rd Commerce Township MI 48390,4370 Haggerty Rd Commerce Township MI 48390,,"10,600",4370 Haggerty Rd,Commerce Township,MI,48390,48390,Oakland County,0.97,17-13-400-022,Industrial,2287 E West Maple Rd,"Commerce Township, MI 48390",Luai Poota,Luai's Automotive LLC,,Warehouse,,,Luai's Automotive LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4400 Haggerty Rd Commerce Township MI 48390,4400 Haggerty Rd Commerce Township MI 48390,,"11,998",4400 Haggerty Rd,Commerce Township,MI,48390,48390,Oakland County,0.77,17-13-400-029,Industrial,3157 Pikewood Ct,"Commerce Township, MI 48382",Robert Booth,Booth Robert A & Patricia,(248) 684-2234,Manufacturing,,,Booth Robert A & Patricia,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4440 Haggerty Rd Commerce Township MI 48390,4440 Haggerty Rd Commerce Township MI 48390,Wison Marine Oakland,"10,500",4440 Haggerty Rd,Commerce Township,MI,48390-1317,48390,Oakland County,1.2,17-13-400-019,Industrial,6095 Grand River Rd,"Brighton, MI 48114",Ronald Wilson,Ronald Wilson,(517) 546-3774,Service,,,Ronald Wilson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22495-22499 Heslip Dr Novi MI 48375,22495-22499 Heslip Dr Novi MI 48375,,"12,596",22495-22499 Heslip Dr,Novi,MI,48375-4138,48375,Oakland County,0.8,22-26-376-009,Industrial,RT 3 Box 382,"Traverse City, MI 49684",Frank Martin,Frank Martin,,Warehouse,,,Frank Martin,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22500 Heslip Dr Novi MI 48375,22500 Heslip Dr Novi MI 48375,,"16,438",22500 Heslip Dr,Novi,MI,48375-4139,48375,Oakland County,1.62,22-26-377-024,Industrial,6980 Lakemont Cir,"West Bloomfield, MI 48323",Larry Morianti,Larry P Morianti,(248) 681-9098,Warehouse,,,Larry P Morianti,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22515 Heslip Dr Novi MI 48375,22515 Heslip Dr Novi MI 48375,,"10,380",22515 Heslip Dr,Novi,MI,48375-4140,48375,Oakland County,1.19,22-26-376-014,Industrial,22419 Paddington Ct,"Novi, MI 48374",Ghazwan Ismail,Ghazwan Ismail,(734) 276-4000,Warehouse,,,Ghazwan Ismail,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22575 Heslip Dr Novi MI 48375,22575 Heslip Dr Novi MI 48375,W.S Equipment,"15,440",22575 Heslip Dr,Novi,MI,48375-4140,48375,Oakland County,1.07,22-26-376-018,Industrial,19850 Marilyn St,"Northville, MI 48167",Dennis Kubica,Kubica Corporation,(313) 724-9000,Warehouse,,,Kubica Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22605 Heslip Dr Novi MI 48375,22605 Heslip Dr Novi MI 48375,Cav Tool,"11,680",22605 Heslip Dr,Novi,MI,48375-4142,48375,Oakland County,1.34,22-26-376-016,Industrial,28214 Beck Rd,"Wixom, MI 48393 ",,R & K Holding LLC,,Warehouse,,,R & K Holding LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22755-22759 Heslip Dr Novi MI 48375,22755-22759 Heslip Dr Novi MI 48375,Global Office Building,"16,407",22755-22759 Heslip Dr,Novi,MI,48375-4144,48375,Oakland County,1.21,22-26-326-014,Industrial,22759 Heslip Dr,"Novi, MI 48375-4144",,"Heslip Holdings, LLC",(248) 449-9100,Warehouse,,,"Heslip Holdings, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22777 Heslip Dr Novi MI 48375,22777 Heslip Dr Novi MI 48375,,"14,458",22777 Heslip Dr,Novi,MI,48375-4144,48375,Oakland County,1.06,22-26-326-010,Industrial,22777 Heslip Dr,"Novi, MI 48375-4144",Christine Ellis,Facet international marketing,(734) 453-3500,Warehouse,,,Facet international marketing,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22781 Heslip Dr Novi MI 48375,22781 Heslip Dr Novi MI 48375,,"14,458",22781 Heslip Dr,Novi,MI,48375-4144,48375,Oakland County,1.06,22-26-326-010,Industrial,,,,,,,,,Jade Group Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2000 E Highland Rd Highland MI 48356,2000 E Highland Rd Highland MI 48356,,"12,330",2000 E Highland Rd,Highland,MI,48356-3058,48356,Oakland County,2.04,11-23-227-001,Industrial,2000 E Highland Rd,"Highland, MI 48356",Michael Seacord,Seaco Investments Llc,(248) 343-0109,Warehouse,,,Seaco Investments Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +5410A E Highland Rd White Lake MI 48383,5410A E Highland Rd White Lake MI 48383,,"11,986",5410A E Highland Rd,White Lake,MI,48383,48383,Oakland County,2.31,12-20-151-007,Industrial,,,,,,Warehouse,,,Highland Road Real Estate Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30100 S Hill Rd New Hudson MI 48165,30100 S Hill Rd New Hudson MI 48165,,"13,000",30100 S Hill Rd,New Hudson,MI,48165,48165,Oakland County,1.46,21-02-376-023,Industrial,30100 S Hill Rd,"New Hudson, MI 48165 ",Dan Cheresko,"Lyon Mechanical, Inc.",(248) 437-1047,Warehouse,,,"Lyon Mechanical, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +335 S Houghton St Milford MI 48381,335 S Houghton St Milford MI 48381,,"15,732",335 S Houghton St,Milford,MI,48381,48381,Oakland County,0.79,16-11-376-028,Industrial,,,,,,Service,,,Houghton Street Associates,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29575 Hudson Dr Novi MI 48377,29575 Hudson Dr Novi MI 48377,Unit 4,"11,983",29575 Hudson Dr,Novi,MI,48377,48377,Oakland County,1.04,22-04-377-002,Industrial,53400 Grand River Ave,"New Hudson, MI 48165",Kim Gasior,Jerry Baker,(248) 437-3000,Light Manufacturing,,,Jerry Baker,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29580 Hudson Dr Novi MI 48377,29580 Hudson Dr Novi MI 48377,,"11,000",29580 Hudson Dr,Novi,MI,48377-1733,48377,Oakland County,1.09,22-04-378-004,Industrial,1695 Balsam Way,"Milford, MI 48381",Nosh Sinishtaj,Nosh Sinishtaj,(248) 408-3420,Warehouse,,,Nosh Sinishtaj,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41115 Jo Dr Novi MI 48375,41115 Jo Dr Novi MI 48375,Micro Craft,"17,825",41115 Jo Dr,Novi,MI,48375-1916,48375,Oakland County,2.82,22-24-100-058,Industrial,41115 Jo Dr,"Novi, MI 48375",,Vincenti Investment Company2,,Manufacturing,,,Vincenti Investment Company2,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41123 Jo Dr Novi MI 48375,41123 Jo Dr Novi MI 48375,,"16,224",41123 Jo Dr,Novi,MI,48375-1933,48375,Oakland County,1.26,22-24-100-061,Industrial,1000 E Mandoline,"Madison Heights, MI 48071",Edward Sherman,Dot Development Company,(248) 588-4350,Warehouse,,,Dot Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +949 Ladd Rd Commerce Township MI 48390,949 Ladd Rd Commerce Township MI 48390,,"15,523",949 Ladd Rd,Commerce Township,MI,48390,48390,Oakland County,3.39,17-34-101-010,Industrial,949 Ladd Rd,"Walled Lake, MI 48390",Lawrence Montgomery,"Montgomery, Lawrence & Catherine",(248) 668-1640,Warehouse,,,"Montgomery, Lawrence & Catherine",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +415 N Lafayette St South Lyon MI 48178,415 N Lafayette St South Lyon MI 48178,,"18,000",415 N Lafayette St,South Lyon,MI,48178,48178,Oakland County,4.24,21-19-476-008,Industrial,415 N Lafayette St,"South Lyon, MI 48178",Charles Pullum,Pullum Window Corporation,(248) 491-4700,Warehouse,,,Pullum Window Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46918 Liberty Dr Wixom MI 48393,46918 Liberty Dr Wixom MI 48393,,"17,902",46918 Liberty Dr,Wixom,MI,48393-3600,48393,Oakland County,1.34,22-09-151-012,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911",,Dart Container Corporation,(517) 244-3001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46919 Liberty Dr Wixom MI 48393,46919 Liberty Dr Wixom MI 48393,,"13,700",46919 Liberty Dr,Wixom,MI,48393-3602,48393,Oakland County,0.96,22-09-152-005,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911",,Dart Container Corporation,(517) 244-3001,Manufacturing,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46953 Liberty Dr Wixom MI 48393,46953 Liberty Dr Wixom MI 48393,,"11,900",46953 Liberty Dr,Wixom,MI,48393-3603,48393,Oakland County,1.71,22-09-152-007,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911",,Dart Container Corporation,(517) 244-3001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46968 Liberty Dr Wixom MI 48393,46968 Liberty Dr Wixom MI 48393,Lot 12,"11,974",46968 Liberty Dr,Wixom,MI,48393-3693,48393,Oakland County,1.18,22-09-301-008,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911",,Dart Container Corporation,(517) 244-3001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46974 Liberty Dr Wixom MI 48393,46974 Liberty Dr Wixom MI 48393,,"11,996",46974 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland County,1.03,22-09-301-005,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,(517) 244-3001,Manufacturing,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46980 Liberty Dr Wixom MI 48393,46980 Liberty Dr Wixom MI 48393,,"13,324",46980 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland County,1.03,22-09-301-004,Industrial,24073-24083 Research Dr,"Farmington Hills, MI 48335-2632",Amy Chen,Tung Thih Electronics USA,(248) 478-9512,Warehouse,,,Tung Thih Electronics USA,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46981-46983 Liberty Dr Wixom MI 48393,46981-46983 Liberty Dr Wixom MI 48393,,"13,578",46981-46983 Liberty Dr,Wixom,MI,48393-3694,48393,Oakland County,0.98,22-09-152-008,Industrial,3120 Sovereign Dr Suite # 4B,"Lansing, MI 48911-4226",,Dart Container Corporation,(517) 244-3001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46986 Liberty Dr Wixom MI 48393,46986 Liberty Dr Wixom MI 48393,Lot 15,"13,240",46986 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland County,1.03,22-09-301-003,Industrial,500 Hogsback Rd,"Mason, MI 48854 ",,Dart Container Corporation,(517) 676-3800,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46987-46989 Liberty Dr Wixom MI 48393,46987-46989 Liberty Dr Wixom MI 48393,,"13,688",46987-46989 Liberty Dr,Wixom,MI,48393,48393,Oakland County,1.09,22-09-152-009,Industrial,432 Hogsback Rd,"Mason, MI 48854 ",Bob Dart,Dart,(517) 676-3803,Warehouse,,,Dart,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46992 Liberty Dr Wixom MI 48393,46992 Liberty Dr Wixom MI 48393,,"16,972",46992 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland County,1.03,22-09-301-002,Industrial,500 Hogsback Rd,"Mason, MI 48854-9547",,Dart Container Corporation,(517) 676-3800,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29108 Lorie Ln Wixom MI 48393,29108 Lorie Ln Wixom MI 48393,,"10,116",29108 Lorie Ln,Wixom,MI,48393-3640,48393,Oakland County,0.89,22-08-200-034,Industrial,29777 Telegraph Rd Suite # 2475,"Southfield, MI 48034-1303",Richard Delonis,Szura & Delonis Plc,(248) 716-3600,,,,Szura & Delonis Plc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29318 Lorie Ln Wixom MI 48393,29318 Lorie Ln Wixom MI 48393,,"13,330",29318 Lorie Ln,Wixom,MI,48393,48393,Oakland County,0.8,22-08-227-023,Industrial,2289 Mayfair Dr,"White Lake, MI 48383",Paul Fus,Paul E Fus,(248) 685-2761,Warehouse,,,Paul E Fus,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29420 Lorie Ln Wixom MI 48393,29420 Lorie Ln Wixom MI 48393,,"10,000",29420 Lorie Ln,Wixom,MI,48393,48393,Oakland County,0.81,22-08-227-002,Industrial,29421 Lorie Ln,"Wixom, MI 48393 ",Arturo Rodriguez,"Roligi Investments, LLC",(248) 348-9991,Warehouse,,,"Roligi Investments, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29431 Lorie Ln Wixom MI 48393,29431 Lorie Ln Wixom MI 48393,,"15,712",29431 Lorie Ln,Wixom,MI,48393,48393,Oakland County,0.72,22-08-226-002,Industrial,29431 Lorie Ln,"Wixom, MI 48393 ",Bud Conrad,BC Manufacturing Inc,(248) 344-0101,Manufacturing,,,BC Manufacturing Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55353 Lyon Industrial Dr New Hudson MI 48165,55353 Lyon Industrial Dr New Hudson MI 48165,,"13,796",55353 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland County,1.14,21-03-402-025,Industrial,34750 Norflok St,"Livonia, MI 48152",Giovanni Agazzi,Grone Construction Co,(248) 474-3786,Warehouse,,,Grone Construction Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55375 Lyon Industrial Dr New Hudson MI 48165,55375 Lyon Industrial Dr New Hudson MI 48165,,"13,800",55375 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland County,1.14,21-03-402-024,Industrial,,,Steve Agazzi,P & N,,Warehouse,,,P & N,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55378 Lyon Industrial Dr New Hudson MI 48165,55378 Lyon Industrial Dr New Hudson MI 48165,,"11,114",55378 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland County,1.67,21-03-402-003,Industrial,55378 Lyon Industrial Dr,"New Hudson, MI 48165",,DENNIS ROGGERS,(248) 446-9771,Warehouse,,,DENNIS ROGGERS,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55390 Lyon Industrial Dr New Hudson MI 48165,55390 Lyon Industrial Dr New Hudson MI 48165,Unit 13,"17,200",55390 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland County,1.32,21-03-402-023,Industrial,7125 Orchard Lake Rd Suite # 200,"West Bloomfield, MI 48322",,Singh Development Company,(248) 865-1600,Manufacturing,,,Singh Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55412 Lyon Industrial Dr New Hudson MI 48165,55412 Lyon Industrial Dr New Hudson MI 48165,Lyon Industrial,"14,800",55412 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland County,1.39,21-03-402-022,Industrial,7125 Orchard Lake Rd Suite # 200,"West Bloomfield, MI 48322",,Singh Development Company,(248) 865-1600,Warehouse,,,Singh Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46605 Magellan Dr Novi MI 48377,46605 Magellan Dr Novi MI 48377,,"14,843",46605 Magellan Dr,Novi,MI,48377,48377,Oakland County,0.68,22-09-326-016,Industrial,,,,,,Warehouse,,,Ntc America Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46665 Magellan Dr Novi MI 48377,46665 Magellan Dr Novi MI 48377,Unit 14,"17,000",46665 Magellan Dr,Novi,MI,48377-2442,48377,Oakland County,1.2,22-09-177-007,Industrial,46665 Magellan Dr,"Novi, MI 48377 ",,Access Interactive,(248) 567-3000,Warehouse,,,Access Interactive,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46695 Magellan Dr Novi MI 48377,46695 Magellan Dr Novi MI 48377,Dantom,"16,048",46695 Magellan Dr,Novi,MI,48377,48377,Oakland County,1.51,22-09-177-006,Industrial,50 Old Webster Rd,"Oxford, MA 01540 ",Valentin Gapontsev,IPG Photonics,(508) 373-1100,Warehouse,,,IPG Photonics,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46725 Magellan Dr Novi MI 48377,46725 Magellan Dr Novi MI 48377,,"16,052",46725 Magellan Dr,Novi,MI,48377-2453,48377,Oakland County,1.2,22-09-177-005,Industrial,46725 Magellan Dr,"Novi, MI 48377 ",Frank Kemmer,Vsc,(248) 926-2540,Warehouse,,,Vsc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46755 Magellan Dr Novi MI 48377,46755 Magellan Dr Novi MI 48377,,"14,021",46755 Magellan Dr,Novi,MI,48377-2453,48377,Oakland County,1.17,22-09-177-012,Industrial,30100 Telegraph Rd Suite # 322,"Bingham Farms, MI 48025",Morton Noveck,Noveck & Nasholtz PLC,(248) 642-7111,Manufacturing,,,Noveck & Nasholtz PLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46785 Magellan Dr Novi MI 48377,46785 Magellan Dr Novi MI 48377,,"16,040",46785 Magellan Dr,Novi,MI,48377-2453,48377,Oakland County,1.11,22-09-177-011,Industrial,550 S Ocean Blvd Suite # 2204,"Boca Raton, FL 33432 ",Iris Phelps,"17242 Boulevard, LLC",(561) 982-9470,Warehouse,,,"17242 Boulevard, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46926 Magellan Dr Wixom MI 48393,46926 Magellan Dr Wixom MI 48393,,"11,000",46926 Magellan Dr,Wixom,MI,48393,48393,Oakland County,1.16,22-09-102-002,Industrial,560 N Carney Dr,"Saint Clair, MI 48079",Geri Schmidt,Geri Schmidt,(810) 329-0855,Warehouse,,,Geri Schmidt,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46934-46942 Magellan Dr Wixom MI 48393,46934-46942 Magellan Dr Wixom MI 48393,,"11,565",46934-46942 Magellan Dr,Wixom,MI,48393,48393,Oakland County,1.07,22-09-102-003,Industrial,1484 Andover Blvd,"Howell, MI 48843",Nathan Donnellon,Nathan Donnellon,(734) 480-3778,Manufacturing,,,Nathan Donnellon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46950 Magellan Dr Wixom MI 48393,46950 Magellan Dr Wixom MI 48393,Lot 4,"15,330",46950 Magellan Dr,Wixom,MI,48393,48393,Oakland County,1.17,22-09-102-004,Industrial,46950 Magellan Dr Suite # C-1,"Wixom, MI 48393 ",Weihua Li,QOMO HiteVision,(248) 869-2121,Warehouse,,,QOMO HiteVision,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +125 S Main St Milford MI 48381,125 S Main St Milford MI 48381,,"15,000",125 S Main St,Milford,MI,48381-1996,48381,Oakland County,0.81,16-11-301-002,Industrial,,,,,,Warehouse,,,Kindred Properties Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1920 W Maple Rd Commerce Township MI 48390,1920 W Maple Rd Commerce Township MI 48390,,"15,200",1920 W Maple Rd,Commerce Township,MI,48390-2953,48390,Oakland County,1.1,17-33-253-002,Industrial,1920 W Maple Rd,"Commerce Township, MI 48390",Conrad Lindstrom,"American Manufacturing Innovators, Inc.",(248) 669-5990,Warehouse,,,"American Manufacturing Innovators, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4170 Martin Rd Commerce Township MI 48390,4170 Martin Rd Commerce Township MI 48390,,"10,000",4170 Martin Rd,Commerce Township,MI,48390-4116,48390,Oakland County,0.66,17-13-326-026,Industrial,3281 W Shore Dr,"Orchard Lake, MI 48324",David Moellering,Moe-Jo LLC,(248) 681-7999,Manufacturing,,,Moe-Jo LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4224 Martin Rd Commerce Township MI 48390,4224 Martin Rd Commerce Township MI 48390,APPCO Control,"10,000",4224 Martin Rd,Commerce Township,MI,48390-4118,48390,Oakland County,0.86,17-13-326-003,Industrial,5645 Sashabaw Rd,"Clarkston, MI 48346",Gina Iacobelli,Independence Management Corp.,(248) 625-1188,Warehouse,,,Independence Management Corp.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4999 McCarthy Dr Milford MI 48381,4999 McCarthy Dr Milford MI 48381,,"14,800",4999 McCarthy Dr,Milford,MI,48381-3947,48381,Oakland County,2.74,16-35-451-026,Industrial,32733 Folsom Rd,"Farmington Hills, MI 48336",James Struble,Ranger Contracting Incorporated,(248) 471-2277,Manufacturing,,,Ranger Contracting Incorporated,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25715-25737 Meadowbrook Rd Novi MI 48375,25715-25737 Meadowbrook Rd Novi MI 48375,,"17,193",25715-25737 Meadowbrook Rd,Novi,MI,48375-1849,48375,Oakland County,1.39,22-23-226-020,Industrial,,,,,,Warehouse,,,"RTN Holdings, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25775 Meadowbrook Rd Novi MI 48375,25775 Meadowbrook Rd Novi MI 48375,,"17,605",25775 Meadowbrook Rd,Novi,MI,48375-1849,48375,Oakland County,1.39,22-23-226-033,Industrial,25775 Meadowbrook Rd,"Novi, MI 48375",Joseph Khalifeh,Biotech Clinical Laboratories,(248) 426-9800,Light Manufacturing,,,Biotech Clinical Laboratories,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25849-25869 Meadowbrook Rd Novi MI 48375,25849-25869 Meadowbrook Rd Novi MI 48375,Building 2,"17,728",25849-25869 Meadowbrook Rd,Novi,MI,48375,48375,Oakland County,2.31,22-23-230-002,Industrial,41200-41218 Bridge St,"Novi, MI 48375",Bill McKeever,Certified Management,(248) 476-6700,R&D,,,Certified Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25873-25893 Meadowbrook Rd Novi MI 48375,25873-25893 Meadowbrook Rd Novi MI 48375,Building 3,"17,726",25873-25893 Meadowbrook Rd,Novi,MI,48375-1851,48375,Oakland County,2.31,22-23-230-003,Industrial,41200-41218 Bridge St,"Novi, MI 48375",,Certified Management,(248) 476-6700,R&D,,,Certified Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1025 Metro Dr Walled Lake MI 48390,1025 Metro Dr Walled Lake MI 48390,,"14,074",1025 Metro Dr,Walled Lake,MI,48390,48390,Oakland County,3.24,17-27-351-023,Industrial,PO BOX 725,"WALLED LAKE, MI 48390",Gary Mapes,Metro Enviromental Services,(313) 624-4799,Warehouse,,,Metro Enviromental Services,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +5350 Milford Rd New Hudson MI 48165,5350 Milford Rd New Hudson MI 48165,,"10,742",5350 Milford Rd,New Hudson,MI,48165,48165,Oakland County,7.26,21-04-201-010,Industrial,1 N Lexington Ave,"White Plains, NY 10601",Mark Comora,FORTISTAR,(914) 421-4900,Warehouse,,,FORTISTAR,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29111 Milford Rd New Hudson MI 48165,29111 Milford Rd New Hudson MI 48165,"Mac Dermid, Inc.","14,459",29111 Milford Rd,New Hudson,MI,48165-9741,48165,Oakland County,5.6,21-09-226-016,Industrial,1401 Blake St,"Denver, CO 80202",,"MacDermid Group, Inc.",(720) 479-3060,Light Manufacturing,,,"MacDermid Group, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +31250 S Milford Rd Milford MI 48381,31250 S Milford Rd Milford MI 48381,,"10,041",31250 S Milford Rd,Milford,MI,48381,48381,Oakland County,7.56,21-03-126-017,Industrial,,,,,,Warehouse,,,Mcnabb D S Living Trust,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +385 N Mill St South Lyon MI 48178,385 N Mill St South Lyon MI 48178,,"18,000",385 N Mill St,South Lyon,MI,48178-1262,48178,Oakland County,1.33,21-20-326-011,Industrial,6659 Seven Mile Rd,"South Lyon, MI 48178 ",Michael Mannella,Michael Mannella,,Warehouse,,,Michael Mannella,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +465 N Mill St South Lyon MI 48178,465 N Mill St South Lyon MI 48178,,"13,743",465 N Mill St,South Lyon,MI,48178,48178,Oakland County,1.95,21-20-326-014,Industrial,,,Linda Turman,Linda S Turman,(248) 961-0441,Manufacturing,,,Linda S Turman,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +521 N Mill St South Lyon MI 48178,521 N Mill St South Lyon MI 48178,,"14,920",521 N Mill St,South Lyon,MI,48178,48178,Oakland County,2,21-20-326-013,Industrial,48755 W 10 Mile Rd,"Novi, MI 48374 ",,Pardonnet George,,Warehouse,,,Pardonnet George,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +201 S Mill St South Lyon MI 48178,201 S Mill St South Lyon MI 48178,,"16,000",201 S Mill St,South Lyon,MI,48178,48178,Oakland County,1.39,21-29-176-025,Industrial,42411 Palmer Rd,"Canton, MI 48188-1990",Adam Aldrin,Mill Street Investment Llc,(734) 516-2509,Manufacturing,,,Mill Street Investment Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3250 New Farm Ct Commerce Township MI 48390,3250 New Farm Ct Commerce Township MI 48390,,"10,400",3250 New Farm Ct,Commerce Township,MI,48390-1702,48390,Oakland County,0.75,17-24-229-006,Industrial,31393 W 13 Mile Rd Suite # 150,"Farmington Hills, MI 48334",Charlie Cassar,Sam Cassar Company,(248) 851-4477,Light Manufacturing,,,Sam Cassar Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3280 New Farm Ct Commerce Township MI 48390,3280 New Farm Ct Commerce Township MI 48390,,"10,400",3280 New Farm Ct,Commerce Township,MI,48390-1754,48390,Oakland County,0.74,17-24-229-007,Industrial,31393 W 13 Mile Rd Suite # 150,"Farmington Hills, MI 48334",Charlie Cassar,Sam Cassar Company,(248) 851-4477,Light Manufacturing,,,Sam Cassar Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3310 New Farm Ct Commerce Township MI 48390,3310 New Farm Ct Commerce Township MI 48390,,"10,400",3310 New Farm Ct,Commerce Township,MI,48390-1755,48390,Oakland County,0.7,17-24-229-008,Industrial,31393 W 13 Mile Rd Suite # 150,"Farmington Hills, MI 48334",Charlie Cassar,Sam Cassar Company,(248) 851-4477,Light Manufacturing,,,Sam Cassar Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25100 Novi Rd Novi MI 48375,25100 Novi Rd Novi MI 48375,Collex Collision Experts,"10,166",25100 Novi Rd,Novi,MI,48375-1636,48375,Oakland County,4.31,22-23-152-004,Industrial,11995 El Camino Real,"San Diego, CA 92130",,Realty Income Corporation,(877) 924-6266,Service,,,Realty Income Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25800 Novi Rd Novi MI 48375,25800 Novi Rd Novi MI 48375,,"12,260",25800 Novi Rd,Novi,MI,48375-1650,48375,Oakland County,4.5,22-23-151-004,Industrial,25125 Trans-X Rd,"Novi, MI 48375 ",,"ACE CUTTING EQUIPMENT & Supply, Inc.",(248) 449-4944,Warehouse,,,"ACE CUTTING EQUIPMENT & Supply, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28005 Oakland Oaks Ct Wixom MI 48393,28005 Oakland Oaks Ct Wixom MI 48393,,"12,078",28005 Oakland Oaks Ct,Wixom,MI,48393-3342,48393,Oakland County,1.3,22-07-326-001,Industrial,,,,,,Warehouse,,,"MB Investments, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28016 Oakland Oaks Ct Wixom MI 48393,28016 Oakland Oaks Ct Wixom MI 48393,Bldg D,"16,306",28016 Oakland Oaks Ct,Wixom,MI,48393-3341,48393,Oakland County,1.07,22-07-326-031,Industrial,28026 Oakland Oaks Ct,"Wixom, MI 48393 ",,Hosco,(248) 912-1750,Warehouse,,,Hosco,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28036 Oakland Oaks Ct Wixom MI 48393,28036 Oakland Oaks Ct Wixom MI 48393,,"11,224",28036 Oakland Oaks Ct,Wixom,MI,48393-3348,48393,Oakland County,1.01,22-07-326-011,Industrial,46701 Commerce Center Dr,"Plymouth, MI 48170",Gerald Cox,Gerald L Cox,(734) 527-9125,Light Manufacturing,,,Gerald L Cox,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28046 Oakland Oaks Ct Wixom MI 48393,28046 Oakland Oaks Ct Wixom MI 48393,,"18,000",28046 Oakland Oaks Ct,Wixom,MI,48393-3348,48393,Oakland County,1.2,22-07-326-036,Industrial,,,,,,Warehouse,,,"Galaxie 11, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3170 E Oakley Park Commerce Township MI 48390,3170 E Oakley Park Commerce Township MI 48390,,"13,500",3170 E Oakley Park,Commerce Township,MI,48390,48390,Oakland County,0.45,17-24-228-001,Industrial,8101 Richardson Rd Suite # 101,"Commerce Township, MI 48390 ",Chris Konja,Askar Brands,(248) 363-4580,Warehouse,,,Askar Brands,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3331 Oakley Park Rd Commerce Township MI 48390,3331 Oakley Park Rd Commerce Township MI 48390,,"10,276",3331 Oakley Park Rd,Commerce Township,MI,48390,48390,Oakland County,1.3,17-13-400-055,Industrial,4104 Pioneer Rd,"Walled Lake, MI 48390 ",Jeanne Kunzman,Jeanne Kunzman,(248) 360-2700,Warehouse,,,Jeanne Kunzman,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2550 E Oakley Park Rd Commerce Township MI 48390,2550 E Oakley Park Rd Commerce Township MI 48390,Finished Basements Plus,"15,550",2550 E Oakley Park Rd,Commerce Township,MI,48390-1663,48390,Oakland County,0.91,17-24-126-012,Industrial,2965 Vero Dr,"Highland, MI 48356",Stephen Iverson,Stephen Iverson,(248) 939-7905,Warehouse,,,Stephen Iverson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3250 E Oakley Park Rd Commerce Township MI 48390,3250 E Oakley Park Rd Commerce Township MI 48390,,"11,407",3250 E Oakley Park Rd,Commerce Township,MI,48390-1648,48390,Oakland County,0.87,17-24-226-003,Industrial,35441 Edmunds Grv,"New Baltimore, MI 48047",Thomas Lubinski,Thomas D Lubinski,,Warehouse,,,Thomas D Lubinski,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3260 Old Farm Commerce Township MI 48390,3260 Old Farm Commerce Township MI 48390,California Closets,"11,100",3260 Old Farm,Commerce Township,MI,48390,48390,Oakland County,0.76,17-24-228-021,Industrial,,,,,,Warehouse,,,Michigan Solar Solutions,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4755 Old Plank Rd Milford MI 48381,4755 Old Plank Rd Milford MI 48381,,"13,252",4755 Old Plank Rd,Milford,MI,48381-4066,48381,Oakland County,15.39,16-36-351-016,Industrial,,,,,,Warehouse,,,T M Ford Development Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4827 Old Plank Rd Milford MI 48381,4827 Old Plank Rd Milford MI 48381,,"11,600",4827 Old Plank Rd,Milford,MI,48381,48381,Oakland County,2.12,16-36-351-018,Industrial,48733 West Rd,"Wixom, MI 48393",,Clearlink Wireless,(248) 449-7362,Warehouse,,,Clearlink Wireless,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28361 W Park Dr Novi MI 48377,28361 W Park Dr Novi MI 48377,,"13,339",28361 W Park Dr,Novi,MI,48377,48377,Oakland County,3.98,22-09-300-047,Industrial,30660 W 8 Mile Rd,"Farmington Hills, MI 48336",Thomas Earle,PISI Industrial LLC,,Manufacturing,,,PISI Industrial LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46425 Peary Ct Novi MI 48377,46425 Peary Ct Novi MI 48377,,"15,798",46425 Peary Ct,Novi,MI,48377-1732,48377,Oakland County,1.59,22-04-378-014,Industrial,46425 Peary Ct,"Novi, MI 48377 ",John Gauruder,Gauruder Investments Llc,(248) 347-6448,Warehouse,,,Gauruder Investments Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4335 Pineview Dr Walled Lake MI 48390,4335 Pineview Dr Walled Lake MI 48390,,"13,691",4335 Pineview Dr,Walled Lake,MI,48390,48390,Oakland County,1.07,17-13-300-079,Industrial,,,,,,Warehouse,,,Heinzmann Family Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4350 Pineview Dr Commerce Township MI 48390,4350 Pineview Dr Commerce Township MI 48390,,"11,500",4350 Pineview Dr,Commerce Township,MI,48390-4113,48390,Oakland County,1.12,17-13-300-077,Industrial,,,,,,Warehouse,,,NCLS Properties LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4359 Pineview Rd Walled Lake MI 48390,4359 Pineview Rd Walled Lake MI 48390,,"14,000",4359 Pineview Rd,Walled Lake,MI,48390,48390,Oakland County,1.53,17-13-300-080,Industrial,4359 Pineview Rd,"Walled Lake, MI 48390 ",,"Sundberg-Ferar, Inc.",(248) 360-3800,R&D,,,"Sundberg-Ferar, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4077 Pioneer Dr Walled Lake MI 48390,4077 Pioneer Dr Walled Lake MI 48390,,"10,032",4077 Pioneer Dr,Walled Lake,MI,48390,48390,Oakland County,1.14,17-13-326-034,Industrial,7205 Deer Lake Rd,"Clarkston, MI 48346 ",Bill Hannon,Bill Hannon,(248) 620-6447,Light Manufacturing,,,Bill Hannon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4295 Plant Dr Walled Lake MI 48390,4295 Plant Dr Walled Lake MI 48390,,"11,016",4295 Plant Dr,Walled Lake,MI,48390,48390,Oakland County,1.25,17-13-400-049,Industrial,,,,,,Warehouse,,,Pechota Investments,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +20801 Pontiac Trl South Lyon MI 48178,20801 Pontiac Trl South Lyon MI 48178,,"14,480",20801 Pontiac Trl,South Lyon,MI,48178,48178,Oakland County,6.15,21-31-400-075,Industrial,306 Andrus Dr,"Murray, KY 42071",,Hutson,(270) 226-7770,Warehouse,,,Hutson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50140 Pontiac Trl Wixom MI 48393,50140 Pontiac Trl Wixom MI 48393,,"15,846",50140 Pontiac Trl,Wixom,MI,48393-2019,48393,Oakland County,2.35,17-31-452-012,Industrial,50140 Pontiac Trl,"Wixom, MI 48393",,Creative Machine,(248) 669-4230,Warehouse,,,Creative Machine,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51100 Pontiac Trl Wixom MI 48393,51100 Pontiac Trl Wixom MI 48393,,"12,500",51100 Pontiac Trl,Wixom,MI,48393-2041,48393,Oakland County,,17-31-351-016,Industrial,23900 Orchard Rd Suite # 240,"Farmington Hills, MI 48336 ",James Barnett,Barnett Industrial Properties LLC,(248) 615-4700,,,,Barnett Industrial Properties LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51800 Pontiac Trl Milford MI 48393,51800 Pontiac Trl Milford MI 48393,,"16,000",51800 Pontiac Trl,Milford,MI,48393-1932,48393,Oakland County,6.72,16-36-451-019,Industrial,4875 Product Dr,"Wixom, MI 48393 ",Troy Clogg,"CTR Landholders, LLC",(248) 685-0123,Manufacturing,,,"CTR Landholders, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +862 N Pontiac Trl Walled Lake MI 48390,862 N Pontiac Trl Walled Lake MI 48390,,"12,453",862 N Pontiac Trl,Walled Lake,MI,48390,48390,Oakland County,,17-34-227-009,Industrial,861 N Pontiac Trail,"Walled Lake, MI 48390 ",James Maher,Maher Group,(248) 926-6631,Showroom,,,Maher Group,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53162 Pontiac Trail Milford MI 48381,53162 Pontiac Trail Milford MI 48381,,"13,600",53162 Pontiac Trail,Milford,MI,48381,48381,Oakland County,2.8,16-35-451-012,Industrial,56558 Pontiac Trl,"New Hudson, MI 48165",David Kolb,Hines Park Ford,(248) 437-6700,Warehouse,,,Hines Park Ford,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1270 N Pontiac Trail Walled Lake MI 48390,1270 N Pontiac Trail Walled Lake MI 48390,,"16,000",1270 N Pontiac Trail,Walled Lake,MI,48390-3139,48390,Oakland County,6.57,17-26-351-014,Industrial,1270 N Pontiac Trail,"Walled Lake, MI 48390",,Professional Movers.com,(248) 926-9999,Warehouse,,,Professional Movers.com,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4715 Product Dr Wixom MI 48393,4715 Product Dr Wixom MI 48393,,"12,000",4715 Product Dr,Wixom,MI,48393,48393,Oakland County,1.94,16-36-451-015,Industrial,28920 Vintage Dr,"New Hudson, MI 48165 ",,Jim Wisti,(248) 437-7517,Warehouse,,,Jim Wisti,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4715 Product Dr Wixom MI 48393,4715 Product Dr Wixom MI 48393,,"10,918",4715 Product Dr,Wixom,MI,48393,48393,Oakland County,7.59,16-36-451-015,Industrial,28920 Vintage Dr,"New Hudson, MI 48165 ",,Jim Wisti,(248) 437-7517,Warehouse,,,Jim Wisti,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28780 Reilly Rd New Hudson MI 48165,28780 Reilly Rd New Hudson MI 48165,,"11,400",28780 Reilly Rd,New Hudson,MI,48165,48165,Oakland County,2.22,21-11-251-025,Industrial,28780 Reilly Rd,"New Hudson, MI 48165",,JOHN KNAPP,(248) 388-2992,Warehouse,,,JOHN KNAPP,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30029 Research Dr New Hudson MI 48165,30029 Research Dr New Hudson MI 48165,,"14,440",30029 Research Dr,New Hudson,MI,48165-8548,48165,Oakland County,1.05,21-03-401-008,Industrial,30029 Research Dr,"New Hudson, MI 48165",Aaron Hoffmann,American Temperature Service Inc,(248) 348-5133,R&D,,,American Temperature Service Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30158 Research Dr New Hudson MI 48165,30158 Research Dr New Hudson MI 48165,,"11,142",30158 Research Dr,New Hudson,MI,48165,48165,Oakland County,1.26,21-03-253-010,Industrial,,,,,,Warehouse,,,Dbl Properties Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30163 Research Dr New Hudson MI 48165,30163 Research Dr New Hudson MI 48165,,"17,739",30163 Research Dr,New Hudson,MI,48165,48165,Oakland County,3.34,21-03-253-002,Industrial,,,,,,Warehouse,,,Wdkk Development Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22325 Roethel Dr Novi MI 48375,22325 Roethel Dr Novi MI 48375,,"15,957",22325 Roethel Dr,Novi,MI,48375-4710,48375,Oakland County,2.18,22-35-127-017,Industrial,,,,,,Warehouse,,,Holloway Investments Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46590 Ryan Ct Novi MI 48377,46590 Ryan Ct Novi MI 48377,,"10,120",46590 Ryan Ct,Novi,MI,48377,48377,Oakland County,1.8,22-04-376-002,Industrial,46590 Ryan Ct,"Novi, MI 48377 ",,SUN-TEC Corporation,(248) 669-3100,Light Manufacturing,,,SUN-TEC Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28200 Samuel Linden Ct Novi MI 48377,28200 Samuel Linden Ct Novi MI 48377,,"11,089",28200 Samuel Linden Ct,Novi,MI,48377,48377,Oakland County,3.98,22-09-300-046,Industrial,,,,,,Warehouse,,,Tiny's Properties Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28200 W Samuel Linden Ct Novi MI 48377,28200 W Samuel Linden Ct Novi MI 48377,,"13,320",28200 W Samuel Linden Ct,Novi,MI,48377,48377,Oakland County,3.98,22-09-300-047,Industrial,30660 W 8 Mile Rd,"Farmington Hills, MI 48336",Thomas Earle,PISI Industrial LLC,,Warehouse,,,PISI Industrial LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25555-25701 Seeley Rd Novi MI 48375,25555-25701 Seeley Rd Novi MI 48375,Novi Mfg (U-Haul),"10,921",25555-25701 Seeley Rd,Novi,MI,48375-2053,48375,Oakland County,6.83,22-24-100-006,Industrial,2721 N Central Ave Suite # 500,"Phoenix, AZ 85004",,U Haul Real Estate Co.,(602) 263-6555,Warehouse,,,U Haul Real Estate Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4922 Technical Dr Milford MI 48381,4922 Technical Dr Milford MI 48381,"George Landry, Inc.","10,450",4922 Technical Dr,Milford,MI,48381-3950,48381,Oakland County,2,16-35-351-020,Industrial,,,,,,Warehouse,,,Martin Preston Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4935 Technical Dr Milford MI 48381,4935 Technical Dr Milford MI 48381,,"11,142",4935 Technical Dr,Milford,MI,48381,48381,Oakland County,2.01,16-35-351-022,Industrial,,,,,,Warehouse,,,NESBIT VAUGHAN B RT,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4936 Technical Dr Milford MI 48381,4936 Technical Dr Milford MI 48381,,"15,341",4936 Technical Dr,Milford,MI,48381-3950,48381,Oakland County,2.5,16-35-351-019,Industrial,,,,,,Warehouse,,,Arthurs Michigan Group,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +52365 Ten Mile Rd South Lyon MI 48178,52365 Ten Mile Rd South Lyon MI 48178,,"18,000",52365 Ten Mile Rd,South Lyon,MI,48178-9757,48178,Oakland County,,21-25-100-015,Industrial,32233 Schoolcraft,"Livonia, MI 48150",Gareth Zebley,"Cambrian Of Lyon, LLC",(517) 536-0298,,,,"Cambrian Of Lyon, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +42780 W Ten Mile Rd Novi MI 48375,42780 W Ten Mile Rd Novi MI 48375,,"15,000",42780 W Ten Mile Rd,Novi,MI,48375,48375,Oakland County,7.42,22-23-376-013,Industrial,2245 Keith Rd,"West Bloomfield, MI 48324",Mark Garmo,Mark Garmo,(248) 366-3052,Warehouse,,,Mark Garmo,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +42950 W Ten Mile Rd Novi MI 48375,42950 W Ten Mile Rd Novi MI 48375,K & P Sheward,"14,400",42950 W Ten Mile Rd,Novi,MI,48375,48375,Oakland County,1,22-23-351-050,Industrial,1334 Maplelawn Dr,"Troy, MI 48084",Darren Frankel,Stuart Frankel Development Co.,(248) 649-2924,Manufacturing,,,Stuart Frankel Development Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1699 Traditional Dr Commerce Township MI 48390,1699 Traditional Dr Commerce Township MI 48390,,"10,000",1699 Traditional Dr,Commerce Township,MI,48390-2973,48390,Oakland County,0.88,17-33-226-022,Industrial,1699 Traditional Dr,"Commerce Township, MI 48390",Robert Savage,Buildmaster Inc,(248) 960-0033,Warehouse,,,Buildmaster Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25005 Trans-X Rd Novi MI 48375,25005 Trans-X Rd Novi MI 48375,,"11,218",25005 Trans-X Rd,Novi,MI,48375-2437,48375,Oakland County,2.09,22-23-326-013,Industrial,25005 Trans-X Rd,"Novi, MI 48375",,Monte Costella & Co.,(248) 347-7744,Warehouse,,,Monte Costella & Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25220 Trans-X Rd Novi MI 48375,25220 Trans-X Rd Novi MI 48375,Trans X,"13,250",25220 Trans-X Rd,Novi,MI,48375-2440,48375,Oakland County,6.06,22-23-151-034,Industrial,25220 Trans-X Rd,"Novi, MI 48375",Alan Wormser,Barry's Lets Rent It,(248) 855-0480,Warehouse,,,Barry's Lets Rent It,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25285 Trans-X Rd Novi MI 48375,25285 Trans-X Rd Novi MI 48375,,"14,925",25285 Trans-X Rd,Novi,MI,48375-2441,48375,Oakland County,2.99,22-23-151-030,Industrial,25285 Trans-X Rd,"Novi, MI 48375",Terry Sweeney,Sweeney Concrete Material,(248) 374-1111,Warehouse,,,Sweeney Concrete Material,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +57425 Travis Rd New Hudson MI 48165,57425 Travis Rd New Hudson MI 48165,,"11,000",57425 Travis Rd,New Hudson,MI,48165-9753,48165,Oakland County,2,21-09-276-002,Industrial,7774 Bentgrass,"Howell, MI 48843 ",Joe Bonadeo,"DENA Investments, LLC",,Warehouse,,,"DENA Investments, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +57450 Travis Rd New Hudson MI 48165,57450 Travis Rd New Hudson MI 48165,,"14,500",57450 Travis Rd,New Hudson,MI,48165,48165,Oakland County,2,21-09-226-015,Industrial,57450 Travis Rd,"New Hudson, MI 48165",Douglas Ross,Networks Enterprises Inc,(248) 446-8590,,,,Networks Enterprises Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50706 Varsity Ct Wixom MI 48393,50706 Varsity Ct Wixom MI 48393,,"17,434",50706 Varsity Ct,Wixom,MI,48393-2072,48393,Oakland County,4.02,22-06-101-050,Industrial,47757 West Rd Suite # C-103,"Wixom, MI 48393 ",,GMT Logistics,(248) 347-8889,R&D,,,GMT Logistics,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22635 Venture Dr Novi MI 48375,22635 Venture Dr Novi MI 48375,,"11,979",22635 Venture Dr,Novi,MI,48375-4182,48375,Oakland County,1.35,22-26-401-030,Industrial,22635 Venture Dr,"Novi, MI 48375",,Bollfilter Corporation,(248) 773-8200,Manufacturing,,,Bollfilter Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22920 Venture Dr Novi MI 48375,22920 Venture Dr Novi MI 48375,,"10,318",22920 Venture Dr,Novi,MI,48375-4188,48375,Oakland County,1.4,22-26-401-040,Industrial,500 S Harvey St,"Plymouth, MI 48170",Bill Lawton,Community Financial Credit Union,(734) 453-1200,R&D,,,Community Financial Credit Union,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22960 Venture Dr Novi MI 48375,22960 Venture Dr Novi MI 48375,Bldg B,"16,880",22960 Venture Dr,Novi,MI,48375-4188,48375,Oakland County,1.86,22-26-401-039,Industrial,38281 Schoolcraft Rd Suite # H,"Livonia, MI 48150",,Aidata USA Co Ltd.,(248) 380-0578,Distribution,,,Aidata USA Co Ltd.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +23000 Venture Dr Novi MI 48375,23000 Venture Dr Novi MI 48375,Bldg A,"16,800",23000 Venture Dr,Novi,MI,48375-4186,48375,Oakland County,1.6,22-26-401-034,Industrial,,,,"J & L Ventures, LLC",,Manufacturing,,,"J & L Ventures, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41144 Vincenti Ct Novi MI 48375,41144 Vincenti Ct Novi MI 48375,Automatic Value,"14,650",41144 Vincenti Ct,Novi,MI,48375-1922,48375,Oakland County,1.03,22-24-100-033,Industrial,35980 Industrial Rd Suite # A-4,"Livonia, MI 48150",,ATEQ Corp.,(734) 838-3100,Warehouse,,,ATEQ Corp.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41216 Vincenti Ct Novi MI 48375,41216 Vincenti Ct Novi MI 48375,,"16,401",41216 Vincenti Ct,Novi,MI,48375-1925,48375,Oakland County,1.03,22-24-100-035,Industrial,25200 W Six Mile Rd,"Redford, MI 48240 ",Charles Schweiger,Drum Handlers Inc,(313) 534-8034,Warehouse,,,Drum Handlers Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41249-41255 Vincenti Ct Novi MI 48375,41249-41255 Vincenti Ct Novi MI 48375,Moshler,"14,400",41249-41255 Vincenti Ct,Novi,MI,48375-1927,48375,Oakland County,1.3,22-24-100-024,Industrial,18184 Buckingham Ave,"Beverly Hills, MI 48025 ",Kirk Nicola,"Paw Print Inn, Inc",,Light Manufacturing,,,"Paw Print Inn, Inc",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41252 Vincenti Ct Novi MI 48375,41252 Vincenti Ct Novi MI 48375,,"11,376",41252 Vincenti Ct,Novi,MI,48375-1925,48375,Oakland County,1.03,22-24-100-036,Industrial,42300 W 9 Mile Rd,"Novi, MI 48375",Raffi Kuredjian,"Lathrup Industries, Inc.",(248) 349-1009,Telecom Hotel/Data Hosting,,,"Lathrup Industries, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41287 Vincenti Ct Novi MI 48375,41287 Vincenti Ct Novi MI 48375,,"10,168",41287 Vincenti Ct,Novi,MI,48375-1927,48375,Oakland County,1.13,22-24-100-023,Industrial,38281 Schoolcraft Rd Suite # M,"Livonia, MI 48150",Mark Prokurat,"Silver-Clip, LLC",(734) 354-6551,Warehouse,,,"Silver-Clip, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41290-41292 Vincenti Ct Novi MI 48375,41290-41292 Vincenti Ct Novi MI 48375,,"14,427",41290-41292 Vincenti Ct,Novi,MI,48375-1925,48375,Oakland County,1.03,22-24-100-037,Industrial,1146 Chestnut Ln S,"South Lyon, MI 48178",,Kevin James VanOrd,(248) 426-9108,Warehouse,,,Kevin James VanOrd,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41326 Vincenti Ct Novi MI 48375,41326 Vincenti Ct Novi MI 48375,Cummins,"14,300",41326 Vincenti Ct,Novi,MI,48375-1926,48375,Oakland County,1.03,22-24-100-038,Industrial,53435 Grand River Ave,"New Hudson, MI 48165 ",,Raymon Wilkinson,(248) 486-5115,Warehouse,,,Raymon Wilkinson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41365-41367 Vincenti Ct Novi MI 48375,41365-41367 Vincenti Ct Novi MI 48375,,"11,000",41365-41367 Vincenti Ct,Novi,MI,48375-1928,48375,Oakland County,1.1,22-24-100-048,Industrial,347 N Main St,"Milford, MI 48381",,Hawthorne Management Co.,(248) 258-7777,Warehouse,,,Hawthorne Management Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41369 Vincenti Ct Novi MI 48375,41369 Vincenti Ct Novi MI 48375,,"12,464",41369 Vincenti Ct,Novi,MI,48375-1928,48375,Oakland County,1.37,22-24-100-047,Industrial,41131-41135 Vincenti Ct,"Novi, MI 48375",Thomas Rzeznik,Danlaw,(248) 476-5571,Light Manufacturing,,,Danlaw,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2750 W Maple Commerce Township MI 48390,2750 W Maple Commerce Township MI 48390,,"10,325",2750 W Maple,Commerce Township,MI,48390-3838,48390,Oakland County,1.48,17-36-100-027,Industrial,2750 W Maple,"Commerce Township, MI 48390",Bob Keslacy,B K Imported Auto Care Inc,(248) 960-7715,Warehouse,,,B K Imported Auto Care Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2287 E W Maple Commerce Township MI 48390,2287 E W Maple Commerce Township MI 48390,,"15,990",2287 E W Maple,Commerce Township,MI,48390-3829,48390,Oakland County,2.27,17-25-376-028,Industrial,28975 Orchard Lake Rd,"Farmington Hills, MI 48333",,U.S. Tool & Cutter,(248) 553-7745,Service,,,U.S. Tool & Cutter,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2325 E W Maple Commerce Township MI 48390,2325 E W Maple Commerce Township MI 48390,,"13,084",2325 E W Maple,Commerce Township,MI,48390-3831,48390,Oakland County,2.02,17-25-376-021,Industrial,2325 Maple Rd,"Birmingham, MI 48009 ",,Kenneth W McQuillan,,Warehouse,,,Kenneth W McQuillan,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28776 Wall St Wixom MI 48393,28776 Wall St Wixom MI 48393,,"11,540",28776 Wall St,Wixom,MI,48393-3516,48393,Oakland County,0.86,22-08-177-008,Industrial,"43000 W 9 Mile Rd Suite # 302, 306","Novi, MI 48375",Ying Li,Brightlines,(248) 380-6688,Warehouse,,,Brightlines,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28930 Wall St Wixom MI 48393,28930 Wall St Wixom MI 48393,,"10,056",28930 Wall St,Wixom,MI,48393-3520,48393,Oakland County,0.76,22-08-177-003,Industrial,10638-10662 Northend Ave,"Oak Park, MI 48220",,Robin Aire Heating & Cooling,(248) 541-3300,Manufacturing,,,Robin Aire Heating & Cooling,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29001 Wall St Wixom MI 48393,29001 Wall St Wixom MI 48393,,"14,368",29001 Wall St,Wixom,MI,48393-3523,48393,Oakland County,9.5,22-08-176-001,Industrial,29001 Wall St,"Wixom, MI 48393",,Walter Toebe Construction Company,(248) 349-7500,Warehouse,,,Walter Toebe Construction Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29249 Wall St Wixom MI 48393,29249 Wall St Wixom MI 48393,,"16,210",29249 Wall St,Wixom,MI,48393-3527,48393,Oakland County,1.31,22-08-126-010,Industrial,9414 Peer Rd,"South Lyon, MI 48179",,Steven P Russell,(248) 486-9703,Warehouse,,,Steven P Russell,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29305-29335 Wall St Wixom MI 48393,29305-29335 Wall St Wixom MI 48393,,"12,114",29305-29335 Wall St,Wixom,MI,48393-3529,48393,Oakland County,0.64,22-08-126-012,Industrial,29305 Wall St,"Wixom, MI 48393",James Holton,James N & Camille M Holton,(248) 579-8722,Manufacturing,,,James N & Camille M Holton,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3170 Walnut Lake Ct Commerce Township MI 48390,3170 Walnut Lake Ct Commerce Township MI 48390,,"10,500",3170 Walnut Lake Ct,Commerce Township,MI,48390-1743,48390,Oakland County,1.8,17-25-226-025,Industrial,3170 Walnut Lake Rd,"Commerce Township, MI 48390",,Fisher Fuel,(248) 624-4449,Warehouse,,,Fisher Fuel,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3181 Walnut Lake Ct Commerce Township MI 48390,3181 Walnut Lake Ct Commerce Township MI 48390,,"14,160",3181 Walnut Lake Ct,Commerce Township,MI,48390-1744,48390,Oakland County,1.77,17-25-226-031,Industrial,3181 Walnut Lake Ct,"Commerce Township, MI 48390",Lena Moore,Club Pet Inc.,(248) 669-4501,Warehouse,,,Club Pet Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3200 Walnut Lake Ct Commerce Township MI 48390,3200 Walnut Lake Ct Commerce Township MI 48390,,"16,960",3200 Walnut Lake Ct,Commerce Township,MI,48390-1745,48390,Oakland County,1.86,17-25-226-030,Industrial,,,Satish Tummala,"Tummala, Satish",(248) 668-6793,Warehouse,,,"Tummala, Satish",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46969 West Rd Wixom MI 48393,46969 West Rd Wixom MI 48393,,"16,080",46969 West Rd,Wixom,MI,48393,48393,Oakland County,1.44,22-09-102-012,Industrial,1411 West Lake Dr,"Novi, MI 48377",Michael Condon,Michael Condon,(248) 669-8830,Warehouse,,,Michael Condon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47850-47874 West Rd Wixom MI 48393,47850-47874 West Rd Wixom MI 48393,Bldg 2,"16,370",47850-47874 West Rd,Wixom,MI,48393-3667,48393,Oakland County,4.44,22-05-476-029,Industrial,S Emerson,"Brighton, MI 48116",Manesh Shah,Manesh Shah,,Warehouse,,,Manesh Shah,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47974-47998 West Rd Wixom MI 48393,47974-47998 West Rd Wixom MI 48393,Bldg 3,"11,356",47974-47998 West Rd,Wixom,MI,48393-3669,48393,Oakland County,4.18,22-05-476-029,Industrial,12336 W Emerson Dr,"Brighton, MI 48116",Manesh Shah,General Chemical Corporation,(248) 587-5600,Warehouse,,,General Chemical Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48090 West Rd Wixom MI 48393,48090 West Rd Wixom MI 48393,,"10,421",48090 West Rd,Wixom,MI,48393,48393,Oakland County,3.62,22-05-476-050,Industrial,,,,,,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48141-48143 West Rd Wixom MI 48393,48141-48143 West Rd Wixom MI 48393,,"16,400",48141-48143 West Rd,Wixom,MI,48393,48393,Oakland County,1,22-08-200-006,Industrial,1771 Long Lake Shore Dr,"Bloomfield Hills, MI 48302 ",Pjeter Stanaj,Pjeter Stanaj,(248) 338-6660,Warehouse,,,Pjeter Stanaj,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48145-48147 West Rd Wixom MI 48393,48145-48147 West Rd Wixom MI 48393,,"15,378",48145-48147 West Rd,Wixom,MI,48393,48393,Oakland County,5,22-08-200-006,Industrial,1771 Long Lake Shore Dr,"Bloomfield Hills, MI 48302 ",Pjeter Stanaj,Pjeter Stanaj,(248) 338-6660,Warehouse,,,Pjeter Stanaj,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48152 West Rd Wixom MI 48393,48152 West Rd Wixom MI 48393,,"14,350",48152 West Rd,Wixom,MI,48393,48393,Oakland County,1.29,22-05-476-055,Industrial,23179 Telegraph Rd,"Southfield, MI 48033",Darryl Rogers,International Development Company,(248) 353-4800,Warehouse,,,International Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48168 West Rd Wixom MI 48393,48168 West Rd Wixom MI 48393,,"13,263",48168 West Rd,Wixom,MI,48393-3673,48393,Oakland County,0.93,22-05-476-054,Industrial,23179 Telegraph Rd,"Southfield, MI 48033",Darryl Rogers,International Development Company,(248) 353-4800,Warehouse,,,International Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48553 West Rd Wixom MI 48393,48553 West Rd Wixom MI 48393,,"13,080",48553 West Rd,Wixom,MI,48393-3537,48393,Oakland County,2.43,22-08-100-049,Industrial,29350 Wall St,"Wixom, MI 48393",Vivek Bedi,"2V Industries, Inc.",(248) 624-7943,Warehouse,,,"2V Industries, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49175-49201 West Rd Wixom MI 48393,49175-49201 West Rd Wixom MI 48393,,"16,700",49175-49201 West Rd,Wixom,MI,48393-3552,48393,Oakland County,1.91,22-08-100-029,Industrial,,,,,,Manufacturing,,,49175 West Road Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49287-49295 West Rd Wixom MI 48393,49287-49295 West Rd Wixom MI 48393,,"13,000",49287-49295 West Rd,Wixom,MI,48393-3553,48393,Oakland County,2,22-08-100-056,Industrial,49287-49295 West Rd,"Wixom, MI 48393",Wes Umlor,Diffin-Umlor & Associates,(248) 437-7803,Warehouse,,,Diffin-Umlor & Associates,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1625 E West Maple Rd Walled Lake MI 48390,1625 E West Maple Rd Walled Lake MI 48390,,"10,845",1625 E West Maple Rd,Walled Lake,MI,48390-3772,48390,Oakland County,1.32,17-35-126-010,Industrial,1754 Fairway Dr,"Birmingham, MI 48009",,Armando C Decapite,(248) 258-8919,Manufacturing,,,Armando C Decapite,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2065 E West Maple Rd Commerce Township MI 48390,2065 E West Maple Rd Commerce Township MI 48390,Bldg C,"11,000",2065 E West Maple Rd,Commerce Township,MI,48390-3858,48390,Oakland County,6.95,17-26-476-011,Industrial,5373 Pontiac Trl,"West Bloomfield, MI 48323",,Commerce Place,(248) 626-2628,Light Distribution,,,Commerce Place,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2075 E West Maple Rd Commerce Township MI 48390,2075 E West Maple Rd Commerce Township MI 48390,Bldg B,"11,000",2075 E West Maple Rd,Commerce Township,MI,48390-3816,48390,Oakland County,6.95,17-26-476-011,Industrial,5373 Pontiac Trl,"West Bloomfield, MI 48323",,Commerce Place,(248) 626-2628,Light Distribution,,,Commerce Place,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2085 E West Maple Rd Commerce Township MI 48390,2085 E West Maple Rd Commerce Township MI 48390,Bldg A,"11,258",2085 E West Maple Rd,Commerce Township,MI,48390-3802,48390,Oakland County,6.95,17-26-476-011,Industrial,5373 Pontiac Trl,"West Bloomfield, MI 48323",Laurie Cunnington,Commerce Place,(248) 626-2628,,,,Commerce Place,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2420 E West Maple Rd Commerce Township MI 48390,2420 E West Maple Rd Commerce Township MI 48390,,"10,800",2420 E West Maple Rd,Commerce Township,MI,48390-3832,48390,Oakland County,2.6,17-36-100-031,Industrial,2280 E W Maple,"Commerce Township, MI 48390",Gregg Williams,Williams International,(248) 624-5200,Warehouse,,,Williams International,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1200 W West Maple Rd Walled Lake MI 48390,1200 W West Maple Rd Walled Lake MI 48390,,"10,880",1200 W West Maple Rd,Walled Lake,MI,48390,48390,Oakland County,2,17-34-151-011,Industrial,1060 W Maple Rd,"Walled Lake, MI 48390",,Dedoes,(248) 624-7710,Manufacturing,,,Dedoes,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1502 W West Maple Rd Walled Lake MI 48390,1502 W West Maple Rd Walled Lake MI 48390,,"10,000",1502 W West Maple Rd,Walled Lake,MI,48390,48390,Oakland County,0.33,17-33-276-013,Industrial,1502 W West Maple Rd,"Walled Lake, MI 48390 ",Brian Vieaux,Casey's Of Walled Lake,(248) 669-5200,Warehouse,,,Casey's Of Walled Lake,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29632 West Tech Dr Wixom MI 48393,29632 West Tech Dr Wixom MI 48393,,"11,325",29632 West Tech Dr,Wixom,MI,48393-3561,48393,Oakland County,1.28,22-05-351-014,Industrial,,,Russell Taylor,Russell Taylor,,Warehouse,,,Russell Taylor,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29659 West Tech Dr Wixom MI 48393,29659 West Tech Dr Wixom MI 48393,,"17,864",29659 West Tech Dr,Wixom,MI,48393-3561,48393,Oakland County,1.25,22-05-352-008,Industrial,150 W Jefferson,"Detroit, MI 48226 ",,"Commercial Properties III, LLC",(248) 960-6800,Manufacturing,,,"Commercial Properties III, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29706 West Tech Dr Wixom MI 48393,29706 West Tech Dr Wixom MI 48393,,"12,031",29706 West Tech Dr,Wixom,MI,48393-3562,48393,Oakland County,1.48,22-05-351-012,Industrial,31475 Myrna St,"Livonia, MI 48154",Darin Dingman,Darin Dingman,,Warehouse,,,Darin Dingman,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30700 Wixom Rd Wixom MI 48393,30700 Wixom Rd Wixom MI 48393,Aramark,"16,068",30700 Wixom Rd,Wixom,MI,48393-2416,48393,Oakland County,2.13,22-05-106-032,Industrial,49397 Schafer Ave,"Wixom, MI 48393 ",William Clark,Maple Technology Centre LLC,(248) 624-6140,Warehouse,,,Maple Technology Centre LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28930 S Wixom Rd Wixom MI 48393,28930 S Wixom Rd Wixom MI 48393,,"14,000",28930 S Wixom Rd,Wixom,MI,48393,48393,Oakland County,8.5,22-08-100-013,Industrial,4840 Wyoming St,"Dearborn, MI 48126",Carl Bumgardner,"Royal Truck & Trailer Sales & Service, Inc.",(313) 846-4000,,,,"Royal Truck & Trailer Sales & Service, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29020 S Wixom Rd Wixom MI 48393,29020 S Wixom Rd Wixom MI 48393,,"17,999",29020 S Wixom Rd,Wixom,MI,48393,48393,Oakland County,3.19,22-08-100-059,Industrial,29020 S Wixom Rd,"Wixom, MI 48393",Jeffery Weinger,"Retail & Commercial Construction, Inc.",(248) 344-9900,Light Manufacturing,,,"Retail & Commercial Construction, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30178 S Wixom Rd Wixom MI 48393,30178 S Wixom Rd Wixom MI 48393,"Rockwell Medical, Inc.","17,240",30178 S Wixom Rd,Wixom,MI,48393,48393,Oakland County,0.5,22-05-301-002,Industrial,23179 Telegraph Rd,"Southfield, MI 48033",Darryl Rogers,International Development Company,(248) 353-4800,Manufacturing,,,International Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30681-30691 S Wixom Rd Wixom MI 48393,30681-30691 S Wixom Rd Wixom MI 48393,,"15,229",30681-30691 S Wixom Rd,Wixom,MI,48393-2415,48393,Oakland County,2.63,22-06-200-046,Industrial,30681-30691 S Wixom Rd,"Wixom, MI 48393",Lake Nelson,MICHIGAN HARDWOOD DISTRIBUTORS,(248) 669-0790,Manufacturing,,,MICHIGAN HARDWOOD DISTRIBUTORS,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30687 S Wixom Rd Wixom MI 48393,30687 S Wixom Rd Wixom MI 48393,,"12,000",30687 S Wixom Rd,Wixom,MI,48393,48393,Oakland County,2.63,22-06-200-010,Industrial,1561 Chanticlair Cir,"Wixom, MI 48393",Adella Nelson,Nelson Talle Properties Llc,(248) 624-6135,Warehouse,,,Nelson Talle Properties Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48932 Wixom Tech Dr Wixom MI 48393,48932 Wixom Tech Dr Wixom MI 48393,,"16,205",48932 Wixom Tech Dr,Wixom,MI,48393,48393,Oakland County,4.02,22-05-351-010,Industrial,375 Park Ave Suite # 1709,"New York, NY 10152",,"Clayton, Dubilier & Rice",(212) 407-5200,Warehouse,,,"Clayton, Dubilier & Rice",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48985 Wixom Tech Dr Wixom MI 48393,48985 Wixom Tech Dr Wixom MI 48393,,"17,125",48985 Wixom Tech Dr,Wixom,MI,48393-3557,48393,Oakland County,1.71,22-05-351-007,Industrial,48985 Wixom Tech Dr Suite # 1st,"Wixom, MI 48393",Randy Stevens,"Lee Stevens Machinery, Inc.",(248) 926-8400,Warehouse,,,"Lee Stevens Machinery, Inc.",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49113 Wixom Tech Dr Wixom MI 48393,49113 Wixom Tech Dr Wixom MI 48393,,"14,156",49113 Wixom Tech Dr,Wixom,MI,48393-3559,48393,Oakland County,1.01,22-05-351-003,Industrial,28065 Oakland Oaks Ct,"Wixom, MI 48393 ",Yassin Burgol,Yassin Burgol,(248) 668-1111,Manufacturing,,,Yassin Burgol,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49145 Wixom Tech Dr Wixom MI 48393,49145 Wixom Tech Dr Wixom MI 48393,,"12,836",49145 Wixom Tech Dr,Wixom,MI,48393-3569,48393,Oakland County,1.94,22-05-351-002,Industrial,29532 Southfiled Rd Suite # 201,"Southfield, MI 48076",,Douglas Capital Partners,(248) 655-7902,Warehouse,,,Douglas Capital Partners,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +Yew Dr Milford MI 48381,Yew Dr Milford MI 48381,Lot 2 Proposed Building,"10,000",Yew Dr,Milford,MI,48381,48381,Oakland County,,16-25-100-062,Industrial,,,,,,Warehouse,,,"Fyke Street Properties, LLC",EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3130 E Oakley Park Rd Walled Lake MI 48390,3130 E Oakley Park Rd Walled Lake MI 48390,,"13,000",3130 E Oakley Park Rd,Walled Lake,MI,48390,48390,Oakland County,0.8,17-24-226-003,Industrial,3170 Oakley Park Rd,"Walled Lake, MI 48390",,Marotta Company,(248) 669-9170,Warehouse,,,Marotta Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +21043 Old Novi Rd Northville MI 48167,21043 Old Novi Rd Northville MI 48167,,"14,755",21043 Old Novi Rd,Northville,MI,48167-2527,48167,Oakland County,1.43,22-34-477-003,Industrial,21043 Old Novi Rd,"Northville, MI 48167",,Northville Fabricating Inc.,,Warehouse,,,Northville Fabricating Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner +,,,,,,,,,,,,,,,,,,,,,,,,Central I-96 Corridor,Owner,Pending,Owner \ No newline at end of file diff --git a/data/result.csv b/data/result.csv new file mode 100644 index 0000000..86fedb5 --- /dev/null +++ b/data/result.csv @@ -0,0 +1,295 @@ +Description Address L Name,Property Address L Custom Building Address,Property Name L Custom Property Name,RBA L Custom SF Building,Property Address P,City P,State P,No Zip,Zip P,County Name C Territory,Land Area (AC) L Custom,Parcel Number L Custom,Property Type L Tag,True Owner Address C Address: Main Address 1 Full Adress,True Owner City State Zip C Address: Main City,True Owner Contact P Full Name,True Owner Name L Custom True Owner,True Owner Phone P Work,Secondary Type L Custom,Owner Name L Custom Owners Name,Owner Phone L owner Phone,Owner Name Name C Name,Assignee L Assignee,C Tag Industrial,Market Area L Custom,Owner C Tag,Status L,C Description +47677-47695 Avante Dr Wixom, MI 48393,47677-47695 Avante Dr Wixom, MI 48393,,11600,47677-47695 Avante Dr,Wixom,MI,48393-3697,48393,Oakland,0.98,22-08-200-031,Industrial,47695 Avante Dr,Wixom, MI 48393,,Gateway Management Company, LLC,(248) 8-14260,Warehouse,,,Gateway Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28033 Center Oaks Ct Wixom, MI 48393,28033 Center Oaks Ct Wixom, MI 48393,,12200,28033 Center Oaks Ct,Wixom,MI,48393-3344,48393,Oakland,1.05,22-07-326-018,Industrial,7125 Orchard Lake Rd Suite # 306,West Bloomfield, MI 48322,Lewis Wagner,Star Builders, Inc.,(248) 8-53010,Light Manufacturing,,,Star Builders, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +45295 Grand River Ave Novi, MI 48375,45295 Grand River Ave Novi, MI 48375,,10540,45295 Grand River Ave,Novi,MI,48375-1019,48375,Oakland,1.66,22-15-351-044,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2175 Fyke Dr Milford, MI 48381,2175 Fyke Dr Milford, MI 48381,,15000,2175 Fyke Dr,Milford,MI,48381,48381,Oakland,3.64,16-25-100-060,Industrial,47133 W 9 Mile Rd,Novi, MI 48374,Amar Abro,Amar Abro,(903) 3-08725,Manufacturing,,,Amar Abro,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55800 Grand River Ave New Hudson, MI 48165,55800 Grand River Ave New Hudson, MI 48165,Unit 31A,10800,55800 Grand River Ave,New Hudson,MI,48165-8711,48165,Oakland,2.35,21-03-402-018,Industrial,55800 Grand River Ave Suite # 150,New Hudson, MI 48165-8711,Mark Evangelista,Evangelista Corporation,(248) 8-80400,Light Manufacturing,,,Evangelista Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25873-25921 Meadowbrook Rd Novi, MI 48375,25873-25921 Meadowbrook Rd Novi, MI 48375,Building 4,17726,25873-25921 Meadowbrook Rd,Novi,MI,48375-1851,48375,Oakland,2.31,22-23-230-004,Industrial,41200-41218 Bridge St,Novi, MI 48375-1301,Bill McKeever,Certified Management,(248) 8-66700,R&D,,,Certified Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25460 Trans X Rd Novi, MI 48375,25460 Trans X Rd Novi, MI 48375,,12907,25460 Trans X Rd,Novi,MI,48375,48375,Oakland,1.50,22-23-151-027,Industrial,45605 W 9 Mile Rd,Novi, MI 48374,Defrim Cizmja,Cizmja, Defrim,(248) 8-75062,Warehouse,,,Cizmja, Defrim,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41180 Vincenti Ct Novi, MI 48375,41180 Vincenti Ct Novi, MI 48375,,14440,41180 Vincenti Ct,Novi,MI,48375-1922,48375,Oakland,1.03,22-24-100-034,Industrial,4038 Foxpointe Dr,West Bloomfield, MI 48323,Donald Hoexter,Hawthorne Management Co,(281) 1-88840,Manufacturing,,,Hawthorne Management Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2045 E West Maple Rd Commerce Township, MI 48390,2045 E West Maple Rd Commerce Township, MI 48390,Bldg D,11000,2045 E West Maple Rd,Commerce Township,MI,48390-3801,48390,Oakland,7.77,17-26-476-011,Industrial,2045 E W Maple,Commerce Township, MI 48390,,Cunnington Family Commerce Ltd. Par,() -,Light Distribution,,,Cunnington Family Commerce Ltd. Par,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +42900 W 9 Mile Rd Novi, MI 48375,42900 W 9 Mile Rd Novi, MI 48375,,14400,42900 W 9 Mile Rd,Novi,MI,48375-4123,48375,Oakland,0.80,22-26-376-020,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +43700 W 12 Mile Rd Novi, MI 48377,43700 W 12 Mile Rd Novi, MI 48377,,15400,43700 W 12 Mile Rd,Novi,MI,48377,48377,Oakland,,22-10-400-053,Industrial,29850-29864 Northwestern Hwy,Southfield, MI 48034,Amer Asmar,Amer Asmar,(248) 8-75454,Warehouse,,,Amer Asmar,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46845 W 12 Mile Rd Novi, MI 48377,46845 W 12 Mile Rd Novi, MI 48377,Cougar Cutting Products,14000,46845 W 12 Mile Rd,Novi,MI,48377-3200,48377,Oakland,1.49,22-16-126-013,Industrial,P.O. Box 508,Novi, MI 48376-0508,Martin Schmitt,Beck Property Management,(248) 8-88864,Warehouse,,,Beck Property Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30503-30505 Andersen Ct Wixom, MI 48393,30503-30505 Andersen Ct Wixom, MI 48393,,12000,30503-30505 Andersen Ct,Wixom,MI,48393,48393,Oakland,0.85,22-05-276-004,Industrial,333 Osprey St,Walled Lake, MI 48390,,A.I. Properties, LLC,(248) 8-91075,Warehouse,,,A.I. Properties, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47840 Anna Ct Wixom, MI 48393,47840 Anna Ct Wixom, MI 48393,,13585,47840 Anna Ct,Wixom,MI,48393-3687,48393,Oakland,1.05,22-08-227-021,Industrial,47840 Anna Ct,Wixom, MI 48393-3687,Mike Murray,Lyons Tool & Manufacturing Corporation,(248) 8-49644,Manufacturing,,,Lyons Tool & Manufacturing Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48009 Anna Ct Wixom, MI 48393,48009 Anna Ct Wixom, MI 48393,,12000,48009 Anna Ct,Wixom,MI,48393,48393,Oakland,1.28,22-08-227-019,Industrial,1395 Energy Way,Highland, MI 48357,George Gudzinski,Commercial Fabricating,(248) 8-71595,Warehouse,,,Commercial Fabricating,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29757 Anthony Dr Wixom, MI 48393,29757 Anthony Dr Wixom, MI 48393,,14314,29757 Anthony Dr,Wixom,MI,48393-3606,48393,Oakland,1.00,22-05-476-037,Industrial,29757 Anthony Dr,Wixom, MI 48393-3606,Michael Kuehnl,Kuehnl, Michael H,(248) 8-71689,Warehouse,,,Kuehnl, Michael H,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29769 Anthony Dr Wixom, MI 48393,29769 Anthony Dr Wixom, MI 48393,,12920,29769 Anthony Dr,Wixom,MI,48393-3606,48393,Oakland,0.93,22-05-476-036,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47400 Avante Dr Wixom, MI 48393,47400 Avante Dr Wixom, MI 48393,,12714,47400 Avante Dr,Wixom,MI,48393-3615,48393,Oakland,1.94,22-08-200-028,Industrial,47400 Avante Dr,Wixom, MI 48393-3615,Daniel Booth,Nostalgic Motor Cars,(248) 8-94884,Warehouse,,,Nostalgic Motor Cars,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +777 Baseline Rd Northville, MI 48167,777 Baseline Rd Northville, MI 48167,,15000,777 Baseline Rd,Northville,MI,48167,48167,Oakland,4.00,22-34-478-001,Industrial,115 N Center St Suite # 204,Northville, MI 48167,Donald Samhat,Donald L Samhat PC,(248) 8-98560,Warehouse,,,Donald L Samhat PC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28214 Beck Rd Wixom, MI 48393,28214 Beck Rd Wixom, MI 48393,R & K Tool,17200,28214 Beck Rd,Wixom,MI,48393-3623,48393,Oakland,1.84,22-09-300-036,Industrial,28214 Beck Rd,Wixom, MI 48393-3623,,Professional Sprinkler Incorporated,(248) 8-95740,Manufacturing,,,Professional Sprinkler Incorporated,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28294 Beck Rd Wixom, MI 48393,28294 Beck Rd Wixom, MI 48393,,16380,28294 Beck Rd,Wixom,MI,48393-3623,48393,Oakland,1.87,22-09-300-034,Industrial,2550 E Buno Rd,Milford, MI 48381,,Preventive Maintenance Tech,(248) 8-46405,Warehouse,,,Preventive Maintenance Tech,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28381 Beck Rd Wixom, MI 48393,28381 Beck Rd Wixom, MI 48393,Bldg K,13560,28381 Beck Rd,Wixom,MI,48393-4731,48393,Oakland,0.85,22-08-426-028,Industrial,28345 Beck Rd Suite # 100,Wixom, MI 48393-4733,Charley Damas,Canton Business Center,(248) 8-48970,Light Manufacturing,,,Canton Business Center,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28389 Beck Rd Wixom, MI 48393,28389 Beck Rd Wixom, MI 48393,Bldg J,14000,28389 Beck Rd,Wixom,MI,48393-4732,48393,Oakland,1.68,22-08-426-027,Industrial,28345 Beck Rd Suite # 100,Wixom, MI 48393-4733,Charley Damas,Canton Business Center,(248) 8-48970,Light Manufacturing,,,Canton Business Center,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28700 Beck Rd Wixom, MI 48393,28700 Beck Rd Wixom, MI 48393,,16356,28700 Beck Rd,Wixom,MI,48393-3604,48393,Oakland,1.73,22-09-152-001,Industrial,39830 Grand River Ave Suite # B1-A,Novi, MI 48375-2140,,NMB Technologies Corporation,(248) 8-92933,R&D,,,NMB Technologies Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29592 Beck Rd Wixom, MI 48393,29592 Beck Rd Wixom, MI 48393,,17461,29592 Beck Rd,Wixom,MI,48393-2821,48393,Oakland,1.35,22-04-351-017,Industrial,28265 Beck Rd,Wixom, MI 48393-4719,Karam Bahnam,USA To Go,(248) 8-37992,Manufacturing,,,USA To Go,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29650 Beck Rd Wixom, MI 48393,29650 Beck Rd Wixom, MI 48393,,14195,29650 Beck Rd,Wixom,MI,48393-2822,48393,Oakland,1.35,22-04-351-012,Industrial,32367 Eight Mile Rd,Farmington Hills, MI 48336,Donna Dancik,Donna Dancik,(248) 8-18985,Warehouse,,,Donna Dancik,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1006 Benstein Rd Walled Lake, MI 48390,1006 Benstein Rd Walled Lake, MI 48390,,12000,1006 Benstein Rd,Walled Lake,MI,48390-2912,48390,Oakland,8.56,17-33-226-012,Industrial,28454 Woodward Ave,Royal Oak, MI 48067,,1006 Benstein Llc,(248) 8-16320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1036 Benstein Rd Walled Lake, MI 48390,1036 Benstein Rd Walled Lake, MI 48390,,12000,1036 Benstein Rd,Walled Lake,MI,48390-2913,48390,Oakland,8.56,17-33-226-012,Industrial,28454 Woodward Ave,Royal Oak, MI 48067,,1006 Benstein Llc,(248) 8-16320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1042 Benstein Rd Walled Lake, MI 48390,1042 Benstein Rd Walled Lake, MI 48390,,12000,1042 Benstein Rd,Walled Lake,MI,48390-2914,48390,Oakland,8.42,17-33-226-012,Industrial,28454 Woodward Ave,Royal Oak, MI 48067,,1006 Benstein Llc,(248) 8-16320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1046 Benstein Rd Walled Lake, MI 48390,1046 Benstein Rd Walled Lake, MI 48390,,12000,1046 Benstein Rd,Walled Lake,MI,48390-2915,48390,Oakland,8.56,17-33-226-012,Industrial,28454 Woodward Ave,Royal Oak, MI 48067,,1006 Benstein Llc,(248) 8-16320,Warehouse,,,1006 Benstein Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1200 Benstein Rd Commerce Township, MI 48390,1200 Benstein Rd Commerce Township, MI 48390,,12000,1200 Benstein Rd,Commerce Township,MI,48390,48390,Oakland,7.91,17-28-476-020,Industrial,2078 Winner St,Commerce Township, MI 48390,Steven Steinway,Preferred Health Products Inc,(248) 8-94300,Warehouse,,,Preferred Health Products Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8601 Boulder Ct Walled Lake, MI 48390,8601 Boulder Ct Walled Lake, MI 48390,BTV Systems,14480,8601 Boulder Ct,Walled Lake,MI,48390,48390,Oakland,1.52,17-13-300-101,Industrial,8601 Boulder Ct,Walled Lake, MI 48390,,Real Green Systems,(248) 8-05296,Distribution,,,Real Green Systems,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8680 Boulder Ct Walled Lake, MI 48390,8680 Boulder Ct Walled Lake, MI 48390,,15338,8680 Boulder Ct,Walled Lake,MI,48390,48390,Oakland,2.64,17-13-300-098,Industrial,8700 Boulder Ct,Walled Lake, MI 48390,,Boulder Development Inc,(248) 8-04700,Warehouse,,,Boulder Development Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8681 Boulder Ct Walled Lake, MI 48390,8681 Boulder Ct Walled Lake, MI 48390,,12500,8681 Boulder Ct,Walled Lake,MI,48390,48390,Oakland,2.00,17-13-300-100,Industrial,8700 Boulder Ct,Walled Lake, MI 48390,Dave Smith,Boulder Development Inc,(248) 8-04700,Warehouse,,,Boulder Development Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41100 Bridge St Novi, MI 48375,41100 Bridge St Novi, MI 48375,,11920,41100 Bridge St,Novi,MI,48375-1300,48375,Oakland,0.74,22-13-351-015,Industrial,3565 Bradford Square Dr,Ann Arbor, MI 48103,John Varick,John F Varick,(734) 4-46211,R&D,,,John F Varick,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41280 Bridge St Novi, MI 48375,41280 Bridge St Novi, MI 48375,,16980,41280 Bridge St,Novi,MI,48375,48375,Oakland,1.32,22-13-351-021,Industrial,3944 Winterset Ln,West Bloomfield, MI 48033,Taher Rasheed,Rasheed Family Investments,LLC,(313) 3-53318,R&D,,,Rasheed Family Investments,LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +Cabot Dr Novi, MI 48377,Cabot Dr Novi, MI 48377,,10000,Cabot Dr,Novi,MI,48377,48377,Oakland,2.40,22-12-200-054,Industrial,,,,,() -,,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28350 Cabot Dr Novi, MI 48377,28350 Cabot Dr Novi, MI 48377,,12014,28350 Cabot Dr,Novi,MI,48377-2919,48377,Oakland,3.67,22-12-400-047,Industrial,39000 Country Club Dr,Farmington Hills, MI 48331,,Northern Equities Management Company,(248) 8-86400,,,,Northern Equities Management Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29185 Cabot Dr Novi, MI 48377,29185 Cabot Dr Novi, MI 48377,,12230,29185 Cabot Dr,Novi,MI,48377-2936,48377,Oakland,2.48,22-12-200-028,Industrial,39000 Country Club Dr,Farmington Hills, MI 48331,Neil Sosin,Northern Equities Group,(248) 8-86400,R&D,,,Northern Equities Group,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47119 Cartier Ct Wixom, MI 48393,47119 Cartier Ct Wixom, MI 48393,,15720,47119 Cartier Ct,Wixom,MI,48393-2872,48393,Oakland,1.31,22-04-152-013,Industrial,26899 Northwestern Hwy Suite # 306,Southfield, MI 48033,Howard Baum,Howard Baum Development Company,(248) 8-03600,Warehouse,,,Howard Baum Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47167 Cartier Ct Wixom, MI 48393,47167 Cartier Ct Wixom, MI 48393,,15895,47167 Cartier Ct,Wixom,MI,48393,48393,Oakland,2.15,22-04-152-005,Industrial,3641 Loblolly Bay Rd,Labelle, FL 33935,John Leekley,John Robert Leekley,(313) 3-68129,Distribution,,,John Robert Leekley,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47110 Cartier Dr Wixom, MI 48393,47110 Cartier Dr Wixom, MI 48393,Dantom,11650,47110 Cartier Dr,Wixom,MI,48393,48393,Oakland,2.01,22-04-151-009,Industrial,326 E 4th St Suite # 200,Royal Oak, MI 48067-2706,Todd Wyett,Versa Development,(248) 8-61081,Warehouse,,,Versa Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47140 Cartier Dr Wixom, MI 48393,47140 Cartier Dr Wixom, MI 48393,,13650,47140 Cartier Dr,Wixom,MI,48393-2876,48393,Oakland,3.61,22-04-151-008,Industrial,47140 Cartier Dr,Wixom, MI 48393-2876,Craig O'Donnell,AEL Michigan, LLC,(248) 8-84966,Warehouse,,,AEL Michigan, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28043 Center Oaks Ct Wixom, MI 48393,28043 Center Oaks Ct Wixom, MI 48393,,17500,28043 Center Oaks Ct,Wixom,MI,48393-3344,48393,Oakland,1.23,22-07-326-041,Industrial,28043 Center Oaks Ct,Wixom, MI 48393,Karen Wilson,Wersborg, LLC,(248) 8-09586,Warehouse,,,Wersborg, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28044 Center Oaks Ct Wixom, MI 48393,28044 Center Oaks Ct Wixom, MI 48393,,15140,28044 Center Oaks Ct,Wixom,MI,48393-3343,48393,Oakland,1.52,22-07-326-037,Industrial,500 Woodward Ave Suite # 3500,Detroit, MI 48226-3416,Kevin Didio,Clark Hill’s Automotive and Manufacturing Practice,(313) 3-99461,Warehouse,,,Clark Hill’s Automotive and Manufacturing Practice,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28064 Center Oaks Ct Wixom, MI 48393,28064 Center Oaks Ct Wixom, MI 48393,,12186,28064 Center Oaks Ct,Wixom,MI,48393,48393,Oakland,1.42,22-07-326-022,Industrial,28064 Center Oaks Ct Suite # A,Wixom, MI 48393,Bertran Gili,Metrologic Group Services Inc.,(248) 8-69090,R&D,,,Metrologic Group Services Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50950 Century Ct Wixom, MI 48393,50950 Century Ct Wixom, MI 48393,,14250,50950 Century Ct,Wixom,MI,48393,48393,Oakland,1.03,22-06-101-060,Industrial,39475 W 13 Mile Rd Suite # 205,Novi, MI 48377-2301,Chad Zamler,Zamler Development,(248) 8-59003,Warehouse,,,Zamler Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51004 Century Ct Wixom, MI 48393,51004 Century Ct Wixom, MI 48393,,14250,51004 Century Ct,Wixom,MI,48393,48393,Oakland,1.03,22-06-101-059,Industrial,39475 W 13 Mile Rd Suite # 205,Novi, MI 48377-2301,Chad Zamler,Century Construction & Management, LLC,(248) 8-43311,Manufacturing,,,Century Construction & Management, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51056 Century Ct Wixom, MI 48393,51056 Century Ct Wixom, MI 48393,,16992,51056 Century Ct,Wixom,MI,48393,48393,Oakland,1.12,22-06-101-058,Industrial,39475 W 13 Mile Rd Suite # 205,Novi, MI 48377-2301,Chad Zamler,Zamler Development,(248) 8-59003,Manufacturing,,,Zamler Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30587 Century Dr Wixom, MI 48393,30587 Century Dr Wixom, MI 48393,Zimmerman,13222,30587 Century Dr,Wixom,MI,48393-2062,48393,Oakland,1.87,22-06-101-011,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +31267 Century Dr Wixom, MI 48393,31267 Century Dr Wixom, MI 48393,,17000,31267 Century Dr,Wixom,MI,48393-2065,48393,Oakland,1.11,22-06-101-001,Industrial,33527-33529 7 Mile Rd,Livonia, MI 48152-3079,,Gargaro Construction Company,(248) 8-34141,Warehouse,,,Gargaro Construction Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2299 Childs Lake Rd Milford, MI 48381,2299 Childs Lake Rd Milford, MI 48381,Bills Tree,11900,2299 Childs Lake Rd,Milford,MI,48381,48381,Oakland,6.59,16-24-101-002,Industrial,2299 Childs Lake Rd,Milford, MI 48381,Mike Bockelman,Bockelman Development,(800) 0-82876,Manufacturing,,,Bockelman Development,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1287 S Commerce Rd Walled Lake, MI 48390,1287 S Commerce Rd Walled Lake, MI 48390,AT&T,10072,1287 S Commerce Rd,Walled Lake,MI,48390,48390,Oakland,2.26,17-27-451-002,Industrial,3566 Michael Ave SW,Grand Rapids, MI 49509,,Mi Bell Telephone Co,(616) 6-05600,Telecom Hotel/Data Hosting,,,Mi Bell Telephone Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2599 Crumb Rd Walled Lake, MI 48390,2599 Crumb Rd Walled Lake, MI 48390,Elsey Construction Products,18000,2599 Crumb Rd,Walled Lake,MI,48390-2814,48390,Oakland,5.00,17-25-326-008,Industrial,2599 Crumb Rd,Walled Lake, MI 48390-2814,,Elsey Construction Products,(248) 8-48177,Warehouse,,,Elsey Construction Products,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1011 Decker Rd Walled Lake, MI 48390,1011 Decker Rd Walled Lake, MI 48390,,12100,1011 Decker Rd,Walled Lake,MI,48390-3219,48390,Oakland,2.25,17-35-126-016,Industrial,1 Towne Sq Suite # 1835,Southfield, MI 48076-3700,,Siegel & Greenfield,(248) 8-65900,Manufacturing,,,Siegel & Greenfield,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50322 Dennis Ct Wixom, MI 48393,50322 Dennis Ct Wixom, MI 48393,Scott's Lawn Service,18000,50322 Dennis Ct,Wixom,MI,48393-2025,48393,Oakland,3.51,17-31-352-006,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50384-50388 Dennis Ct Wixom, MI 48393,50384-50388 Dennis Ct Wixom, MI 48393,Bldg G,10783,50384-50388 Dennis Ct,Wixom,MI,48393-2025,48393,Oakland,1.02,17-31-352-004,Industrial,6960 Orchard Lake Rd Suite # 300,West Bloomfield, MI 48322-4515,Kelly Woodley,First Holding Management Company, LLC,(248) 8-53330,Warehouse,,,First Holding Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50400 Dennis Ct Wixom, MI 48393,50400 Dennis Ct Wixom, MI 48393,,11525,50400 Dennis Ct,Wixom,MI,48393-2048,48393,Oakland,1.20,17-31-352-002,Industrial,6960 Orchard Lake Rd Suite # 300,West Bloomfield, MI 48322-4515,Kelly Woodley,First Holding Management Company, LLC,(248) 8-53330,Light Manufacturing,,,First Holding Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50420 Dennis Ct Wixom, MI 48393,50420 Dennis Ct Wixom, MI 48393,,10383,50420 Dennis Ct,Wixom,MI,48393-2076,48393,Oakland,0.69,17-31-352-001,Industrial,6960 Orchard Lake Rd Suite # 300,West Bloomfield, MI 48322-4515,Kelly Woodley,First Holding Management Company, LLC,(248) 8-53330,Warehouse,,,First Holding Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50200-50210 Dennis Industrial Ct Wixom, MI 48393,50200-50210 Dennis Industrial Ct Wixom, MI 48393,Bldg D,13417,50200-50210 Dennis Industrial Ct,Wixom,MI,48393-2021,48393,Oakland,0.69,17-31-352-009,Industrial,6960 Orchard Lake Rd Suite # 300,West Bloomfield, MI 48322-4515,Kelly Woodley,First Holding Management Company, LLC,(248) 8-53330,Warehouse,,,First Holding Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50240-50250 Dennis Industrial Ct Wixom, MI 48393,50240-50250 Dennis Industrial Ct Wixom, MI 48393,Bldg F,15504,50240-50250 Dennis Industrial Ct,Wixom,MI,48393-2024,48393,Oakland,3.51,17-31-352-007,Industrial,6960 Orchard Lake Rd Suite # 300,West Bloomfield, MI 48322-4515,Kelly Woodley,First Holding Management Company, LLC,(248) 8-53330,Warehouse,,,First Holding Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50394 Dennis Industrial Pky Wixom, MI 48393,50394 Dennis Industrial Pky Wixom, MI 48393,Bldg C,14000,50394 Dennis Industrial Pky,Wixom,MI,48393-2026,48393,Oakland,11.81,17-31-352-003,Industrial,6960 Orchard Lake Rd Suite # 300,West Bloomfield, MI 48322-4515,Kelly Woodley,First Holding Management Company, LLC,(248) 8-53330,Light Manufacturing,,,First Holding Management Company, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46470 Desoto Ct Novi, MI 48377,46470 Desoto Ct Novi, MI 48377,Bldg B,15555,46470 Desoto Ct,Novi,MI,48377-1731,48377,Oakland,1.16,22-04-379-002,Industrial,46470 Desoto Ct,Novi, MI 48377-1731,Jin Hong,TREK Inc.,(248) 8-82131,Manufacturing,,,TREK Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48575 Downing Dr Wixom, MI 48393,48575 Downing Dr Wixom, MI 48393,,10000,48575 Downing Dr,Wixom,MI,48393-3503,48393,Oakland,1.65,22-08-100-041,Industrial,331 Metty Dr,Ann Arbor, MI 48103-9155,Robert Hoffman,Ducks Unlimited Inc,(734) 4-32035,Warehouse,,,Ducks Unlimited Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48590-48596 Downing Dr Wixom, MI 48393,48590-48596 Downing Dr Wixom, MI 48393,,16000,48590-48596 Downing Dr,Wixom,MI,48393-3501,48393,Oakland,2.17,22-08-100-026,Industrial,30380 S Hill Ct,New Hudson, MI 48165,Dennis Sinacoloa,Sinacola Construction,(248) 8-79777,Warehouse,,,Sinacola Construction,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48602 Downing Dr Wixom, MI 48393,48602 Downing Dr Wixom, MI 48393,,14909,48602 Downing Dr,Wixom,MI,48393-3504,48393,Oakland,2.00,22-08-100-032,Industrial,7205 Deer Lake Rd,Clarkston, MI 48346,William Hannon,HANNON MARINE STORAGE LLC,(248) 8-06447,Warehouse,,,HANNON MARINE STORAGE LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1925 Easy St Commerce Township, MI 48390,1925 Easy St Commerce Township, MI 48390,,10800,1925 Easy St,Commerce Township,MI,48390-3221,48390,Oakland,0.90,17-26-426-030,Industrial,1977 E West Maple Rd,Walled Lake, MI 48390,,Advance Plumbing & Heating Supply Co.,(248) 8-97474,Warehouse,,,Advance Plumbing & Heating Supply Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1941-1951 Easy St Commerce Township, MI 48390,1941-1951 Easy St Commerce Township, MI 48390,,16348,1941-1951 Easy St,Commerce Township,MI,48390-3221,48390,Oakland,1.32,17-26-426-031,Industrial,2175 E W Maple Rd,Commerce Township, MI 48382,Bruce Bullard,Bruce Bullard,(248) 8-80077,Warehouse,,,Bruce Bullard,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2005-2035 Easy St Commerce Township, MI 48390,2005-2035 Easy St Commerce Township, MI 48390,,11385,2005-2035 Easy St,Commerce Township,MI,48390-3223,48390,Oakland,0.89,17-26-426-061,Industrial,3646 E Elder Rd,West Bloomfield, MI 48324,Joel Rosenberg,Easy Street Investments, LLC,(248) 8-09394,Warehouse,,,Easy Street Investments, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2121 Easy St Commerce Township, MI 48390,2121 Easy St Commerce Township, MI 48390,,18000,2121 Easy St,Commerce Township,MI,48390-3225,48390,Oakland,1.65,17-26-426-015,Industrial,,,Alan Edelson,Alan Edelson,() -,Warehouse,,,Alan Edelson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2431 Fyke Dr Milford, MI 48381,2431 Fyke Dr Milford, MI 48381,,11154,2431 Fyke Dr,Milford,MI,48381,48381,Oakland,5.15,16-25-100-014,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8177 Goldie St Walled Lake, MI 48390,8177 Goldie St Walled Lake, MI 48390,,10736,8177 Goldie St,Walled Lake,MI,48390,48390,Oakland,4.66,17-13-400-009,Industrial,8177 Goldie St,Walled Lake, MI 48390,Richard White,CA Hull Co Inc,(248) 8-48025,Manufacturing,,,CA Hull Co Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8225 Goldie St Commerce Township, MI 48390,8225 Goldie St Commerce Township, MI 48390,,14885,8225 Goldie St,Commerce Township,MI,48390-4109,48390,Oakland,9.01,17-13-400-008,Industrial,8177 Goldie St,Walled Lake, MI 48390,Joseph Malloure,CA Hull Co Inc,(248) 8-48025,Warehouse,,,CA Hull Co Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8230 Goldie St Commerce Township, MI 48390,8230 Goldie St Commerce Township, MI 48390,,12000,8230 Goldie St,Commerce Township,MI,48390-4108,48390,Oakland,1.03,17-13-400-044,Industrial,32235 Craftsbury,Farmington Hills, MI 48334-3429,Marion Johnsee,Marion Johnsee,() -,Distribution,,,Marion Johnsee,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8232 Goldie St Commerce Township, MI 48390,8232 Goldie St Commerce Township, MI 48390,,12000,8232 Goldie St,Commerce Township,MI,48390-4108,48390,Oakland,1.03,17-13-400-043,Industrial,32235 Craftsbury,Farmington Hills, MI 48334-3429,Marion Johnsee,Marion Johnsee,() -,Warehouse,,,Marion Johnsee,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +8240-8246 Goldie St Commerce Township, MI 48390,8240-8246 Goldie St Commerce Township, MI 48390,,16000,8240-8246 Goldie St,Commerce Township,MI,48390-4108,48390,Oakland,1.48,17-13-400-047,Industrial,8246 Goldie St,Commerce Township, MI 48390-4108,Dan Wissner,Direct Connect Systems,(800) 0-55714,Manufacturing,,,Direct Connect Systems,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28011 Grand Oaks Ct Wixom, MI 48393,28011 Grand Oaks Ct Wixom, MI 48393,Century Architectural Hardware,11640,28011 Grand Oaks Ct,Wixom,MI,48393-3340,48393,Oakland,1.49,22-07-401-015,Industrial,3145 Copper Rd,Fenton, MI 48430,Adam Cole,Excel Medical Products Llc,(810) 0-44775,Warehouse,,,Excel Medical Products Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28021 Grand Oaks Ct Wixom, MI 48393,28021 Grand Oaks Ct Wixom, MI 48393,,15660,28021 Grand Oaks Ct,Wixom,MI,48393-3340,48393,Oakland,1.26,22-07-401-016,Industrial,28021 Grand Oaks Ct,Wixom, MI 48393-3340,Beth Ancona,Ancona Controls,(248) 8-45600,Warehouse,,,Ancona Controls,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28061 Grand Oaks Ct Wixom, MI 48393,28061 Grand Oaks Ct Wixom, MI 48393,,13992,28061 Grand Oaks Ct,Wixom,MI,48393-3340,48393,Oakland,1.40,22-07-401-020,Industrial,38250 French Pond,Farmington Hills, MI 48331,Jon Williamson,Jon P Williamson,(248) 8-91106,Warehouse,,,Jon P Williamson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +39586 Grand River Ave Novi, MI 48375,39586 Grand River Ave Novi, MI 48375,Keford Collision,16000,39586 Grand River Ave,Novi,MI,48375-2102,48375,Oakland,2.35,22-24-426-007,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40020 Grand River Ave Novi, MI 48375,40020 Grand River Ave Novi, MI 48375,Bldg A,14924,40020 Grand River Ave,Novi,MI,48375-2112,48375,Oakland,1.60,22-24-401-019,Industrial,6111 N Shore Dr,West Bloomfield, MI 48324,,Steven Kopitz,(248) 8-26012,Light Manufacturing,,,Steven Kopitz,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40024 Grand River Ave Novi, MI 48375,40024 Grand River Ave Novi, MI 48375,Bldg B,12330,40024 Grand River Ave,Novi,MI,48375,48375,Oakland,1.32,22-24-401-019,Industrial,6111 N Shore Dr,West Bloomfield, MI 48324,,Steven Kopitz,(248) 8-26012,Light Manufacturing,,,Steven Kopitz,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40028 Grand River Ave Novi, MI 48375,40028 Grand River Ave Novi, MI 48375,Bldg C,12330,40028 Grand River Ave,Novi,MI,48375-2167,48375,Oakland,1.32,22-24-401-019,Industrial,6111 N Shore Dr,West Bloomfield, MI 48324,,Steven Kopitz,(248) 8-26012,Light Manufacturing,,,Steven Kopitz,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40220 Grand River Ave Novi, MI 48375,40220 Grand River Ave Novi, MI 48375,,11464,40220 Grand River Ave,Novi,MI,48375-2116,48375,Oakland,4.91,22-24-401-026,Industrial,39500 High Pointe Blvd,Novi, MI 48375-5505,,AJR Development, Inc.,(248) 8-06150,R&D,,,AJR Development, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40375 Grand River Ave Novi, MI 48375,40375 Grand River Ave Novi, MI 48375,,13883,40375 Grand River Ave,Novi,MI,48375-2123,48375,Oakland,0.82,22-24-451-002,Industrial,40375 Grand River Ave,Novi, MI 48375-2123,Thelma Lacy,Thelma C. Lacy,() -,Warehouse,,,Thelma C. Lacy,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40850 Grand River Ave Novi, MI 48375,40850 Grand River Ave Novi, MI 48375,Bldg A,13500,40850 Grand River Ave,Novi,MI,48375-5705,48375,Oakland,1.60,22-24-100-012,Industrial,41106 Clermont Ave,Novi, MI 48375-5702,Sanjay Seth,Seth Investments LLC,(248) 8-50313,Warehouse,,,Seth Investments LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +40950 Grand River Ave Novi, MI 48375,40950 Grand River Ave Novi, MI 48375,,12000,40950 Grand River Ave,Novi,MI,48375-2816,48375,Oakland,1.06,22-24-100-057,Industrial,2112 Prestwick Dr,Farmington Hills, MI 48335,Alan wood,Alan Wood,(248) 8-57574,Warehouse,,,Alan Wood,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +44375 Grand River Ave Novi, MI 48375,44375 Grand River Ave Novi, MI 48375,,13000,44375 Grand River Ave,Novi,MI,48375-1156,48375,Oakland,1.15,22-15-378-014,Industrial,13821 Elmira St,Detroit, MI 48227,John Debono,Shaw & Slavsky Inc,(313) 3-43990,Warehouse,,,Shaw & Slavsky Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +45031-45033 Grand River Ave Novi, MI 48375,45031-45033 Grand River Ave Novi, MI 48375,,15586,45031-45033 Grand River Ave,Novi,MI,48375-1015,48375,Oakland,2.23,22-15-351-025,Industrial,45033 Grand River,Novi, MI 48375-1015,Daniel Mansfield,Daniel C. Mansfield,() -,Warehouse,,,Daniel C. Mansfield,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +45500 Grand River Ave Novi, MI 48374,45500 Grand River Ave Novi, MI 48374,,13423,45500 Grand River Ave,Novi,MI,48374-1305,48374,Oakland,10.05,22-16-426-005,Industrial,P.O.Box 8018,Novi, MI 48376-8018,,DeMaria Building Co.,(248) 8-88710,Warehouse,,,DeMaria Building Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46001 Grand River Ave Novi, MI 48374,46001 Grand River Ave Novi, MI 48374,,12552,46001 Grand River Ave,Novi,MI,48374-1319,48374,Oakland,1.00,22-16-451-054,Industrial,6761 E Ten Mile Rd,Center Line, MI 48015,,Servall Inc.,(586) 6-41818,Warehouse,,,Servall Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46035 Grand River Ave Novi, MI 48374,46035 Grand River Ave Novi, MI 48374,,17214,46035 Grand River Ave,Novi,MI,48374-1319,48374,Oakland,7.67,22-16-451-005,Industrial,138 W Fisher Fwy,Detroit, MI 48201,Victor Giller,Paradise Properties Inc,(248) 8-84890,Manufacturing,,,Paradise Properties Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46085 Grand River Ave Novi, MI 48374,46085 Grand River Ave Novi, MI 48374,,10622,46085 Grand River Ave,Novi,MI,48374-1319,48374,Oakland,3.74,22-16-451-041,Industrial,3500 Ridge Rd,Highland, MI 48356,Robert Massard,Robert Massard,(248) 8-70417,Warehouse,,,Robert Massard,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46089 Grand River Ave Novi, MI 48374,46089 Grand River Ave Novi, MI 48374,,12032,46089 Grand River Ave,Novi,MI,48374-1319,48374,Oakland,1.03,22-16-451-042,Industrial,46089 Grand River Ave,Novi, MI 48374-1319,,Slaco Tool & Manufacturing,(248) 8-99911,Manufacturing,,,Slaco Tool & Manufacturing,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46400 Grand River Ave Novi, MI 48374,46400 Grand River Ave Novi, MI 48374,Bell Fork Lift,14073,46400 Grand River Ave,Novi,MI,48374-1323,48374,Oakland,1.60,22-16-251-017,Industrial,34660 Centaur Dr Suite # 34660,Clinton Township, MI 48035,,Bell Fork Fort Inc,(586) 6-25773,Warehouse,,,Bell Fork Fort Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46700 Grand River Ave Novi, MI 48374,46700 Grand River Ave Novi, MI 48374,,10800,46700 Grand River Ave,Novi,MI,48374-1326,48374,Oakland,19.22,22-16-176-020,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47087 Grand River Ave Novi, MI 48374,47087 Grand River Ave Novi, MI 48374,,15000,47087 Grand River Ave,Novi,MI,48374-1340,48374,Oakland,3.00,22-16-151-002,Industrial,47087 Grand River Ave,Novi, MI 48374-1340,Mike McCowan,Mike McCowan,(248) 8-98877,Manufacturing,,,Mike McCowan,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48545 Grand River Ave Novi, MI 48374,48545 Grand River Ave Novi, MI 48374,,12220,48545 Grand River Ave,Novi,MI,48374-1245,48374,Oakland,5.00,22-17-101-015,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48595 Grand River Ave Novi, MI 48374,48595 Grand River Ave Novi, MI 48374,,10347,48595 Grand River Ave,Novi,MI,48374-1245,48374,Oakland,5.02,22-17-101-016,Industrial,21565 Flanders St,Farmington Hills, MI 48335,Christine Walker,Walker, William & Christine,(517) 7-89049,Warehouse,,,Walker, William & Christine,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48735 Grand River Ave Novi, MI 48374,48735 Grand River Ave Novi, MI 48374,,10195,48735 Grand River Ave,Novi,MI,48374-1247,48374,Oakland,5.98,22-17-101-014,Industrial,24700 Northwestern Hwy Suite # 700,Southfield, MI 48075,Daniel Irvin,Novi Cartage LLC,(586) 6-61700,Truck Terminal,,,Novi Cartage LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51722 Grand River Ave Wixom, MI 48393,51722 Grand River Ave Wixom, MI 48393,South Building,14000,51722 Grand River Ave,Wixom,MI,48393,48393,Oakland,7.34,21-12-251-012,Industrial,51722 Grand River Ave,Lyon Township, MI 48393,,United Rentals,(248) 8-42800,Warehouse,,,United Rentals,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53115-53125 Grand River Ave New Hudson, MI 48165,53115-53125 Grand River Ave New Hudson, MI 48165,,12018,53115-53125 Grand River Ave,New Hudson,MI,48165,48165,Oakland,2.00,21-11-276-006,Industrial,53125 Grand River Ave,New Hudson, MI 48165,Richard Similuk,Rjs Group Llc,(248) 8-38761,Warehouse,,,Rjs Group Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53205 Grand River Ave New Hudson, MI 48165,53205 Grand River Ave New Hudson, MI 48165,,14800,53205 Grand River Ave,New Hudson,MI,48165,48165,Oakland,4.00,21-11-276-011,Industrial,4706 Product Dr Suite # 7,Milford, MI 48381,James Solomon,Crystal Property Management LLC,(517) 7-04480,Warehouse,,,Crystal Property Management LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53400 Grand River Ave New Hudson, MI 48165,53400 Grand River Ave New Hudson, MI 48165,Building A,16200,53400 Grand River Ave,New Hudson,MI,48165-8521,48165,Oakland,2.07,21-11-226-004,Industrial,53400 Grand River Ave,New Hudson, MI 48165-8521,Kim Gasior,Jerry Baker,(248) 8-73000,Light Manufacturing,,,Jerry Baker,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53583 Grand River Ave Wixom, MI 48393,53583 Grand River Ave Wixom, MI 48393,,10608,53583 Grand River Ave,Wixom,MI,48393,48393,Oakland,2.15,21-11-251-027,Industrial,54360 Belcrest Dr,Milford, MI 48381,John Dolan,John Dolan,(248) 8-74445,Warehouse,,,John Dolan,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53655 Grand River Ave New Hudson, MI 48165,53655 Grand River Ave New Hudson, MI 48165,,12913,53655 Grand River Ave,New Hudson,MI,48165-8523,48165,Oakland,1.61,21-11-251-016,Industrial,5000 Dryden Ln,Bloomfield Hills, MI 48304,Michael Reilly,Micahel J Reilly,(248) 8-66134,Warehouse,,,Micahel J Reilly,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +54750 Grand River Ave New Hudson, MI 48165,54750 Grand River Ave New Hudson, MI 48165,,12500,54750 Grand River Ave,New Hudson,MI,48165,48165,Oakland,2.00,21-02-376-019,Industrial,1503 Mystic Hills Dr,Milford, MI 48380-4489,Edward Swadish,Swadish, Edward Frank,(248) 8-73967,Warehouse,,,Swadish, Edward Frank,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +54790 Grand River Ave New Hudson, MI 48165,54790 Grand River Ave New Hudson, MI 48165,,14240,54790 Grand River Ave,New Hudson,MI,48165-8526,48165,Oakland,1.78,21-02-376-018,Industrial,8051 Locklin Ln,Commerce Township, MI 48382,,Union Bay Associates, LLC,() -,Warehouse,,,Union Bay Associates, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55820 Grand River Ave New Hudson, MI 48165,55820 Grand River Ave New Hudson, MI 48165,,10500,55820 Grand River Ave,New Hudson,MI,48165-8706,48165,Oakland,2.30,21-03-402-018,Industrial,,,,,() -,,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55860 Grand River Ave New Hudson, MI 48165,55860 Grand River Ave New Hudson, MI 48165,,10814,55860 Grand River Ave,New Hudson,MI,48165-9717,48165,Oakland,1.20,21-03-401-001,Industrial,7071 Orchard Lake Rd,West Bloomfield, MI 48322-3613,Cristy Evangelista,Evangelista Development LLC,(248) 8-61114,Light Manufacturing,,,Evangelista Development LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +56405 Grand River Ave New Hudson, MI 48165,56405 Grand River Ave New Hudson, MI 48165,Insulgard,12000,56405 Grand River Ave,New Hudson,MI,48165,48165,Oakland,2.88,21-03-376-022,Industrial,58000 Grand River Ave,New Hudson, MI 48165,,Charter Township of Lyon,(248) 8-72240,Warehouse,,,Charter Township of Lyon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28850 Haas Rd Wixom, MI 48393,28850 Haas Rd Wixom, MI 48393,P.B. Brodak Roofing & Sheet Metal Co.,16700,28850 Haas Rd,Wixom,MI,48393,48393,Oakland,2.62,21-11-276-014,Industrial,,,,,() -,Manufacturing,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3295 Haggerty Rd Commerce Township, MI 48390,3295 Haggerty Rd Commerce Township, MI 48390,,18000,3295 Haggerty Rd,Commerce Township,MI,48390-1725,48390,Oakland,1.34,17-24-228-028,Industrial,3225 Haggerty Rd,Commerce Township, MI 48390,Robin Dubuc,Thomas Craig Properties LLC,(248) 8-46140,Manufacturing,,,Thomas Craig Properties LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4270 Haggerty Rd Walled Lake, MI 48390,4270 Haggerty Rd Walled Lake, MI 48390,,10000,4270 Haggerty Rd,Walled Lake,MI,48390,48390,Oakland,1.64,17-13-400-014,Industrial,4278 Haggerty Rd,Walled Lake, MI 48390,Kim Jensen,Jensen Building Products,(248) 8-34144,Warehouse,,,Jensen Building Products,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4278 Haggerty Rd Walled Lake, MI 48390,4278 Haggerty Rd Walled Lake, MI 48390,Building 1,15000,4278 Haggerty Rd,Walled Lake,MI,48390,48390,Oakland,0.95,17-13-400-015,Industrial,,,,,() -,Manufacturing,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4370 Haggerty Rd Commerce Township, MI 48390,4370 Haggerty Rd Commerce Township, MI 48390,,10600,4370 Haggerty Rd,Commerce Township,MI,48390,48390,Oakland,0.97,17-13-400-022,Industrial,2287 E West Maple Rd,Commerce Township, MI 48390-3820,Luai Poota,Luai's Automotive LLC,() -,Warehouse,,,Luai's Automotive LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4400 Haggerty Rd Commerce Township, MI 48390,4400 Haggerty Rd Commerce Township, MI 48390,,11998,4400 Haggerty Rd,Commerce Township,MI,48390,48390,Oakland,0.77,17-13-400-029,Industrial,3157 Pikewood Ct,Commerce Township, MI 48382-2234,Robert Booth,Booth Robert A & Patricia,(248) 8-42234,Manufacturing,,,Booth Robert A & Patricia,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4440 Haggerty Rd Commerce Township, MI 48390,4440 Haggerty Rd Commerce Township, MI 48390,Wison Marine Oakland,10500,4440 Haggerty Rd,Commerce Township,MI,48390-1317,48390,Oakland,1.20,17-13-400-019,Industrial,6095 Grand River Rd,Brighton, MI 48114,Ronald Wilson,Ronald Wilson,(517) 7-63774,Service,,,Ronald Wilson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22495-22499 Heslip Dr Novi, MI 48375,22495-22499 Heslip Dr Novi, MI 48375,,12596,22495-22499 Heslip Dr,Novi,MI,48375-4138,48375,Oakland,0.80,22-26-376-009,Industrial,RT 3 Box 382,Traverse City, MI 49684-9803,Frank Martin,Frank Martin,() -,Warehouse,,,Frank Martin,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22500 Heslip Dr Novi, MI 48375,22500 Heslip Dr Novi, MI 48375,,16438,22500 Heslip Dr,Novi,MI,48375-4139,48375,Oakland,1.62,22-26-377-024,Industrial,6980 Lakemont Cir,West Bloomfield, MI 48323-2070,Larry Morianti,Larry P Morianti,(248) 8-19098,Warehouse,,,Larry P Morianti,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22515 Heslip Dr Novi, MI 48375,22515 Heslip Dr Novi, MI 48375,,10380,22515 Heslip Dr,Novi,MI,48375-4140,48375,Oakland,1.19,22-26-376-014,Industrial,22419 Paddington Ct,Novi, MI 48374,Ghazwan Ismail,Ghazwan Ismail,(734) 4-64000,Warehouse,,,Ghazwan Ismail,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22575 Heslip Dr Novi, MI 48375,22575 Heslip Dr Novi, MI 48375,W.S Equipment,15440,22575 Heslip Dr,Novi,MI,48375-4140,48375,Oakland,1.07,22-26-376-018,Industrial,19850 Marilyn St,Northville, MI 48167-2626,Dennis Kubica,Kubica Corporation,(313) 3-49000,Warehouse,,,Kubica Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22605 Heslip Dr Novi, MI 48375,22605 Heslip Dr Novi, MI 48375,Cav Tool,11680,22605 Heslip Dr,Novi,MI,48375-4142,48375,Oakland,1.34,22-26-376-016,Industrial,28214 Beck Rd,Wixom, MI 48393,,R & K Holding LLC,() -,Warehouse,,,R & K Holding LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22755-22759 Heslip Dr Novi, MI 48375,22755-22759 Heslip Dr Novi, MI 48375,Global Office Building,16407,22755-22759 Heslip Dr,Novi,MI,48375-4144,48375,Oakland,1.21,22-26-326-014,Industrial,22759 Heslip Dr,Novi, MI 48375-4144,,Heslip Holdings, LLC,(248) 8-99100,Warehouse,,,Heslip Holdings, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22777 Heslip Dr Novi, MI 48375,22777 Heslip Dr Novi, MI 48375,,14458,22777 Heslip Dr,Novi,MI,48375-4144,48375,Oakland,1.06,22-26-326-010,Industrial,22777 Heslip Dr,Novi, MI 48375-4144,Christine Ellis,Facet international marketing,(734) 4-33500,Warehouse,,,Facet international marketing,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22781 Heslip Dr Novi, MI 48375,22781 Heslip Dr Novi, MI 48375,,14458,22781 Heslip Dr,Novi,MI,48375-4144,48375,Oakland,1.06,22-26-326-010,Industrial,,,,,() -,,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2000 E Highland Rd Highland, MI 48356,2000 E Highland Rd Highland, MI 48356,,12330,2000 E Highland Rd,Highland,MI,48356-3058,48356,Oakland,2.04,11-23-227-001,Industrial,2000 E Highland Rd,Highland, MI 48356-3058,Michael Seacord,Seaco Investments Llc,(248) 8-30109,Warehouse,,,Seaco Investments Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +5410A E Highland Rd White Lake, MI 48383,5410A E Highland Rd White Lake, MI 48383,,11986,5410A E Highland Rd,White Lake,MI,48383,48383,Oakland,2.31,12-20-151-007,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30100 S Hill Rd New Hudson, MI 48165,30100 S Hill Rd New Hudson, MI 48165,,13000,30100 S Hill Rd,New Hudson,MI,48165,48165,Oakland,1.46,21-02-376-023,Industrial,30100 S Hill Rd,New Hudson, MI 48165,Dan Cheresko,Lyon Mechanical, Inc.,(248) 8-71047,Warehouse,,,Lyon Mechanical, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +335 S Houghton St Milford, MI 48381,335 S Houghton St Milford, MI 48381,,15732,335 S Houghton St,Milford,MI,48381,48381,Oakland,0.79,16-11-376-028,Industrial,,,,,() -,Service,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29575 Hudson Dr Novi, MI 48377,29575 Hudson Dr Novi, MI 48377,Unit 4,11983,29575 Hudson Dr,Novi,MI,48377,48377,Oakland,1.04,22-04-377-002,Industrial,53400 Grand River Ave,New Hudson, MI 48165-8521,Kim Gasior,Jerry Baker,(248) 8-73000,Light Manufacturing,,,Jerry Baker,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29580 Hudson Dr Novi, MI 48377,29580 Hudson Dr Novi, MI 48377,,11000,29580 Hudson Dr,Novi,MI,48377-1733,48377,Oakland,1.09,22-04-378-004,Industrial,1695 Balsam Way,Milford, MI 48381,Nosh Sinishtaj,Nosh Sinishtaj,(248) 8-83420,Warehouse,,,Nosh Sinishtaj,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41115 Jo Dr Novi, MI 48375,41115 Jo Dr Novi, MI 48375,Micro Craft,17825,41115 Jo Dr,Novi,MI,48375-1916,48375,Oakland,2.82,22-24-100-058,Industrial,41115 Jo Dr,Novi, MI 48375-1916,,Vincenti Investment Company2,() -,Manufacturing,,,Vincenti Investment Company2,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41123 Jo Dr Novi, MI 48375,41123 Jo Dr Novi, MI 48375,,16224,41123 Jo Dr,Novi,MI,48375-1933,48375,Oakland,1.26,22-24-100-061,Industrial,1000 E Mandoline,Madison Heights, MI 48071-1475,Edward Sherman,Dot Development Company,(248) 8-84350,Warehouse,,,Dot Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +949 Ladd Rd Commerce Township, MI 48390,949 Ladd Rd Commerce Township, MI 48390,,15523,949 Ladd Rd,Commerce Township,MI,48390,48390,Oakland,3.39,17-34-101-010,Industrial,949 Ladd Rd,Walled Lake, MI 48390,Lawrence Montgomery,Montgomery, Lawrence & Catherine,(248) 8-81640,Warehouse,,,Montgomery, Lawrence & Catherine,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +415 N Lafayette St South Lyon, MI 48178,415 N Lafayette St South Lyon, MI 48178,,18000,415 N Lafayette St,South Lyon,MI,48178,48178,Oakland,4.24,21-19-476-008,Industrial,415 N Lafayette St,South Lyon, MI 48178,Charles Pullum,Pullum Window Corporation,(248) 8-14700,Warehouse,,,Pullum Window Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46918 Liberty Dr Wixom, MI 48393,46918 Liberty Dr Wixom, MI 48393,,17902,46918 Liberty Dr,Wixom,MI,48393-3600,48393,Oakland,1.34,22-09-151-012,Industrial,3120 Sovereign Dr Suite # 4B,Lansing, MI 48911-4226,,Dart Container Corporation,(517) 7-43001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46919 Liberty Dr Wixom, MI 48393,46919 Liberty Dr Wixom, MI 48393,,13700,46919 Liberty Dr,Wixom,MI,48393-3602,48393,Oakland,0.96,22-09-152-005,Industrial,3120 Sovereign Dr Suite # 4B,Lansing, MI 48911-4226,,Dart Container Corporation,(517) 7-43001,Manufacturing,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46953 Liberty Dr Wixom, MI 48393,46953 Liberty Dr Wixom, MI 48393,,11900,46953 Liberty Dr,Wixom,MI,48393-3603,48393,Oakland,1.71,22-09-152-007,Industrial,3120 Sovereign Dr Suite # 4B,Lansing, MI 48911-4226,,Dart Container Corporation,(517) 7-43001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46968 Liberty Dr Wixom, MI 48393,46968 Liberty Dr Wixom, MI 48393,Lot 12,11974,46968 Liberty Dr,Wixom,MI,48393-3693,48393,Oakland,1.18,22-09-301-008,Industrial,3120 Sovereign Dr Suite # 4B,Lansing, MI 48911-4226,,Dart Container Corporation,(517) 7-43001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46974 Liberty Dr Wixom, MI 48393,46974 Liberty Dr Wixom, MI 48393,,11996,46974 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland,1.03,22-09-301-005,Industrial,3120 Sovereign Dr Suite # 4B,Lansing, MI 48911-4226,,Dart Container Corporation,(517) 7-43001,Manufacturing,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46980 Liberty Dr Wixom, MI 48393,46980 Liberty Dr Wixom, MI 48393,,13324,46980 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland,1.03,22-09-301-004,Industrial,24073-24083 Research Dr,Farmington Hills, MI 48335-2632,Amy Chen,Tung Thih Electronics USA,(248) 8-89512,Warehouse,,,Tung Thih Electronics USA,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46981-46983 Liberty Dr Wixom, MI 48393,46981-46983 Liberty Dr Wixom, MI 48393,,13578,46981-46983 Liberty Dr,Wixom,MI,48393-3694,48393,Oakland,0.98,22-09-152-008,Industrial,3120 Sovereign Dr Suite # 4B,Lansing, MI 48911-4226,,Dart Container Corporation,(517) 7-43001,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46986 Liberty Dr Wixom, MI 48393,46986 Liberty Dr Wixom, MI 48393,Lot 15,13240,46986 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland,1.03,22-09-301-003,Industrial,500 Hogsback Rd,Mason, MI 48854,,Dart Container Corporation,(517) 7-63800,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46987-46989 Liberty Dr Wixom, MI 48393,46987-46989 Liberty Dr Wixom, MI 48393,,13688,46987-46989 Liberty Dr,Wixom,MI,48393,48393,Oakland,1.09,22-09-152-009,Industrial,432 Hogsback Rd,Mason, MI 48854,Bob Dart,Dart,(517) 7-63803,Warehouse,,,Dart,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46992 Liberty Dr Wixom, MI 48393,46992 Liberty Dr Wixom, MI 48393,,16972,46992 Liberty Dr,Wixom,MI,48393-3601,48393,Oakland,1.03,22-09-301-002,Industrial,500 Hogsback Rd,Mason, MI 48854-9547,,Dart Container Corporation,(517) 7-63800,Warehouse,,,Dart Container Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29108 Lorie Ln Wixom, MI 48393,29108 Lorie Ln Wixom, MI 48393,,10116,29108 Lorie Ln,Wixom,MI,48393-3640,48393,Oakland,0.89,22-08-200-034,Industrial,29777 Telegraph Rd Suite # 2475,Southfield, MI 48034-1303,Richard Delonis,Szura & Delonis Plc,(248) 8-63600,,,,Szura & Delonis Plc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29318 Lorie Ln Wixom, MI 48393,29318 Lorie Ln Wixom, MI 48393,,13330,29318 Lorie Ln,Wixom,MI,48393,48393,Oakland,0.80,22-08-227-023,Industrial,2289 Mayfair Dr,White Lake, MI 48383,Paul Fus,Paul E Fus,(248) 8-52761,Warehouse,,,Paul E Fus,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29420 Lorie Ln Wixom, MI 48393,29420 Lorie Ln Wixom, MI 48393,,10000,29420 Lorie Ln,Wixom,MI,48393,48393,Oakland,0.81,22-08-227-002,Industrial,29421 Lorie Ln,Wixom, MI 48393,Arturo Rodriguez,Roligi Investments, LLC,(248) 8-89991,Warehouse,,,Roligi Investments, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29431 Lorie Ln Wixom, MI 48393,29431 Lorie Ln Wixom, MI 48393,,15712,29431 Lorie Ln,Wixom,MI,48393,48393,Oakland,0.72,22-08-226-002,Industrial,29431 Lorie Ln,Wixom, MI 48393,Bud Conrad,BC Manufacturing Inc,(248) 8-40101,Manufacturing,,,BC Manufacturing Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55353 Lyon Industrial Dr New Hudson, MI 48165,55353 Lyon Industrial Dr New Hudson, MI 48165,,13796,55353 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland,1.14,21-03-402-025,Industrial,34750 Norflok St,Livonia, MI 48152-4041,Giovanni Agazzi,Grone Construction Co,(248) 8-43786,Warehouse,,,Grone Construction Co,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55375 Lyon Industrial Dr New Hudson, MI 48165,55375 Lyon Industrial Dr New Hudson, MI 48165,,13800,55375 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland,1.14,21-03-402-024,Industrial,,,Steve Agazzi,P & N,() -,Warehouse,,,P & N,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55378 Lyon Industrial Dr New Hudson, MI 48165,55378 Lyon Industrial Dr New Hudson, MI 48165,,11114,55378 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland,1.67,21-03-402-003,Industrial,55378 Lyon Industrial Dr,New Hudson, MI 48165,,DENNIS ROGGERS,(248) 8-69771,Warehouse,,,DENNIS ROGGERS,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55390 Lyon Industrial Dr New Hudson, MI 48165,55390 Lyon Industrial Dr New Hudson, MI 48165,Unit 13,17200,55390 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland,1.32,21-03-402-023,Industrial,7125 Orchard Lake Rd Suite # 200,West Bloomfield, MI 48322-3615,,Singh Development Company,(248) 8-51600,Manufacturing,,,Singh Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +55412 Lyon Industrial Dr New Hudson, MI 48165,55412 Lyon Industrial Dr New Hudson, MI 48165,Lyon Industrial,14800,55412 Lyon Industrial Dr,New Hudson,MI,48165,48165,Oakland,1.39,21-03-402-022,Industrial,7125 Orchard Lake Rd Suite # 200,West Bloomfield, MI 48322-3615,,Singh Development Company,(248) 8-51600,Warehouse,,,Singh Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46605 Magellan Dr Novi, MI 48377,46605 Magellan Dr Novi, MI 48377,,14843,46605 Magellan Dr,Novi,MI,48377,48377,Oakland,0.68,22-09-326-016,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46665 Magellan Dr Novi, MI 48377,46665 Magellan Dr Novi, MI 48377,Unit 14,17000,46665 Magellan Dr,Novi,MI,48377-2442,48377,Oakland,1.20,22-09-177-007,Industrial,46665 Magellan Dr,Novi, MI 48377,,Access Interactive,(248) 8-73000,Warehouse,,,Access Interactive,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46695 Magellan Dr Novi, MI 48377,46695 Magellan Dr Novi, MI 48377,Dantom,16048,46695 Magellan Dr,Novi,MI,48377,48377,Oakland,1.51,22-09-177-006,Industrial,50 Old Webster Rd,Oxford, MA 01540,Valentin Gapontsev,IPG Photonics,(508) 8-31100,Warehouse,,,IPG Photonics,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46725 Magellan Dr Novi, MI 48377,46725 Magellan Dr Novi, MI 48377,,16052,46725 Magellan Dr,Novi,MI,48377-2453,48377,Oakland,1.20,22-09-177-005,Industrial,46725 Magellan Dr,Novi, MI 48377-2453,Frank Kemmer,Vsc,(248) 8-62540,Warehouse,,,Vsc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46755 Magellan Dr Novi, MI 48377,46755 Magellan Dr Novi, MI 48377,,14021,46755 Magellan Dr,Novi,MI,48377-2453,48377,Oakland,1.17,22-09-177-012,Industrial,30100 Telegraph Rd Suite # 322,Bingham Farms, MI 48025-4514,Morton Noveck,Noveck & Nasholtz PLC,(248) 8-27111,Manufacturing,,,Noveck & Nasholtz PLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46785 Magellan Dr Novi, MI 48377,46785 Magellan Dr Novi, MI 48377,,16040,46785 Magellan Dr,Novi,MI,48377-2453,48377,Oakland,1.11,22-09-177-011,Industrial,550 S Ocean Blvd Suite # 2204,Boca Raton, FL 33432,Iris Phelps,17242 Boulevard, LLC,(561) 1-29470,Warehouse,,,17242 Boulevard, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46926 Magellan Dr Wixom, MI 48393,46926 Magellan Dr Wixom, MI 48393,,11000,46926 Magellan Dr,Wixom,MI,48393,48393,Oakland,1.16,22-09-102-002,Industrial,560 N Carney Dr,Saint Clair, MI 48079,Geri Schmidt,Geri Schmidt,(810) 0-90855,Warehouse,,,Geri Schmidt,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46934-46942 Magellan Dr Wixom, MI 48393,46934-46942 Magellan Dr Wixom, MI 48393,,11565,46934-46942 Magellan Dr,Wixom,MI,48393,48393,Oakland,1.07,22-09-102-003,Industrial,1484 Andover Blvd,Howell, MI 48843,Nathan Donnellon,Nathan Donnellon,(734) 4-03778,Manufacturing,,,Nathan Donnellon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46950 Magellan Dr Wixom, MI 48393,46950 Magellan Dr Wixom, MI 48393,Lot 4,15330,46950 Magellan Dr,Wixom,MI,48393,48393,Oakland,1.17,22-09-102-004,Industrial,46950 Magellan Dr Suite # C-1,Wixom, MI 48393,Weihua Li,QOMO HiteVision,(248) 8-92121,Warehouse,,,QOMO HiteVision,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +125 S Main St Milford, MI 48381,125 S Main St Milford, MI 48381,,15000,125 S Main St,Milford,MI,48381-1996,48381,Oakland,0.81,16-11-301-002,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1920 W Maple Rd Commerce Township, MI 48390,1920 W Maple Rd Commerce Township, MI 48390,,15200,1920 W Maple Rd,Commerce Township,MI,48390-2953,48390,Oakland,1.10,17-33-253-002,Industrial,1920 W Maple Rd,Commerce Township, MI 48390-2953,Conrad Lindstrom,American Manufacturing Innovators, Inc.,(248) 8-95990,Warehouse,,,American Manufacturing Innovators, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4170 Martin Rd Commerce Township, MI 48390,4170 Martin Rd Commerce Township, MI 48390,,10000,4170 Martin Rd,Commerce Township,MI,48390-4116,48390,Oakland,0.66,17-13-326-026,Industrial,3281 W Shore Dr,Orchard Lake, MI 48324,David Moellering,Moe-Jo LLC,(248) 8-17999,Manufacturing,,,Moe-Jo LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4224 Martin Rd Commerce Township, MI 48390,4224 Martin Rd Commerce Township, MI 48390,APPCO Control,10000,4224 Martin Rd,Commerce Township,MI,48390-4118,48390,Oakland,0.86,17-13-326-003,Industrial,5645 Sashabaw Rd,Clarkston, MI 48346,Gina Iacobelli,Independence Management Corp.,(248) 8-51188,Warehouse,,,Independence Management Corp.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4999 McCarthy Dr Milford, MI 48381,4999 McCarthy Dr Milford, MI 48381,,14800,4999 McCarthy Dr,Milford,MI,48381-3947,48381,Oakland,2.74,16-35-451-026,Industrial,32733 Folsom Rd,Farmington Hills, MI 48336-4425,James Struble,Ranger Contracting Incorporated,(248) 8-12277,Manufacturing,,,Ranger Contracting Incorporated,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25715-25737 Meadowbrook Rd Novi, MI 48375,25715-25737 Meadowbrook Rd Novi, MI 48375,,17193,25715-25737 Meadowbrook Rd,Novi,MI,48375-1849,48375,Oakland,1.39,22-23-226-020,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25775 Meadowbrook Rd Novi, MI 48375,25775 Meadowbrook Rd Novi, MI 48375,,17605,25775 Meadowbrook Rd,Novi,MI,48375-1849,48375,Oakland,1.39,22-23-226-033,Industrial,25775 Meadowbrook Rd,Novi, MI 48375-1849,Joseph Khalifeh,Biotech Clinical Laboratories,(248) 8-69800,Light Manufacturing,,,Biotech Clinical Laboratories,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25849-25869 Meadowbrook Rd Novi, MI 48375,25849-25869 Meadowbrook Rd Novi, MI 48375,Building 2,17728,25849-25869 Meadowbrook Rd,Novi,MI,48375,48375,Oakland,2.31,22-23-230-002,Industrial,41200-41218 Bridge St,Novi, MI 48375-1301,Bill McKeever,Certified Management,(248) 8-66700,R&D,,,Certified Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25873-25893 Meadowbrook Rd Novi, MI 48375,25873-25893 Meadowbrook Rd Novi, MI 48375,Building 3,17726,25873-25893 Meadowbrook Rd,Novi,MI,48375-1851,48375,Oakland,2.31,22-23-230-003,Industrial,41200-41218 Bridge St,Novi, MI 48375-1301,,Certified Management,(248) 8-66700,R&D,,,Certified Management,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1025 Metro Dr Walled Lake, MI 48390,1025 Metro Dr Walled Lake, MI 48390,,14074,1025 Metro Dr,Walled Lake,MI,48390,48390,Oakland,3.24,17-27-351-023,Industrial,PO BOX 725,WALLED LAKE, MI 48390,Gary Mapes,Metro Enviromental Services,(313) 3-44799,Warehouse,,,Metro Enviromental Services,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +5350 Milford Rd New Hudson, MI 48165,5350 Milford Rd New Hudson, MI 48165,,10742,5350 Milford Rd,New Hudson,MI,48165,48165,Oakland,7.26,21-04-201-010,Industrial,1 N Lexington Ave,White Plains, NY 10601-1712,Mark Comora,FORTISTAR,(914) 4-14900,Warehouse,,,FORTISTAR,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29111 Milford Rd New Hudson, MI 48165,29111 Milford Rd New Hudson, MI 48165,Mac Dermid, Inc.,14459,29111 Milford Rd,New Hudson,MI,48165-9741,48165,Oakland,5.60,21-09-226-016,Industrial,1401 Blake St,Denver, CO 80202-1383,,MacDermid Group, Inc.,(720) 0-93060,Light Manufacturing,,,MacDermid Group, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +31250 S Milford Rd Milford, MI 48381,31250 S Milford Rd Milford, MI 48381,,10041,31250 S Milford Rd,Milford,MI,48381,48381,Oakland,7.56,21-03-126-017,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +385 N Mill St South Lyon, MI 48178,385 N Mill St South Lyon, MI 48178,,18000,385 N Mill St,South Lyon,MI,48178-1262,48178,Oakland,1.33,21-20-326-011,Industrial,6659 Seven Mile Rd,South Lyon, MI 48178,Michael Mannella,Michael Mannella,() -,Warehouse,,,Michael Mannella,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +465 N Mill St South Lyon, MI 48178,465 N Mill St South Lyon, MI 48178,,13743,465 N Mill St,South Lyon,MI,48178,48178,Oakland,1.95,21-20-326-014,Industrial,,,Linda Turman,Linda S Turman,(248) 8-10441,Manufacturing,,,Linda S Turman,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +521 N Mill St South Lyon, MI 48178,521 N Mill St South Lyon, MI 48178,,14920,521 N Mill St,South Lyon,MI,48178,48178,Oakland,2.00,21-20-326-013,Industrial,48755 W 10 Mile Rd,Novi, MI 48374,,Pardonnet George,() -,Warehouse,,,Pardonnet George,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +201 S Mill St South Lyon, MI 48178,201 S Mill St South Lyon, MI 48178,,16000,201 S Mill St,South Lyon,MI,48178,48178,Oakland,1.39,21-29-176-025,Industrial,42411 Palmer Rd,Canton, MI 48188-1990,Adam Aldrin,Mill Street Investment Llc,(734) 4-62509,Manufacturing,,,Mill Street Investment Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3250 New Farm Ct Commerce Township, MI 48390,3250 New Farm Ct Commerce Township, MI 48390,,10400,3250 New Farm Ct,Commerce Township,MI,48390-1702,48390,Oakland,0.75,17-24-229-006,Industrial,31393 W 13 Mile Rd Suite # 150,Farmington Hills, MI 48334-2297,Charlie Cassar,Sam Cassar Company,(248) 8-14477,Light Manufacturing,,,Sam Cassar Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3280 New Farm Ct Commerce Township, MI 48390,3280 New Farm Ct Commerce Township, MI 48390,,10400,3280 New Farm Ct,Commerce Township,MI,48390-1754,48390,Oakland,0.74,17-24-229-007,Industrial,31393 W 13 Mile Rd Suite # 150,Farmington Hills, MI 48334-2297,Charlie Cassar,Sam Cassar Company,(248) 8-14477,Light Manufacturing,,,Sam Cassar Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3310 New Farm Ct Commerce Township, MI 48390,3310 New Farm Ct Commerce Township, MI 48390,,10400,3310 New Farm Ct,Commerce Township,MI,48390-1755,48390,Oakland,0.70,17-24-229-008,Industrial,31393 W 13 Mile Rd Suite # 150,Farmington Hills, MI 48334-2297,Charlie Cassar,Sam Cassar Company,(248) 8-14477,Light Manufacturing,,,Sam Cassar Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25100 Novi Rd Novi, MI 48375,25100 Novi Rd Novi, MI 48375,Collex Collision Experts,10166,25100 Novi Rd,Novi,MI,48375-1636,48375,Oakland,4.31,22-23-152-004,Industrial,11995 El Camino Real,San Diego, CA 92130-2544,,Realty Income Corporation,(877) 7-46266,Service,,,Realty Income Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25800 Novi Rd Novi, MI 48375,25800 Novi Rd Novi, MI 48375,,12260,25800 Novi Rd,Novi,MI,48375-1650,48375,Oakland,4.50,22-23-151-004,Industrial,25125 Trans-X Rd,Novi, MI 48375,,ACE CUTTING EQUIPMENT & Supply, Inc.,(248) 8-94944,Warehouse,,,ACE CUTTING EQUIPMENT & Supply, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28005 Oakland Oaks Ct Wixom, MI 48393,28005 Oakland Oaks Ct Wixom, MI 48393,,12078,28005 Oakland Oaks Ct,Wixom,MI,48393-3342,48393,Oakland,1.30,22-07-326-001,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28016 Oakland Oaks Ct Wixom, MI 48393,28016 Oakland Oaks Ct Wixom, MI 48393,Bldg D,16306,28016 Oakland Oaks Ct,Wixom,MI,48393-3341,48393,Oakland,1.07,22-07-326-031,Industrial,28026 Oakland Oaks Ct,Wixom, MI 48393,,Hosco,(248) 8-21750,Warehouse,,,Hosco,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28036 Oakland Oaks Ct Wixom, MI 48393,28036 Oakland Oaks Ct Wixom, MI 48393,,11224,28036 Oakland Oaks Ct,Wixom,MI,48393-3348,48393,Oakland,1.01,22-07-326-011,Industrial,46701 Commerce Center Dr,Plymouth, MI 48170-2475,Gerald Cox,Gerald L Cox,(734) 4-79125,Light Manufacturing,,,Gerald L Cox,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28046 Oakland Oaks Ct Wixom, MI 48393,28046 Oakland Oaks Ct Wixom, MI 48393,,18000,28046 Oakland Oaks Ct,Wixom,MI,48393-3348,48393,Oakland,1.20,22-07-326-036,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3170 E Oakley Park Commerce Township, MI 48390,3170 E Oakley Park Commerce Township, MI 48390,,13500,3170 E Oakley Park,Commerce Township,MI,48390,48390,Oakland,0.45,17-24-228-001,Industrial,8101 Richardson Rd Suite # 101,Commerce Township, MI 48390,Chris Konja,Askar Brands,(248) 8-34580,Warehouse,,,Askar Brands,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3331 Oakley Park Rd Commerce Township, MI 48390,3331 Oakley Park Rd Commerce Township, MI 48390,,10276,3331 Oakley Park Rd,Commerce Township,MI,48390,48390,Oakland,1.30,17-13-400-055,Industrial,4104 Pioneer Rd,Walled Lake, MI 48390,Jeanne Kunzman,Jeanne Kunzman,(248) 8-02700,Warehouse,,,Jeanne Kunzman,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2550 E Oakley Park Rd Commerce Township, MI 48390,2550 E Oakley Park Rd Commerce Township, MI 48390,Finished Basements Plus,15550,2550 E Oakley Park Rd,Commerce Township,MI,48390-1663,48390,Oakland,0.91,17-24-126-012,Industrial,2965 Vero Dr,Highland, MI 48356,Stephen Iverson,Stephen Iverson,(248) 8-97905,Warehouse,,,Stephen Iverson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3250 E Oakley Park Rd Commerce Township, MI 48390,3250 E Oakley Park Rd Commerce Township, MI 48390,,11407,3250 E Oakley Park Rd,Commerce Township,MI,48390-1648,48390,Oakland,0.87,17-24-226-003,Industrial,35441 Edmunds Grv,New Baltimore, MI 48047,Thomas Lubinski,Thomas D Lubinski,() -,Warehouse,,,Thomas D Lubinski,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3260 Old Farm Commerce Township, MI 48390,3260 Old Farm Commerce Township, MI 48390,California Closets,11100,3260 Old Farm,Commerce Township,MI,48390,48390,Oakland,0.76,17-24-228-021,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4755 Old Plank Rd Milford, MI 48381,4755 Old Plank Rd Milford, MI 48381,,13252,4755 Old Plank Rd,Milford,MI,48381-4066,48381,Oakland,15.39,16-36-351-016,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4827 Old Plank Rd Milford, MI 48381,4827 Old Plank Rd Milford, MI 48381,,11600,4827 Old Plank Rd,Milford,MI,48381,48381,Oakland,2.12,16-36-351-018,Industrial,48733 West Rd,Wixom, MI 48393-3544,,Clearlink Wireless,(248) 8-97362,Warehouse,,,Clearlink Wireless,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28361 W Park Dr Novi, MI 48377,28361 W Park Dr Novi, MI 48377,,13339,28361 W Park Dr,Novi,MI,48377,48377,Oakland,3.98,22-09-300-047,Industrial,30660 W 8 Mile Rd,Farmington Hills, MI 48336,Thomas Earle,PISI Industrial LLC,() -,Manufacturing,,,PISI Industrial LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46425 Peary Ct Novi, MI 48377,46425 Peary Ct Novi, MI 48377,,15798,46425 Peary Ct,Novi,MI,48377-1732,48377,Oakland,1.59,22-04-378-014,Industrial,46425 Peary Ct,Novi, MI 48377,John Gauruder,Gauruder Investments Llc,(248) 8-76448,Warehouse,,,Gauruder Investments Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4335 Pineview Dr Walled Lake, MI 48390,4335 Pineview Dr Walled Lake, MI 48390,,13691,4335 Pineview Dr,Walled Lake,MI,48390,48390,Oakland,1.07,17-13-300-079,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4350 Pineview Dr Commerce Township, MI 48390,4350 Pineview Dr Commerce Township, MI 48390,,11500,4350 Pineview Dr,Commerce Township,MI,48390-4113,48390,Oakland,1.12,17-13-300-077,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4359 Pineview Rd Walled Lake, MI 48390,4359 Pineview Rd Walled Lake, MI 48390,,14000,4359 Pineview Rd,Walled Lake,MI,48390,48390,Oakland,1.53,17-13-300-080,Industrial,4359 Pineview Rd,Walled Lake, MI 48390,,Sundberg-Ferar, Inc.,(248) 8-03800,R&D,,,Sundberg-Ferar, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4077 Pioneer Dr Walled Lake, MI 48390,4077 Pioneer Dr Walled Lake, MI 48390,,10032,4077 Pioneer Dr,Walled Lake,MI,48390,48390,Oakland,1.14,17-13-326-034,Industrial,7205 Deer Lake Rd,Clarkston, MI 48346,Bill Hannon,Bill Hannon,(248) 8-06447,Light Manufacturing,,,Bill Hannon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4295 Plant Dr Walled Lake, MI 48390,4295 Plant Dr Walled Lake, MI 48390,,11016,4295 Plant Dr,Walled Lake,MI,48390,48390,Oakland,1.25,17-13-400-049,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +20801 Pontiac Trl South Lyon, MI 48178,20801 Pontiac Trl South Lyon, MI 48178,,14480,20801 Pontiac Trl,South Lyon,MI,48178,48178,Oakland,6.15,21-31-400-075,Industrial,306 Andrus Dr,Murray, KY 42071-2180,,Hutson,(270) 0-67770,Warehouse,,,Hutson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50140 Pontiac Trl Wixom, MI 48393,50140 Pontiac Trl Wixom, MI 48393,,15846,50140 Pontiac Trl,Wixom,MI,48393-2019,48393,Oakland,2.35,17-31-452-012,Industrial,50140 Pontiac Trl,Wixom, MI 48393-2019,,Creative Machine,(248) 8-94230,Warehouse,,,Creative Machine,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51100 Pontiac Trl Wixom, MI 48393,51100 Pontiac Trl Wixom, MI 48393,,12500,51100 Pontiac Trl,Wixom,MI,48393-2041,48393,Oakland,,17-31-351-016,Industrial,23900 Orchard Rd Suite # 240,Farmington Hills, MI 48336,James Barnett,Barnett Industrial Properties LLC,(248) 8-54700,,,,Barnett Industrial Properties LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +51800 Pontiac Trl Milford, MI 48393,51800 Pontiac Trl Milford, MI 48393,,16000,51800 Pontiac Trl,Milford,MI,48393-1932,48393,Oakland,6.72,16-36-451-019,Industrial,4875 Product Dr,Wixom, MI 48393,Troy Clogg,CTR Landholders, LLC,(248) 8-50123,Manufacturing,,,CTR Landholders, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +862 N Pontiac Trl Walled Lake, MI 48390,862 N Pontiac Trl Walled Lake, MI 48390,,12453,862 N Pontiac Trl,Walled Lake,MI,48390,48390,Oakland,,17-34-227-009,Industrial,861 N Pontiac Trail,Walled Lake, MI 48390,James Maher,Maher Group,(248) 8-66631,Showroom,,,Maher Group,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +53162 Pontiac Trail Milford, MI 48381,53162 Pontiac Trail Milford, MI 48381,,13600,53162 Pontiac Trail,Milford,MI,48381,48381,Oakland,2.80,16-35-451-012,Industrial,56558 Pontiac Trl,New Hudson, MI 48165-9728,David Kolb,Hines Park Ford,(248) 8-76700,Warehouse,,,Hines Park Ford,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1270 N Pontiac Trail Walled Lake, MI 48390,1270 N Pontiac Trail Walled Lake, MI 48390,,16000,1270 N Pontiac Trail,Walled Lake,MI,48390-3139,48390,Oakland,6.57,17-26-351-014,Industrial,1270 N Pontiac Trail,Walled Lake, MI 48390-3139,,Professional Movers.com,(248) 8-69999,Warehouse,,,Professional Movers.com,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4715 Product Dr Wixom, MI 48393,4715 Product Dr Wixom, MI 48393,,12000,4715 Product Dr,Wixom,MI,48393,48393,Oakland,1.94,16-36-451-015,Industrial,28920 Vintage Dr,New Hudson, MI 48165,,Jim Wisti,(248) 8-77517,Warehouse,,,Jim Wisti,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4715 Product Dr Wixom, MI 48393,4715 Product Dr Wixom, MI 48393,,10918,4715 Product Dr,Wixom,MI,48393,48393,Oakland,7.59,16-36-451-015,Industrial,28920 Vintage Dr,New Hudson, MI 48165,,Jim Wisti,(248) 8-77517,Warehouse,,,Jim Wisti,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28780 Reilly Rd New Hudson, MI 48165,28780 Reilly Rd New Hudson, MI 48165,,11400,28780 Reilly Rd,New Hudson,MI,48165,48165,Oakland,2.22,21-11-251-025,Industrial,28780 Reilly Rd,New Hudson, MI 48165,,JOHN KNAPP,(248) 8-82992,Warehouse,,,JOHN KNAPP,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30029 Research Dr New Hudson, MI 48165,30029 Research Dr New Hudson, MI 48165,,14440,30029 Research Dr,New Hudson,MI,48165-8548,48165,Oakland,1.05,21-03-401-008,Industrial,30029 Research Dr,New Hudson, MI 48165-8548,Aaron Hoffmann,American Temperature Service Inc,(248) 8-85133,R&D,,,American Temperature Service Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30158 Research Dr New Hudson, MI 48165,30158 Research Dr New Hudson, MI 48165,,11142,30158 Research Dr,New Hudson,MI,48165,48165,Oakland,1.26,21-03-253-010,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30163 Research Dr New Hudson, MI 48165,30163 Research Dr New Hudson, MI 48165,,17739,30163 Research Dr,New Hudson,MI,48165,48165,Oakland,3.34,21-03-253-002,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22325 Roethel Dr Novi, MI 48375,22325 Roethel Dr Novi, MI 48375,,15957,22325 Roethel Dr,Novi,MI,48375-4710,48375,Oakland,2.18,22-35-127-017,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46590 Ryan Ct Novi, MI 48377,46590 Ryan Ct Novi, MI 48377,,10120,46590 Ryan Ct,Novi,MI,48377,48377,Oakland,1.80,22-04-376-002,Industrial,46590 Ryan Ct,Novi, MI 48377,,SUN-TEC Corporation,(248) 8-93100,Light Manufacturing,,,SUN-TEC Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28200 Samuel Linden Ct Novi, MI 48377,28200 Samuel Linden Ct Novi, MI 48377,,11089,28200 Samuel Linden Ct,Novi,MI,48377,48377,Oakland,3.98,22-09-300-046,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28200 W Samuel Linden Ct Novi, MI 48377,28200 W Samuel Linden Ct Novi, MI 48377,,13320,28200 W Samuel Linden Ct,Novi,MI,48377,48377,Oakland,3.98,22-09-300-047,Industrial,30660 W 8 Mile Rd,Farmington Hills, MI 48336,Thomas Earle,PISI Industrial LLC,() -,Warehouse,,,PISI Industrial LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25555-25701 Seeley Rd Novi, MI 48375,25555-25701 Seeley Rd Novi, MI 48375,Novi Mfg (U-Haul),10921,25555-25701 Seeley Rd,Novi,MI,48375-2053,48375,Oakland,6.83,22-24-100-006,Industrial,2721 N Central Ave Suite # 500,Phoenix, AZ 85004-1127,,U Haul Real Estate Co.,(602) 2-36555,Warehouse,,,U Haul Real Estate Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4922 Technical Dr Milford, MI 48381,4922 Technical Dr Milford, MI 48381,George Landry, Inc.,10450,4922 Technical Dr,Milford,MI,48381-3950,48381,Oakland,2.00,16-35-351-020,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4935 Technical Dr Milford, MI 48381,4935 Technical Dr Milford, MI 48381,,11142,4935 Technical Dr,Milford,MI,48381,48381,Oakland,2.01,16-35-351-022,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +4936 Technical Dr Milford, MI 48381,4936 Technical Dr Milford, MI 48381,,15341,4936 Technical Dr,Milford,MI,48381-3950,48381,Oakland,2.50,16-35-351-019,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +52365 Ten Mile Rd South Lyon, MI 48178,52365 Ten Mile Rd South Lyon, MI 48178,,18000,52365 Ten Mile Rd,South Lyon,MI,48178-9757,48178,Oakland,,21-25-100-015,Industrial,32233 Schoolcraft,Livonia, MI 48150,Gareth Zebley,Cambrian Of Lyon, LLC,(517) 7-60298,,,,Cambrian Of Lyon, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +42780 W Ten Mile Rd Novi, MI 48375,42780 W Ten Mile Rd Novi, MI 48375,,15000,42780 W Ten Mile Rd,Novi,MI,48375,48375,Oakland,7.42,22-23-376-013,Industrial,2245 Keith Rd,West Bloomfield, MI 48324,Mark Garmo,Mark Garmo,(248) 8-63052,Warehouse,,,Mark Garmo,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +42950 W Ten Mile Rd Novi, MI 48375,42950 W Ten Mile Rd Novi, MI 48375,K & P Sheward,14400,42950 W Ten Mile Rd,Novi,MI,48375,48375,Oakland,1.00,22-23-351-050,Industrial,1334 Maplelawn Dr,Troy, MI 48084-5341,Darren Frankel,Stuart Frankel Development Co.,(248) 8-92924,Manufacturing,,,Stuart Frankel Development Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1699 Traditional Dr Commerce Township, MI 48390,1699 Traditional Dr Commerce Township, MI 48390,,10000,1699 Traditional Dr,Commerce Township,MI,48390-2973,48390,Oakland,0.88,17-33-226-022,Industrial,1699 Traditional Dr,Commerce Township, MI 48390-2973,Robert Savage,Buildmaster Inc,(248) 8-00033,Warehouse,,,Buildmaster Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25005 Trans-X Rd Novi, MI 48375,25005 Trans-X Rd Novi, MI 48375,,11218,25005 Trans-X Rd,Novi,MI,48375-2437,48375,Oakland,2.09,22-23-326-013,Industrial,25005 Trans-X Rd,Novi, MI 48375-2437,,Monte Costella & Co.,(248) 8-77744,Warehouse,,,Monte Costella & Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25220 Trans-X Rd Novi, MI 48375,25220 Trans-X Rd Novi, MI 48375,Trans X,13250,25220 Trans-X Rd,Novi,MI,48375-2440,48375,Oakland,6.06,22-23-151-034,Industrial,25220 Trans-X Rd,Novi, MI 48375-2440,Alan Wormser,Barry's Lets Rent It,(248) 8-50480,Warehouse,,,Barry's Lets Rent It,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +25285 Trans-X Rd Novi, MI 48375,25285 Trans-X Rd Novi, MI 48375,,14925,25285 Trans-X Rd,Novi,MI,48375-2441,48375,Oakland,2.99,22-23-151-030,Industrial,25285 Trans-X Rd,Novi, MI 48375-2441,Terry Sweeney,Sweeney Concrete Material,(248) 8-41111,Warehouse,,,Sweeney Concrete Material,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +57425 Travis Rd New Hudson, MI 48165,57425 Travis Rd New Hudson, MI 48165,,11000,57425 Travis Rd,New Hudson,MI,48165-9753,48165,Oakland,2.00,21-09-276-002,Industrial,7774 Bentgrass,Howell, MI 48843,Joe Bonadeo,DENA Investments, LLC,() -,Warehouse,,,DENA Investments, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +57450 Travis Rd New Hudson, MI 48165,57450 Travis Rd New Hudson, MI 48165,,14500,57450 Travis Rd,New Hudson,MI,48165,48165,Oakland,2.00,21-09-226-015,Industrial,57450 Travis Rd,New Hudson, MI 48165,Douglas Ross,Networks Enterprises Inc,(248) 8-68590,,,,Networks Enterprises Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +50706 Varsity Ct Wixom, MI 48393,50706 Varsity Ct Wixom, MI 48393,,17434,50706 Varsity Ct,Wixom,MI,48393-2072,48393,Oakland,4.02,22-06-101-050,Industrial,47757 West Rd Suite # C-103,Wixom, MI 48393,,GMT Logistics,(248) 8-78889,R&D,,,GMT Logistics,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22635 Venture Dr Novi, MI 48375,22635 Venture Dr Novi, MI 48375,,11979,22635 Venture Dr,Novi,MI,48375-4182,48375,Oakland,1.35,22-26-401-030,Industrial,22635 Venture Dr,Novi, MI 48375-4182,,Bollfilter Corporation,(248) 8-38200,Manufacturing,,,Bollfilter Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22920 Venture Dr Novi, MI 48375,22920 Venture Dr Novi, MI 48375,,10318,22920 Venture Dr,Novi,MI,48375-4188,48375,Oakland,1.40,22-26-401-040,Industrial,500 S Harvey St,Plymouth, MI 48170,Bill Lawton,Community Financial Credit Union,(734) 4-31200,R&D,,,Community Financial Credit Union,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +22960 Venture Dr Novi, MI 48375,22960 Venture Dr Novi, MI 48375,Bldg B,16880,22960 Venture Dr,Novi,MI,48375-4188,48375,Oakland,1.86,22-26-401-039,Industrial,38281 Schoolcraft Rd Suite # H,Livonia, MI 48150-5052,,Aidata USA Co Ltd.,(248) 8-00578,Distribution,,,Aidata USA Co Ltd.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +23000 Venture Dr Novi, MI 48375,23000 Venture Dr Novi, MI 48375,Bldg A,16800,23000 Venture Dr,Novi,MI,48375-4186,48375,Oakland,1.60,22-26-401-034,Industrial,,,,J & L Ventures, LLC,() -,Manufacturing,,,J & L Ventures, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41144 Vincenti Ct Novi, MI 48375,41144 Vincenti Ct Novi, MI 48375,Automatic Value,14650,41144 Vincenti Ct,Novi,MI,48375-1922,48375,Oakland,1.03,22-24-100-033,Industrial,35980 Industrial Rd Suite # A-4,Livonia, MI 48150-1274,,ATEQ Corp.,(734) 4-83100,Warehouse,,,ATEQ Corp.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41216 Vincenti Ct Novi, MI 48375,41216 Vincenti Ct Novi, MI 48375,,16401,41216 Vincenti Ct,Novi,MI,48375-1925,48375,Oakland,1.03,22-24-100-035,Industrial,25200 W Six Mile Rd,Redford, MI 48240,Charles Schweiger,Drum Handlers Inc,(313) 3-48034,Warehouse,,,Drum Handlers Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41249-41255 Vincenti Ct Novi, MI 48375,41249-41255 Vincenti Ct Novi, MI 48375,Moshler,14400,41249-41255 Vincenti Ct,Novi,MI,48375-1927,48375,Oakland,1.30,22-24-100-024,Industrial,18184 Buckingham Ave,Beverly Hills, MI 48025,Kirk Nicola,Paw Print Inn, Inc,() -,Light Manufacturing,,,Paw Print Inn, Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41252 Vincenti Ct Novi, MI 48375,41252 Vincenti Ct Novi, MI 48375,,11376,41252 Vincenti Ct,Novi,MI,48375-1925,48375,Oakland,1.03,22-24-100-036,Industrial,42300 W 9 Mile Rd,Novi, MI 48375-4103,Raffi Kuredjian,Lathrup Industries, Inc.,(248) 8-91009,Telecom Hotel/Data Hosting,,,Lathrup Industries, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41287 Vincenti Ct Novi, MI 48375,41287 Vincenti Ct Novi, MI 48375,,10168,41287 Vincenti Ct,Novi,MI,48375-1927,48375,Oakland,1.13,22-24-100-023,Industrial,38281 Schoolcraft Rd Suite # M,Livonia, MI 48150-5052,Mark Prokurat,Silver-Clip, LLC,(734) 4-46551,Warehouse,,,Silver-Clip, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41290-41292 Vincenti Ct Novi, MI 48375,41290-41292 Vincenti Ct Novi, MI 48375,,14427,41290-41292 Vincenti Ct,Novi,MI,48375-1925,48375,Oakland,1.03,22-24-100-037,Industrial,1146 Chestnut Ln S,South Lyon, MI 48178,,Kevin James VanOrd,(248) 8-69108,Warehouse,,,Kevin James VanOrd,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41326 Vincenti Ct Novi, MI 48375,41326 Vincenti Ct Novi, MI 48375,Cummins,14300,41326 Vincenti Ct,Novi,MI,48375-1926,48375,Oakland,1.03,22-24-100-038,Industrial,53435 Grand River Ave,New Hudson, MI 48165,,Raymon Wilkinson,(248) 8-65115,Warehouse,,,Raymon Wilkinson,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41365-41367 Vincenti Ct Novi, MI 48375,41365-41367 Vincenti Ct Novi, MI 48375,,11000,41365-41367 Vincenti Ct,Novi,MI,48375-1928,48375,Oakland,1.10,22-24-100-048,Industrial,347 N Main St,Milford, MI 48381-1924,,Hawthorne Management Co.,(248) 8-87777,Warehouse,,,Hawthorne Management Co.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +41369 Vincenti Ct Novi, MI 48375,41369 Vincenti Ct Novi, MI 48375,,12464,41369 Vincenti Ct,Novi,MI,48375-1928,48375,Oakland,1.37,22-24-100-047,Industrial,41131-41135 Vincenti Ct,Novi, MI 48375-1924,Thomas Rzeznik,Danlaw,(248) 8-65571,Light Manufacturing,,,Danlaw,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2750 W Maple Commerce Township, MI 48390,2750 W Maple Commerce Township, MI 48390,,10325,2750 W Maple,Commerce Township,MI,48390-3838,48390,Oakland,1.48,17-36-100-027,Industrial,2750 W Maple,Commerce Township, MI 48390-3838,Bob Keslacy,B K Imported Auto Care Inc,(248) 8-07715,Warehouse,,,B K Imported Auto Care Inc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2287 E W Maple Commerce Township, MI 48390,2287 E W Maple Commerce Township, MI 48390,,15990,2287 E W Maple,Commerce Township,MI,48390-3829,48390,Oakland,2.27,17-25-376-028,Industrial,28975 Orchard Lake Rd,Farmington Hills, MI 48333,,U.S. Tool & Cutter,(248) 8-37745,Service,,,U.S. Tool & Cutter,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2325 E W Maple Commerce Township, MI 48390,2325 E W Maple Commerce Township, MI 48390,,13084,2325 E W Maple,Commerce Township,MI,48390-3831,48390,Oakland,2.02,17-25-376-021,Industrial,2325 Maple Rd,Birmingham, MI 48009,,Kenneth W McQuillan,() -,Warehouse,,,Kenneth W McQuillan,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28776 Wall St Wixom, MI 48393,28776 Wall St Wixom, MI 48393,,11540,28776 Wall St,Wixom,MI,48393-3516,48393,Oakland,0.86,22-08-177-008,Industrial,43000 W 9 Mile Rd Suite # 302, 306,Novi, MI 48375-4175,Ying Li,Brightlines,(248) 8-06688,Warehouse,,,Brightlines,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28930 Wall St Wixom, MI 48393,28930 Wall St Wixom, MI 48393,,10056,28930 Wall St,Wixom,MI,48393-3520,48393,Oakland,0.76,22-08-177-003,Industrial,10638-10662 Northend Ave,Oak Park, MI 48220-2137,,Robin Aire Heating & Cooling,(248) 8-13300,Manufacturing,,,Robin Aire Heating & Cooling,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29001 Wall St Wixom, MI 48393,29001 Wall St Wixom, MI 48393,,14368,29001 Wall St,Wixom,MI,48393-3523,48393,Oakland,9.50,22-08-176-001,Industrial,29001 Wall St,Wixom, MI 48393-3523,,Walter Toebe Construction Company,(248) 8-97500,Warehouse,,,Walter Toebe Construction Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29249 Wall St Wixom, MI 48393,29249 Wall St Wixom, MI 48393,,16210,29249 Wall St,Wixom,MI,48393-3527,48393,Oakland,1.31,22-08-126-010,Industrial,9414 Peer Rd,South Lyon, MI 48179,,Steven P Russell,(248) 8-69703,Warehouse,,,Steven P Russell,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29305-29335 Wall St Wixom, MI 48393,29305-29335 Wall St Wixom, MI 48393,,12114,29305-29335 Wall St,Wixom,MI,48393-3529,48393,Oakland,0.64,22-08-126-012,Industrial,29305 Wall St,Wixom, MI 48393-3529,James Holton,James N & Camille M Holton,(248) 8-98722,Manufacturing,,,James N & Camille M Holton,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3170 Walnut Lake Ct Commerce Township, MI 48390,3170 Walnut Lake Ct Commerce Township, MI 48390,,10500,3170 Walnut Lake Ct,Commerce Township,MI,48390-1743,48390,Oakland,1.80,17-25-226-025,Industrial,3170 Walnut Lake Rd,Commerce Township, MI 48390-1743,,Fisher Fuel,(248) 8-44449,Warehouse,,,Fisher Fuel,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3181 Walnut Lake Ct Commerce Township, MI 48390,3181 Walnut Lake Ct Commerce Township, MI 48390,,14160,3181 Walnut Lake Ct,Commerce Township,MI,48390-1744,48390,Oakland,1.77,17-25-226-031,Industrial,3181 Walnut Lake Ct,Commerce Township, MI 48390-1744,Lena Moore,Club Pet Inc.,(248) 8-94501,Warehouse,,,Club Pet Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3200 Walnut Lake Ct Commerce Township, MI 48390,3200 Walnut Lake Ct Commerce Township, MI 48390,,16960,3200 Walnut Lake Ct,Commerce Township,MI,48390-1745,48390,Oakland,1.86,17-25-226-030,Industrial,,,Satish Tummala,Tummala, Satish,(248) 8-86793,Warehouse,,,Tummala, Satish,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +46969 West Rd Wixom, MI 48393,46969 West Rd Wixom, MI 48393,,16080,46969 West Rd,Wixom,MI,48393,48393,Oakland,1.44,22-09-102-012,Industrial,1411 West Lake Dr,Novi, MI 48377,Michael Condon,Michael Condon,(248) 8-98830,Warehouse,,,Michael Condon,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47850-47874 West Rd Wixom, MI 48393,47850-47874 West Rd Wixom, MI 48393,Bldg 2,16370,47850-47874 West Rd,Wixom,MI,48393-3667,48393,Oakland,4.44,22-05-476-029,Industrial,S Emerson,Brighton, MI 48116,Manesh Shah,Manesh Shah,() -,Warehouse,,,Manesh Shah,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +47974-47998 West Rd Wixom, MI 48393,47974-47998 West Rd Wixom, MI 48393,Bldg 3,11356,47974-47998 West Rd,Wixom,MI,48393-3669,48393,Oakland,4.18,22-05-476-029,Industrial,12336 W Emerson Dr,Brighton, MI 48116,Manesh Shah,General Chemical Corporation,(248) 8-75600,Warehouse,,,General Chemical Corporation,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48090 West Rd Wixom, MI 48393,48090 West Rd Wixom, MI 48393,,10421,48090 West Rd,Wixom,MI,48393,48393,Oakland,3.62,22-05-476-050,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48141-48143 West Rd Wixom, MI 48393,48141-48143 West Rd Wixom, MI 48393,,16400,48141-48143 West Rd,Wixom,MI,48393,48393,Oakland,1.00,22-08-200-006,Industrial,1771 Long Lake Shore Dr,Bloomfield Hills, MI 48302,Pjeter Stanaj,Pjeter Stanaj,(248) 8-86660,Warehouse,,,Pjeter Stanaj,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48145-48147 West Rd Wixom, MI 48393,48145-48147 West Rd Wixom, MI 48393,,15378,48145-48147 West Rd,Wixom,MI,48393,48393,Oakland,5.00,22-08-200-006,Industrial,1771 Long Lake Shore Dr,Bloomfield Hills, MI 48302,Pjeter Stanaj,Pjeter Stanaj,(248) 8-86660,Warehouse,,,Pjeter Stanaj,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48152 West Rd Wixom, MI 48393,48152 West Rd Wixom, MI 48393,,14350,48152 West Rd,Wixom,MI,48393,48393,Oakland,1.29,22-05-476-055,Industrial,23179 Telegraph Rd,Southfield, MI 48033-4126,Darryl Rogers,International Development Company,(248) 8-34800,Warehouse,,,International Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48168 West Rd Wixom, MI 48393,48168 West Rd Wixom, MI 48393,,13263,48168 West Rd,Wixom,MI,48393-3673,48393,Oakland,0.93,22-05-476-054,Industrial,23179 Telegraph Rd,Southfield, MI 48033-4126,Darryl Rogers,International Development Company,(248) 8-34800,Warehouse,,,International Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48473 West Rd Wixom, MI 48393,48473 West Rd Wixom, MI 48393,Build to Suit,11850,48473 West Rd,Wixom,MI,48393,48393,Oakland,2.74,22-08-100-064,Industrial,,,,,() -,,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48553 West Rd Wixom, MI 48393,48553 West Rd Wixom, MI 48393,,13080,48553 West Rd,Wixom,MI,48393-3537,48393,Oakland,2.43,22-08-100-049,Industrial,29350 Wall St,Wixom, MI 48393-3528,Vivek Bedi,2V Industries, Inc.,(248) 8-47943,Warehouse,,,2V Industries, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49175-49201 West Rd Wixom, MI 48393,49175-49201 West Rd Wixom, MI 48393,,16700,49175-49201 West Rd,Wixom,MI,48393-3552,48393,Oakland,1.91,22-08-100-029,Industrial,,,,,() -,Manufacturing,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49287-49295 West Rd Wixom, MI 48393,49287-49295 West Rd Wixom, MI 48393,,13000,49287-49295 West Rd,Wixom,MI,48393-3553,48393,Oakland,2.00,22-08-100-056,Industrial,49287-49295 West Rd,Wixom, MI 48393-3553,Wes Umlor,Diffin-Umlor & Associates,(248) 8-77803,Warehouse,,,Diffin-Umlor & Associates,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1625 E West Maple Rd Walled Lake, MI 48390,1625 E West Maple Rd Walled Lake, MI 48390,,10845,1625 E West Maple Rd,Walled Lake,MI,48390-3772,48390,Oakland,1.32,17-35-126-010,Industrial,1754 Fairway Dr,Birmingham, MI 48009-1866,,Armando C Decapite,(248) 8-88919,Manufacturing,,,Armando C Decapite,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2065 E West Maple Rd Commerce Township, MI 48390,2065 E West Maple Rd Commerce Township, MI 48390,Bldg C,11000,2065 E West Maple Rd,Commerce Township,MI,48390-3858,48390,Oakland,6.95,17-26-476-011,Industrial,5373 Pontiac Trl,West Bloomfield, MI 48323-1562,,Commerce Place,(248) 8-62628,Light Distribution,,,Commerce Place,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2075 E West Maple Rd Commerce Township, MI 48390,2075 E West Maple Rd Commerce Township, MI 48390,Bldg B,11000,2075 E West Maple Rd,Commerce Township,MI,48390-3816,48390,Oakland,6.95,17-26-476-011,Industrial,5373 Pontiac Trl,West Bloomfield, MI 48323-1562,,Commerce Place,(248) 8-62628,Light Distribution,,,Commerce Place,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2085 E West Maple Rd Commerce Township, MI 48390,2085 E West Maple Rd Commerce Township, MI 48390,Bldg A,11258,2085 E West Maple Rd,Commerce Township,MI,48390-3802,48390,Oakland,6.95,17-26-476-011,Industrial,5373 Pontiac Trl,West Bloomfield, MI 48323-1562,Laurie Cunnington,Commerce Place,(248) 8-62628,,,,Commerce Place,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +2420 E West Maple Rd Commerce Township, MI 48390,2420 E West Maple Rd Commerce Township, MI 48390,,10800,2420 E West Maple Rd,Commerce Township,MI,48390-3832,48390,Oakland,2.60,17-36-100-031,Industrial,2280 E W Maple,Commerce Township, MI 48390-3828,Gregg Williams,Williams International,(248) 8-45200,Warehouse,,,Williams International,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1200 W West Maple Rd Walled Lake, MI 48390,1200 W West Maple Rd Walled Lake, MI 48390,,10880,1200 W West Maple Rd,Walled Lake,MI,48390,48390,Oakland,2.00,17-34-151-011,Industrial,1060 W Maple Rd,Walled Lake, MI 48390-2935,,Dedoes,(248) 8-47710,Manufacturing,,,Dedoes,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +1502 W West Maple Rd Walled Lake, MI 48390,1502 W West Maple Rd Walled Lake, MI 48390,,10000,1502 W West Maple Rd,Walled Lake,MI,48390,48390,Oakland,0.33,17-33-276-013,Industrial,1502 W West Maple Rd,Walled Lake, MI 48390,Brian Vieaux,Casey's Of Walled Lake,(248) 8-95200,Warehouse,,,Casey's Of Walled Lake,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29632 West Tech Dr Wixom, MI 48393,29632 West Tech Dr Wixom, MI 48393,,11325,29632 West Tech Dr,Wixom,MI,48393-3561,48393,Oakland,1.28,22-05-351-014,Industrial,,,Russell Taylor,Russell Taylor,() -,Warehouse,,,Russell Taylor,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29659 West Tech Dr Wixom, MI 48393,29659 West Tech Dr Wixom, MI 48393,,17864,29659 West Tech Dr,Wixom,MI,48393-3561,48393,Oakland,1.25,22-05-352-008,Industrial,150 W Jefferson,Detroit, MI 48226,,Commercial Properties III, LLC,(248) 8-06800,Manufacturing,,,Commercial Properties III, LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29706 West Tech Dr Wixom, MI 48393,29706 West Tech Dr Wixom, MI 48393,,12031,29706 West Tech Dr,Wixom,MI,48393-3562,48393,Oakland,1.48,22-05-351-012,Industrial,31475 Myrna St,Livonia, MI 48154,Darin Dingman,Darin Dingman,() -,Warehouse,,,Darin Dingman,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30700 Wixom Rd Wixom, MI 48393,30700 Wixom Rd Wixom, MI 48393,Aramark,16068,30700 Wixom Rd,Wixom,MI,48393-2416,48393,Oakland,2.13,22-05-106-032,Industrial,49397 Schafer Ave,Wixom, MI 48393,William Clark,Maple Technology Centre LLC,(248) 8-46140,Warehouse,,,Maple Technology Centre LLC,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +28930 S Wixom Rd Wixom, MI 48393,28930 S Wixom Rd Wixom, MI 48393,,14000,28930 S Wixom Rd,Wixom,MI,48393,48393,Oakland,8.50,22-08-100-013,Industrial,4840 Wyoming St,Dearborn, MI 48126-3723,Carl Bumgardner,Royal Truck & Trailer Sales & Service, Inc.,(313) 3-64000,,,,Royal Truck & Trailer Sales & Service, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +29020 S Wixom Rd Wixom, MI 48393,29020 S Wixom Rd Wixom, MI 48393,,17999,29020 S Wixom Rd,Wixom,MI,48393,48393,Oakland,3.19,22-08-100-059,Industrial,29020 S Wixom Rd,Wixom, MI 48393,Jeffery Weinger,Retail & Commercial Construction, Inc.,(248) 8-49900,Light Manufacturing,,,Retail & Commercial Construction, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30178 S Wixom Rd Wixom, MI 48393,30178 S Wixom Rd Wixom, MI 48393,Rockwell Medical, Inc.,17240,30178 S Wixom Rd,Wixom,MI,48393,48393,Oakland,0.50,22-05-301-002,Industrial,23179 Telegraph Rd,Southfield, MI 48033-4126,Darryl Rogers,International Development Company,(248) 8-34800,Manufacturing,,,International Development Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30681-30691 S Wixom Rd Wixom, MI 48393,30681-30691 S Wixom Rd Wixom, MI 48393,,15229,30681-30691 S Wixom Rd,Wixom,MI,48393-2415,48393,Oakland,2.63,22-06-200-046,Industrial,30681-30691 S Wixom Rd,Wixom, MI 48393-2415,Lake Nelson,MICHIGAN HARDWOOD DISTRIBUTORS,(248) 8-90790,Manufacturing,,,MICHIGAN HARDWOOD DISTRIBUTORS,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +30687 S Wixom Rd Wixom, MI 48393,30687 S Wixom Rd Wixom, MI 48393,,12000,30687 S Wixom Rd,Wixom,MI,48393,48393,Oakland,2.63,22-06-200-010,Industrial,1561 Chanticlair Cir,Wixom, MI 48393,Adella Nelson,Nelson Talle Properties Llc,(248) 8-46135,Warehouse,,,Nelson Talle Properties Llc,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48932 Wixom Tech Dr Wixom, MI 48393,48932 Wixom Tech Dr Wixom, MI 48393,,16205,48932 Wixom Tech Dr,Wixom,MI,48393,48393,Oakland,4.02,22-05-351-010,Industrial,375 Park Ave Suite # 1709,New York, NY 10152-0002,,Clayton, Dubilier & Rice,(212) 2-75200,Warehouse,,,Clayton, Dubilier & Rice,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +48985 Wixom Tech Dr Wixom, MI 48393,48985 Wixom Tech Dr Wixom, MI 48393,,17125,48985 Wixom Tech Dr,Wixom,MI,48393-3557,48393,Oakland,1.71,22-05-351-007,Industrial,48985 Wixom Tech Dr Suite # 1st,Wixom, MI 48393-3557,Randy Stevens,Lee Stevens Machinery, Inc.,(248) 8-68400,Warehouse,,,Lee Stevens Machinery, Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49113 Wixom Tech Dr Wixom, MI 48393,49113 Wixom Tech Dr Wixom, MI 48393,,14156,49113 Wixom Tech Dr,Wixom,MI,48393-3559,48393,Oakland,1.01,22-05-351-003,Industrial,28065 Oakland Oaks Ct,Wixom, MI 48393,Yassin Burgol,Yassin Burgol,(248) 8-81111,Manufacturing,,,Yassin Burgol,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +49145 Wixom Tech Dr Wixom, MI 48393,49145 Wixom Tech Dr Wixom, MI 48393,,12836,49145 Wixom Tech Dr,Wixom,MI,48393-3569,48393,Oakland,1.94,22-05-351-002,Industrial,29532 Southfiled Rd Suite # 201,Southfield, MI 48076,,Douglas Capital Partners,(248) 8-57902,Warehouse,,,Douglas Capital Partners,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +Yew Dr Milford, MI 48381,Yew Dr Milford, MI 48381,Lot 2 Proposed Building,10000,Yew Dr,Milford,MI,48381,48381,Oakland,,16-25-100-062,Industrial,,,,,() -,Warehouse,,,,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +3130 E Oakley Park Rd Walled Lake, MI 48390,3130 E Oakley Park Rd Walled Lake, MI 48390,,13000,3130 E Oakley Park Rd,Walled Lake,MI,48390,48390,Oakland,0.80,17-24-226-003,Industrial,3170 Oakley Park Rd,Walled Lake, MI 48390,,Marotta Company,(248) 8-99170,Warehouse,,,Marotta Company,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner +21043 Old Novi Rd Northville, MI 48167,21043 Old Novi Rd Northville, MI 48167,,14755,21043 Old Novi Rd,Northville,MI,48167-2527,48167,Oakland,1.43,22-34-477-003,Industrial,21043 Old Novi Rd,Northville, MI 48167-2527,,Northville Fabricating Inc.,() -,Warehouse,,,Northville Fabricating Inc.,EJR,Industrial,Central I-96 Corridor,Owner,Pending,Owner \ No newline at end of file diff --git a/data/result.txt b/data/result.txt new file mode 100644 index 0000000..535abfb --- /dev/null +++ b/data/result.txt @@ -0,0 +1 @@ +[{"Description Address L Name":"47677-47695 Avante Dr Wixom, MI 48393","Property Address L Custom Building Address":"47677-47695 Avante Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11600","Property Address P":"47677-47695 Avante Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3697","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.98","Parcel Number L Custom":"22-08-200-031","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47695 Avante Dr","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Gateway Management Company, LLC","True Owner Phone P Work":"(248) 8-14260","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Gateway Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28033 Center Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28033 Center Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12200","Property Address P":"28033 Center Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3344","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.05","Parcel Number L Custom":"22-07-326-018","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7125 Orchard Lake Rd Suite # 306","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322","True Owner Contact P Full Name":"Lewis Wagner","True Owner Name L Custom True Owner":"Star Builders, Inc.","True Owner Phone P Work":"(248) 8-53010","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Star Builders, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"45295 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"45295 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10540","Property Address P":"45295 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-1019","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.66","Parcel Number L Custom":"22-15-351-044","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2175 Fyke Dr Milford, MI 48381","Property Address L Custom Building Address":"2175 Fyke Dr Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15000","Property Address P":"2175 Fyke Dr","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.64","Parcel Number L Custom":"16-25-100-060","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47133 W 9 Mile Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48374","True Owner Contact P Full Name":"Amar Abro","True Owner Name L Custom True Owner":"Amar Abro","True Owner Phone P Work":"(903) 3-08725","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Amar Abro","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55800 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"55800 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"Unit 31A","RBA L Custom SF Building":"10800","Property Address P":"55800 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165-8711","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.35","Parcel Number L Custom":"21-03-402-018","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"55800 Grand River Ave Suite # 150","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165-8711","True Owner Contact P Full Name":"Mark Evangelista","True Owner Name L Custom True Owner":"Evangelista Corporation","True Owner Phone P Work":"(248) 8-80400","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Evangelista Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25873-25921 Meadowbrook Rd Novi, MI 48375","Property Address L Custom Building Address":"25873-25921 Meadowbrook Rd Novi, MI 48375","Property Name L Custom Property Name":"Building 4","RBA L Custom SF Building":"17726","Property Address P":"25873-25921 Meadowbrook Rd","City P":"Novi","State P":"MI","No Zip":"48375-1851","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.31","Parcel Number L Custom":"22-23-230-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"41200-41218 Bridge St","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1301","True Owner Contact P Full Name":"Bill McKeever","True Owner Name L Custom True Owner":"Certified Management","True Owner Phone P Work":"(248) 8-66700","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Certified Management","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25460 Trans X Rd Novi, MI 48375","Property Address L Custom Building Address":"25460 Trans X Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12907","Property Address P":"25460 Trans X Rd","City P":"Novi","State P":"MI","No Zip":"48375","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.50","Parcel Number L Custom":"22-23-151-027","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"45605 W 9 Mile Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48374","True Owner Contact P Full Name":"Defrim Cizmja","True Owner Name L Custom True Owner":"Cizmja, Defrim","True Owner Phone P Work":"(248) 8-75062","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Cizmja, Defrim","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41180 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41180 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14440","Property Address P":"41180 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1922","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-24-100-034","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4038 Foxpointe Dr","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48323","True Owner Contact P Full Name":"Donald Hoexter","True Owner Name L Custom True Owner":"Hawthorne Management Co","True Owner Phone P Work":"(281) 1-88840","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Hawthorne Management Co","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2045 E West Maple Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"2045 E West Maple Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"Bldg D","RBA L Custom SF Building":"11000","Property Address P":"2045 E West Maple Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-3801","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.77","Parcel Number L Custom":"17-26-476-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2045 E W Maple","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Cunnington Family Commerce Ltd. Par","True Owner Phone P Work":"() -","Secondary Type L Custom":"Light Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Cunnington Family Commerce Ltd. Par","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"42900 W 9 Mile Rd Novi, MI 48375","Property Address L Custom Building Address":"42900 W 9 Mile Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14400","Property Address P":"42900 W 9 Mile Rd","City P":"Novi","State P":"MI","No Zip":"48375-4123","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.80","Parcel Number L Custom":"22-26-376-020","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"43700 W 12 Mile Rd Novi, MI 48377","Property Address L Custom Building Address":"43700 W 12 Mile Rd Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15400","Property Address P":"43700 W 12 Mile Rd","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"","Parcel Number L Custom":"22-10-400-053","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29850-29864 Northwestern Hwy","True Owner City State Zip C Address: Main City":"Southfield, MI 48034","True Owner Contact P Full Name":"Amer Asmar","True Owner Name L Custom True Owner":"Amer Asmar","True Owner Phone P Work":"(248) 8-75454","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Amer Asmar","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46845 W 12 Mile Rd Novi, MI 48377","Property Address L Custom Building Address":"46845 W 12 Mile Rd Novi, MI 48377","Property Name L Custom Property Name":"Cougar Cutting Products","RBA L Custom SF Building":"14000","Property Address P":"46845 W 12 Mile Rd","City P":"Novi","State P":"MI","No Zip":"48377-3200","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.49","Parcel Number L Custom":"22-16-126-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"P.O. Box 508","True Owner City State Zip C Address: Main City":"Novi, MI 48376-0508","True Owner Contact P Full Name":"Martin Schmitt","True Owner Name L Custom True Owner":"Beck Property Management","True Owner Phone P Work":"(248) 8-88864","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Beck Property Management","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30503-30505 Andersen Ct Wixom, MI 48393","Property Address L Custom Building Address":"30503-30505 Andersen Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"30503-30505 Andersen Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.85","Parcel Number L Custom":"22-05-276-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"333 Osprey St","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"A.I. Properties, LLC","True Owner Phone P Work":"(248) 8-91075","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"A.I. Properties, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47840 Anna Ct Wixom, MI 48393","Property Address L Custom Building Address":"47840 Anna Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13585","Property Address P":"47840 Anna Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3687","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.05","Parcel Number L Custom":"22-08-227-021","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47840 Anna Ct","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3687","True Owner Contact P Full Name":"Mike Murray","True Owner Name L Custom True Owner":"Lyons Tool & Manufacturing Corporation","True Owner Phone P Work":"(248) 8-49644","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Lyons Tool & Manufacturing Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48009 Anna Ct Wixom, MI 48393","Property Address L Custom Building Address":"48009 Anna Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"48009 Anna Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.28","Parcel Number L Custom":"22-08-227-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1395 Energy Way","True Owner City State Zip C Address: Main City":"Highland, MI 48357","True Owner Contact P Full Name":"George Gudzinski","True Owner Name L Custom True Owner":"Commercial Fabricating","True Owner Phone P Work":"(248) 8-71595","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Commercial Fabricating","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29757 Anthony Dr Wixom, MI 48393","Property Address L Custom Building Address":"29757 Anthony Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14314","Property Address P":"29757 Anthony Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3606","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.00","Parcel Number L Custom":"22-05-476-037","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29757 Anthony Dr","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3606","True Owner Contact P Full Name":"Michael Kuehnl","True Owner Name L Custom True Owner":"Kuehnl, Michael H","True Owner Phone P Work":"(248) 8-71689","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Kuehnl, Michael H","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29769 Anthony Dr Wixom, MI 48393","Property Address L Custom Building Address":"29769 Anthony Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12920","Property Address P":"29769 Anthony Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3606","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.93","Parcel Number L Custom":"22-05-476-036","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47400 Avante Dr Wixom, MI 48393","Property Address L Custom Building Address":"47400 Avante Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12714","Property Address P":"47400 Avante Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3615","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.94","Parcel Number L Custom":"22-08-200-028","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47400 Avante Dr","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3615","True Owner Contact P Full Name":"Daniel Booth","True Owner Name L Custom True Owner":"Nostalgic Motor Cars","True Owner Phone P Work":"(248) 8-94884","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Nostalgic Motor Cars","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"777 Baseline Rd Northville, MI 48167","Property Address L Custom Building Address":"777 Baseline Rd Northville, MI 48167","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15000","Property Address P":"777 Baseline Rd","City P":"Northville","State P":"MI","No Zip":"48167","Zip P":"48167","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.00","Parcel Number L Custom":"22-34-478-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"115 N Center St Suite # 204","True Owner City State Zip C Address: Main City":"Northville, MI 48167","True Owner Contact P Full Name":"Donald Samhat","True Owner Name L Custom True Owner":"Donald L Samhat PC","True Owner Phone P Work":"(248) 8-98560","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Donald L Samhat PC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28214 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"28214 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"R & K Tool","RBA L Custom SF Building":"17200","Property Address P":"28214 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3623","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.84","Parcel Number L Custom":"22-09-300-036","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28214 Beck Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3623","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Professional Sprinkler Incorporated","True Owner Phone P Work":"(248) 8-95740","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Professional Sprinkler Incorporated","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28294 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"28294 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16380","Property Address P":"28294 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3623","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.87","Parcel Number L Custom":"22-09-300-034","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2550 E Buno Rd","True Owner City State Zip C Address: Main City":"Milford, MI 48381","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Preventive Maintenance Tech","True Owner Phone P Work":"(248) 8-46405","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Preventive Maintenance Tech","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28381 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"28381 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"Bldg K","RBA L Custom SF Building":"13560","Property Address P":"28381 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-4731","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.85","Parcel Number L Custom":"22-08-426-028","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28345 Beck Rd Suite # 100","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-4733","True Owner Contact P Full Name":"Charley Damas","True Owner Name L Custom True Owner":"Canton Business Center","True Owner Phone P Work":"(248) 8-48970","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Canton Business Center","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28389 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"28389 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"Bldg J","RBA L Custom SF Building":"14000","Property Address P":"28389 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-4732","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.68","Parcel Number L Custom":"22-08-426-027","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28345 Beck Rd Suite # 100","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-4733","True Owner Contact P Full Name":"Charley Damas","True Owner Name L Custom True Owner":"Canton Business Center","True Owner Phone P Work":"(248) 8-48970","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Canton Business Center","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28700 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"28700 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16356","Property Address P":"28700 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3604","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.73","Parcel Number L Custom":"22-09-152-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39830 Grand River Ave Suite # B1-A","True Owner City State Zip C Address: Main City":"Novi, MI 48375-2140","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"NMB Technologies Corporation","True Owner Phone P Work":"(248) 8-92933","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"NMB Technologies Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29592 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"29592 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17461","Property Address P":"29592 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-2821","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.35","Parcel Number L Custom":"22-04-351-017","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28265 Beck Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-4719","True Owner Contact P Full Name":"Karam Bahnam","True Owner Name L Custom True Owner":"USA To Go","True Owner Phone P Work":"(248) 8-37992","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"USA To Go","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29650 Beck Rd Wixom, MI 48393","Property Address L Custom Building Address":"29650 Beck Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14195","Property Address P":"29650 Beck Rd","City P":"Wixom","State P":"MI","No Zip":"48393-2822","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.35","Parcel Number L Custom":"22-04-351-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"32367 Eight Mile Rd","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48336","True Owner Contact P Full Name":"Donna Dancik","True Owner Name L Custom True Owner":"Donna Dancik","True Owner Phone P Work":"(248) 8-18985","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Donna Dancik","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1006 Benstein Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1006 Benstein Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"1006 Benstein Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-2912","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"8.56","Parcel Number L Custom":"17-33-226-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28454 Woodward Ave","True Owner City State Zip C Address: Main City":"Royal Oak, MI 48067","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"1006 Benstein Llc","True Owner Phone P Work":"(248) 8-16320","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"1006 Benstein Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1036 Benstein Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1036 Benstein Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"1036 Benstein Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-2913","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"8.56","Parcel Number L Custom":"17-33-226-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28454 Woodward Ave","True Owner City State Zip C Address: Main City":"Royal Oak, MI 48067","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"1006 Benstein Llc","True Owner Phone P Work":"(248) 8-16320","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"1006 Benstein Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1042 Benstein Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1042 Benstein Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"1042 Benstein Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-2914","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"8.42","Parcel Number L Custom":"17-33-226-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28454 Woodward Ave","True Owner City State Zip C Address: Main City":"Royal Oak, MI 48067","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"1006 Benstein Llc","True Owner Phone P Work":"(248) 8-16320","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"1006 Benstein Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1046 Benstein Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1046 Benstein Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"1046 Benstein Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-2915","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"8.56","Parcel Number L Custom":"17-33-226-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28454 Woodward Ave","True Owner City State Zip C Address: Main City":"Royal Oak, MI 48067","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"1006 Benstein Llc","True Owner Phone P Work":"(248) 8-16320","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"1006 Benstein Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1200 Benstein Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"1200 Benstein Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"1200 Benstein Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.91","Parcel Number L Custom":"17-28-476-020","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2078 Winner St","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390","True Owner Contact P Full Name":"Steven Steinway","True Owner Name L Custom True Owner":"Preferred Health Products Inc","True Owner Phone P Work":"(248) 8-94300","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Preferred Health Products Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8601 Boulder Ct Walled Lake, MI 48390","Property Address L Custom Building Address":"8601 Boulder Ct Walled Lake, MI 48390","Property Name L Custom Property Name":"BTV Systems","RBA L Custom SF Building":"14480","Property Address P":"8601 Boulder Ct","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.52","Parcel Number L Custom":"17-13-300-101","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8601 Boulder Ct","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Real Green Systems","True Owner Phone P Work":"(248) 8-05296","Secondary Type L Custom":"Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Real Green Systems","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8680 Boulder Ct Walled Lake, MI 48390","Property Address L Custom Building Address":"8680 Boulder Ct Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15338","Property Address P":"8680 Boulder Ct","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.64","Parcel Number L Custom":"17-13-300-098","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8700 Boulder Ct","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Boulder Development Inc","True Owner Phone P Work":"(248) 8-04700","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Boulder Development Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8681 Boulder Ct Walled Lake, MI 48390","Property Address L Custom Building Address":"8681 Boulder Ct Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12500","Property Address P":"8681 Boulder Ct","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"17-13-300-100","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8700 Boulder Ct","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Dave Smith","True Owner Name L Custom True Owner":"Boulder Development Inc","True Owner Phone P Work":"(248) 8-04700","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Boulder Development Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41100 Bridge St Novi, MI 48375","Property Address L Custom Building Address":"41100 Bridge St Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11920","Property Address P":"41100 Bridge St","City P":"Novi","State P":"MI","No Zip":"48375-1300","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.74","Parcel Number L Custom":"22-13-351-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3565 Bradford Square Dr","True Owner City State Zip C Address: Main City":"Ann Arbor, MI 48103","True Owner Contact P Full Name":"John Varick","True Owner Name L Custom True Owner":"John F Varick","True Owner Phone P Work":"(734) 4-46211","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"John F Varick","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41280 Bridge St Novi, MI 48375","Property Address L Custom Building Address":"41280 Bridge St Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16980","Property Address P":"41280 Bridge St","City P":"Novi","State P":"MI","No Zip":"48375","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.32","Parcel Number L Custom":"22-13-351-021","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3944 Winterset Ln","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48033","True Owner Contact P Full Name":"Taher Rasheed","True Owner Name L Custom True Owner":"Rasheed Family Investments,LLC","True Owner Phone P Work":"(313) 3-53318","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Rasheed Family Investments,LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"Cabot Dr Novi, MI 48377","Property Address L Custom Building Address":"Cabot Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"Cabot Dr","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.40","Parcel Number L Custom":"22-12-200-054","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28350 Cabot Dr Novi, MI 48377","Property Address L Custom Building Address":"28350 Cabot Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12014","Property Address P":"28350 Cabot Dr","City P":"Novi","State P":"MI","No Zip":"48377-2919","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.67","Parcel Number L Custom":"22-12-400-047","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39000 Country Club Dr","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48331","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Northern Equities Management Company","True Owner Phone P Work":"(248) 8-86400","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Northern Equities Management Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29185 Cabot Dr Novi, MI 48377","Property Address L Custom Building Address":"29185 Cabot Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12230","Property Address P":"29185 Cabot Dr","City P":"Novi","State P":"MI","No Zip":"48377-2936","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.48","Parcel Number L Custom":"22-12-200-028","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39000 Country Club Dr","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48331","True Owner Contact P Full Name":"Neil Sosin","True Owner Name L Custom True Owner":"Northern Equities Group","True Owner Phone P Work":"(248) 8-86400","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Northern Equities Group","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47119 Cartier Ct Wixom, MI 48393","Property Address L Custom Building Address":"47119 Cartier Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15720","Property Address P":"47119 Cartier Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2872","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.31","Parcel Number L Custom":"22-04-152-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"26899 Northwestern Hwy Suite # 306","True Owner City State Zip C Address: Main City":"Southfield, MI 48033","True Owner Contact P Full Name":"Howard Baum","True Owner Name L Custom True Owner":"Howard Baum Development Company","True Owner Phone P Work":"(248) 8-03600","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Howard Baum Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47167 Cartier Ct Wixom, MI 48393","Property Address L Custom Building Address":"47167 Cartier Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15895","Property Address P":"47167 Cartier Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.15","Parcel Number L Custom":"22-04-152-005","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3641 Loblolly Bay Rd","True Owner City State Zip C Address: Main City":"Labelle, FL 33935","True Owner Contact P Full Name":"John Leekley","True Owner Name L Custom True Owner":"John Robert Leekley","True Owner Phone P Work":"(313) 3-68129","Secondary Type L Custom":"Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"John Robert Leekley","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47110 Cartier Dr Wixom, MI 48393","Property Address L Custom Building Address":"47110 Cartier Dr Wixom, MI 48393","Property Name L Custom Property Name":"Dantom","RBA L Custom SF Building":"11650","Property Address P":"47110 Cartier Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.01","Parcel Number L Custom":"22-04-151-009","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"326 E 4th St Suite # 200","True Owner City State Zip C Address: Main City":"Royal Oak, MI 48067-2706","True Owner Contact P Full Name":"Todd Wyett","True Owner Name L Custom True Owner":"Versa Development","True Owner Phone P Work":"(248) 8-61081","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Versa Development","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47140 Cartier Dr Wixom, MI 48393","Property Address L Custom Building Address":"47140 Cartier Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13650","Property Address P":"47140 Cartier Dr","City P":"Wixom","State P":"MI","No Zip":"48393-2876","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.61","Parcel Number L Custom":"22-04-151-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47140 Cartier Dr","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-2876","True Owner Contact P Full Name":"Craig O'Donnell","True Owner Name L Custom True Owner":"AEL Michigan, LLC","True Owner Phone P Work":"(248) 8-84966","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"AEL Michigan, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28043 Center Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28043 Center Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17500","Property Address P":"28043 Center Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3344","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.23","Parcel Number L Custom":"22-07-326-041","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28043 Center Oaks Ct","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Karen Wilson","True Owner Name L Custom True Owner":"Wersborg, LLC","True Owner Phone P Work":"(248) 8-09586","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Wersborg, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28044 Center Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28044 Center Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15140","Property Address P":"28044 Center Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3343","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.52","Parcel Number L Custom":"22-07-326-037","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"500 Woodward Ave Suite # 3500","True Owner City State Zip C Address: Main City":"Detroit, MI 48226-3416","True Owner Contact P Full Name":"Kevin Didio","True Owner Name L Custom True Owner":"Clark Hill’s Automotive and Manufacturing Practice","True Owner Phone P Work":"(313) 3-99461","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Clark Hill’s Automotive and Manufacturing Practice","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28064 Center Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28064 Center Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12186","Property Address P":"28064 Center Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.42","Parcel Number L Custom":"22-07-326-022","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28064 Center Oaks Ct Suite # A","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Bertran Gili","True Owner Name L Custom True Owner":"Metrologic Group Services Inc.","True Owner Phone P Work":"(248) 8-69090","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Metrologic Group Services Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50950 Century Ct Wixom, MI 48393","Property Address L Custom Building Address":"50950 Century Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14250","Property Address P":"50950 Century Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-06-101-060","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39475 W 13 Mile Rd Suite # 205","True Owner City State Zip C Address: Main City":"Novi, MI 48377-2301","True Owner Contact P Full Name":"Chad Zamler","True Owner Name L Custom True Owner":"Zamler Development","True Owner Phone P Work":"(248) 8-59003","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Zamler Development","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"51004 Century Ct Wixom, MI 48393","Property Address L Custom Building Address":"51004 Century Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14250","Property Address P":"51004 Century Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-06-101-059","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39475 W 13 Mile Rd Suite # 205","True Owner City State Zip C Address: Main City":"Novi, MI 48377-2301","True Owner Contact P Full Name":"Chad Zamler","True Owner Name L Custom True Owner":"Century Construction & Management, LLC","True Owner Phone P Work":"(248) 8-43311","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Century Construction & Management, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"51056 Century Ct Wixom, MI 48393","Property Address L Custom Building Address":"51056 Century Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16992","Property Address P":"51056 Century Ct","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.12","Parcel Number L Custom":"22-06-101-058","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39475 W 13 Mile Rd Suite # 205","True Owner City State Zip C Address: Main City":"Novi, MI 48377-2301","True Owner Contact P Full Name":"Chad Zamler","True Owner Name L Custom True Owner":"Zamler Development","True Owner Phone P Work":"(248) 8-59003","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Zamler Development","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30587 Century Dr Wixom, MI 48393","Property Address L Custom Building Address":"30587 Century Dr Wixom, MI 48393","Property Name L Custom Property Name":"Zimmerman","RBA L Custom SF Building":"13222","Property Address P":"30587 Century Dr","City P":"Wixom","State P":"MI","No Zip":"48393-2062","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.87","Parcel Number L Custom":"22-06-101-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"31267 Century Dr Wixom, MI 48393","Property Address L Custom Building Address":"31267 Century Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17000","Property Address P":"31267 Century Dr","City P":"Wixom","State P":"MI","No Zip":"48393-2065","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.11","Parcel Number L Custom":"22-06-101-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"33527-33529 7 Mile Rd","True Owner City State Zip C Address: Main City":"Livonia, MI 48152-3079","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Gargaro Construction Company","True Owner Phone P Work":"(248) 8-34141","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Gargaro Construction Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2299 Childs Lake Rd Milford, MI 48381","Property Address L Custom Building Address":"2299 Childs Lake Rd Milford, MI 48381","Property Name L Custom Property Name":"Bills Tree","RBA L Custom SF Building":"11900","Property Address P":"2299 Childs Lake Rd","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.59","Parcel Number L Custom":"16-24-101-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2299 Childs Lake Rd","True Owner City State Zip C Address: Main City":"Milford, MI 48381","True Owner Contact P Full Name":"Mike Bockelman","True Owner Name L Custom True Owner":"Bockelman Development","True Owner Phone P Work":"(800) 0-82876","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Bockelman Development","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1287 S Commerce Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1287 S Commerce Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"AT&T","RBA L Custom SF Building":"10072","Property Address P":"1287 S Commerce Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.26","Parcel Number L Custom":"17-27-451-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3566 Michael Ave SW","True Owner City State Zip C Address: Main City":"Grand Rapids, MI 49509","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Mi Bell Telephone Co","True Owner Phone P Work":"(616) 6-05600","Secondary Type L Custom":"Telecom Hotel/Data Hosting","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Mi Bell Telephone Co","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2599 Crumb Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"2599 Crumb Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"Elsey Construction Products","RBA L Custom SF Building":"18000","Property Address P":"2599 Crumb Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-2814","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.00","Parcel Number L Custom":"17-25-326-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2599 Crumb Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390-2814","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Elsey Construction Products","True Owner Phone P Work":"(248) 8-48177","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Elsey Construction Products","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1011 Decker Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1011 Decker Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12100","Property Address P":"1011 Decker Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-3219","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.25","Parcel Number L Custom":"17-35-126-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1 Towne Sq Suite # 1835","True Owner City State Zip C Address: Main City":"Southfield, MI 48076-3700","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Siegel & Greenfield","True Owner Phone P Work":"(248) 8-65900","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Siegel & Greenfield","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50322 Dennis Ct Wixom, MI 48393","Property Address L Custom Building Address":"50322 Dennis Ct Wixom, MI 48393","Property Name L Custom Property Name":"Scott's Lawn Service","RBA L Custom SF Building":"18000","Property Address P":"50322 Dennis Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2025","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.51","Parcel Number L Custom":"17-31-352-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50384-50388 Dennis Ct Wixom, MI 48393","Property Address L Custom Building Address":"50384-50388 Dennis Ct Wixom, MI 48393","Property Name L Custom Property Name":"Bldg G","RBA L Custom SF Building":"10783","Property Address P":"50384-50388 Dennis Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2025","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.02","Parcel Number L Custom":"17-31-352-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6960 Orchard Lake Rd Suite # 300","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-4515","True Owner Contact P Full Name":"Kelly Woodley","True Owner Name L Custom True Owner":"First Holding Management Company, LLC","True Owner Phone P Work":"(248) 8-53330","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"First Holding Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50400 Dennis Ct Wixom, MI 48393","Property Address L Custom Building Address":"50400 Dennis Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11525","Property Address P":"50400 Dennis Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2048","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.20","Parcel Number L Custom":"17-31-352-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6960 Orchard Lake Rd Suite # 300","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-4515","True Owner Contact P Full Name":"Kelly Woodley","True Owner Name L Custom True Owner":"First Holding Management Company, LLC","True Owner Phone P Work":"(248) 8-53330","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"First Holding Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50420 Dennis Ct Wixom, MI 48393","Property Address L Custom Building Address":"50420 Dennis Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10383","Property Address P":"50420 Dennis Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2076","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.69","Parcel Number L Custom":"17-31-352-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6960 Orchard Lake Rd Suite # 300","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-4515","True Owner Contact P Full Name":"Kelly Woodley","True Owner Name L Custom True Owner":"First Holding Management Company, LLC","True Owner Phone P Work":"(248) 8-53330","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"First Holding Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50200-50210 Dennis Industrial Ct Wixom, MI 48393","Property Address L Custom Building Address":"50200-50210 Dennis Industrial Ct Wixom, MI 48393","Property Name L Custom Property Name":"Bldg D","RBA L Custom SF Building":"13417","Property Address P":"50200-50210 Dennis Industrial Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2021","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.69","Parcel Number L Custom":"17-31-352-009","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6960 Orchard Lake Rd Suite # 300","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-4515","True Owner Contact P Full Name":"Kelly Woodley","True Owner Name L Custom True Owner":"First Holding Management Company, LLC","True Owner Phone P Work":"(248) 8-53330","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"First Holding Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50240-50250 Dennis Industrial Ct Wixom, MI 48393","Property Address L Custom Building Address":"50240-50250 Dennis Industrial Ct Wixom, MI 48393","Property Name L Custom Property Name":"Bldg F","RBA L Custom SF Building":"15504","Property Address P":"50240-50250 Dennis Industrial Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2024","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.51","Parcel Number L Custom":"17-31-352-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6960 Orchard Lake Rd Suite # 300","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-4515","True Owner Contact P Full Name":"Kelly Woodley","True Owner Name L Custom True Owner":"First Holding Management Company, LLC","True Owner Phone P Work":"(248) 8-53330","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"First Holding Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50394 Dennis Industrial Pky Wixom, MI 48393","Property Address L Custom Building Address":"50394 Dennis Industrial Pky Wixom, MI 48393","Property Name L Custom Property Name":"Bldg C","RBA L Custom SF Building":"14000","Property Address P":"50394 Dennis Industrial Pky","City P":"Wixom","State P":"MI","No Zip":"48393-2026","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"11.81","Parcel Number L Custom":"17-31-352-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6960 Orchard Lake Rd Suite # 300","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-4515","True Owner Contact P Full Name":"Kelly Woodley","True Owner Name L Custom True Owner":"First Holding Management Company, LLC","True Owner Phone P Work":"(248) 8-53330","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"First Holding Management Company, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46470 Desoto Ct Novi, MI 48377","Property Address L Custom Building Address":"46470 Desoto Ct Novi, MI 48377","Property Name L Custom Property Name":"Bldg B","RBA L Custom SF Building":"15555","Property Address P":"46470 Desoto Ct","City P":"Novi","State P":"MI","No Zip":"48377-1731","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.16","Parcel Number L Custom":"22-04-379-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46470 Desoto Ct","True Owner City State Zip C Address: Main City":"Novi, MI 48377-1731","True Owner Contact P Full Name":"Jin Hong","True Owner Name L Custom True Owner":"TREK Inc.","True Owner Phone P Work":"(248) 8-82131","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"TREK Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48575 Downing Dr Wixom, MI 48393","Property Address L Custom Building Address":"48575 Downing Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"48575 Downing Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3503","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.65","Parcel Number L Custom":"22-08-100-041","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"331 Metty Dr","True Owner City State Zip C Address: Main City":"Ann Arbor, MI 48103-9155","True Owner Contact P Full Name":"Robert Hoffman","True Owner Name L Custom True Owner":"Ducks Unlimited Inc","True Owner Phone P Work":"(734) 4-32035","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Ducks Unlimited Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48590-48596 Downing Dr Wixom, MI 48393","Property Address L Custom Building Address":"48590-48596 Downing Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16000","Property Address P":"48590-48596 Downing Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3501","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.17","Parcel Number L Custom":"22-08-100-026","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30380 S Hill Ct","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"Dennis Sinacoloa","True Owner Name L Custom True Owner":"Sinacola Construction","True Owner Phone P Work":"(248) 8-79777","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Sinacola Construction","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48602 Downing Dr Wixom, MI 48393","Property Address L Custom Building Address":"48602 Downing Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14909","Property Address P":"48602 Downing Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3504","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"22-08-100-032","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7205 Deer Lake Rd","True Owner City State Zip C Address: Main City":"Clarkston, MI 48346","True Owner Contact P Full Name":"William Hannon","True Owner Name L Custom True Owner":"HANNON MARINE STORAGE LLC","True Owner Phone P Work":"(248) 8-06447","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"HANNON MARINE STORAGE LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1925 Easy St Commerce Township, MI 48390","Property Address L Custom Building Address":"1925 Easy St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10800","Property Address P":"1925 Easy St","City P":"Commerce Township","State P":"MI","No Zip":"48390-3221","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.90","Parcel Number L Custom":"17-26-426-030","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1977 E West Maple Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Advance Plumbing & Heating Supply Co.","True Owner Phone P Work":"(248) 8-97474","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Advance Plumbing & Heating Supply Co.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1941-1951 Easy St Commerce Township, MI 48390","Property Address L Custom Building Address":"1941-1951 Easy St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16348","Property Address P":"1941-1951 Easy St","City P":"Commerce Township","State P":"MI","No Zip":"48390-3221","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.32","Parcel Number L Custom":"17-26-426-031","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2175 E W Maple Rd","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48382","True Owner Contact P Full Name":"Bruce Bullard","True Owner Name L Custom True Owner":"Bruce Bullard","True Owner Phone P Work":"(248) 8-80077","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Bruce Bullard","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2005-2035 Easy St Commerce Township, MI 48390","Property Address L Custom Building Address":"2005-2035 Easy St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11385","Property Address P":"2005-2035 Easy St","City P":"Commerce Township","State P":"MI","No Zip":"48390-3223","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.89","Parcel Number L Custom":"17-26-426-061","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3646 E Elder Rd","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48324","True Owner Contact P Full Name":"Joel Rosenberg","True Owner Name L Custom True Owner":"Easy Street Investments, LLC","True Owner Phone P Work":"(248) 8-09394","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Easy Street Investments, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2121 Easy St Commerce Township, MI 48390","Property Address L Custom Building Address":"2121 Easy St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"18000","Property Address P":"2121 Easy St","City P":"Commerce Township","State P":"MI","No Zip":"48390-3225","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.65","Parcel Number L Custom":"17-26-426-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"Alan Edelson","True Owner Name L Custom True Owner":"Alan Edelson","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Alan Edelson","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2431 Fyke Dr Milford, MI 48381","Property Address L Custom Building Address":"2431 Fyke Dr Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11154","Property Address P":"2431 Fyke Dr","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.15","Parcel Number L Custom":"16-25-100-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8177 Goldie St Walled Lake, MI 48390","Property Address L Custom Building Address":"8177 Goldie St Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10736","Property Address P":"8177 Goldie St","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.66","Parcel Number L Custom":"17-13-400-009","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8177 Goldie St","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Richard White","True Owner Name L Custom True Owner":"CA Hull Co Inc","True Owner Phone P Work":"(248) 8-48025","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"CA Hull Co Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8225 Goldie St Commerce Township, MI 48390","Property Address L Custom Building Address":"8225 Goldie St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14885","Property Address P":"8225 Goldie St","City P":"Commerce Township","State P":"MI","No Zip":"48390-4109","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"9.01","Parcel Number L Custom":"17-13-400-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8177 Goldie St","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Joseph Malloure","True Owner Name L Custom True Owner":"CA Hull Co Inc","True Owner Phone P Work":"(248) 8-48025","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"CA Hull Co Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8230 Goldie St Commerce Township, MI 48390","Property Address L Custom Building Address":"8230 Goldie St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"8230 Goldie St","City P":"Commerce Township","State P":"MI","No Zip":"48390-4108","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"17-13-400-044","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"32235 Craftsbury","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48334-3429","True Owner Contact P Full Name":"Marion Johnsee","True Owner Name L Custom True Owner":"Marion Johnsee","True Owner Phone P Work":"() -","Secondary Type L Custom":"Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Marion Johnsee","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8232 Goldie St Commerce Township, MI 48390","Property Address L Custom Building Address":"8232 Goldie St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"8232 Goldie St","City P":"Commerce Township","State P":"MI","No Zip":"48390-4108","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"17-13-400-043","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"32235 Craftsbury","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48334-3429","True Owner Contact P Full Name":"Marion Johnsee","True Owner Name L Custom True Owner":"Marion Johnsee","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Marion Johnsee","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"8240-8246 Goldie St Commerce Township, MI 48390","Property Address L Custom Building Address":"8240-8246 Goldie St Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16000","Property Address P":"8240-8246 Goldie St","City P":"Commerce Township","State P":"MI","No Zip":"48390-4108","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.48","Parcel Number L Custom":"17-13-400-047","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8246 Goldie St","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-4108","True Owner Contact P Full Name":"Dan Wissner","True Owner Name L Custom True Owner":"Direct Connect Systems","True Owner Phone P Work":"(800) 0-55714","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Direct Connect Systems","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28011 Grand Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28011 Grand Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"Century Architectural Hardware","RBA L Custom SF Building":"11640","Property Address P":"28011 Grand Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3340","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.49","Parcel Number L Custom":"22-07-401-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3145 Copper Rd","True Owner City State Zip C Address: Main City":"Fenton, MI 48430","True Owner Contact P Full Name":"Adam Cole","True Owner Name L Custom True Owner":"Excel Medical Products Llc","True Owner Phone P Work":"(810) 0-44775","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Excel Medical Products Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28021 Grand Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28021 Grand Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15660","Property Address P":"28021 Grand Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3340","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.26","Parcel Number L Custom":"22-07-401-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28021 Grand Oaks Ct","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3340","True Owner Contact P Full Name":"Beth Ancona","True Owner Name L Custom True Owner":"Ancona Controls","True Owner Phone P Work":"(248) 8-45600","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Ancona Controls","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28061 Grand Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28061 Grand Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13992","Property Address P":"28061 Grand Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3340","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.40","Parcel Number L Custom":"22-07-401-020","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"38250 French Pond","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48331","True Owner Contact P Full Name":"Jon Williamson","True Owner Name L Custom True Owner":"Jon P Williamson","True Owner Phone P Work":"(248) 8-91106","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jon P Williamson","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"39586 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"39586 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"Keford Collision","RBA L Custom SF Building":"16000","Property Address P":"39586 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-2102","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.35","Parcel Number L Custom":"22-24-426-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40020 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40020 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"Bldg A","RBA L Custom SF Building":"14924","Property Address P":"40020 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-2112","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.60","Parcel Number L Custom":"22-24-401-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6111 N Shore Dr","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48324","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Steven Kopitz","True Owner Phone P Work":"(248) 8-26012","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Steven Kopitz","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40024 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40024 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"Bldg B","RBA L Custom SF Building":"12330","Property Address P":"40024 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.32","Parcel Number L Custom":"22-24-401-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6111 N Shore Dr","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48324","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Steven Kopitz","True Owner Phone P Work":"(248) 8-26012","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Steven Kopitz","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40028 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40028 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"Bldg C","RBA L Custom SF Building":"12330","Property Address P":"40028 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-2167","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.32","Parcel Number L Custom":"22-24-401-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6111 N Shore Dr","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48324","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Steven Kopitz","True Owner Phone P Work":"(248) 8-26012","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Steven Kopitz","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40220 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40220 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11464","Property Address P":"40220 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-2116","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.91","Parcel Number L Custom":"22-24-401-026","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"39500 High Pointe Blvd","True Owner City State Zip C Address: Main City":"Novi, MI 48375-5505","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"AJR Development, Inc.","True Owner Phone P Work":"(248) 8-06150","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"AJR Development, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40375 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40375 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13883","Property Address P":"40375 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-2123","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.82","Parcel Number L Custom":"22-24-451-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"40375 Grand River Ave","True Owner City State Zip C Address: Main City":"Novi, MI 48375-2123","True Owner Contact P Full Name":"Thelma Lacy","True Owner Name L Custom True Owner":"Thelma C. Lacy","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Thelma C. Lacy","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40850 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40850 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"Bldg A","RBA L Custom SF Building":"13500","Property Address P":"40850 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-5705","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.60","Parcel Number L Custom":"22-24-100-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"41106 Clermont Ave","True Owner City State Zip C Address: Main City":"Novi, MI 48375-5702","True Owner Contact P Full Name":"Sanjay Seth","True Owner Name L Custom True Owner":"Seth Investments LLC","True Owner Phone P Work":"(248) 8-50313","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Seth Investments LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"40950 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"40950 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"40950 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-2816","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.06","Parcel Number L Custom":"22-24-100-057","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2112 Prestwick Dr","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48335","True Owner Contact P Full Name":"Alan wood","True Owner Name L Custom True Owner":"Alan Wood","True Owner Phone P Work":"(248) 8-57574","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Alan Wood","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"44375 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"44375 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13000","Property Address P":"44375 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-1156","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.15","Parcel Number L Custom":"22-15-378-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"13821 Elmira St","True Owner City State Zip C Address: Main City":"Detroit, MI 48227","True Owner Contact P Full Name":"John Debono","True Owner Name L Custom True Owner":"Shaw & Slavsky Inc","True Owner Phone P Work":"(313) 3-43990","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Shaw & Slavsky Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"45031-45033 Grand River Ave Novi, MI 48375","Property Address L Custom Building Address":"45031-45033 Grand River Ave Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15586","Property Address P":"45031-45033 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48375-1015","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.23","Parcel Number L Custom":"22-15-351-025","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"45033 Grand River","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1015","True Owner Contact P Full Name":"Daniel Mansfield","True Owner Name L Custom True Owner":"Daniel C. Mansfield","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Daniel C. Mansfield","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"45500 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"45500 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13423","Property Address P":"45500 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1305","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"10.05","Parcel Number L Custom":"22-16-426-005","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"P.O.Box 8018","True Owner City State Zip C Address: Main City":"Novi, MI 48376-8018","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"DeMaria Building Co.","True Owner Phone P Work":"(248) 8-88710","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"DeMaria Building Co.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46001 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"46001 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12552","Property Address P":"46001 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1319","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.00","Parcel Number L Custom":"22-16-451-054","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6761 E Ten Mile Rd","True Owner City State Zip C Address: Main City":"Center Line, MI 48015","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Servall Inc.","True Owner Phone P Work":"(586) 6-41818","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Servall Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46035 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"46035 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17214","Property Address P":"46035 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1319","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.67","Parcel Number L Custom":"22-16-451-005","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"138 W Fisher Fwy","True Owner City State Zip C Address: Main City":"Detroit, MI 48201","True Owner Contact P Full Name":"Victor Giller","True Owner Name L Custom True Owner":"Paradise Properties Inc","True Owner Phone P Work":"(248) 8-84890","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Paradise Properties Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46085 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"46085 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10622","Property Address P":"46085 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1319","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.74","Parcel Number L Custom":"22-16-451-041","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3500 Ridge Rd","True Owner City State Zip C Address: Main City":"Highland, MI 48356","True Owner Contact P Full Name":"Robert Massard","True Owner Name L Custom True Owner":"Robert Massard","True Owner Phone P Work":"(248) 8-70417","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Robert Massard","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46089 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"46089 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12032","Property Address P":"46089 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1319","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-16-451-042","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46089 Grand River Ave","True Owner City State Zip C Address: Main City":"Novi, MI 48374-1319","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Slaco Tool & Manufacturing","True Owner Phone P Work":"(248) 8-99911","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Slaco Tool & Manufacturing","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46400 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"46400 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"Bell Fork Lift","RBA L Custom SF Building":"14073","Property Address P":"46400 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1323","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.60","Parcel Number L Custom":"22-16-251-017","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"34660 Centaur Dr Suite # 34660","True Owner City State Zip C Address: Main City":"Clinton Township, MI 48035","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Bell Fork Fort Inc","True Owner Phone P Work":"(586) 6-25773","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Bell Fork Fort Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46700 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"46700 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10800","Property Address P":"46700 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1326","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"19.22","Parcel Number L Custom":"22-16-176-020","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47087 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"47087 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15000","Property Address P":"47087 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1340","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.00","Parcel Number L Custom":"22-16-151-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47087 Grand River Ave","True Owner City State Zip C Address: Main City":"Novi, MI 48374-1340","True Owner Contact P Full Name":"Mike McCowan","True Owner Name L Custom True Owner":"Mike McCowan","True Owner Phone P Work":"(248) 8-98877","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Mike McCowan","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48545 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"48545 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12220","Property Address P":"48545 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1245","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.00","Parcel Number L Custom":"22-17-101-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48595 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"48595 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10347","Property Address P":"48595 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1245","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.02","Parcel Number L Custom":"22-17-101-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"21565 Flanders St","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48335","True Owner Contact P Full Name":"Christine Walker","True Owner Name L Custom True Owner":"Walker, William & Christine","True Owner Phone P Work":"(517) 7-89049","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Walker, William & Christine","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48735 Grand River Ave Novi, MI 48374","Property Address L Custom Building Address":"48735 Grand River Ave Novi, MI 48374","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10195","Property Address P":"48735 Grand River Ave","City P":"Novi","State P":"MI","No Zip":"48374-1247","Zip P":"48374","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.98","Parcel Number L Custom":"22-17-101-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"24700 Northwestern Hwy Suite # 700","True Owner City State Zip C Address: Main City":"Southfield, MI 48075","True Owner Contact P Full Name":"Daniel Irvin","True Owner Name L Custom True Owner":"Novi Cartage LLC","True Owner Phone P Work":"(586) 6-61700","Secondary Type L Custom":"Truck Terminal","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Novi Cartage LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"51722 Grand River Ave Wixom, MI 48393","Property Address L Custom Building Address":"51722 Grand River Ave Wixom, MI 48393","Property Name L Custom Property Name":"South Building","RBA L Custom SF Building":"14000","Property Address P":"51722 Grand River Ave","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.34","Parcel Number L Custom":"21-12-251-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"51722 Grand River Ave","True Owner City State Zip C Address: Main City":"Lyon Township, MI 48393","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"United Rentals","True Owner Phone P Work":"(248) 8-42800","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"United Rentals","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"53115-53125 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"53115-53125 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12018","Property Address P":"53115-53125 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"21-11-276-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"53125 Grand River Ave","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"Richard Similuk","True Owner Name L Custom True Owner":"Rjs Group Llc","True Owner Phone P Work":"(248) 8-38761","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Rjs Group Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"53205 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"53205 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14800","Property Address P":"53205 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.00","Parcel Number L Custom":"21-11-276-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4706 Product Dr Suite # 7","True Owner City State Zip C Address: Main City":"Milford, MI 48381","True Owner Contact P Full Name":"James Solomon","True Owner Name L Custom True Owner":"Crystal Property Management LLC","True Owner Phone P Work":"(517) 7-04480","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Crystal Property Management LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"53400 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"53400 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"Building A","RBA L Custom SF Building":"16200","Property Address P":"53400 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165-8521","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.07","Parcel Number L Custom":"21-11-226-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"53400 Grand River Ave","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165-8521","True Owner Contact P Full Name":"Kim Gasior","True Owner Name L Custom True Owner":"Jerry Baker","True Owner Phone P Work":"(248) 8-73000","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jerry Baker","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"53583 Grand River Ave Wixom, MI 48393","Property Address L Custom Building Address":"53583 Grand River Ave Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10608","Property Address P":"53583 Grand River Ave","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.15","Parcel Number L Custom":"21-11-251-027","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"54360 Belcrest Dr","True Owner City State Zip C Address: Main City":"Milford, MI 48381","True Owner Contact P Full Name":"John Dolan","True Owner Name L Custom True Owner":"John Dolan","True Owner Phone P Work":"(248) 8-74445","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"John Dolan","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"53655 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"53655 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12913","Property Address P":"53655 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165-8523","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.61","Parcel Number L Custom":"21-11-251-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"5000 Dryden Ln","True Owner City State Zip C Address: Main City":"Bloomfield Hills, MI 48304","True Owner Contact P Full Name":"Michael Reilly","True Owner Name L Custom True Owner":"Micahel J Reilly","True Owner Phone P Work":"(248) 8-66134","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Micahel J Reilly","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"54750 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"54750 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12500","Property Address P":"54750 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"21-02-376-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1503 Mystic Hills Dr","True Owner City State Zip C Address: Main City":"Milford, MI 48380-4489","True Owner Contact P Full Name":"Edward Swadish","True Owner Name L Custom True Owner":"Swadish, Edward Frank","True Owner Phone P Work":"(248) 8-73967","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Swadish, Edward Frank","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"54790 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"54790 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14240","Property Address P":"54790 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165-8526","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.78","Parcel Number L Custom":"21-02-376-018","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8051 Locklin Ln","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48382","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Union Bay Associates, LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Union Bay Associates, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55820 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"55820 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10500","Property Address P":"55820 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165-8706","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.30","Parcel Number L Custom":"21-03-402-018","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55860 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"55860 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10814","Property Address P":"55860 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165-9717","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.20","Parcel Number L Custom":"21-03-401-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7071 Orchard Lake Rd","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-3613","True Owner Contact P Full Name":"Cristy Evangelista","True Owner Name L Custom True Owner":"Evangelista Development LLC","True Owner Phone P Work":"(248) 8-61114","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Evangelista Development LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"56405 Grand River Ave New Hudson, MI 48165","Property Address L Custom Building Address":"56405 Grand River Ave New Hudson, MI 48165","Property Name L Custom Property Name":"Insulgard","RBA L Custom SF Building":"12000","Property Address P":"56405 Grand River Ave","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.88","Parcel Number L Custom":"21-03-376-022","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"58000 Grand River Ave","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Charter Township of Lyon","True Owner Phone P Work":"(248) 8-72240","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Charter Township of Lyon","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28850 Haas Rd Wixom, MI 48393","Property Address L Custom Building Address":"28850 Haas Rd Wixom, MI 48393","Property Name L Custom Property Name":"P.B. Brodak Roofing & Sheet Metal Co.","RBA L Custom SF Building":"16700","Property Address P":"28850 Haas Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.62","Parcel Number L Custom":"21-11-276-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3295 Haggerty Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"3295 Haggerty Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"18000","Property Address P":"3295 Haggerty Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-1725","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.34","Parcel Number L Custom":"17-24-228-028","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3225 Haggerty Rd","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390","True Owner Contact P Full Name":"Robin Dubuc","True Owner Name L Custom True Owner":"Thomas Craig Properties LLC","True Owner Phone P Work":"(248) 8-46140","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Thomas Craig Properties LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4270 Haggerty Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"4270 Haggerty Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"4270 Haggerty Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.64","Parcel Number L Custom":"17-13-400-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4278 Haggerty Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Kim Jensen","True Owner Name L Custom True Owner":"Jensen Building Products","True Owner Phone P Work":"(248) 8-34144","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jensen Building Products","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4278 Haggerty Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"4278 Haggerty Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"Building 1","RBA L Custom SF Building":"15000","Property Address P":"4278 Haggerty Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.95","Parcel Number L Custom":"17-13-400-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4370 Haggerty Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"4370 Haggerty Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10600","Property Address P":"4370 Haggerty Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.97","Parcel Number L Custom":"17-13-400-022","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2287 E West Maple Rd","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-3820","True Owner Contact P Full Name":"Luai Poota","True Owner Name L Custom True Owner":"Luai's Automotive LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Luai's Automotive LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4400 Haggerty Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"4400 Haggerty Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11998","Property Address P":"4400 Haggerty Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.77","Parcel Number L Custom":"17-13-400-029","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3157 Pikewood Ct","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48382-2234","True Owner Contact P Full Name":"Robert Booth","True Owner Name L Custom True Owner":"Booth Robert A & Patricia","True Owner Phone P Work":"(248) 8-42234","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Booth Robert A & Patricia","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4440 Haggerty Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"4440 Haggerty Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"Wison Marine Oakland","RBA L Custom SF Building":"10500","Property Address P":"4440 Haggerty Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-1317","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.20","Parcel Number L Custom":"17-13-400-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6095 Grand River Rd","True Owner City State Zip C Address: Main City":"Brighton, MI 48114","True Owner Contact P Full Name":"Ronald Wilson","True Owner Name L Custom True Owner":"Ronald Wilson","True Owner Phone P Work":"(517) 7-63774","Secondary Type L Custom":"Service","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Ronald Wilson","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22495-22499 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22495-22499 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12596","Property Address P":"22495-22499 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4138","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.80","Parcel Number L Custom":"22-26-376-009","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"RT 3 Box 382","True Owner City State Zip C Address: Main City":"Traverse City, MI 49684-9803","True Owner Contact P Full Name":"Frank Martin","True Owner Name L Custom True Owner":"Frank Martin","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Frank Martin","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22500 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22500 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16438","Property Address P":"22500 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4139","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.62","Parcel Number L Custom":"22-26-377-024","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6980 Lakemont Cir","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48323-2070","True Owner Contact P Full Name":"Larry Morianti","True Owner Name L Custom True Owner":"Larry P Morianti","True Owner Phone P Work":"(248) 8-19098","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Larry P Morianti","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22515 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22515 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10380","Property Address P":"22515 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4140","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.19","Parcel Number L Custom":"22-26-376-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"22419 Paddington Ct","True Owner City State Zip C Address: Main City":"Novi, MI 48374","True Owner Contact P Full Name":"Ghazwan Ismail","True Owner Name L Custom True Owner":"Ghazwan Ismail","True Owner Phone P Work":"(734) 4-64000","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Ghazwan Ismail","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22575 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22575 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"W.S Equipment","RBA L Custom SF Building":"15440","Property Address P":"22575 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4140","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.07","Parcel Number L Custom":"22-26-376-018","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"19850 Marilyn St","True Owner City State Zip C Address: Main City":"Northville, MI 48167-2626","True Owner Contact P Full Name":"Dennis Kubica","True Owner Name L Custom True Owner":"Kubica Corporation","True Owner Phone P Work":"(313) 3-49000","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Kubica Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22605 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22605 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"Cav Tool","RBA L Custom SF Building":"11680","Property Address P":"22605 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4142","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.34","Parcel Number L Custom":"22-26-376-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28214 Beck Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"R & K Holding LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"R & K Holding LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22755-22759 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22755-22759 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"Global Office Building","RBA L Custom SF Building":"16407","Property Address P":"22755-22759 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4144","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.21","Parcel Number L Custom":"22-26-326-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"22759 Heslip Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48375-4144","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Heslip Holdings, LLC","True Owner Phone P Work":"(248) 8-99100","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Heslip Holdings, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22777 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22777 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14458","Property Address P":"22777 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4144","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.06","Parcel Number L Custom":"22-26-326-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"22777 Heslip Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48375-4144","True Owner Contact P Full Name":"Christine Ellis","True Owner Name L Custom True Owner":"Facet international marketing","True Owner Phone P Work":"(734) 4-33500","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Facet international marketing","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22781 Heslip Dr Novi, MI 48375","Property Address L Custom Building Address":"22781 Heslip Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14458","Property Address P":"22781 Heslip Dr","City P":"Novi","State P":"MI","No Zip":"48375-4144","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.06","Parcel Number L Custom":"22-26-326-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2000 E Highland Rd Highland, MI 48356","Property Address L Custom Building Address":"2000 E Highland Rd Highland, MI 48356","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12330","Property Address P":"2000 E Highland Rd","City P":"Highland","State P":"MI","No Zip":"48356-3058","Zip P":"48356","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.04","Parcel Number L Custom":"11-23-227-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2000 E Highland Rd","True Owner City State Zip C Address: Main City":"Highland, MI 48356-3058","True Owner Contact P Full Name":"Michael Seacord","True Owner Name L Custom True Owner":"Seaco Investments Llc","True Owner Phone P Work":"(248) 8-30109","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Seaco Investments Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"5410A E Highland Rd White Lake, MI 48383","Property Address L Custom Building Address":"5410A E Highland Rd White Lake, MI 48383","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11986","Property Address P":"5410A E Highland Rd","City P":"White Lake","State P":"MI","No Zip":"48383","Zip P":"48383","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.31","Parcel Number L Custom":"12-20-151-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30100 S Hill Rd New Hudson, MI 48165","Property Address L Custom Building Address":"30100 S Hill Rd New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13000","Property Address P":"30100 S Hill Rd","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.46","Parcel Number L Custom":"21-02-376-023","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30100 S Hill Rd","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"Dan Cheresko","True Owner Name L Custom True Owner":"Lyon Mechanical, Inc.","True Owner Phone P Work":"(248) 8-71047","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Lyon Mechanical, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"335 S Houghton St Milford, MI 48381","Property Address L Custom Building Address":"335 S Houghton St Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15732","Property Address P":"335 S Houghton St","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.79","Parcel Number L Custom":"16-11-376-028","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Service","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29575 Hudson Dr Novi, MI 48377","Property Address L Custom Building Address":"29575 Hudson Dr Novi, MI 48377","Property Name L Custom Property Name":"Unit 4","RBA L Custom SF Building":"11983","Property Address P":"29575 Hudson Dr","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.04","Parcel Number L Custom":"22-04-377-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"53400 Grand River Ave","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165-8521","True Owner Contact P Full Name":"Kim Gasior","True Owner Name L Custom True Owner":"Jerry Baker","True Owner Phone P Work":"(248) 8-73000","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jerry Baker","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29580 Hudson Dr Novi, MI 48377","Property Address L Custom Building Address":"29580 Hudson Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11000","Property Address P":"29580 Hudson Dr","City P":"Novi","State P":"MI","No Zip":"48377-1733","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.09","Parcel Number L Custom":"22-04-378-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1695 Balsam Way","True Owner City State Zip C Address: Main City":"Milford, MI 48381","True Owner Contact P Full Name":"Nosh Sinishtaj","True Owner Name L Custom True Owner":"Nosh Sinishtaj","True Owner Phone P Work":"(248) 8-83420","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Nosh Sinishtaj","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41115 Jo Dr Novi, MI 48375","Property Address L Custom Building Address":"41115 Jo Dr Novi, MI 48375","Property Name L Custom Property Name":"Micro Craft","RBA L Custom SF Building":"17825","Property Address P":"41115 Jo Dr","City P":"Novi","State P":"MI","No Zip":"48375-1916","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.82","Parcel Number L Custom":"22-24-100-058","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"41115 Jo Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1916","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Vincenti Investment Company2","True Owner Phone P Work":"() -","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Vincenti Investment Company2","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41123 Jo Dr Novi, MI 48375","Property Address L Custom Building Address":"41123 Jo Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16224","Property Address P":"41123 Jo Dr","City P":"Novi","State P":"MI","No Zip":"48375-1933","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.26","Parcel Number L Custom":"22-24-100-061","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1000 E Mandoline","True Owner City State Zip C Address: Main City":"Madison Heights, MI 48071-1475","True Owner Contact P Full Name":"Edward Sherman","True Owner Name L Custom True Owner":"Dot Development Company","True Owner Phone P Work":"(248) 8-84350","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dot Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"949 Ladd Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"949 Ladd Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15523","Property Address P":"949 Ladd Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.39","Parcel Number L Custom":"17-34-101-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"949 Ladd Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Lawrence Montgomery","True Owner Name L Custom True Owner":"Montgomery, Lawrence & Catherine","True Owner Phone P Work":"(248) 8-81640","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Montgomery, Lawrence & Catherine","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"415 N Lafayette St South Lyon, MI 48178","Property Address L Custom Building Address":"415 N Lafayette St South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"18000","Property Address P":"415 N Lafayette St","City P":"South Lyon","State P":"MI","No Zip":"48178","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.24","Parcel Number L Custom":"21-19-476-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"415 N Lafayette St","True Owner City State Zip C Address: Main City":"South Lyon, MI 48178","True Owner Contact P Full Name":"Charles Pullum","True Owner Name L Custom True Owner":"Pullum Window Corporation","True Owner Phone P Work":"(248) 8-14700","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Pullum Window Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46918 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46918 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17902","Property Address P":"46918 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3600","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.34","Parcel Number L Custom":"22-09-151-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3120 Sovereign Dr Suite # 4B","True Owner City State Zip C Address: Main City":"Lansing, MI 48911-4226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-43001","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46919 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46919 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13700","Property Address P":"46919 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3602","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.96","Parcel Number L Custom":"22-09-152-005","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3120 Sovereign Dr Suite # 4B","True Owner City State Zip C Address: Main City":"Lansing, MI 48911-4226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-43001","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46953 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46953 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11900","Property Address P":"46953 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3603","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.71","Parcel Number L Custom":"22-09-152-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3120 Sovereign Dr Suite # 4B","True Owner City State Zip C Address: Main City":"Lansing, MI 48911-4226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-43001","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46968 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46968 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"Lot 12","RBA L Custom SF Building":"11974","Property Address P":"46968 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3693","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.18","Parcel Number L Custom":"22-09-301-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3120 Sovereign Dr Suite # 4B","True Owner City State Zip C Address: Main City":"Lansing, MI 48911-4226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-43001","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46974 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46974 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11996","Property Address P":"46974 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3601","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-09-301-005","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3120 Sovereign Dr Suite # 4B","True Owner City State Zip C Address: Main City":"Lansing, MI 48911-4226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-43001","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46980 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46980 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13324","Property Address P":"46980 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3601","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-09-301-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"24073-24083 Research Dr","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48335-2632","True Owner Contact P Full Name":"Amy Chen","True Owner Name L Custom True Owner":"Tung Thih Electronics USA","True Owner Phone P Work":"(248) 8-89512","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Tung Thih Electronics USA","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46981-46983 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46981-46983 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13578","Property Address P":"46981-46983 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3694","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.98","Parcel Number L Custom":"22-09-152-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3120 Sovereign Dr Suite # 4B","True Owner City State Zip C Address: Main City":"Lansing, MI 48911-4226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-43001","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46986 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46986 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"Lot 15","RBA L Custom SF Building":"13240","Property Address P":"46986 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3601","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-09-301-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"500 Hogsback Rd","True Owner City State Zip C Address: Main City":"Mason, MI 48854","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-63800","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46987-46989 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46987-46989 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13688","Property Address P":"46987-46989 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.09","Parcel Number L Custom":"22-09-152-009","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"432 Hogsback Rd","True Owner City State Zip C Address: Main City":"Mason, MI 48854","True Owner Contact P Full Name":"Bob Dart","True Owner Name L Custom True Owner":"Dart","True Owner Phone P Work":"(517) 7-63803","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46992 Liberty Dr Wixom, MI 48393","Property Address L Custom Building Address":"46992 Liberty Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16972","Property Address P":"46992 Liberty Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3601","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-09-301-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"500 Hogsback Rd","True Owner City State Zip C Address: Main City":"Mason, MI 48854-9547","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dart Container Corporation","True Owner Phone P Work":"(517) 7-63800","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dart Container Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29108 Lorie Ln Wixom, MI 48393","Property Address L Custom Building Address":"29108 Lorie Ln Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10116","Property Address P":"29108 Lorie Ln","City P":"Wixom","State P":"MI","No Zip":"48393-3640","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.89","Parcel Number L Custom":"22-08-200-034","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29777 Telegraph Rd Suite # 2475","True Owner City State Zip C Address: Main City":"Southfield, MI 48034-1303","True Owner Contact P Full Name":"Richard Delonis","True Owner Name L Custom True Owner":"Szura & Delonis Plc","True Owner Phone P Work":"(248) 8-63600","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Szura & Delonis Plc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29318 Lorie Ln Wixom, MI 48393","Property Address L Custom Building Address":"29318 Lorie Ln Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13330","Property Address P":"29318 Lorie Ln","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.80","Parcel Number L Custom":"22-08-227-023","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2289 Mayfair Dr","True Owner City State Zip C Address: Main City":"White Lake, MI 48383","True Owner Contact P Full Name":"Paul Fus","True Owner Name L Custom True Owner":"Paul E Fus","True Owner Phone P Work":"(248) 8-52761","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Paul E Fus","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29420 Lorie Ln Wixom, MI 48393","Property Address L Custom Building Address":"29420 Lorie Ln Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"29420 Lorie Ln","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.81","Parcel Number L Custom":"22-08-227-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29421 Lorie Ln","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Arturo Rodriguez","True Owner Name L Custom True Owner":"Roligi Investments, LLC","True Owner Phone P Work":"(248) 8-89991","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Roligi Investments, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29431 Lorie Ln Wixom, MI 48393","Property Address L Custom Building Address":"29431 Lorie Ln Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15712","Property Address P":"29431 Lorie Ln","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.72","Parcel Number L Custom":"22-08-226-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29431 Lorie Ln","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Bud Conrad","True Owner Name L Custom True Owner":"BC Manufacturing Inc","True Owner Phone P Work":"(248) 8-40101","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"BC Manufacturing Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55353 Lyon Industrial Dr New Hudson, MI 48165","Property Address L Custom Building Address":"55353 Lyon Industrial Dr New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13796","Property Address P":"55353 Lyon Industrial Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.14","Parcel Number L Custom":"21-03-402-025","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"34750 Norflok St","True Owner City State Zip C Address: Main City":"Livonia, MI 48152-4041","True Owner Contact P Full Name":"Giovanni Agazzi","True Owner Name L Custom True Owner":"Grone Construction Co","True Owner Phone P Work":"(248) 8-43786","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Grone Construction Co","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55375 Lyon Industrial Dr New Hudson, MI 48165","Property Address L Custom Building Address":"55375 Lyon Industrial Dr New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13800","Property Address P":"55375 Lyon Industrial Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.14","Parcel Number L Custom":"21-03-402-024","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"Steve Agazzi","True Owner Name L Custom True Owner":"P & N","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"P & N","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55378 Lyon Industrial Dr New Hudson, MI 48165","Property Address L Custom Building Address":"55378 Lyon Industrial Dr New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11114","Property Address P":"55378 Lyon Industrial Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.67","Parcel Number L Custom":"21-03-402-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"55378 Lyon Industrial Dr","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"DENNIS ROGGERS","True Owner Phone P Work":"(248) 8-69771","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"DENNIS ROGGERS","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55390 Lyon Industrial Dr New Hudson, MI 48165","Property Address L Custom Building Address":"55390 Lyon Industrial Dr New Hudson, MI 48165","Property Name L Custom Property Name":"Unit 13","RBA L Custom SF Building":"17200","Property Address P":"55390 Lyon Industrial Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.32","Parcel Number L Custom":"21-03-402-023","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7125 Orchard Lake Rd Suite # 200","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-3615","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Singh Development Company","True Owner Phone P Work":"(248) 8-51600","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Singh Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"55412 Lyon Industrial Dr New Hudson, MI 48165","Property Address L Custom Building Address":"55412 Lyon Industrial Dr New Hudson, MI 48165","Property Name L Custom Property Name":"Lyon Industrial","RBA L Custom SF Building":"14800","Property Address P":"55412 Lyon Industrial Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.39","Parcel Number L Custom":"21-03-402-022","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7125 Orchard Lake Rd Suite # 200","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48322-3615","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Singh Development Company","True Owner Phone P Work":"(248) 8-51600","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Singh Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46605 Magellan Dr Novi, MI 48377","Property Address L Custom Building Address":"46605 Magellan Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14843","Property Address P":"46605 Magellan Dr","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.68","Parcel Number L Custom":"22-09-326-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46665 Magellan Dr Novi, MI 48377","Property Address L Custom Building Address":"46665 Magellan Dr Novi, MI 48377","Property Name L Custom Property Name":"Unit 14","RBA L Custom SF Building":"17000","Property Address P":"46665 Magellan Dr","City P":"Novi","State P":"MI","No Zip":"48377-2442","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.20","Parcel Number L Custom":"22-09-177-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46665 Magellan Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48377","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Access Interactive","True Owner Phone P Work":"(248) 8-73000","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Access Interactive","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46695 Magellan Dr Novi, MI 48377","Property Address L Custom Building Address":"46695 Magellan Dr Novi, MI 48377","Property Name L Custom Property Name":"Dantom","RBA L Custom SF Building":"16048","Property Address P":"46695 Magellan Dr","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.51","Parcel Number L Custom":"22-09-177-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"50 Old Webster Rd","True Owner City State Zip C Address: Main City":"Oxford, MA 01540","True Owner Contact P Full Name":"Valentin Gapontsev","True Owner Name L Custom True Owner":"IPG Photonics","True Owner Phone P Work":"(508) 8-31100","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"IPG Photonics","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46725 Magellan Dr Novi, MI 48377","Property Address L Custom Building Address":"46725 Magellan Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16052","Property Address P":"46725 Magellan Dr","City P":"Novi","State P":"MI","No Zip":"48377-2453","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.20","Parcel Number L Custom":"22-09-177-005","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46725 Magellan Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48377-2453","True Owner Contact P Full Name":"Frank Kemmer","True Owner Name L Custom True Owner":"Vsc","True Owner Phone P Work":"(248) 8-62540","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Vsc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46755 Magellan Dr Novi, MI 48377","Property Address L Custom Building Address":"46755 Magellan Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14021","Property Address P":"46755 Magellan Dr","City P":"Novi","State P":"MI","No Zip":"48377-2453","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.17","Parcel Number L Custom":"22-09-177-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30100 Telegraph Rd Suite # 322","True Owner City State Zip C Address: Main City":"Bingham Farms, MI 48025-4514","True Owner Contact P Full Name":"Morton Noveck","True Owner Name L Custom True Owner":"Noveck & Nasholtz PLC","True Owner Phone P Work":"(248) 8-27111","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Noveck & Nasholtz PLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46785 Magellan Dr Novi, MI 48377","Property Address L Custom Building Address":"46785 Magellan Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16040","Property Address P":"46785 Magellan Dr","City P":"Novi","State P":"MI","No Zip":"48377-2453","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.11","Parcel Number L Custom":"22-09-177-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"550 S Ocean Blvd Suite # 2204","True Owner City State Zip C Address: Main City":"Boca Raton, FL 33432","True Owner Contact P Full Name":"Iris Phelps","True Owner Name L Custom True Owner":"17242 Boulevard, LLC","True Owner Phone P Work":"(561) 1-29470","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"17242 Boulevard, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46926 Magellan Dr Wixom, MI 48393","Property Address L Custom Building Address":"46926 Magellan Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11000","Property Address P":"46926 Magellan Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.16","Parcel Number L Custom":"22-09-102-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"560 N Carney Dr","True Owner City State Zip C Address: Main City":"Saint Clair, MI 48079","True Owner Contact P Full Name":"Geri Schmidt","True Owner Name L Custom True Owner":"Geri Schmidt","True Owner Phone P Work":"(810) 0-90855","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Geri Schmidt","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46934-46942 Magellan Dr Wixom, MI 48393","Property Address L Custom Building Address":"46934-46942 Magellan Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11565","Property Address P":"46934-46942 Magellan Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.07","Parcel Number L Custom":"22-09-102-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1484 Andover Blvd","True Owner City State Zip C Address: Main City":"Howell, MI 48843","True Owner Contact P Full Name":"Nathan Donnellon","True Owner Name L Custom True Owner":"Nathan Donnellon","True Owner Phone P Work":"(734) 4-03778","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Nathan Donnellon","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46950 Magellan Dr Wixom, MI 48393","Property Address L Custom Building Address":"46950 Magellan Dr Wixom, MI 48393","Property Name L Custom Property Name":"Lot 4","RBA L Custom SF Building":"15330","Property Address P":"46950 Magellan Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.17","Parcel Number L Custom":"22-09-102-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46950 Magellan Dr Suite # C-1","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Weihua Li","True Owner Name L Custom True Owner":"QOMO HiteVision","True Owner Phone P Work":"(248) 8-92121","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"QOMO HiteVision","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"125 S Main St Milford, MI 48381","Property Address L Custom Building Address":"125 S Main St Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15000","Property Address P":"125 S Main St","City P":"Milford","State P":"MI","No Zip":"48381-1996","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.81","Parcel Number L Custom":"16-11-301-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1920 W Maple Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"1920 W Maple Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15200","Property Address P":"1920 W Maple Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-2953","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.10","Parcel Number L Custom":"17-33-253-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1920 W Maple Rd","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-2953","True Owner Contact P Full Name":"Conrad Lindstrom","True Owner Name L Custom True Owner":"American Manufacturing Innovators, Inc.","True Owner Phone P Work":"(248) 8-95990","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"American Manufacturing Innovators, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4170 Martin Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"4170 Martin Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"4170 Martin Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-4116","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.66","Parcel Number L Custom":"17-13-326-026","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3281 W Shore Dr","True Owner City State Zip C Address: Main City":"Orchard Lake, MI 48324","True Owner Contact P Full Name":"David Moellering","True Owner Name L Custom True Owner":"Moe-Jo LLC","True Owner Phone P Work":"(248) 8-17999","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Moe-Jo LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4224 Martin Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"4224 Martin Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"APPCO Control","RBA L Custom SF Building":"10000","Property Address P":"4224 Martin Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-4118","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.86","Parcel Number L Custom":"17-13-326-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"5645 Sashabaw Rd","True Owner City State Zip C Address: Main City":"Clarkston, MI 48346","True Owner Contact P Full Name":"Gina Iacobelli","True Owner Name L Custom True Owner":"Independence Management Corp.","True Owner Phone P Work":"(248) 8-51188","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Independence Management Corp.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4999 McCarthy Dr Milford, MI 48381","Property Address L Custom Building Address":"4999 McCarthy Dr Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14800","Property Address P":"4999 McCarthy Dr","City P":"Milford","State P":"MI","No Zip":"48381-3947","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.74","Parcel Number L Custom":"16-35-451-026","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"32733 Folsom Rd","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48336-4425","True Owner Contact P Full Name":"James Struble","True Owner Name L Custom True Owner":"Ranger Contracting Incorporated","True Owner Phone P Work":"(248) 8-12277","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Ranger Contracting Incorporated","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25715-25737 Meadowbrook Rd Novi, MI 48375","Property Address L Custom Building Address":"25715-25737 Meadowbrook Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17193","Property Address P":"25715-25737 Meadowbrook Rd","City P":"Novi","State P":"MI","No Zip":"48375-1849","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.39","Parcel Number L Custom":"22-23-226-020","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25775 Meadowbrook Rd Novi, MI 48375","Property Address L Custom Building Address":"25775 Meadowbrook Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17605","Property Address P":"25775 Meadowbrook Rd","City P":"Novi","State P":"MI","No Zip":"48375-1849","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.39","Parcel Number L Custom":"22-23-226-033","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"25775 Meadowbrook Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1849","True Owner Contact P Full Name":"Joseph Khalifeh","True Owner Name L Custom True Owner":"Biotech Clinical Laboratories","True Owner Phone P Work":"(248) 8-69800","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Biotech Clinical Laboratories","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25849-25869 Meadowbrook Rd Novi, MI 48375","Property Address L Custom Building Address":"25849-25869 Meadowbrook Rd Novi, MI 48375","Property Name L Custom Property Name":"Building 2","RBA L Custom SF Building":"17728","Property Address P":"25849-25869 Meadowbrook Rd","City P":"Novi","State P":"MI","No Zip":"48375","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.31","Parcel Number L Custom":"22-23-230-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"41200-41218 Bridge St","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1301","True Owner Contact P Full Name":"Bill McKeever","True Owner Name L Custom True Owner":"Certified Management","True Owner Phone P Work":"(248) 8-66700","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Certified Management","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25873-25893 Meadowbrook Rd Novi, MI 48375","Property Address L Custom Building Address":"25873-25893 Meadowbrook Rd Novi, MI 48375","Property Name L Custom Property Name":"Building 3","RBA L Custom SF Building":"17726","Property Address P":"25873-25893 Meadowbrook Rd","City P":"Novi","State P":"MI","No Zip":"48375-1851","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.31","Parcel Number L Custom":"22-23-230-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"41200-41218 Bridge St","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1301","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Certified Management","True Owner Phone P Work":"(248) 8-66700","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Certified Management","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1025 Metro Dr Walled Lake, MI 48390","Property Address L Custom Building Address":"1025 Metro Dr Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14074","Property Address P":"1025 Metro Dr","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.24","Parcel Number L Custom":"17-27-351-023","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"PO BOX 725","True Owner City State Zip C Address: Main City":"WALLED LAKE, MI 48390","True Owner Contact P Full Name":"Gary Mapes","True Owner Name L Custom True Owner":"Metro Enviromental Services","True Owner Phone P Work":"(313) 3-44799","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Metro Enviromental Services","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"5350 Milford Rd New Hudson, MI 48165","Property Address L Custom Building Address":"5350 Milford Rd New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10742","Property Address P":"5350 Milford Rd","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.26","Parcel Number L Custom":"21-04-201-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1 N Lexington Ave","True Owner City State Zip C Address: Main City":"White Plains, NY 10601-1712","True Owner Contact P Full Name":"Mark Comora","True Owner Name L Custom True Owner":"FORTISTAR","True Owner Phone P Work":"(914) 4-14900","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"FORTISTAR","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29111 Milford Rd New Hudson, MI 48165","Property Address L Custom Building Address":"29111 Milford Rd New Hudson, MI 48165","Property Name L Custom Property Name":"Mac Dermid, Inc.","RBA L Custom SF Building":"14459","Property Address P":"29111 Milford Rd","City P":"New Hudson","State P":"MI","No Zip":"48165-9741","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.60","Parcel Number L Custom":"21-09-226-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1401 Blake St","True Owner City State Zip C Address: Main City":"Denver, CO 80202-1383","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"MacDermid Group, Inc.","True Owner Phone P Work":"(720) 0-93060","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"MacDermid Group, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"31250 S Milford Rd Milford, MI 48381","Property Address L Custom Building Address":"31250 S Milford Rd Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10041","Property Address P":"31250 S Milford Rd","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.56","Parcel Number L Custom":"21-03-126-017","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"385 N Mill St South Lyon, MI 48178","Property Address L Custom Building Address":"385 N Mill St South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"18000","Property Address P":"385 N Mill St","City P":"South Lyon","State P":"MI","No Zip":"48178-1262","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.33","Parcel Number L Custom":"21-20-326-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"6659 Seven Mile Rd","True Owner City State Zip C Address: Main City":"South Lyon, MI 48178","True Owner Contact P Full Name":"Michael Mannella","True Owner Name L Custom True Owner":"Michael Mannella","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Michael Mannella","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"465 N Mill St South Lyon, MI 48178","Property Address L Custom Building Address":"465 N Mill St South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13743","Property Address P":"465 N Mill St","City P":"South Lyon","State P":"MI","No Zip":"48178","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.95","Parcel Number L Custom":"21-20-326-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"Linda Turman","True Owner Name L Custom True Owner":"Linda S Turman","True Owner Phone P Work":"(248) 8-10441","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Linda S Turman","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"521 N Mill St South Lyon, MI 48178","Property Address L Custom Building Address":"521 N Mill St South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14920","Property Address P":"521 N Mill St","City P":"South Lyon","State P":"MI","No Zip":"48178","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"21-20-326-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"48755 W 10 Mile Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48374","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Pardonnet George","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Pardonnet George","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"201 S Mill St South Lyon, MI 48178","Property Address L Custom Building Address":"201 S Mill St South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16000","Property Address P":"201 S Mill St","City P":"South Lyon","State P":"MI","No Zip":"48178","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.39","Parcel Number L Custom":"21-29-176-025","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"42411 Palmer Rd","True Owner City State Zip C Address: Main City":"Canton, MI 48188-1990","True Owner Contact P Full Name":"Adam Aldrin","True Owner Name L Custom True Owner":"Mill Street Investment Llc","True Owner Phone P Work":"(734) 4-62509","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Mill Street Investment Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3250 New Farm Ct Commerce Township, MI 48390","Property Address L Custom Building Address":"3250 New Farm Ct Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10400","Property Address P":"3250 New Farm Ct","City P":"Commerce Township","State P":"MI","No Zip":"48390-1702","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.75","Parcel Number L Custom":"17-24-229-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"31393 W 13 Mile Rd Suite # 150","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48334-2297","True Owner Contact P Full Name":"Charlie Cassar","True Owner Name L Custom True Owner":"Sam Cassar Company","True Owner Phone P Work":"(248) 8-14477","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Sam Cassar Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3280 New Farm Ct Commerce Township, MI 48390","Property Address L Custom Building Address":"3280 New Farm Ct Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10400","Property Address P":"3280 New Farm Ct","City P":"Commerce Township","State P":"MI","No Zip":"48390-1754","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.74","Parcel Number L Custom":"17-24-229-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"31393 W 13 Mile Rd Suite # 150","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48334-2297","True Owner Contact P Full Name":"Charlie Cassar","True Owner Name L Custom True Owner":"Sam Cassar Company","True Owner Phone P Work":"(248) 8-14477","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Sam Cassar Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3310 New Farm Ct Commerce Township, MI 48390","Property Address L Custom Building Address":"3310 New Farm Ct Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10400","Property Address P":"3310 New Farm Ct","City P":"Commerce Township","State P":"MI","No Zip":"48390-1755","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.70","Parcel Number L Custom":"17-24-229-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"31393 W 13 Mile Rd Suite # 150","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48334-2297","True Owner Contact P Full Name":"Charlie Cassar","True Owner Name L Custom True Owner":"Sam Cassar Company","True Owner Phone P Work":"(248) 8-14477","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Sam Cassar Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25100 Novi Rd Novi, MI 48375","Property Address L Custom Building Address":"25100 Novi Rd Novi, MI 48375","Property Name L Custom Property Name":"Collex Collision Experts","RBA L Custom SF Building":"10166","Property Address P":"25100 Novi Rd","City P":"Novi","State P":"MI","No Zip":"48375-1636","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.31","Parcel Number L Custom":"22-23-152-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"11995 El Camino Real","True Owner City State Zip C Address: Main City":"San Diego, CA 92130-2544","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Realty Income Corporation","True Owner Phone P Work":"(877) 7-46266","Secondary Type L Custom":"Service","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Realty Income Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25800 Novi Rd Novi, MI 48375","Property Address L Custom Building Address":"25800 Novi Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12260","Property Address P":"25800 Novi Rd","City P":"Novi","State P":"MI","No Zip":"48375-1650","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.50","Parcel Number L Custom":"22-23-151-004","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"25125 Trans-X Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48375","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"ACE CUTTING EQUIPMENT & Supply, Inc.","True Owner Phone P Work":"(248) 8-94944","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"ACE CUTTING EQUIPMENT & Supply, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28005 Oakland Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28005 Oakland Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12078","Property Address P":"28005 Oakland Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3342","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.30","Parcel Number L Custom":"22-07-326-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28016 Oakland Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28016 Oakland Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"Bldg D","RBA L Custom SF Building":"16306","Property Address P":"28016 Oakland Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3341","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.07","Parcel Number L Custom":"22-07-326-031","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28026 Oakland Oaks Ct","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Hosco","True Owner Phone P Work":"(248) 8-21750","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Hosco","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28036 Oakland Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28036 Oakland Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11224","Property Address P":"28036 Oakland Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3348","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.01","Parcel Number L Custom":"22-07-326-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46701 Commerce Center Dr","True Owner City State Zip C Address: Main City":"Plymouth, MI 48170-2475","True Owner Contact P Full Name":"Gerald Cox","True Owner Name L Custom True Owner":"Gerald L Cox","True Owner Phone P Work":"(734) 4-79125","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Gerald L Cox","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28046 Oakland Oaks Ct Wixom, MI 48393","Property Address L Custom Building Address":"28046 Oakland Oaks Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"18000","Property Address P":"28046 Oakland Oaks Ct","City P":"Wixom","State P":"MI","No Zip":"48393-3348","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.20","Parcel Number L Custom":"22-07-326-036","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3170 E Oakley Park Commerce Township, MI 48390","Property Address L Custom Building Address":"3170 E Oakley Park Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13500","Property Address P":"3170 E Oakley Park","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.45","Parcel Number L Custom":"17-24-228-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"8101 Richardson Rd Suite # 101","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390","True Owner Contact P Full Name":"Chris Konja","True Owner Name L Custom True Owner":"Askar Brands","True Owner Phone P Work":"(248) 8-34580","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Askar Brands","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3331 Oakley Park Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"3331 Oakley Park Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10276","Property Address P":"3331 Oakley Park Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.30","Parcel Number L Custom":"17-13-400-055","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4104 Pioneer Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Jeanne Kunzman","True Owner Name L Custom True Owner":"Jeanne Kunzman","True Owner Phone P Work":"(248) 8-02700","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jeanne Kunzman","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2550 E Oakley Park Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"2550 E Oakley Park Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"Finished Basements Plus","RBA L Custom SF Building":"15550","Property Address P":"2550 E Oakley Park Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-1663","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.91","Parcel Number L Custom":"17-24-126-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2965 Vero Dr","True Owner City State Zip C Address: Main City":"Highland, MI 48356","True Owner Contact P Full Name":"Stephen Iverson","True Owner Name L Custom True Owner":"Stephen Iverson","True Owner Phone P Work":"(248) 8-97905","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Stephen Iverson","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3250 E Oakley Park Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"3250 E Oakley Park Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11407","Property Address P":"3250 E Oakley Park Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-1648","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.87","Parcel Number L Custom":"17-24-226-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"35441 Edmunds Grv","True Owner City State Zip C Address: Main City":"New Baltimore, MI 48047","True Owner Contact P Full Name":"Thomas Lubinski","True Owner Name L Custom True Owner":"Thomas D Lubinski","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Thomas D Lubinski","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3260 Old Farm Commerce Township, MI 48390","Property Address L Custom Building Address":"3260 Old Farm Commerce Township, MI 48390","Property Name L Custom Property Name":"California Closets","RBA L Custom SF Building":"11100","Property Address P":"3260 Old Farm","City P":"Commerce Township","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.76","Parcel Number L Custom":"17-24-228-021","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4755 Old Plank Rd Milford, MI 48381","Property Address L Custom Building Address":"4755 Old Plank Rd Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13252","Property Address P":"4755 Old Plank Rd","City P":"Milford","State P":"MI","No Zip":"48381-4066","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"15.39","Parcel Number L Custom":"16-36-351-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4827 Old Plank Rd Milford, MI 48381","Property Address L Custom Building Address":"4827 Old Plank Rd Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11600","Property Address P":"4827 Old Plank Rd","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.12","Parcel Number L Custom":"16-36-351-018","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"48733 West Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3544","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Clearlink Wireless","True Owner Phone P Work":"(248) 8-97362","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Clearlink Wireless","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28361 W Park Dr Novi, MI 48377","Property Address L Custom Building Address":"28361 W Park Dr Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13339","Property Address P":"28361 W Park Dr","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.98","Parcel Number L Custom":"22-09-300-047","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30660 W 8 Mile Rd","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48336","True Owner Contact P Full Name":"Thomas Earle","True Owner Name L Custom True Owner":"PISI Industrial LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"PISI Industrial LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46425 Peary Ct Novi, MI 48377","Property Address L Custom Building Address":"46425 Peary Ct Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15798","Property Address P":"46425 Peary Ct","City P":"Novi","State P":"MI","No Zip":"48377-1732","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.59","Parcel Number L Custom":"22-04-378-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46425 Peary Ct","True Owner City State Zip C Address: Main City":"Novi, MI 48377","True Owner Contact P Full Name":"John Gauruder","True Owner Name L Custom True Owner":"Gauruder Investments Llc","True Owner Phone P Work":"(248) 8-76448","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Gauruder Investments Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4335 Pineview Dr Walled Lake, MI 48390","Property Address L Custom Building Address":"4335 Pineview Dr Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13691","Property Address P":"4335 Pineview Dr","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.07","Parcel Number L Custom":"17-13-300-079","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4350 Pineview Dr Commerce Township, MI 48390","Property Address L Custom Building Address":"4350 Pineview Dr Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11500","Property Address P":"4350 Pineview Dr","City P":"Commerce Township","State P":"MI","No Zip":"48390-4113","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.12","Parcel Number L Custom":"17-13-300-077","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4359 Pineview Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"4359 Pineview Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14000","Property Address P":"4359 Pineview Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.53","Parcel Number L Custom":"17-13-300-080","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4359 Pineview Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Sundberg-Ferar, Inc.","True Owner Phone P Work":"(248) 8-03800","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Sundberg-Ferar, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4077 Pioneer Dr Walled Lake, MI 48390","Property Address L Custom Building Address":"4077 Pioneer Dr Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10032","Property Address P":"4077 Pioneer Dr","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.14","Parcel Number L Custom":"17-13-326-034","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7205 Deer Lake Rd","True Owner City State Zip C Address: Main City":"Clarkston, MI 48346","True Owner Contact P Full Name":"Bill Hannon","True Owner Name L Custom True Owner":"Bill Hannon","True Owner Phone P Work":"(248) 8-06447","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Bill Hannon","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4295 Plant Dr Walled Lake, MI 48390","Property Address L Custom Building Address":"4295 Plant Dr Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11016","Property Address P":"4295 Plant Dr","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.25","Parcel Number L Custom":"17-13-400-049","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"20801 Pontiac Trl South Lyon, MI 48178","Property Address L Custom Building Address":"20801 Pontiac Trl South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14480","Property Address P":"20801 Pontiac Trl","City P":"South Lyon","State P":"MI","No Zip":"48178","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.15","Parcel Number L Custom":"21-31-400-075","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"306 Andrus Dr","True Owner City State Zip C Address: Main City":"Murray, KY 42071-2180","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Hutson","True Owner Phone P Work":"(270) 0-67770","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Hutson","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50140 Pontiac Trl Wixom, MI 48393","Property Address L Custom Building Address":"50140 Pontiac Trl Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15846","Property Address P":"50140 Pontiac Trl","City P":"Wixom","State P":"MI","No Zip":"48393-2019","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.35","Parcel Number L Custom":"17-31-452-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"50140 Pontiac Trl","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-2019","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Creative Machine","True Owner Phone P Work":"(248) 8-94230","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Creative Machine","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"51100 Pontiac Trl Wixom, MI 48393","Property Address L Custom Building Address":"51100 Pontiac Trl Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12500","Property Address P":"51100 Pontiac Trl","City P":"Wixom","State P":"MI","No Zip":"48393-2041","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"","Parcel Number L Custom":"17-31-351-016","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"23900 Orchard Rd Suite # 240","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48336","True Owner Contact P Full Name":"James Barnett","True Owner Name L Custom True Owner":"Barnett Industrial Properties LLC","True Owner Phone P Work":"(248) 8-54700","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Barnett Industrial Properties LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"51800 Pontiac Trl Milford, MI 48393","Property Address L Custom Building Address":"51800 Pontiac Trl Milford, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16000","Property Address P":"51800 Pontiac Trl","City P":"Milford","State P":"MI","No Zip":"48393-1932","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.72","Parcel Number L Custom":"16-36-451-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4875 Product Dr","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Troy Clogg","True Owner Name L Custom True Owner":"CTR Landholders, LLC","True Owner Phone P Work":"(248) 8-50123","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"CTR Landholders, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"862 N Pontiac Trl Walled Lake, MI 48390","Property Address L Custom Building Address":"862 N Pontiac Trl Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12453","Property Address P":"862 N Pontiac Trl","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"","Parcel Number L Custom":"17-34-227-009","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"861 N Pontiac Trail","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"James Maher","True Owner Name L Custom True Owner":"Maher Group","True Owner Phone P Work":"(248) 8-66631","Secondary Type L Custom":"Showroom","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Maher Group","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"53162 Pontiac Trail Milford, MI 48381","Property Address L Custom Building Address":"53162 Pontiac Trail Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13600","Property Address P":"53162 Pontiac Trail","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.80","Parcel Number L Custom":"16-35-451-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"56558 Pontiac Trl","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165-9728","True Owner Contact P Full Name":"David Kolb","True Owner Name L Custom True Owner":"Hines Park Ford","True Owner Phone P Work":"(248) 8-76700","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Hines Park Ford","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1270 N Pontiac Trail Walled Lake, MI 48390","Property Address L Custom Building Address":"1270 N Pontiac Trail Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16000","Property Address P":"1270 N Pontiac Trail","City P":"Walled Lake","State P":"MI","No Zip":"48390-3139","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.57","Parcel Number L Custom":"17-26-351-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1270 N Pontiac Trail","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390-3139","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Professional Movers.com","True Owner Phone P Work":"(248) 8-69999","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Professional Movers.com","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4715 Product Dr Wixom, MI 48393","Property Address L Custom Building Address":"4715 Product Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"4715 Product Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.94","Parcel Number L Custom":"16-36-451-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28920 Vintage Dr","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Jim Wisti","True Owner Phone P Work":"(248) 8-77517","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jim Wisti","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4715 Product Dr Wixom, MI 48393","Property Address L Custom Building Address":"4715 Product Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10918","Property Address P":"4715 Product Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.59","Parcel Number L Custom":"16-36-451-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28920 Vintage Dr","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Jim Wisti","True Owner Phone P Work":"(248) 8-77517","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Jim Wisti","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28780 Reilly Rd New Hudson, MI 48165","Property Address L Custom Building Address":"28780 Reilly Rd New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11400","Property Address P":"28780 Reilly Rd","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.22","Parcel Number L Custom":"21-11-251-025","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28780 Reilly Rd","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"JOHN KNAPP","True Owner Phone P Work":"(248) 8-82992","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"JOHN KNAPP","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30029 Research Dr New Hudson, MI 48165","Property Address L Custom Building Address":"30029 Research Dr New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14440","Property Address P":"30029 Research Dr","City P":"New Hudson","State P":"MI","No Zip":"48165-8548","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.05","Parcel Number L Custom":"21-03-401-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30029 Research Dr","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165-8548","True Owner Contact P Full Name":"Aaron Hoffmann","True Owner Name L Custom True Owner":"American Temperature Service Inc","True Owner Phone P Work":"(248) 8-85133","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"American Temperature Service Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30158 Research Dr New Hudson, MI 48165","Property Address L Custom Building Address":"30158 Research Dr New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11142","Property Address P":"30158 Research Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.26","Parcel Number L Custom":"21-03-253-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30163 Research Dr New Hudson, MI 48165","Property Address L Custom Building Address":"30163 Research Dr New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17739","Property Address P":"30163 Research Dr","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.34","Parcel Number L Custom":"21-03-253-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22325 Roethel Dr Novi, MI 48375","Property Address L Custom Building Address":"22325 Roethel Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15957","Property Address P":"22325 Roethel Dr","City P":"Novi","State P":"MI","No Zip":"48375-4710","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.18","Parcel Number L Custom":"22-35-127-017","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46590 Ryan Ct Novi, MI 48377","Property Address L Custom Building Address":"46590 Ryan Ct Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10120","Property Address P":"46590 Ryan Ct","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.80","Parcel Number L Custom":"22-04-376-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"46590 Ryan Ct","True Owner City State Zip C Address: Main City":"Novi, MI 48377","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"SUN-TEC Corporation","True Owner Phone P Work":"(248) 8-93100","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"SUN-TEC Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28200 Samuel Linden Ct Novi, MI 48377","Property Address L Custom Building Address":"28200 Samuel Linden Ct Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11089","Property Address P":"28200 Samuel Linden Ct","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.98","Parcel Number L Custom":"22-09-300-046","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28200 W Samuel Linden Ct Novi, MI 48377","Property Address L Custom Building Address":"28200 W Samuel Linden Ct Novi, MI 48377","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13320","Property Address P":"28200 W Samuel Linden Ct","City P":"Novi","State P":"MI","No Zip":"48377","Zip P":"48377","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.98","Parcel Number L Custom":"22-09-300-047","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30660 W 8 Mile Rd","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48336","True Owner Contact P Full Name":"Thomas Earle","True Owner Name L Custom True Owner":"PISI Industrial LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"PISI Industrial LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25555-25701 Seeley Rd Novi, MI 48375","Property Address L Custom Building Address":"25555-25701 Seeley Rd Novi, MI 48375","Property Name L Custom Property Name":"Novi Mfg (U-Haul)","RBA L Custom SF Building":"10921","Property Address P":"25555-25701 Seeley Rd","City P":"Novi","State P":"MI","No Zip":"48375-2053","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.83","Parcel Number L Custom":"22-24-100-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2721 N Central Ave Suite # 500","True Owner City State Zip C Address: Main City":"Phoenix, AZ 85004-1127","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"U Haul Real Estate Co.","True Owner Phone P Work":"(602) 2-36555","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"U Haul Real Estate Co.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4922 Technical Dr Milford, MI 48381","Property Address L Custom Building Address":"4922 Technical Dr Milford, MI 48381","Property Name L Custom Property Name":"George Landry, Inc.","RBA L Custom SF Building":"10450","Property Address P":"4922 Technical Dr","City P":"Milford","State P":"MI","No Zip":"48381-3950","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"16-35-351-020","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4935 Technical Dr Milford, MI 48381","Property Address L Custom Building Address":"4935 Technical Dr Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11142","Property Address P":"4935 Technical Dr","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.01","Parcel Number L Custom":"16-35-351-022","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"4936 Technical Dr Milford, MI 48381","Property Address L Custom Building Address":"4936 Technical Dr Milford, MI 48381","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15341","Property Address P":"4936 Technical Dr","City P":"Milford","State P":"MI","No Zip":"48381-3950","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.50","Parcel Number L Custom":"16-35-351-019","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"52365 Ten Mile Rd South Lyon, MI 48178","Property Address L Custom Building Address":"52365 Ten Mile Rd South Lyon, MI 48178","Property Name L Custom Property Name":"","RBA L Custom SF Building":"18000","Property Address P":"52365 Ten Mile Rd","City P":"South Lyon","State P":"MI","No Zip":"48178-9757","Zip P":"48178","County Name C Territory":"Oakland","Land Area (AC) L Custom":"","Parcel Number L Custom":"21-25-100-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"32233 Schoolcraft","True Owner City State Zip C Address: Main City":"Livonia, MI 48150","True Owner Contact P Full Name":"Gareth Zebley","True Owner Name L Custom True Owner":"Cambrian Of Lyon, LLC","True Owner Phone P Work":"(517) 7-60298","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Cambrian Of Lyon, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"42780 W Ten Mile Rd Novi, MI 48375","Property Address L Custom Building Address":"42780 W Ten Mile Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15000","Property Address P":"42780 W Ten Mile Rd","City P":"Novi","State P":"MI","No Zip":"48375","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"7.42","Parcel Number L Custom":"22-23-376-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2245 Keith Rd","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48324","True Owner Contact P Full Name":"Mark Garmo","True Owner Name L Custom True Owner":"Mark Garmo","True Owner Phone P Work":"(248) 8-63052","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Mark Garmo","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"42950 W Ten Mile Rd Novi, MI 48375","Property Address L Custom Building Address":"42950 W Ten Mile Rd Novi, MI 48375","Property Name L Custom Property Name":"K & P Sheward","RBA L Custom SF Building":"14400","Property Address P":"42950 W Ten Mile Rd","City P":"Novi","State P":"MI","No Zip":"48375","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.00","Parcel Number L Custom":"22-23-351-050","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1334 Maplelawn Dr","True Owner City State Zip C Address: Main City":"Troy, MI 48084-5341","True Owner Contact P Full Name":"Darren Frankel","True Owner Name L Custom True Owner":"Stuart Frankel Development Co.","True Owner Phone P Work":"(248) 8-92924","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Stuart Frankel Development Co.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1699 Traditional Dr Commerce Township, MI 48390","Property Address L Custom Building Address":"1699 Traditional Dr Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"1699 Traditional Dr","City P":"Commerce Township","State P":"MI","No Zip":"48390-2973","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.88","Parcel Number L Custom":"17-33-226-022","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1699 Traditional Dr","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-2973","True Owner Contact P Full Name":"Robert Savage","True Owner Name L Custom True Owner":"Buildmaster Inc","True Owner Phone P Work":"(248) 8-00033","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Buildmaster Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25005 Trans-X Rd Novi, MI 48375","Property Address L Custom Building Address":"25005 Trans-X Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11218","Property Address P":"25005 Trans-X Rd","City P":"Novi","State P":"MI","No Zip":"48375-2437","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.09","Parcel Number L Custom":"22-23-326-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"25005 Trans-X Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48375-2437","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Monte Costella & Co.","True Owner Phone P Work":"(248) 8-77744","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Monte Costella & Co.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25220 Trans-X Rd Novi, MI 48375","Property Address L Custom Building Address":"25220 Trans-X Rd Novi, MI 48375","Property Name L Custom Property Name":"Trans X","RBA L Custom SF Building":"13250","Property Address P":"25220 Trans-X Rd","City P":"Novi","State P":"MI","No Zip":"48375-2440","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.06","Parcel Number L Custom":"22-23-151-034","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"25220 Trans-X Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48375-2440","True Owner Contact P Full Name":"Alan Wormser","True Owner Name L Custom True Owner":"Barry's Lets Rent It","True Owner Phone P Work":"(248) 8-50480","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Barry's Lets Rent It","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"25285 Trans-X Rd Novi, MI 48375","Property Address L Custom Building Address":"25285 Trans-X Rd Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14925","Property Address P":"25285 Trans-X Rd","City P":"Novi","State P":"MI","No Zip":"48375-2441","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.99","Parcel Number L Custom":"22-23-151-030","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"25285 Trans-X Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48375-2441","True Owner Contact P Full Name":"Terry Sweeney","True Owner Name L Custom True Owner":"Sweeney Concrete Material","True Owner Phone P Work":"(248) 8-41111","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Sweeney Concrete Material","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"57425 Travis Rd New Hudson, MI 48165","Property Address L Custom Building Address":"57425 Travis Rd New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11000","Property Address P":"57425 Travis Rd","City P":"New Hudson","State P":"MI","No Zip":"48165-9753","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"21-09-276-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"7774 Bentgrass","True Owner City State Zip C Address: Main City":"Howell, MI 48843","True Owner Contact P Full Name":"Joe Bonadeo","True Owner Name L Custom True Owner":"DENA Investments, LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"DENA Investments, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"57450 Travis Rd New Hudson, MI 48165","Property Address L Custom Building Address":"57450 Travis Rd New Hudson, MI 48165","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14500","Property Address P":"57450 Travis Rd","City P":"New Hudson","State P":"MI","No Zip":"48165","Zip P":"48165","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"21-09-226-015","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"57450 Travis Rd","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"Douglas Ross","True Owner Name L Custom True Owner":"Networks Enterprises Inc","True Owner Phone P Work":"(248) 8-68590","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Networks Enterprises Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"50706 Varsity Ct Wixom, MI 48393","Property Address L Custom Building Address":"50706 Varsity Ct Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17434","Property Address P":"50706 Varsity Ct","City P":"Wixom","State P":"MI","No Zip":"48393-2072","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.02","Parcel Number L Custom":"22-06-101-050","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"47757 West Rd Suite # C-103","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"GMT Logistics","True Owner Phone P Work":"(248) 8-78889","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"GMT Logistics","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22635 Venture Dr Novi, MI 48375","Property Address L Custom Building Address":"22635 Venture Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11979","Property Address P":"22635 Venture Dr","City P":"Novi","State P":"MI","No Zip":"48375-4182","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.35","Parcel Number L Custom":"22-26-401-030","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"22635 Venture Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48375-4182","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Bollfilter Corporation","True Owner Phone P Work":"(248) 8-38200","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Bollfilter Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22920 Venture Dr Novi, MI 48375","Property Address L Custom Building Address":"22920 Venture Dr Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10318","Property Address P":"22920 Venture Dr","City P":"Novi","State P":"MI","No Zip":"48375-4188","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.40","Parcel Number L Custom":"22-26-401-040","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"500 S Harvey St","True Owner City State Zip C Address: Main City":"Plymouth, MI 48170","True Owner Contact P Full Name":"Bill Lawton","True Owner Name L Custom True Owner":"Community Financial Credit Union","True Owner Phone P Work":"(734) 4-31200","Secondary Type L Custom":"R&D","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Community Financial Credit Union","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"22960 Venture Dr Novi, MI 48375","Property Address L Custom Building Address":"22960 Venture Dr Novi, MI 48375","Property Name L Custom Property Name":"Bldg B","RBA L Custom SF Building":"16880","Property Address P":"22960 Venture Dr","City P":"Novi","State P":"MI","No Zip":"48375-4188","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.86","Parcel Number L Custom":"22-26-401-039","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"38281 Schoolcraft Rd Suite # H","True Owner City State Zip C Address: Main City":"Livonia, MI 48150-5052","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Aidata USA Co Ltd.","True Owner Phone P Work":"(248) 8-00578","Secondary Type L Custom":"Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Aidata USA Co Ltd.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"23000 Venture Dr Novi, MI 48375","Property Address L Custom Building Address":"23000 Venture Dr Novi, MI 48375","Property Name L Custom Property Name":"Bldg A","RBA L Custom SF Building":"16800","Property Address P":"23000 Venture Dr","City P":"Novi","State P":"MI","No Zip":"48375-4186","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.60","Parcel Number L Custom":"22-26-401-034","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"J & L Ventures, LLC","True Owner Phone P Work":"() -","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"J & L Ventures, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41144 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41144 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"Automatic Value","RBA L Custom SF Building":"14650","Property Address P":"41144 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1922","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-24-100-033","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"35980 Industrial Rd Suite # A-4","True Owner City State Zip C Address: Main City":"Livonia, MI 48150-1274","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"ATEQ Corp.","True Owner Phone P Work":"(734) 4-83100","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"ATEQ Corp.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41216 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41216 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16401","Property Address P":"41216 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1925","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-24-100-035","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"25200 W Six Mile Rd","True Owner City State Zip C Address: Main City":"Redford, MI 48240","True Owner Contact P Full Name":"Charles Schweiger","True Owner Name L Custom True Owner":"Drum Handlers Inc","True Owner Phone P Work":"(313) 3-48034","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Drum Handlers Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41249-41255 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41249-41255 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"Moshler","RBA L Custom SF Building":"14400","Property Address P":"41249-41255 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1927","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.30","Parcel Number L Custom":"22-24-100-024","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"18184 Buckingham Ave","True Owner City State Zip C Address: Main City":"Beverly Hills, MI 48025","True Owner Contact P Full Name":"Kirk Nicola","True Owner Name L Custom True Owner":"Paw Print Inn, Inc","True Owner Phone P Work":"() -","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Paw Print Inn, Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41252 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41252 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11376","Property Address P":"41252 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1925","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-24-100-036","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"42300 W 9 Mile Rd","True Owner City State Zip C Address: Main City":"Novi, MI 48375-4103","True Owner Contact P Full Name":"Raffi Kuredjian","True Owner Name L Custom True Owner":"Lathrup Industries, Inc.","True Owner Phone P Work":"(248) 8-91009","Secondary Type L Custom":"Telecom Hotel/Data Hosting","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Lathrup Industries, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41287 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41287 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10168","Property Address P":"41287 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1927","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.13","Parcel Number L Custom":"22-24-100-023","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"38281 Schoolcraft Rd Suite # M","True Owner City State Zip C Address: Main City":"Livonia, MI 48150-5052","True Owner Contact P Full Name":"Mark Prokurat","True Owner Name L Custom True Owner":"Silver-Clip, LLC","True Owner Phone P Work":"(734) 4-46551","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Silver-Clip, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41290-41292 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41290-41292 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14427","Property Address P":"41290-41292 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1925","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-24-100-037","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1146 Chestnut Ln S","True Owner City State Zip C Address: Main City":"South Lyon, MI 48178","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Kevin James VanOrd","True Owner Phone P Work":"(248) 8-69108","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Kevin James VanOrd","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41326 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41326 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"Cummins","RBA L Custom SF Building":"14300","Property Address P":"41326 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1926","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.03","Parcel Number L Custom":"22-24-100-038","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"53435 Grand River Ave","True Owner City State Zip C Address: Main City":"New Hudson, MI 48165","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Raymon Wilkinson","True Owner Phone P Work":"(248) 8-65115","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Raymon Wilkinson","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41365-41367 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41365-41367 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11000","Property Address P":"41365-41367 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1928","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.10","Parcel Number L Custom":"22-24-100-048","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"347 N Main St","True Owner City State Zip C Address: Main City":"Milford, MI 48381-1924","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Hawthorne Management Co.","True Owner Phone P Work":"(248) 8-87777","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Hawthorne Management Co.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"41369 Vincenti Ct Novi, MI 48375","Property Address L Custom Building Address":"41369 Vincenti Ct Novi, MI 48375","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12464","Property Address P":"41369 Vincenti Ct","City P":"Novi","State P":"MI","No Zip":"48375-1928","Zip P":"48375","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.37","Parcel Number L Custom":"22-24-100-047","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"41131-41135 Vincenti Ct","True Owner City State Zip C Address: Main City":"Novi, MI 48375-1924","True Owner Contact P Full Name":"Thomas Rzeznik","True Owner Name L Custom True Owner":"Danlaw","True Owner Phone P Work":"(248) 8-65571","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Danlaw","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2750 W Maple Commerce Township, MI 48390","Property Address L Custom Building Address":"2750 W Maple Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10325","Property Address P":"2750 W Maple","City P":"Commerce Township","State P":"MI","No Zip":"48390-3838","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.48","Parcel Number L Custom":"17-36-100-027","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2750 W Maple","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-3838","True Owner Contact P Full Name":"Bob Keslacy","True Owner Name L Custom True Owner":"B K Imported Auto Care Inc","True Owner Phone P Work":"(248) 8-07715","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"B K Imported Auto Care Inc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2287 E W Maple Commerce Township, MI 48390","Property Address L Custom Building Address":"2287 E W Maple Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15990","Property Address P":"2287 E W Maple","City P":"Commerce Township","State P":"MI","No Zip":"48390-3829","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.27","Parcel Number L Custom":"17-25-376-028","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28975 Orchard Lake Rd","True Owner City State Zip C Address: Main City":"Farmington Hills, MI 48333","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"U.S. Tool & Cutter","True Owner Phone P Work":"(248) 8-37745","Secondary Type L Custom":"Service","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"U.S. Tool & Cutter","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2325 E W Maple Commerce Township, MI 48390","Property Address L Custom Building Address":"2325 E W Maple Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13084","Property Address P":"2325 E W Maple","City P":"Commerce Township","State P":"MI","No Zip":"48390-3831","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.02","Parcel Number L Custom":"17-25-376-021","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2325 Maple Rd","True Owner City State Zip C Address: Main City":"Birmingham, MI 48009","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Kenneth W McQuillan","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Kenneth W McQuillan","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28776 Wall St Wixom, MI 48393","Property Address L Custom Building Address":"28776 Wall St Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11540","Property Address P":"28776 Wall St","City P":"Wixom","State P":"MI","No Zip":"48393-3516","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.86","Parcel Number L Custom":"22-08-177-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"43000 W 9 Mile Rd Suite # 302, 306","True Owner City State Zip C Address: Main City":"Novi, MI 48375-4175","True Owner Contact P Full Name":"Ying Li","True Owner Name L Custom True Owner":"Brightlines","True Owner Phone P Work":"(248) 8-06688","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Brightlines","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28930 Wall St Wixom, MI 48393","Property Address L Custom Building Address":"28930 Wall St Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10056","Property Address P":"28930 Wall St","City P":"Wixom","State P":"MI","No Zip":"48393-3520","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.76","Parcel Number L Custom":"22-08-177-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"10638-10662 Northend Ave","True Owner City State Zip C Address: Main City":"Oak Park, MI 48220-2137","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Robin Aire Heating & Cooling","True Owner Phone P Work":"(248) 8-13300","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Robin Aire Heating & Cooling","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29001 Wall St Wixom, MI 48393","Property Address L Custom Building Address":"29001 Wall St Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14368","Property Address P":"29001 Wall St","City P":"Wixom","State P":"MI","No Zip":"48393-3523","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"9.50","Parcel Number L Custom":"22-08-176-001","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29001 Wall St","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3523","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Walter Toebe Construction Company","True Owner Phone P Work":"(248) 8-97500","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Walter Toebe Construction Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29249 Wall St Wixom, MI 48393","Property Address L Custom Building Address":"29249 Wall St Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16210","Property Address P":"29249 Wall St","City P":"Wixom","State P":"MI","No Zip":"48393-3527","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.31","Parcel Number L Custom":"22-08-126-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"9414 Peer Rd","True Owner City State Zip C Address: Main City":"South Lyon, MI 48179","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Steven P Russell","True Owner Phone P Work":"(248) 8-69703","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Steven P Russell","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29305-29335 Wall St Wixom, MI 48393","Property Address L Custom Building Address":"29305-29335 Wall St Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12114","Property Address P":"29305-29335 Wall St","City P":"Wixom","State P":"MI","No Zip":"48393-3529","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.64","Parcel Number L Custom":"22-08-126-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29305 Wall St","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3529","True Owner Contact P Full Name":"James Holton","True Owner Name L Custom True Owner":"James N & Camille M Holton","True Owner Phone P Work":"(248) 8-98722","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"James N & Camille M Holton","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3170 Walnut Lake Ct Commerce Township, MI 48390","Property Address L Custom Building Address":"3170 Walnut Lake Ct Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10500","Property Address P":"3170 Walnut Lake Ct","City P":"Commerce Township","State P":"MI","No Zip":"48390-1743","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.80","Parcel Number L Custom":"17-25-226-025","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3170 Walnut Lake Rd","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-1743","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Fisher Fuel","True Owner Phone P Work":"(248) 8-44449","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Fisher Fuel","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3181 Walnut Lake Ct Commerce Township, MI 48390","Property Address L Custom Building Address":"3181 Walnut Lake Ct Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14160","Property Address P":"3181 Walnut Lake Ct","City P":"Commerce Township","State P":"MI","No Zip":"48390-1744","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.77","Parcel Number L Custom":"17-25-226-031","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3181 Walnut Lake Ct","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-1744","True Owner Contact P Full Name":"Lena Moore","True Owner Name L Custom True Owner":"Club Pet Inc.","True Owner Phone P Work":"(248) 8-94501","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Club Pet Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3200 Walnut Lake Ct Commerce Township, MI 48390","Property Address L Custom Building Address":"3200 Walnut Lake Ct Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16960","Property Address P":"3200 Walnut Lake Ct","City P":"Commerce Township","State P":"MI","No Zip":"48390-1745","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.86","Parcel Number L Custom":"17-25-226-030","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"Satish Tummala","True Owner Name L Custom True Owner":"Tummala, Satish","True Owner Phone P Work":"(248) 8-86793","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Tummala, Satish","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"46969 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"46969 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16080","Property Address P":"46969 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.44","Parcel Number L Custom":"22-09-102-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1411 West Lake Dr","True Owner City State Zip C Address: Main City":"Novi, MI 48377","True Owner Contact P Full Name":"Michael Condon","True Owner Name L Custom True Owner":"Michael Condon","True Owner Phone P Work":"(248) 8-98830","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Michael Condon","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47850-47874 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"47850-47874 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"Bldg 2","RBA L Custom SF Building":"16370","Property Address P":"47850-47874 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3667","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.44","Parcel Number L Custom":"22-05-476-029","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"S Emerson","True Owner City State Zip C Address: Main City":"Brighton, MI 48116","True Owner Contact P Full Name":"Manesh Shah","True Owner Name L Custom True Owner":"Manesh Shah","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Manesh Shah","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"47974-47998 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"47974-47998 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"Bldg 3","RBA L Custom SF Building":"11356","Property Address P":"47974-47998 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3669","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.18","Parcel Number L Custom":"22-05-476-029","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"12336 W Emerson Dr","True Owner City State Zip C Address: Main City":"Brighton, MI 48116","True Owner Contact P Full Name":"Manesh Shah","True Owner Name L Custom True Owner":"General Chemical Corporation","True Owner Phone P Work":"(248) 8-75600","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"General Chemical Corporation","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48090 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48090 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10421","Property Address P":"48090 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.62","Parcel Number L Custom":"22-05-476-050","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48141-48143 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48141-48143 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16400","Property Address P":"48141-48143 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.00","Parcel Number L Custom":"22-08-200-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1771 Long Lake Shore Dr","True Owner City State Zip C Address: Main City":"Bloomfield Hills, MI 48302","True Owner Contact P Full Name":"Pjeter Stanaj","True Owner Name L Custom True Owner":"Pjeter Stanaj","True Owner Phone P Work":"(248) 8-86660","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Pjeter Stanaj","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48145-48147 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48145-48147 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15378","Property Address P":"48145-48147 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"5.00","Parcel Number L Custom":"22-08-200-006","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1771 Long Lake Shore Dr","True Owner City State Zip C Address: Main City":"Bloomfield Hills, MI 48302","True Owner Contact P Full Name":"Pjeter Stanaj","True Owner Name L Custom True Owner":"Pjeter Stanaj","True Owner Phone P Work":"(248) 8-86660","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Pjeter Stanaj","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48152 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48152 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14350","Property Address P":"48152 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.29","Parcel Number L Custom":"22-05-476-055","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"23179 Telegraph Rd","True Owner City State Zip C Address: Main City":"Southfield, MI 48033-4126","True Owner Contact P Full Name":"Darryl Rogers","True Owner Name L Custom True Owner":"International Development Company","True Owner Phone P Work":"(248) 8-34800","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"International Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48168 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48168 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13263","Property Address P":"48168 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3673","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.93","Parcel Number L Custom":"22-05-476-054","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"23179 Telegraph Rd","True Owner City State Zip C Address: Main City":"Southfield, MI 48033-4126","True Owner Contact P Full Name":"Darryl Rogers","True Owner Name L Custom True Owner":"International Development Company","True Owner Phone P Work":"(248) 8-34800","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"International Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48473 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48473 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"Build to Suit","RBA L Custom SF Building":"11850","Property Address P":"48473 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.74","Parcel Number L Custom":"22-08-100-064","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48553 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"48553 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13080","Property Address P":"48553 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3537","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.43","Parcel Number L Custom":"22-08-100-049","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29350 Wall St","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3528","True Owner Contact P Full Name":"Vivek Bedi","True Owner Name L Custom True Owner":"2V Industries, Inc.","True Owner Phone P Work":"(248) 8-47943","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"2V Industries, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"49175-49201 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"49175-49201 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16700","Property Address P":"49175-49201 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3552","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.91","Parcel Number L Custom":"22-08-100-029","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"49287-49295 West Rd Wixom, MI 48393","Property Address L Custom Building Address":"49287-49295 West Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13000","Property Address P":"49287-49295 West Rd","City P":"Wixom","State P":"MI","No Zip":"48393-3553","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"22-08-100-056","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"49287-49295 West Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3553","True Owner Contact P Full Name":"Wes Umlor","True Owner Name L Custom True Owner":"Diffin-Umlor & Associates","True Owner Phone P Work":"(248) 8-77803","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Diffin-Umlor & Associates","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1625 E West Maple Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1625 E West Maple Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10845","Property Address P":"1625 E West Maple Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390-3772","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.32","Parcel Number L Custom":"17-35-126-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1754 Fairway Dr","True Owner City State Zip C Address: Main City":"Birmingham, MI 48009-1866","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Armando C Decapite","True Owner Phone P Work":"(248) 8-88919","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Armando C Decapite","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2065 E West Maple Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"2065 E West Maple Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"Bldg C","RBA L Custom SF Building":"11000","Property Address P":"2065 E West Maple Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-3858","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.95","Parcel Number L Custom":"17-26-476-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"5373 Pontiac Trl","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48323-1562","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Commerce Place","True Owner Phone P Work":"(248) 8-62628","Secondary Type L Custom":"Light Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Commerce Place","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2075 E West Maple Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"2075 E West Maple Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"Bldg B","RBA L Custom SF Building":"11000","Property Address P":"2075 E West Maple Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-3816","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.95","Parcel Number L Custom":"17-26-476-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"5373 Pontiac Trl","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48323-1562","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Commerce Place","True Owner Phone P Work":"(248) 8-62628","Secondary Type L Custom":"Light Distribution","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Commerce Place","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2085 E West Maple Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"2085 E West Maple Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"Bldg A","RBA L Custom SF Building":"11258","Property Address P":"2085 E West Maple Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-3802","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"6.95","Parcel Number L Custom":"17-26-476-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"5373 Pontiac Trl","True Owner City State Zip C Address: Main City":"West Bloomfield, MI 48323-1562","True Owner Contact P Full Name":"Laurie Cunnington","True Owner Name L Custom True Owner":"Commerce Place","True Owner Phone P Work":"(248) 8-62628","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Commerce Place","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"2420 E West Maple Rd Commerce Township, MI 48390","Property Address L Custom Building Address":"2420 E West Maple Rd Commerce Township, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10800","Property Address P":"2420 E West Maple Rd","City P":"Commerce Township","State P":"MI","No Zip":"48390-3832","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.60","Parcel Number L Custom":"17-36-100-031","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"2280 E W Maple","True Owner City State Zip C Address: Main City":"Commerce Township, MI 48390-3828","True Owner Contact P Full Name":"Gregg Williams","True Owner Name L Custom True Owner":"Williams International","True Owner Phone P Work":"(248) 8-45200","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Williams International","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1200 W West Maple Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1200 W West Maple Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10880","Property Address P":"1200 W West Maple Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.00","Parcel Number L Custom":"17-34-151-011","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1060 W Maple Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390-2935","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Dedoes","True Owner Phone P Work":"(248) 8-47710","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Dedoes","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"1502 W West Maple Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"1502 W West Maple Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"10000","Property Address P":"1502 W West Maple Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.33","Parcel Number L Custom":"17-33-276-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1502 W West Maple Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"Brian Vieaux","True Owner Name L Custom True Owner":"Casey's Of Walled Lake","True Owner Phone P Work":"(248) 8-95200","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Casey's Of Walled Lake","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29632 West Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"29632 West Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"11325","Property Address P":"29632 West Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3561","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.28","Parcel Number L Custom":"22-05-351-014","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"Russell Taylor","True Owner Name L Custom True Owner":"Russell Taylor","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Russell Taylor","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29659 West Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"29659 West Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17864","Property Address P":"29659 West Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3561","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.25","Parcel Number L Custom":"22-05-352-008","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"150 W Jefferson","True Owner City State Zip C Address: Main City":"Detroit, MI 48226","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Commercial Properties III, LLC","True Owner Phone P Work":"(248) 8-06800","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Commercial Properties III, LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29706 West Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"29706 West Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12031","Property Address P":"29706 West Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3562","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.48","Parcel Number L Custom":"22-05-351-012","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"31475 Myrna St","True Owner City State Zip C Address: Main City":"Livonia, MI 48154","True Owner Contact P Full Name":"Darin Dingman","True Owner Name L Custom True Owner":"Darin Dingman","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Darin Dingman","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30700 Wixom Rd Wixom, MI 48393","Property Address L Custom Building Address":"30700 Wixom Rd Wixom, MI 48393","Property Name L Custom Property Name":"Aramark","RBA L Custom SF Building":"16068","Property Address P":"30700 Wixom Rd","City P":"Wixom","State P":"MI","No Zip":"48393-2416","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.13","Parcel Number L Custom":"22-05-106-032","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"49397 Schafer Ave","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"William Clark","True Owner Name L Custom True Owner":"Maple Technology Centre LLC","True Owner Phone P Work":"(248) 8-46140","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Maple Technology Centre LLC","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"28930 S Wixom Rd Wixom, MI 48393","Property Address L Custom Building Address":"28930 S Wixom Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14000","Property Address P":"28930 S Wixom Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"8.50","Parcel Number L Custom":"22-08-100-013","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"4840 Wyoming St","True Owner City State Zip C Address: Main City":"Dearborn, MI 48126-3723","True Owner Contact P Full Name":"Carl Bumgardner","True Owner Name L Custom True Owner":"Royal Truck & Trailer Sales & Service, Inc.","True Owner Phone P Work":"(313) 3-64000","Secondary Type L Custom":"","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Royal Truck & Trailer Sales & Service, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"29020 S Wixom Rd Wixom, MI 48393","Property Address L Custom Building Address":"29020 S Wixom Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17999","Property Address P":"29020 S Wixom Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"3.19","Parcel Number L Custom":"22-08-100-059","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29020 S Wixom Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Jeffery Weinger","True Owner Name L Custom True Owner":"Retail & Commercial Construction, Inc.","True Owner Phone P Work":"(248) 8-49900","Secondary Type L Custom":"Light Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Retail & Commercial Construction, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30178 S Wixom Rd Wixom, MI 48393","Property Address L Custom Building Address":"30178 S Wixom Rd Wixom, MI 48393","Property Name L Custom Property Name":"Rockwell Medical, Inc.","RBA L Custom SF Building":"17240","Property Address P":"30178 S Wixom Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.50","Parcel Number L Custom":"22-05-301-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"23179 Telegraph Rd","True Owner City State Zip C Address: Main City":"Southfield, MI 48033-4126","True Owner Contact P Full Name":"Darryl Rogers","True Owner Name L Custom True Owner":"International Development Company","True Owner Phone P Work":"(248) 8-34800","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"International Development Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30681-30691 S Wixom Rd Wixom, MI 48393","Property Address L Custom Building Address":"30681-30691 S Wixom Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"15229","Property Address P":"30681-30691 S Wixom Rd","City P":"Wixom","State P":"MI","No Zip":"48393-2415","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.63","Parcel Number L Custom":"22-06-200-046","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"30681-30691 S Wixom Rd","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-2415","True Owner Contact P Full Name":"Lake Nelson","True Owner Name L Custom True Owner":"MICHIGAN HARDWOOD DISTRIBUTORS","True Owner Phone P Work":"(248) 8-90790","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"MICHIGAN HARDWOOD DISTRIBUTORS","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"30687 S Wixom Rd Wixom, MI 48393","Property Address L Custom Building Address":"30687 S Wixom Rd Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12000","Property Address P":"30687 S Wixom Rd","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"2.63","Parcel Number L Custom":"22-06-200-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"1561 Chanticlair Cir","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Adella Nelson","True Owner Name L Custom True Owner":"Nelson Talle Properties Llc","True Owner Phone P Work":"(248) 8-46135","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Nelson Talle Properties Llc","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48932 Wixom Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"48932 Wixom Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"16205","Property Address P":"48932 Wixom Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"4.02","Parcel Number L Custom":"22-05-351-010","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"375 Park Ave Suite # 1709","True Owner City State Zip C Address: Main City":"New York, NY 10152-0002","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Clayton, Dubilier & Rice","True Owner Phone P Work":"(212) 2-75200","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Clayton, Dubilier & Rice","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"48985 Wixom Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"48985 Wixom Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"17125","Property Address P":"48985 Wixom Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3557","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.71","Parcel Number L Custom":"22-05-351-007","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"48985 Wixom Tech Dr Suite # 1st","True Owner City State Zip C Address: Main City":"Wixom, MI 48393-3557","True Owner Contact P Full Name":"Randy Stevens","True Owner Name L Custom True Owner":"Lee Stevens Machinery, Inc.","True Owner Phone P Work":"(248) 8-68400","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Lee Stevens Machinery, Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"49113 Wixom Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"49113 Wixom Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14156","Property Address P":"49113 Wixom Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3559","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.01","Parcel Number L Custom":"22-05-351-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"28065 Oakland Oaks Ct","True Owner City State Zip C Address: Main City":"Wixom, MI 48393","True Owner Contact P Full Name":"Yassin Burgol","True Owner Name L Custom True Owner":"Yassin Burgol","True Owner Phone P Work":"(248) 8-81111","Secondary Type L Custom":"Manufacturing","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Yassin Burgol","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"49145 Wixom Tech Dr Wixom, MI 48393","Property Address L Custom Building Address":"49145 Wixom Tech Dr Wixom, MI 48393","Property Name L Custom Property Name":"","RBA L Custom SF Building":"12836","Property Address P":"49145 Wixom Tech Dr","City P":"Wixom","State P":"MI","No Zip":"48393-3569","Zip P":"48393","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.94","Parcel Number L Custom":"22-05-351-002","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"29532 Southfiled Rd Suite # 201","True Owner City State Zip C Address: Main City":"Southfield, MI 48076","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Douglas Capital Partners","True Owner Phone P Work":"(248) 8-57902","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Douglas Capital Partners","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"Yew Dr Milford, MI 48381","Property Address L Custom Building Address":"Yew Dr Milford, MI 48381","Property Name L Custom Property Name":"Lot 2 Proposed Building","RBA L Custom SF Building":"10000","Property Address P":"Yew Dr","City P":"Milford","State P":"MI","No Zip":"48381","Zip P":"48381","County Name C Territory":"Oakland","Land Area (AC) L Custom":"","Parcel Number L Custom":"16-25-100-062","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"","True Owner City State Zip C Address: Main City":"","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"3130 E Oakley Park Rd Walled Lake, MI 48390","Property Address L Custom Building Address":"3130 E Oakley Park Rd Walled Lake, MI 48390","Property Name L Custom Property Name":"","RBA L Custom SF Building":"13000","Property Address P":"3130 E Oakley Park Rd","City P":"Walled Lake","State P":"MI","No Zip":"48390","Zip P":"48390","County Name C Territory":"Oakland","Land Area (AC) L Custom":"0.80","Parcel Number L Custom":"17-24-226-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"3170 Oakley Park Rd","True Owner City State Zip C Address: Main City":"Walled Lake, MI 48390","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Marotta Company","True Owner Phone P Work":"(248) 8-99170","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Marotta Company","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"},{"Description Address L Name":"21043 Old Novi Rd Northville, MI 48167","Property Address L Custom Building Address":"21043 Old Novi Rd Northville, MI 48167","Property Name L Custom Property Name":"","RBA L Custom SF Building":"14755","Property Address P":"21043 Old Novi Rd","City P":"Northville","State P":"MI","No Zip":"48167-2527","Zip P":"48167","County Name C Territory":"Oakland","Land Area (AC) L Custom":"1.43","Parcel Number L Custom":"22-34-477-003","Property Type L Tag":"Industrial","True Owner Address C Address: Main Address 1 Full Adress":"21043 Old Novi Rd","True Owner City State Zip C Address: Main City":"Northville, MI 48167-2527","True Owner Contact P Full Name":"","True Owner Name L Custom True Owner":"Northville Fabricating Inc.","True Owner Phone P Work":"() -","Secondary Type L Custom":"Warehouse","Owner Name L Custom Owners Name":"","Owner Phone L owner Phone":"","Owner Name Name C Name":"Northville Fabricating Inc.","Assignee L Assignee":"EJR","C Tag Industrial":"Industrial","Market Area L Custom":"Central I-96 Corridor","Owner C Tag":"Owner","Status L":"Pending","C Description":"Owner"}] \ No newline at end of file diff --git a/getColumns.js b/getColumns.js new file mode 100644 index 0000000..42d8eae --- /dev/null +++ b/getColumns.js @@ -0,0 +1,14 @@ +const csvToJson = require('csvtojson'); + +function processFiles(){ + let props = []; + csvToJson().fromFile('./data/i96e.csv').then(jsonObj => { + let keys = Object.keys(jsonObj[0]); + keys.forEach(key => { + props.push(`y['${key}'] =`); + }); + console.log(props); + }); +} + +processFiles(); diff --git a/index.js b/index.js new file mode 100644 index 0000000..0243a02 --- /dev/null +++ b/index.js @@ -0,0 +1,80 @@ +const csvToJson = require('csvtojson'); +const { Parser } = require('json2csv'); +const fs = require('fs'); + +function formatPhoneNumber(phoneNumber){ + return `(${phoneNumber.slice(0, 3)}) ${phoneNumber.slice(2, 3)}-${phoneNumber.slice(5)}`; +} + +function processFiles(){ + csvToJson({ + noheader: false, + headers: [ + 'PropertyAddress', + 'PropertyName', + 'RBA', + 'City', + 'State', + 'Zip', + 'CountyName', + 'LandAreaAC', + 'ParcelNumber1', + 'PropertyType', + 'TrueOwnerAddress', + 'TrueOwnerCityStateZip', + 'TrueOwnerContact', + 'TrueOwnerName', + 'TrueOwnerPhone', + 'SecondaryType', + 'OwnerName', + 'OwnerPhone' + ] + }).fromFile('./data/i96.csv').then((jsonObj) => { + // console.log(jsonObj[4]); + let data = jsonObj.map((x) => { + let y = {}; + y['Description Address L Name'] = `${x.PropertyAddress} ${x.City}, ${x.State} ${x.Zip.slice(0, 5)}`; + y['Property Address L Custom Building Address'] = `${x.PropertyAddress} ${x.City}, ${x.State} ${x.Zip.slice(0, 5)}`; + y['Property Name L Custom Property Name'] = x.PropertyName; + y['RBA L Custom SF Building'] = x.RBA; + y['Property Address P'] = x.PropertyAddress; + y['City P'] = x.City; + y['State P'] = x.State; + y['No Zip'] = x.Zip; + y['Zip P'] = x.Zip.slice(0, 5); + y['County Name C Territory'] = x.CountyName; + y['Land Area (AC) L Custom'] = x.LandAreaAC; + y['Parcel Number L Custom'] = x.ParcelNumber1; + y['Property Type L Tag'] = 'Industrial'; + y['True Owner Address C Address: Main Address 1 Full Adress'] = x.TrueOwnerAddress; + y['True Owner City State Zip C Address: Main City'] = x.TrueOwnerCityStateZip; + y['True Owner Contact P Full Name'] = x.TrueOwnerContact; + y['True Owner Name L Custom True Owner'] = x.TrueOwnerName; + y['True Owner Phone P Work'] = formatPhoneNumber(x.TrueOwnerPhone); + y['Secondary Type L Custom'] = x.SecondaryType; + y['Owner Name L Custom Owners Name'] = ''; + y['Owner Phone L owner Phone'] = ''; + y['Owner Name Name C Name'] = x.TrueOwnerName; + y['Assignee L Assignee'] = 'EJR'; + y['C Tag Industrial'] = 'Industrial'; + y['Market Area L Custom'] = 'Central I-96 Corridor'; + y['Owner C Tag'] = 'Owner'; + y['Status L'] = 'Pending'; + y['C Description'] = 'Owner'; + + return y; + }); + fs.writeFileSync('./data/result.txt', JSON.stringify(data)); + const parser = new Parser({ + quote: '', + }); + const csv = parser.parse(data); + // console.log(csv); + fs.writeFileSync('./data/result.csv', csv); + }); + // let file = fs.readFileSync('./data/i96.csv').toString(); + // let jsonData = csvToJson().fromString(file); + // console.log(jsonData); +} + +processFiles(); diff --git a/node_modules/.bin/csvtojson b/node_modules/.bin/csvtojson new file mode 120000 index 0000000..f6c6cfe --- /dev/null +++ b/node_modules/.bin/csvtojson @@ -0,0 +1 @@ +../csvtojson/bin/csvtojson \ No newline at end of file diff --git a/node_modules/.bin/json2csv b/node_modules/.bin/json2csv new file mode 120000 index 0000000..2eed657 --- /dev/null +++ b/node_modules/.bin/json2csv @@ -0,0 +1 @@ +../json2csv/bin/json2csv.js \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..d614d3a --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,88 @@ +{ + "name": "costar-data-ingest", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/csvtojson": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.10.tgz", + "integrity": "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ==", + "dependencies": { + "bluebird": "^3.5.1", + "lodash": "^4.17.3", + "strip-bom": "^2.0.0" + }, + "bin": { + "csvtojson": "bin/csvtojson" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "node_modules/json2csv": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.7.tgz", + "integrity": "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA==", + "dependencies": { + "commander": "^6.1.0", + "jsonparse": "^1.3.1", + "lodash.get": "^4.4.2" + }, + "bin": { + "json2csv": "bin/json2csv.js" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6.13.0" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + } + } +} diff --git a/node_modules/bluebird/LICENSE b/node_modules/bluebird/LICENSE new file mode 100644 index 0000000..b24e635 --- /dev/null +++ b/node_modules/bluebird/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2018 Petka Antonov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/bluebird/README.md b/node_modules/bluebird/README.md new file mode 100644 index 0000000..7c1dd66 --- /dev/null +++ b/node_modules/bluebird/README.md @@ -0,0 +1,57 @@ + + Promises/A+ logo + + + +[![Build Status](https://travis-ci.org/petkaantonov/bluebird.svg?branch=master)](https://travis-ci.org/petkaantonov/bluebird) +[![coverage-98%](https://img.shields.io/badge/coverage-98%25-brightgreen.svg?style=flat)](http://petkaantonov.github.io/bluebird/coverage/debug/index.html) + +**Got a question?** Join us on [stackoverflow](http://stackoverflow.com/questions/tagged/bluebird), the [mailing list](https://groups.google.com/forum/#!forum/bluebird-js) or chat on [IRC](https://webchat.freenode.net/?channels=#promises) + +# Introduction + +Bluebird is a fully featured promise library with focus on innovative features and performance + +See the [**bluebird website**](http://bluebirdjs.com/docs/getting-started.html) for further documentation, references and instructions. See the [**API reference**](http://bluebirdjs.com/docs/api-reference.html) here. + +For bluebird 2.x documentation and files, see the [2.x tree](https://github.com/petkaantonov/bluebird/tree/2.x). + +### Note + +Promises in Node.js 10 are significantly faster than before. Bluebird still includes a lot of features like cancellation, iteration methods and warnings that native promises don't. If you are using Bluebird for performance rather than for those - please consider giving native promises a shot and running the benchmarks yourself. + +# Questions and issues + +The [github issue tracker](https://github.com/petkaantonov/bluebird/issues) is **_only_** for bug reports and feature requests. Anything else, such as questions for help in using the library, should be posted in [StackOverflow](http://stackoverflow.com/questions/tagged/bluebird) under tags `promise` and `bluebird`. + + + +## Thanks + +Thanks to BrowserStack for providing us with a free account which lets us support old browsers like IE8. + +# License + +The MIT License (MIT) + +Copyright (c) 2013-2019 Petka Antonov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/node_modules/bluebird/changelog.md b/node_modules/bluebird/changelog.md new file mode 100644 index 0000000..73b2eb6 --- /dev/null +++ b/node_modules/bluebird/changelog.md @@ -0,0 +1 @@ +[http://bluebirdjs.com/docs/changelog.html](http://bluebirdjs.com/docs/changelog.html) diff --git a/node_modules/bluebird/js/browser/bluebird.core.js b/node_modules/bluebird/js/browser/bluebird.core.js new file mode 100644 index 0000000..24a8bf2 --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.core.js @@ -0,0 +1,3914 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core + * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0) { + _drainQueueStep(queue); + } +} + +function _drainQueueStep(queue) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + } else { + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } +} + +Async.prototype._drainQueues = function () { + _drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + _drainQueue(this._lateQueue); +}; + +Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } +}; + +Async.prototype._reset = function () { + this._isTickUsed = false; +}; + +module.exports = Async; +module.exports.firstLineError = firstLineError; + +},{"./queue":17,"./schedule":18}],2:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { +var calledBind = false; +var rejectThis = function(_, e) { + this._reject(e); +}; + +var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); +}; + +var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } +}; + +var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); +}; + +Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; +}; + +Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } +}; + +Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; +}; + +Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); +}; +}; + +},{}],3:[function(_dereq_,module,exports){ +"use strict"; +var old; +if (typeof Promise !== "undefined") old = Promise; +function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; +} +var bluebird = _dereq_("./promise")(); +bluebird.noConflict = noConflict; +module.exports = bluebird; + +},{"./promise":15}],4:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, PromiseArray, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } +}; + +Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; +}; + +Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; +}; + +Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; +}; + +Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } +}; + +Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); +}; + +Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); +}; + +Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; +}; + +Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); +}; + +Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); +}; + +Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } +}; + +Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); +}; + +Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } +}; + +Promise.prototype._resultCancelled = function() { + this.cancel(); +}; + +}; + +},{"./util":21}],5:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(NEXT_FILTER) { +var util = _dereq_("./util"); +var getKeys = _dereq_("./es5").keys; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; +} + +return catchFilter; +}; + +},{"./es5":10,"./util":21}],6:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +var longStackTraces = false; +var contextStack = []; + +Promise.prototype._promiseCreated = function() {}; +Promise.prototype._pushContext = function() {}; +Promise.prototype._popContext = function() {return null;}; +Promise._peekContext = Promise.prototype._peekContext = function() {}; + +function Context() { + this._trace = new Context.CapturedTrace(peekContext()); +} +Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } +}; + +Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; +}; + +function createContext() { + if (longStackTraces) return new Context(); +} + +function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; +} +Context.CapturedTrace = null; +Context.create = createContext; +Context.deactivateLongStackTraces = function() {}; +Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; +}; +return Context; +}; + +},{}],7:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, Context, + enableAsyncHooks, disableAsyncHooks) { +var async = Promise._async; +var Warning = _dereq_("./errors").Warning; +var util = _dereq_("./util"); +var es5 = _dereq_("./es5"); +var canAttachTrace = util.canAttachTrace; +var unhandledRejectionHandled; +var possiblyUnhandledRejection; +var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; +var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; +var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; +var stackFramePattern = null; +var formatStack = null; +var indentStackFrames = false; +var printWarning; +var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (true || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + +var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + +var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + +var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + +var deferUnhandledRejectionCheck; +(function() { + var promises = []; + + function unhandledRejectionCheck() { + for (var i = 0; i < promises.length; ++i) { + promises[i]._notifyUnhandledRejection(); + } + unhandledRejectionClear(); + } + + function unhandledRejectionClear() { + promises.length = 0; + } + + deferUnhandledRejectionCheck = function(promise) { + promises.push(promise); + setTimeout(unhandledRejectionCheck, 1); + }; + + es5.defineProperty(Promise, "_unhandledRejectionCheck", { + value: unhandledRejectionCheck + }); + es5.defineProperty(Promise, "_unhandledRejectionClear", { + value: unhandledRejectionClear + }); +})(); + +Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); +}; + +Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + deferUnhandledRejectionCheck(this); +}; + +Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); +}; + +Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; +}; + +Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; +}; + +Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } +}; + +Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; +}; + +Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); +}; + +Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; +}; + +Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; +}; + +Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } +}; + +Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; +}; + +Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); +}; + +Promise.onPossiblyUnhandledRejection = function (fn) { + var context = Promise._getContext(); + possiblyUnhandledRejection = util.contextBind(context, fn); +}; + +Promise.onUnhandledRejectionHandled = function (fn) { + var context = Promise._getContext(); + unhandledRejectionHandled = util.contextBind(context, fn); +}; + +var disableLongStackTraces = function() {}; +Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Promise.prototype._dereferenceTrace = Promise_dereferenceTrace; + Context.deactivateLongStackTraces(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace; + Context.activateLongStackTraces(); + } +}; + +Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); +}; + + +var legacyHandlers = { + unhandledrejection: { + before: function() { + var ret = util.global.onunhandledrejection; + util.global.onunhandledrejection = null; + return ret; + }, + after: function(fn) { + util.global.onunhandledrejection = fn; + } + }, + rejectionhandled: { + before: function() { + var ret = util.global.onrejectionhandled; + util.global.onrejectionhandled = null; + return ret; + }, + after: function(fn) { + util.global.onrejectionhandled = fn; + } + } +}; + +var fireDomEvent = (function() { + var dispatch = function(legacy, e) { + if (legacy) { + var fn; + try { + fn = legacy.before(); + return !util.global.dispatchEvent(e); + } finally { + legacy.after(fn); + } + } else { + return !util.global.dispatchEvent(e); + } + }; + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var eventData = { + detail: event, + cancelable: true + }; + var domEvent = new CustomEvent(name, eventData); + es5.defineProperty( + domEvent, "promise", {value: event.promise}); + es5.defineProperty( + domEvent, "reason", {value: event.reason}); + + return dispatch(legacyHandlers[name], domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = new Event(name, { + cancelable: true + }); + domEvent.detail = event; + es5.defineProperty(domEvent, "promise", {value: event.promise}); + es5.defineProperty(domEvent, "reason", {value: event.reason}); + return dispatch(legacyHandlers[name], domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name, false, true, + event); + return dispatch(legacyHandlers[name], domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; +})(); + +var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } +})(); + +function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; +} + +var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject +}; + +var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; +}; + +Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) { + var prev = config.asyncHooks; + var cur = !!opts.asyncHooks; + if (prev !== cur) { + config.asyncHooks = cur; + if (cur) { + enableAsyncHooks(); + } else { + disableAsyncHooks(); + } + } + } + return Promise; +}; + +function defaultFireEvent() { return false; } + +Promise.prototype._fireEvent = defaultFireEvent; +Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } +}; +Promise.prototype._onCancel = function () {}; +Promise.prototype._setOnCancel = function (handler) { ; }; +Promise.prototype._attachCancellationCallback = function(onCancel) { + ; +}; +Promise.prototype._captureStackTrace = function () {}; +Promise.prototype._attachExtraTrace = function () {}; +Promise.prototype._dereferenceTrace = function () {}; +Promise.prototype._clearCancellationData = function() {}; +Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; +}; + +function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } +} + +function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } +} + +function cancellationOnCancel() { + return this._onCancelField; +} + +function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; +} + +function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; +} + +function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} + +function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} +var propagateFromFunction = bindingPropagateFrom; + +function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; +} + +function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); +} + +function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } +} + +function longStackTracesDereferenceTrace() { + this._trace = undefined; +} + +function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } +} + +function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); +} + +function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } +} + +function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); +} + +function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } +} + +function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } +} + +function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; +} + +function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; +} + +function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; +} + +function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } +} + +function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } +} + +function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); +} + +function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; +} + +function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; +} + +var shouldIgnore = function() { return false; }; +var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; +function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } +} + +function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = (firstLineError.stack || "").split("\n"); + var lastStackLines = (lastLineError.stack || "").split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; +} + +function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); +} +util.inherits(CapturedTrace, Error); +Context.CapturedTrace = CapturedTrace; + +CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } +}; + +CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); +}; + +var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + +})([]); + +if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } +} + +var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false, + asyncHooks: false +}; + +if (longStackTraces) Promise.longStackTraces(); + +return { + asyncHooks: function() { + return config.asyncHooks; + }, + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent +}; +}; + +},{"./errors":9,"./es5":10,"./util":21}],8:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function returner() { + return this.value; +} +function thrower() { + throw this.reason; +} + +Promise.prototype["return"] = +Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); +}; + +Promise.prototype["throw"] = +Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); +}; + +Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } +}; + +Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } +}; +}; + +},{}],9:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var Objectfreeze = es5.freeze; +var util = _dereq_("./util"); +var inherits = util.inherits; +var notEnumerableProp = util.notEnumerableProp; + +function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; +} + +var _TypeError, _RangeError; +var Warning = subError("Warning", "warning"); +var CancellationError = subError("CancellationError", "cancellation error"); +var TimeoutError = subError("TimeoutError", "timeout error"); +var AggregateError = subError("AggregateError", "aggregate error"); +try { + _TypeError = TypeError; + _RangeError = RangeError; +} catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); +} + +var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + +for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } +} + +es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true +}); +AggregateError.prototype["isOperational"] = true; +var level = 0; +AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; +}; + +function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + +} +inherits(OperationalError, Error); + +var errorTypes = Error["__BluebirdErrorTypes__"]; +if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); +} + +module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning +}; + +},{"./es5":10,"./util":21}],10:[function(_dereq_,module,exports){ +var isES5 = (function(){ + "use strict"; + return this === undefined; +})(); + +if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; +} else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; +} + +},{}],11:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { +var util = _dereq_("./util"); +var CancellationError = Promise.CancellationError; +var errorObj = util.errorObj; +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); + +function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; +} + +PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; +}; + +function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; +} + +FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); +}; + +function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; +} + +function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); +} +function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; +} +function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret === NEXT_FILTER) { + return ret; + } else if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } +} + +Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); +}; + +Promise.prototype.lastly = +Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); +}; + + +Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); +}; + +Promise.prototype.tapCatch = function (handlerOrPredicate) { + var len = arguments.length; + if(len === 1) { + return this._passThrough(handlerOrPredicate, + 1, + undefined, + finallyHandler); + } else { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return Promise.reject(new TypeError( + "tapCatch statement predicate: " + + "expecting an object but got " + util.classString(item) + )); + } + } + catchInstances.length = j; + var handler = arguments[i]; + return this._passThrough(catchFilter(catchInstances, handler, this), + 1, + undefined, + finallyHandler); + } + +}; + +return PassThroughHandlerContext; +}; + +},{"./catch_filter":5,"./util":21}],12:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) { +var util = _dereq_("./util"); +var canEvaluate = util.canEvaluate; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var reject; + +if (!true) { +if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; +}} + +Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (!true) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var context = Promise._getContext(); + holder.fn = util.contextBind(context, holder.fn); + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var args = [].slice.call(arguments);; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; +}; + +}; + +},{"./util":21}],13:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; + +Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; +}; + +Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; +}; + +Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } +}; +}; + +},{"./util":21}],14:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var maybeWrapAsError = util.maybeWrapAsError; +var errors = _dereq_("./errors"); +var OperationalError = errors.OperationalError; +var es5 = _dereq_("./es5"); + +function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; +} + +var rErrorKey = /^(?:name|message|stack|cause)$/; +function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; +} + +function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var args = [].slice.call(arguments, 1);; + promise._fulfill(args); + } + promise = null; + }; +} + +module.exports = nodebackForPromise; + +},{"./errors":9,"./es5":10,"./util":21}],15:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function() { +var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); +}; +var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); +}; +function Proxyable() {} +var UNDEFINED_BINDING = {}; +var util = _dereq_("./util"); +util.setReflectHandler(reflectHandler); + +var getDomain = function() { + var domain = process.domain; + if (domain === undefined) { + return null; + } + return domain; +}; +var getContextDefault = function() { + return null; +}; +var getContextDomain = function() { + return { + domain: getDomain(), + async: null + }; +}; +var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? + _dereq_("async_hooks").AsyncResource : null; +var getContextAsyncHooks = function() { + return { + domain: getDomain(), + async: new AsyncResource("Bluebird::Promise") + }; +}; +var getContext = util.isNode ? getContextDomain : getContextDefault; +util.notEnumerableProp(Promise, "_getContext", getContext); +var enableAsyncHooks = function() { + getContext = getContextAsyncHooks; + util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); +}; +var disableAsyncHooks = function() { + getContext = getContextDomain; + util.notEnumerableProp(Promise, "_getContext", getContextDomain); +}; + +var es5 = _dereq_("./es5"); +var Async = _dereq_("./async"); +var async = new Async(); +es5.defineProperty(Promise, "_async", {value: async}); +var errors = _dereq_("./errors"); +var TypeError = Promise.TypeError = errors.TypeError; +Promise.RangeError = errors.RangeError; +var CancellationError = Promise.CancellationError = errors.CancellationError; +Promise.TimeoutError = errors.TimeoutError; +Promise.OperationalError = errors.OperationalError; +Promise.RejectionError = errors.OperationalError; +Promise.AggregateError = errors.AggregateError; +var INTERNAL = function(){}; +var APPLY = {}; +var NEXT_FILTER = {}; +var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL); +var PromiseArray = + _dereq_("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); +var Context = _dereq_("./context")(Promise); + /*jshint unused:false*/ +var createContext = Context.create; + +var debug = _dereq_("./debuggability")(Promise, Context, + enableAsyncHooks, disableAsyncHooks); +var CapturedTrace = debug.CapturedTrace; +var PassThroughHandlerContext = + _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); +var nodebackForPromise = _dereq_("./nodeback"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +function check(self, executor) { + if (self == null || self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + +} + +function Promise(executor) { + if (executor !== INTERNAL) { + check(this, executor); + } + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + this._resolveFromExecutor(executor); + this._promiseCreated(); + this._fireEvent("promiseCreated", this); +} + +Promise.prototype.toString = function () { + return "[object Promise]"; +}; + +Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("Catch statement predicate: " + + "expecting an object but got " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + + if (typeof fn !== "function") { + throw new TypeError("The last argument to .catch() " + + "must be a function, got " + util.toString(fn)); + } + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); +}; + +Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); +}; + +Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); +}; + +Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); +}; + +Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); +}; + +Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; +}; + +Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); +}; + +Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); +}; + +Promise.getNewLibraryCopy = module.exports; + +Promise.is = function (val) { + return val instanceof Promise; +}; + +Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.all = function (promises) { + return new PromiseArray(promises).promise(); +}; + +Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; +}; + +Promise.resolve = Promise.fulfilled = Promise.cast; + +Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; +}; + +Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); +}; + +Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData +) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var context = getContext(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: util.contextBind(context, handler), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, + receiver, context); + } + + return promise; +}; + +Promise.prototype._length = function () { + return this._bitField & 65535; +}; + +Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; +}; + +Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; +}; + +Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); +}; + +Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); +}; + +Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); +}; + +Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); +}; + +Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; +}; + +Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; +}; + +Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); +}; + +Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); +}; + +Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; +}; + +Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + var bitField = this._bitField; + this._bitField = bitField | + (((bitField & 536870912) >> 2) ^ + 134217728); +}; + +Promise.prototype._setNoAsyncGuarantee = function() { + this._bitField = (this._bitField | 536870912) & + (~134217728); +}; + +Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; +}; + +Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; +}; + +Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; +}; + +Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; +}; + +Promise.prototype._boundValue = function() {}; + +Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + context +) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = util.contextBind(context, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + util.contextBind(context, reject); + } + } + this._setLength(index + 1); + return index; +}; + +Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); +}; + +Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(maybePromise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } +}; + +Promise.prototype._rejectCallback = +function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); +}; + +Promise.prototype._resolveFromExecutor = function (executor) { + if (executor === INTERNAL) return; + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } +}; + +Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise +) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } +}; + +Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; +}; + +Promise.prototype._followee = function() { + return this._rejectionHandler0; +}; + +Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; +}; + +Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } +}; + +Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } +}; + +Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); +}; + +Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); +}; + +Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; +}; + +Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + this._dereferenceTrace(); + } +}; + +Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } +}; + +Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } +}; + +Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } +}; + +Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); +}; + +Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } +}; + +if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + es5.defineProperty(Promise.prototype, Symbol.toStringTag, { + get: function () { + return "Object"; + } + }); +} + +function deferResolve(v) {this.promise._resolveCallback(v);} +function deferReject(v) {this.promise._rejectCallback(v, false);} + +Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; +}; + +util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + +_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); +_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); +_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug); +_dereq_("./direct_resolve")(Promise); +_dereq_("./synchronous_inspection")(Promise); +_dereq_("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); +Promise.Promise = Promise; +Promise.version = "3.7.2"; + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + +}; + +},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,"async_hooks":undefined}],16:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { +var util = _dereq_("./util"); +var isArray = util.isArray; + +function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + case -6: return new Map(); + } +} + +function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + values.suppressUnhandledRejections(); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); +} +util.inherits(PromiseArray, Proxyable); + +PromiseArray.prototype.length = function () { + return this._length; +}; + +PromiseArray.prototype.promise = function () { + return this._promise; +}; + +PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); +}; + +PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); +}; + +PromiseArray.prototype._isResolved = function () { + return this._values === null; +}; + +PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); +}; + +PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); +}; + +PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); +}; + +PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; +}; + +PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; +}; + +PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } +}; + +PromiseArray.prototype.shouldCopyValues = function () { + return true; +}; + +PromiseArray.prototype.getActualLength = function (len) { + return len; +}; + +return PromiseArray; +}; + +},{"./util":21}],17:[function(_dereq_,module,exports){ +"use strict"; +function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } +} + +function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; +} + +Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; +}; + +Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; +}; + +Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; +}; + +Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; +}; + +Queue.prototype.length = function () { + return this._length; +}; + +Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } +}; + +Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); +}; + +module.exports = Queue; + +},{}],18:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var schedule; +var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var NativePromise = util.getNativePromise(); +if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; +} else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova)) && + ("classList" in document.documentElement)) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); +} else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; +} else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; +} else { + schedule = noAsyncScheduler; +} +module.exports = schedule; + +},{"./util":21}],19:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } +} + +PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; +}; + +var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var reason = PromiseInspection.prototype.error = +PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; +}; + +var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; +}; + +var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; +}; + +var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; +}; + +PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; +}; + +Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; +}; + +Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); +}; + +Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; +}; + +Promise.prototype.isPending = function() { + return isPending.call(this._target()); +}; + +Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); +}; + +Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); +}; + +Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); +}; + +Promise.prototype.value = function() { + return value.call(this._target()); +}; + +Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); +}; + +Promise.prototype._value = function() { + return this._settledValue(); +}; + +Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); +}; + +Promise.PromiseInspection = PromiseInspection; +}; + +},{}],20:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var util = _dereq_("./util"); +var errorObj = util.errorObj; +var isObject = util.isObject; + +function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; +} + +function doGetThen(obj) { + return obj.then; +} + +function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} + +var hasProp = {}.hasOwnProperty; +function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } +} + +function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; +} + +return tryConvertToPromise; +}; + +},{"./util":21}],21:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var canEvaluate = typeof navigator == "undefined"; + +var errorObj = {e: {}}; +var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + +function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} +function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; +} + +var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; +}; + + +function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + +} + +function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; +} + +function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); +} + +function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; +} + +function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } +} + +function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; +} + +function thrower(r) { + throw r; +} + +var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + +})(); + +var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; +function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } +} + +function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var receiver = new FakeConstructor(); + function ic() { + return typeof receiver.foo; + } + ic(); + ic(); + return obj; + eval(obj); +} + +var rident = /^[a-z$_][a-z$_0-9]*$/i; +function isIdentifier(str) { + return rident.test(str); +} + +function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; +} + +function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } +} + +function isError(obj) { + return obj instanceof Error || + (obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"); +} + +function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} +} + +function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); +} + +function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); +} + +var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } +})(); + +function classString(obj) { + return {}.toString.call(obj); +} + +function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } +} + +var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; +}; + +if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; +} + +var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + +var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + +function env(key) { + return hasEnvVariables ? process.env[key] : undefined; +} + +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if (classString(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + +var reflectHandler; +function contextBind(ctx, cb) { + if (ctx === null || + typeof cb !== "function" || + cb === reflectHandler) { + return cb; + } + + if (ctx.domain !== null) { + cb = ctx.domain.bind(cb); + } + + var async = ctx.async; + if (async !== null) { + var old = cb; + cb = function() { + var args = (new Array(2)).concat([].slice.call(arguments));; + args[0] = old; + args[1] = this; + return async.runInAsyncScope.apply(async, args); + }; + } + return cb; +} + +var ret = { + setReflectHandler: function(fn) { + reflectHandler = fn; + }, + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + contextBind: contextBind +}; +ret.isRecentNode = ret.isNode && (function() { + var version; + if (process.versions && process.versions.node) { + version = process.versions.node.split(".").map(Number); + } else if (process.version) { + version = process.version.split(".").map(Number); + } + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); +})(); +ret.nodeSupportsAsyncResource = ret.isNode && (function() { + var supportsAsync = false; + try { + var res = _dereq_("async_hooks").AsyncResource; + supportsAsync = typeof res.prototype.runInAsyncScope === "function"; + } catch (e) { + supportsAsync = false; + } + return supportsAsync; +})(); + +if (ret.isNode) ret.toFastProperties(process); + +try {throw new Error(); } catch (e) {ret.lastLineError = e;} +module.exports = ret; + +},{"./es5":10,"async_hooks":undefined}]},{},[3])(3) +}); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; } \ No newline at end of file diff --git a/node_modules/bluebird/js/browser/bluebird.core.min.js b/node_modules/bluebird/js/browser/bluebird.core.min.js new file mode 100644 index 0000000..836176e --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.core.min.js @@ -0,0 +1,31 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core + * Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function o(a,s){if(!e[a]){if(!t[a]){var c="function"==typeof _dereq_&&_dereq_;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return o(n?n:e)},u,u.exports,r,t,e,n)}return e[a].exports}for(var i="function"==typeof _dereq_&&_dereq_,a=0;a0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var l;try{throw new Error}catch(u){l=u}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=o,r.prototype.invoke=i,r.prototype.settlePromises=a,r.prototype._drainQueues=function(){s(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,s(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=l},{"./queue":17,"./schedule":18}],2:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var o=!1,i=function(t,e){this._reject(e)},a=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(i,i,null,this,t)},s=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(i){o||(o=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(i),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var f={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,a,void 0,u,f),l._then(s,c,void 0,u,f),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],3:[function(t,e,n){"use strict";function r(){try{Promise===i&&(Promise=o)}catch(t){}return i}var o;"undefined"!=typeof Promise&&(o=Promise);var i=t("./promise")();i.noConflict=r,e.exports=i},{"./promise":15}],4:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){var i=t("./util"),a=i.tryCatch,s=i.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!o.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(i.isArray(t))for(var n=0;n=0?i[t]:void 0}var o=!1,i=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,i.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=i.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,i=t.prototype._popContext,a=t._peekContext,s=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=i,t._peekContext=a,t.prototype._peekContext=s,t.prototype._promiseCreated=c,o=!1},o=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],7:[function(t,e,n){"use strict";e.exports=function(e,n,r,o){function i(t,e){return{promise:e}}function a(){return!1}function s(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+V.toString(t));r._attachCancellationCallback(t)})}catch(o){return o}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?V.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function l(){return this._onCancelField}function u(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function d(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function _(){this._trace=new H(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);V.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),V.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,o){if(void 0===t&&null!==e&&Z){if(void 0!==o&&o._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var i="",a="";if(e._trace){for(var s=e._trace.stack.split("\n"),c=E(s),l=c.length-1;l>=0;--l){var u=c[l];if(!M.test(u)){var p=u.match(W);p&&(i="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],l=0;l0&&(a="\n"+s[l-1]);break}}var h="a promise was created in a "+n+"handler "+i+"but was not returned from it, see http://goo.gl/rRqMUw"+a;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(ut.warnings){var o,i=new D(t);if(n)r._attachExtraTrace(i);else if(ut.longStackTraces&&(o=e._peekContext()))o.attachExtraTrace(i);else{var a=F(i);i.stack=a.message+"\n"+a.stack.join("\n")}it("warning",i)||T(i,"",!0)}}function C(t,e){for(var n=0;n=0;--s)if(r[s]===i){a=s;break}for(var s=a;s>=0;--s){var c=r[s];if(e[o]!==c)break;e.pop(),o--}e=r}}function E(t){for(var e=[],n=0;n0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?j(t):[" (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:E(e)}}function T(t,e,n){if("undefined"!=typeof console){var r;if(V.isObject(t)){var o=t.stack;r=e+z(o,t)}else r=e+String(t);"function"==typeof B?B(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function x(t,e,n,r){var o=!1;try{"function"==typeof e&&(o=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(i){I.throwLater(i)}"unhandledRejection"===t?it(t,n,r)||o||T(n,"Unhandled rejection "):it(t,r)}function R(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():V.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(o){}0===e.length&&(e="(empty array)")}return"(<"+S(e)+">, no stack trace)"}function S(t){var e=41;return t.lengtha||0>s||!n||!r||n!==r||a>=s||(st=function(t){if(G.test(t))return!0;var e=O(t);return e&&e.fileName===n&&a<=e.line&&e.line<=s?!0:!1})}}function H(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);lt(this,H),e>32&&this.uncycle()}var N,L,B,U,I=e._async,D=t("./errors").Warning,V=t("./util"),Q=t("./es5"),q=V.canAttachTrace,G=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,M=/\((?:timers\.js):\d+:\d+\)/,W=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,$=null,z=null,X=!1,K=!(0==V.env("BLUEBIRD_DEBUG")||!V.env("BLUEBIRD_DEBUG")&&"development"!==V.env("NODE_ENV")),J=!(0==V.env("BLUEBIRD_WARNINGS")||!K&&!V.env("BLUEBIRD_WARNINGS")),Y=!(0==V.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!V.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=V.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!V.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();L=V.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();N=V.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!ut.longStackTraces&&P()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,o=e.prototype._dereferenceTrace;ut.longStackTraces=!0,tt=function(){if(I.haveItemsQueued()&&!ut.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=o,n.deactivateLongStackTraces(),ut.longStackTraces=!1},e.prototype._captureStackTrace=_,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return ut.longStackTraces&&P()};var et={unhandledrejection:{before:function(){var t=V.global.onunhandledrejection;return V.global.onunhandledrejection=null,t},after:function(t){V.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=V.global.onrejectionhandled;return V.global.onrejectionhandled=null,t},after:function(t){V.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!V.global.dispatchEvent(e);var n;try{return n=t.before(),!V.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},o=new CustomEvent(e,r);return Q.defineProperty(o,"promise",{value:n.promise}),Q.defineProperty(o,"reason",{value:n.reason}),t(et[e],o)}}if("function"==typeof Event){var e=new Event("CustomEvent");return V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,Q.defineProperty(r,"promise",{value:n.promise}),Q.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),V.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return V.isNode?function(){return process.emit.apply(process,arguments)}:V.global?function(t){var e="on"+t.toLowerCase(),n=V.global[e];return n?(n.apply(V.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),ot={promiseCreated:i,promiseFulfilled:i,promiseRejected:i,promiseResolved:i,promiseCancelled:i,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:i},it=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){I.throwLater(n),e=!0}var r=!1;try{r=nt(t,ot[t].apply(null,arguments))}catch(n){I.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;ut.warnings=!!n,Z=ut.warnings,V.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!ut.cancellation){if(I.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=l,e.prototype._setOnCancel=u,e.prototype._attachCancellationCallback=c,e.prototype._execute=s,at=f,ut.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!ut.monitoring?(ut.monitoring=!0,e.prototype._fireEvent=it):!t.monitoring&&ut.monitoring&&(ut.monitoring=!1,e.prototype._fireEvent=a)),"asyncHooks"in t&&V.nodeSupportsAsyncResource){var i=ut.asyncHooks,h=!!t.asyncHooks;i!==h&&(ut.asyncHooks=h,h?r():o())}return e},e.prototype._fireEvent=a,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var at=h,st=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;V.inherits(H,Error),n.CapturedTrace=H,H.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,o=this;void 0!==o;++r)e.push(o),o=o._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var i=e[r].stack;void 0===n[i]&&(n[i]=r)}for(var r=0;t>r;++r){var a=e[r].stack,s=n[a];if(void 0!==s&&s!==r){s>0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>s?(c._parent=e[s+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var l=c._length+1,u=r-2;u>=0;--u)e[u]._length=l,l++;return}}}},H.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],o=this;void 0!==o;)r.push(E(o.stack.split("\n"))),o=o._parent;k(r),w(r),V.notEnumerableProp(t,"stack",C(n,r)),V.notEnumerableProp(t,"__stackCleaned__",!0)}};var lt=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():R(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,$=t,z=e;var n=Error.captureStackTrace;return st=function(t){return G.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return $=/@/,z=e,X=!0,function(t){t.stack=(new Error).stack};var o;try{throw new Error}catch(i){o="stack"in i}return"stack"in r||!o||"number"!=typeof Error.stackTraceLimit?(z=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?R(e):e.toString()},null):($=t,z=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(B=function(t){console.warn(t)},V.isNode&&process.stderr.isTTY?B=function(t,e){var n=e?"":"";console.warn(n+t+"\n")}:V.isNode||"string"!=typeof(new Error).stack||(B=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var ut={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return ut.asyncHooks},longStackTraces:function(){return ut.longStackTraces},warnings:function(){return ut.warnings},cancellation:function(){return ut.cancellation},monitoring:function(){return ut.monitoring},propagateFromFunction:function(){return at},boundValueFunction:function(){return d},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:H,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":9,"./es5":10,"./util":21}],8:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var o=function(){return r};return this.caught(n,o)}}},{}],9:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return u(n,Error),n}function o(t){return this instanceof o?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new o(t)}var i,a,s=t("./es5"),c=s.freeze,l=t("./util"),u=l.inherits,p=l.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),d=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,a=RangeError}catch(v){i=r("TypeError","type error"),a=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function s(){return l.call(this,this.promise._target()._settledValue())}function c(t){return a(this,t)?void 0:(f.e=t,f)}function l(t){var o=this.promise,l=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?l.call(o._boundValue()):l.call(o._boundValue(),t);if(u===r)return u;if(void 0!==u){o._setReturnedNonUndefined();var h=n(u,o);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var d=new p("late cancellation observer");return o._attachExtraTrace(d),f.e=d,f}h.isPending()&&h._attachCancellationCallback(new i(this))}return h._then(s,c,void 0,this,void 0)}}}return o.isRejected()?(a(this),f.e=t,f):(a(this),t)}var u=t("./util"),p=e.CancellationError,f=u.errorObj,h=t("./catch_filter")(r);return o.prototype.isFinallyHandler=function(){return 0===this.type},i.prototype._resultCancelled=function(){a(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new o(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,l,l)},e.prototype.tap=function(t){return this._passThrough(t,1,l)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,l);var r,o=new Array(n-1),i=0;for(r=0;n-1>r;++r){var a=arguments[r];if(!u.isObject(a))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+u.classString(a)));o[i++]=a}o.length=i;var s=arguments[r];return this._passThrough(h(o,s,this),1,void 0,l)},o}},{"./catch_filter":5,"./util":21}],12:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util");a.canEvaluate,a.tryCatch,a.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var o=[].slice.call(arguments);t&&o.pop();var r=new n(o).promise();return void 0!==t?r.spread(t):r}}},{"./util":21}],13:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){var a=t("./util"),s=a.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+a.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var o=s(t).apply(this,arguments),a=r._popContext();return i.checkForgottenReturns(o,a,"Promise.method",r),r._resolveFromSyncValue(o),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return o("expecting a function but got "+a.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){i.deprecated("calling Promise.try with more than 1 argument");var l=arguments[1],u=arguments[2];c=a.isArray(l)?s(t).apply(u,l):s(t).call(u,l)}else c=s(t)();var p=r._popContext();return i.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===a.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":21}],14:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&u.getPrototypeOf(t)===Error.prototype}function o(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=u.keys(t),o=0;o1){var n,r=new Array(e-1),o=0; +for(n=0;e-1>n;++n){var i=arguments[n];if(!f.isObject(i))return u("Catch statement predicate: expecting an object but got "+f.classString(i));r[o++]=i}if(r.length=o,t=arguments[n],"function"!=typeof t)throw new j("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,N(r,t,this))}return this.then(void 0,t)},o.prototype.reflect=function(){return this._then(l,l,void 0,this,void 0)},o.prototype.then=function(t,e){if(A.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},o.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},o.prototype.spread=function(t){return"function"!=typeof t?u("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,x,void 0)},o.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},o.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new P(this).promise()},o.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},o.getNewLibraryCopy=e.exports,o.is=function(t){return t instanceof o},o.fromNode=o.fromCallback=function(t){var e=new o(T);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=U(t)(L(e,n));return r===B&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},o.all=function(t){return new P(t).promise()},o.cast=function(t){var e=S(t);return e instanceof o||(e=new o(T),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},o.resolve=o.fulfilled=o.cast,o.reject=o.rejected=function(t){var e=new o(T);return e._captureStackTrace(),e._rejectCallback(t,!0),e},o.setScheduler=function(t){if("function"!=typeof t)throw new j("expecting a function but got "+f.classString(t));return k.setScheduler(t)},o.prototype._then=function(t,e,n,r,i){var a=void 0!==i,s=a?i:new o(T),c=this._target(),l=c._bitField;a||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&l)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var u=g();if(0!==(50397184&l)){var p,h,d=c._settlePromiseCtx;0!==(33554432&l)?(h=c._rejectionHandler0,p=t):0!==(16777216&l)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(d=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),k.invoke(d,c,{handler:f.contextBind(u,p),promise:s,receiver:r,value:h})}else c._addCallbacks(t,e,s,r,u);return s},o.prototype._length=function(){return 65535&this._bitField},o.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},o.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},o.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},o.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},o.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},o.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},o.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},o.prototype._isFinal=function(){return(4194304&this._bitField)>0},o.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},o.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},o.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},o.prototype._setAsyncGuaranteed=function(){if(!k.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},o.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},o.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},o.prototype._promiseAt=function(t){return this[4*t-4+2]},o.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},o.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},o.prototype._boundValue=function(){},o.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,o=t._receiverAt(0);void 0===o&&(o=p),this._addCallbacks(e,n,r,o,null)},o.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),o=t._promiseAt(e),i=t._receiverAt(e);void 0===i&&(i=p),this._addCallbacks(n,r,o,i,null)},o.prototype._addCallbacks=function(t,e,n,r,o){var i=this._length();if(i>=65531&&(i=0,this._setLength(0)),0===i)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(o,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(o,e));else{var a=4*i-4;this[a+2]=n,this[a+3]=r,"function"==typeof t&&(this[a+0]=f.contextBind(o,t)),"function"==typeof e&&(this[a+1]=f.contextBind(o,e))}return this._setLength(i+1),i},o.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},o.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=S(t,this);if(!(n instanceof o))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var i=r._bitField;if(0===(50397184&i)){var a=this._length();a>0&&r._migrateCallback0(this);for(var s=1;a>s;++s)r._migrateCallbackAt(this,s);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&i))this._fulfill(r._value());else if(0!==(16777216&i))this._reject(r._reason());else{var l=new F("late cancellation observer");r._attachExtraTrace(l),this._reject(l)}}},o.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),o=r===t;if(!o&&!n&&A.warnings()){var i="a promise was rejected with a non-error: "+f.classString(t);this._warn(i,!0)}this._attachExtraTrace(r,e?o:!1),this._reject(t)},o.prototype._resolveFromExecutor=function(t){if(t!==T){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},o.prototype._settlePromiseFromHandler=function(t,e,n,r){var o=r._bitField;if(0===(65536&o)){r._pushContext();var i;e===x?n&&"number"==typeof n.length?i=U(t).apply(this._boundValue(),n):(i=B,i.e=new j("cannot .spread() a non-array: "+f.classString(n))):i=U(t).call(e,n);var a=r._popContext();o=r._bitField,0===(65536&o)&&(i===R?r._reject(n):i===B?r._rejectCallback(i.e,!1):(A.checkForgottenReturns(i,a,"",r,this),r._resolveCallback(i)))}},o.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},o.prototype._followee=function(){return this._rejectionHandler0},o.prototype._setFollowee=function(t){this._rejectionHandler0=t},o.prototype._settlePromise=function(t,e,r,i){var a=t instanceof o,s=this._bitField,c=0!==(134217728&s);0!==(65536&s)?(a&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,U(e).call(r,i)===B&&t._reject(B.e)):e===l?t._fulfill(l.call(r)):r instanceof n?r._promiseCancelled(t):a||t instanceof P?t._cancel():r.cancel()):"function"==typeof e?a?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,i,t)):e.call(r,i,t):r instanceof n?r._isResolved()||(0!==(33554432&s)?r._promiseFulfilled(i,t):r._promiseRejected(i,t)):a&&(c&&t._setAsyncGuaranteed(),0!==(33554432&s)?t._fulfill(i):t._reject(i))},o.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,i=t.value;"function"==typeof e?n instanceof o?this._settlePromiseFromHandler(e,r,i,n):e.call(r,i,n):n instanceof o&&n._reject(i)},o.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},o.prototype._settlePromise0=function(t,e,n){var r=this._promise0,o=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,o,e)},o.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},o.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():k.settlePromises(this),this._dereferenceTrace())}},o.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?k.fatalError(t,f.isNode):void((65535&e)>0?k.settlePromises(this):this._ensurePossibleRejectionHandled())},o.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),o=this._promiseAt(n),i=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(o,r,i,e)}},o.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},o.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&C.defineProperty(o.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),o.defer=o.pending=function(){A.deprecated("Promise.defer","new Promise");var t=new o(T);return{promise:t,resolve:i,reject:a}},f.notEnumerableProp(o,"_makeSelfResolutionError",c),t("./method")(o,T,S,u,A),t("./bind")(o,T,S,A),t("./cancel")(o,P,u,A),t("./direct_resolve")(o),t("./synchronous_inspection")(o),t("./join")(o,P,S,T,k),o.Promise=o,o.version="3.7.2",f.toFastProperties(o),f.toFastProperties(o.prototype),s({a:1}),s({b:2}),s({c:3}),s(1),s(function(){}),s(void 0),s(!1),s(new o(T)),A.setBounds(w.firstLineError,f.lastLineError),o}},{"./async":1,"./bind":2,"./cancel":4,"./catch_filter":5,"./context":6,"./debuggability":7,"./direct_resolve":8,"./errors":9,"./es5":10,"./finally":11,"./join":12,"./method":13,"./nodeback":14,"./promise_array":16,"./synchronous_inspection":19,"./thenables":20,"./util":21,async_hooks:void 0}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,o,i){function a(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function s(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(s,i),s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function l(t,n){var i=r(this._values,this._promise);if(i instanceof e){i=i._target();var s=i._bitField;if(this._values=i,0===(50397184&s))return this._promise._setAsyncGuaranteed(),i._then(l,this._reject,void 0,this,n);if(0===(33554432&s))return 0!==(16777216&s)?this._reject(i._reason()):this._cancel();i=i._value()}if(i=c.asArray(i),null===i){var u=o("expecting an array or an iterable object but got "+c.classString(i)).reason();return void this._promise._rejectCallback(u,!1)}return 0===i.length?void(-5===n?this._resolveEmptyArray():this._resolve(a(n))):void this._iterate(i)},s.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var o=this._promise,i=!1,a=null,s=0;n>s;++s){var c=r(t[s],o);c instanceof e?(c=c._target(),a=c._bitField):a=null,i?null!==a&&c.suppressUnhandledRejections():null!==a?0===(50397184&a)?(c._proxy(this,s),this._values[s]=c):i=0!==(33554432&a)?this._promiseFulfilled(c._value(),s):0!==(16777216&a)?this._promiseRejected(c._reason(),s):this._promiseCancelled(s):i=this._promiseFulfilled(c,s)}i||o._setAsyncGuaranteed()},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},s.prototype._promiseCancelled=function(){return this._cancel(),!0},s.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},s.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;ni;++i)n[i+r]=t[i+e],t[i+e]=void 0}function o(t){this._capacity=t,this._length=0,this._front=0}o.prototype._willBeOverCapacity=function(t){return this._capacityn;++n)o[n]=t[n];return o[n]=e,o}function l(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function u(t,e,n){if(i(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),o=A.test(t+"")&&F.names(t).length>0;if(n||r||o)return!0}return!1}catch(i){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function d(t){return H.test(t)}function _(t,e,n){for(var r=new Array(t),o=0;t>o;++o)r[o]=e+o+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{u(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function C(t){return{}.toString.call(t)}function w(t,e,n){for(var r=F.names(t),o=0;o10||t[0]>0}(),V.nodeSupportsAsyncResource=V.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),V.isNode&&V.toFastProperties(process);try{throw new Error}catch(Q){V.lastLineError=Q}e.exports=V},{"./es5":10,async_hooks:void 0}]},{},[3])(3)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise); \ No newline at end of file diff --git a/node_modules/bluebird/js/browser/bluebird.js b/node_modules/bluebird/js/browser/bluebird.js new file mode 100644 index 0000000..7f0686f --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.js @@ -0,0 +1,5778 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0) { + _drainQueueStep(queue); + } +} + +function _drainQueueStep(queue) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + } else { + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } +} + +Async.prototype._drainQueues = function () { + _drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + _drainQueue(this._lateQueue); +}; + +Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } +}; + +Async.prototype._reset = function () { + this._isTickUsed = false; +}; + +module.exports = Async; +module.exports.firstLineError = firstLineError; + +},{"./queue":26,"./schedule":29}],3:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { +var calledBind = false; +var rejectThis = function(_, e) { + this._reject(e); +}; + +var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); +}; + +var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } +}; + +var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); +}; + +Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; +}; + +Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } +}; + +Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; +}; + +Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); +}; +}; + +},{}],4:[function(_dereq_,module,exports){ +"use strict"; +var old; +if (typeof Promise !== "undefined") old = Promise; +function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; +} +var bluebird = _dereq_("./promise")(); +bluebird.noConflict = noConflict; +module.exports = bluebird; + +},{"./promise":22}],5:[function(_dereq_,module,exports){ +"use strict"; +var cr = Object.create; +if (cr) { + var callerCache = cr(null); + var getterCache = cr(null); + callerCache[" size"] = getterCache[" size"] = 0; +} + +module.exports = function(Promise) { +var util = _dereq_("./util"); +var canEvaluate = util.canEvaluate; +var isIdentifier = util.isIdentifier; + +var getMethodCaller; +var getGetter; +if (!true) { +var makeMethodCaller = function (methodName) { + return new Function("ensureMethod", " \n\ + return function(obj) { \n\ + 'use strict' \n\ + var len = this.length; \n\ + ensureMethod(obj, 'methodName'); \n\ + switch(len) { \n\ + case 1: return obj.methodName(this[0]); \n\ + case 2: return obj.methodName(this[0], this[1]); \n\ + case 3: return obj.methodName(this[0], this[1], this[2]); \n\ + case 0: return obj.methodName(); \n\ + default: \n\ + return obj.methodName.apply(obj, this); \n\ + } \n\ + }; \n\ + ".replace(/methodName/g, methodName))(ensureMethod); +}; + +var makeGetter = function (propertyName) { + return new Function("obj", " \n\ + 'use strict'; \n\ + return obj.propertyName; \n\ + ".replace("propertyName", propertyName)); +}; + +var getCompiled = function(name, compiler, cache) { + var ret = cache[name]; + if (typeof ret !== "function") { + if (!isIdentifier(name)) { + return null; + } + ret = compiler(name); + cache[name] = ret; + cache[" size"]++; + if (cache[" size"] > 512) { + var keys = Object.keys(cache); + for (var i = 0; i < 256; ++i) delete cache[keys[i]]; + cache[" size"] = keys.length - 256; + } + } + return ret; +}; + +getMethodCaller = function(name) { + return getCompiled(name, makeMethodCaller, callerCache); +}; + +getGetter = function(name) { + return getCompiled(name, makeGetter, getterCache); +}; +} + +function ensureMethod(obj, methodName) { + var fn; + if (obj != null) fn = obj[methodName]; + if (typeof fn !== "function") { + var message = "Object " + util.classString(obj) + " has no method '" + + util.toString(methodName) + "'"; + throw new Promise.TypeError(message); + } + return fn; +} + +function caller(obj) { + var methodName = this.pop(); + var fn = ensureMethod(obj, methodName); + return fn.apply(obj, this); +} +Promise.prototype.call = function (methodName) { + var args = [].slice.call(arguments, 1);; + if (!true) { + if (canEvaluate) { + var maybeCaller = getMethodCaller(methodName); + if (maybeCaller !== null) { + return this._then( + maybeCaller, undefined, undefined, args, undefined); + } + } + } + args.push(methodName); + return this._then(caller, undefined, undefined, args, undefined); +}; + +function namedGetter(obj) { + return obj[this]; +} +function indexedGetter(obj) { + var index = +this; + if (index < 0) index = Math.max(0, index + obj.length); + return obj[index]; +} +Promise.prototype.get = function (propertyName) { + var isIndex = (typeof propertyName === "number"); + var getter; + if (!isIndex) { + if (canEvaluate) { + var maybeGetter = getGetter(propertyName); + getter = maybeGetter !== null ? maybeGetter : namedGetter; + } else { + getter = namedGetter; + } + } else { + getter = indexedGetter; + } + return this._then(getter, undefined, undefined, propertyName, undefined); +}; +}; + +},{"./util":36}],6:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, PromiseArray, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } +}; + +Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; +}; + +Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; +}; + +Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; +}; + +Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } +}; + +Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); +}; + +Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); +}; + +Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; +}; + +Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); +}; + +Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); +}; + +Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } +}; + +Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); +}; + +Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } +}; + +Promise.prototype._resultCancelled = function() { + this.cancel(); +}; + +}; + +},{"./util":36}],7:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(NEXT_FILTER) { +var util = _dereq_("./util"); +var getKeys = _dereq_("./es5").keys; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; +} + +return catchFilter; +}; + +},{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +var longStackTraces = false; +var contextStack = []; + +Promise.prototype._promiseCreated = function() {}; +Promise.prototype._pushContext = function() {}; +Promise.prototype._popContext = function() {return null;}; +Promise._peekContext = Promise.prototype._peekContext = function() {}; + +function Context() { + this._trace = new Context.CapturedTrace(peekContext()); +} +Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } +}; + +Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; +}; + +function createContext() { + if (longStackTraces) return new Context(); +} + +function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; +} +Context.CapturedTrace = null; +Context.create = createContext; +Context.deactivateLongStackTraces = function() {}; +Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; +}; +return Context; +}; + +},{}],9:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, Context, + enableAsyncHooks, disableAsyncHooks) { +var async = Promise._async; +var Warning = _dereq_("./errors").Warning; +var util = _dereq_("./util"); +var es5 = _dereq_("./es5"); +var canAttachTrace = util.canAttachTrace; +var unhandledRejectionHandled; +var possiblyUnhandledRejection; +var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; +var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; +var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; +var stackFramePattern = null; +var formatStack = null; +var indentStackFrames = false; +var printWarning; +var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (true || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + +var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + +var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + +var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + +var deferUnhandledRejectionCheck; +(function() { + var promises = []; + + function unhandledRejectionCheck() { + for (var i = 0; i < promises.length; ++i) { + promises[i]._notifyUnhandledRejection(); + } + unhandledRejectionClear(); + } + + function unhandledRejectionClear() { + promises.length = 0; + } + + deferUnhandledRejectionCheck = function(promise) { + promises.push(promise); + setTimeout(unhandledRejectionCheck, 1); + }; + + es5.defineProperty(Promise, "_unhandledRejectionCheck", { + value: unhandledRejectionCheck + }); + es5.defineProperty(Promise, "_unhandledRejectionClear", { + value: unhandledRejectionClear + }); +})(); + +Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); +}; + +Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + deferUnhandledRejectionCheck(this); +}; + +Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); +}; + +Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; +}; + +Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; +}; + +Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } +}; + +Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; +}; + +Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); +}; + +Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; +}; + +Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; +}; + +Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } +}; + +Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; +}; + +Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); +}; + +Promise.onPossiblyUnhandledRejection = function (fn) { + var context = Promise._getContext(); + possiblyUnhandledRejection = util.contextBind(context, fn); +}; + +Promise.onUnhandledRejectionHandled = function (fn) { + var context = Promise._getContext(); + unhandledRejectionHandled = util.contextBind(context, fn); +}; + +var disableLongStackTraces = function() {}; +Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Promise.prototype._dereferenceTrace = Promise_dereferenceTrace; + Context.deactivateLongStackTraces(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace; + Context.activateLongStackTraces(); + } +}; + +Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); +}; + + +var legacyHandlers = { + unhandledrejection: { + before: function() { + var ret = util.global.onunhandledrejection; + util.global.onunhandledrejection = null; + return ret; + }, + after: function(fn) { + util.global.onunhandledrejection = fn; + } + }, + rejectionhandled: { + before: function() { + var ret = util.global.onrejectionhandled; + util.global.onrejectionhandled = null; + return ret; + }, + after: function(fn) { + util.global.onrejectionhandled = fn; + } + } +}; + +var fireDomEvent = (function() { + var dispatch = function(legacy, e) { + if (legacy) { + var fn; + try { + fn = legacy.before(); + return !util.global.dispatchEvent(e); + } finally { + legacy.after(fn); + } + } else { + return !util.global.dispatchEvent(e); + } + }; + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var eventData = { + detail: event, + cancelable: true + }; + var domEvent = new CustomEvent(name, eventData); + es5.defineProperty( + domEvent, "promise", {value: event.promise}); + es5.defineProperty( + domEvent, "reason", {value: event.reason}); + + return dispatch(legacyHandlers[name], domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = new Event(name, { + cancelable: true + }); + domEvent.detail = event; + es5.defineProperty(domEvent, "promise", {value: event.promise}); + es5.defineProperty(domEvent, "reason", {value: event.reason}); + return dispatch(legacyHandlers[name], domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name, false, true, + event); + return dispatch(legacyHandlers[name], domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; +})(); + +var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } +})(); + +function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; +} + +var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject +}; + +var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; +}; + +Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) { + var prev = config.asyncHooks; + var cur = !!opts.asyncHooks; + if (prev !== cur) { + config.asyncHooks = cur; + if (cur) { + enableAsyncHooks(); + } else { + disableAsyncHooks(); + } + } + } + return Promise; +}; + +function defaultFireEvent() { return false; } + +Promise.prototype._fireEvent = defaultFireEvent; +Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } +}; +Promise.prototype._onCancel = function () {}; +Promise.prototype._setOnCancel = function (handler) { ; }; +Promise.prototype._attachCancellationCallback = function(onCancel) { + ; +}; +Promise.prototype._captureStackTrace = function () {}; +Promise.prototype._attachExtraTrace = function () {}; +Promise.prototype._dereferenceTrace = function () {}; +Promise.prototype._clearCancellationData = function() {}; +Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; +}; + +function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } +} + +function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } +} + +function cancellationOnCancel() { + return this._onCancelField; +} + +function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; +} + +function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; +} + +function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} + +function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} +var propagateFromFunction = bindingPropagateFrom; + +function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; +} + +function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); +} + +function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } +} + +function longStackTracesDereferenceTrace() { + this._trace = undefined; +} + +function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } +} + +function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); +} + +function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } +} + +function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); +} + +function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } +} + +function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } +} + +function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; +} + +function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; +} + +function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; +} + +function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } +} + +function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } +} + +function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); +} + +function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; +} + +function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; +} + +var shouldIgnore = function() { return false; }; +var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; +function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } +} + +function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = (firstLineError.stack || "").split("\n"); + var lastStackLines = (lastLineError.stack || "").split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; +} + +function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); +} +util.inherits(CapturedTrace, Error); +Context.CapturedTrace = CapturedTrace; + +CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } +}; + +CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); +}; + +var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + +})([]); + +if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } +} + +var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false, + asyncHooks: false +}; + +if (longStackTraces) Promise.longStackTraces(); + +return { + asyncHooks: function() { + return config.asyncHooks; + }, + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent +}; +}; + +},{"./errors":12,"./es5":13,"./util":36}],10:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function returner() { + return this.value; +} +function thrower() { + throw this.reason; +} + +Promise.prototype["return"] = +Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); +}; + +Promise.prototype["throw"] = +Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); +}; + +Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } +}; + +Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } +}; +}; + +},{}],11:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseReduce = Promise.reduce; +var PromiseAll = Promise.all; + +function promiseAllThis() { + return PromiseAll(this); +} + +function PromiseMapSeries(promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, INTERNAL); +} + +Promise.prototype.each = function (fn) { + return PromiseReduce(this, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, this, undefined); +}; + +Promise.prototype.mapSeries = function (fn) { + return PromiseReduce(this, fn, INTERNAL, INTERNAL); +}; + +Promise.each = function (promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, promises, undefined); +}; + +Promise.mapSeries = PromiseMapSeries; +}; + + +},{}],12:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var Objectfreeze = es5.freeze; +var util = _dereq_("./util"); +var inherits = util.inherits; +var notEnumerableProp = util.notEnumerableProp; + +function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; +} + +var _TypeError, _RangeError; +var Warning = subError("Warning", "warning"); +var CancellationError = subError("CancellationError", "cancellation error"); +var TimeoutError = subError("TimeoutError", "timeout error"); +var AggregateError = subError("AggregateError", "aggregate error"); +try { + _TypeError = TypeError; + _RangeError = RangeError; +} catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); +} + +var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + +for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } +} + +es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true +}); +AggregateError.prototype["isOperational"] = true; +var level = 0; +AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; +}; + +function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + +} +inherits(OperationalError, Error); + +var errorTypes = Error["__BluebirdErrorTypes__"]; +if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); +} + +module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning +}; + +},{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){ +var isES5 = (function(){ + "use strict"; + return this === undefined; +})(); + +if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; +} else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; +} + +},{}],14:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseMap = Promise.map; + +Promise.prototype.filter = function (fn, options) { + return PromiseMap(this, fn, options, INTERNAL); +}; + +Promise.filter = function (promises, fn, options) { + return PromiseMap(promises, fn, options, INTERNAL); +}; +}; + +},{}],15:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { +var util = _dereq_("./util"); +var CancellationError = Promise.CancellationError; +var errorObj = util.errorObj; +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); + +function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; +} + +PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; +}; + +function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; +} + +FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); +}; + +function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; +} + +function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); +} +function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; +} +function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret === NEXT_FILTER) { + return ret; + } else if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } +} + +Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); +}; + +Promise.prototype.lastly = +Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); +}; + + +Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); +}; + +Promise.prototype.tapCatch = function (handlerOrPredicate) { + var len = arguments.length; + if(len === 1) { + return this._passThrough(handlerOrPredicate, + 1, + undefined, + finallyHandler); + } else { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return Promise.reject(new TypeError( + "tapCatch statement predicate: " + + "expecting an object but got " + util.classString(item) + )); + } + } + catchInstances.length = j; + var handler = arguments[i]; + return this._passThrough(catchFilter(catchInstances, handler, this), + 1, + undefined, + finallyHandler); + } + +}; + +return PassThroughHandlerContext; +}; + +},{"./catch_filter":7,"./util":36}],16:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, + apiRejection, + INTERNAL, + tryConvertToPromise, + Proxyable, + debug) { +var errors = _dereq_("./errors"); +var TypeError = errors.TypeError; +var util = _dereq_("./util"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +var yieldHandlers = []; + +function promiseFromYieldHandler(value, yieldHandlers, traceParent) { + for (var i = 0; i < yieldHandlers.length; ++i) { + traceParent._pushContext(); + var result = tryCatch(yieldHandlers[i])(value); + traceParent._popContext(); + if (result === errorObj) { + traceParent._pushContext(); + var ret = Promise.reject(errorObj.e); + traceParent._popContext(); + return ret; + } + var maybePromise = tryConvertToPromise(result, traceParent); + if (maybePromise instanceof Promise) return maybePromise; + } + return null; +} + +function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { + if (debug.cancellation()) { + var internal = new Promise(INTERNAL); + var _finallyPromise = this._finallyPromise = new Promise(INTERNAL); + this._promise = internal.lastly(function() { + return _finallyPromise; + }); + internal._captureStackTrace(); + internal._setOnCancel(this); + } else { + var promise = this._promise = new Promise(INTERNAL); + promise._captureStackTrace(); + } + this._stack = stack; + this._generatorFunction = generatorFunction; + this._receiver = receiver; + this._generator = undefined; + this._yieldHandlers = typeof yieldHandler === "function" + ? [yieldHandler].concat(yieldHandlers) + : yieldHandlers; + this._yieldedPromise = null; + this._cancellationPhase = false; +} +util.inherits(PromiseSpawn, Proxyable); + +PromiseSpawn.prototype._isResolved = function() { + return this._promise === null; +}; + +PromiseSpawn.prototype._cleanup = function() { + this._promise = this._generator = null; + if (debug.cancellation() && this._finallyPromise !== null) { + this._finallyPromise._fulfill(); + this._finallyPromise = null; + } +}; + +PromiseSpawn.prototype._promiseCancelled = function() { + if (this._isResolved()) return; + var implementsReturn = typeof this._generator["return"] !== "undefined"; + + var result; + if (!implementsReturn) { + var reason = new Promise.CancellationError( + "generator .return() sentinel"); + Promise.coroutine.returnSentinel = reason; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + result = tryCatch(this._generator["throw"]).call(this._generator, + reason); + this._promise._popContext(); + } else { + this._promise._pushContext(); + result = tryCatch(this._generator["return"]).call(this._generator, + undefined); + this._promise._popContext(); + } + this._cancellationPhase = true; + this._yieldedPromise = null; + this._continue(result); +}; + +PromiseSpawn.prototype._promiseFulfilled = function(value) { + this._yieldedPromise = null; + this._promise._pushContext(); + var result = tryCatch(this._generator.next).call(this._generator, value); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._promiseRejected = function(reason) { + this._yieldedPromise = null; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + var result = tryCatch(this._generator["throw"]) + .call(this._generator, reason); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._resultCancelled = function() { + if (this._yieldedPromise instanceof Promise) { + var promise = this._yieldedPromise; + this._yieldedPromise = null; + promise.cancel(); + } +}; + +PromiseSpawn.prototype.promise = function () { + return this._promise; +}; + +PromiseSpawn.prototype._run = function () { + this._generator = this._generatorFunction.call(this._receiver); + this._receiver = + this._generatorFunction = undefined; + this._promiseFulfilled(undefined); +}; + +PromiseSpawn.prototype._continue = function (result) { + var promise = this._promise; + if (result === errorObj) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._rejectCallback(result.e, false); + } + } + + var value = result.value; + if (result.done === true) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._resolveCallback(value); + } + } else { + var maybePromise = tryConvertToPromise(value, this._promise); + if (!(maybePromise instanceof Promise)) { + maybePromise = + promiseFromYieldHandler(maybePromise, + this._yieldHandlers, + this._promise); + if (maybePromise === null) { + this._promiseRejected( + new TypeError( + "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) + + "From coroutine:\u000a" + + this._stack.split("\n").slice(1, -7).join("\n") + ) + ); + return; + } + } + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + this._yieldedPromise = maybePromise; + maybePromise._proxy(this, null); + } else if (((bitField & 33554432) !== 0)) { + Promise._async.invoke( + this._promiseFulfilled, this, maybePromise._value() + ); + } else if (((bitField & 16777216) !== 0)) { + Promise._async.invoke( + this._promiseRejected, this, maybePromise._reason() + ); + } else { + this._promiseCancelled(); + } + } +}; + +Promise.coroutine = function (generatorFunction, options) { + if (typeof generatorFunction !== "function") { + throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var yieldHandler = Object(options).yieldHandler; + var PromiseSpawn$ = PromiseSpawn; + var stack = new Error().stack; + return function () { + var generator = generatorFunction.apply(this, arguments); + var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, + stack); + var ret = spawn.promise(); + spawn._generator = generator; + spawn._promiseFulfilled(undefined); + return ret; + }; +}; + +Promise.coroutine.addYieldHandler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + yieldHandlers.push(fn); +}; + +Promise.spawn = function (generatorFunction) { + debug.deprecated("Promise.spawn()", "Promise.coroutine()"); + if (typeof generatorFunction !== "function") { + return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var spawn = new PromiseSpawn(generatorFunction, this); + var ret = spawn.promise(); + spawn._run(Promise.spawn); + return ret; +}; +}; + +},{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) { +var util = _dereq_("./util"); +var canEvaluate = util.canEvaluate; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var reject; + +if (!true) { +if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; +}} + +Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (!true) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var context = Promise._getContext(); + holder.fn = util.contextBind(context, holder.fn); + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var args = [].slice.call(arguments);; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; +}; + +}; + +},{"./util":36}],18:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +function MappingPromiseArray(promises, fn, limit, _filter) { + this.constructor$(promises); + this._promise._captureStackTrace(); + var context = Promise._getContext(); + this._callback = util.contextBind(context, fn); + this._preservedValues = _filter === INTERNAL + ? new Array(this.length()) + : null; + this._limit = limit; + this._inFlight = 0; + this._queue = []; + async.invoke(this._asyncInit, this, undefined); + if (util.isArray(promises)) { + for (var i = 0; i < promises.length; ++i) { + var maybePromise = promises[i]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + } +} +util.inherits(MappingPromiseArray, PromiseArray); + +MappingPromiseArray.prototype._asyncInit = function() { + this._init$(undefined, -2); +}; + +MappingPromiseArray.prototype._init = function () {}; + +MappingPromiseArray.prototype._promiseFulfilled = function (value, index) { + var values = this._values; + var length = this.length(); + var preservedValues = this._preservedValues; + var limit = this._limit; + + if (index < 0) { + index = (index * -1) - 1; + values[index] = value; + if (limit >= 1) { + this._inFlight--; + this._drainQueue(); + if (this._isResolved()) return true; + } + } else { + if (limit >= 1 && this._inFlight >= limit) { + values[index] = value; + this._queue.push(index); + return false; + } + if (preservedValues !== null) preservedValues[index] = value; + + var promise = this._promise; + var callback = this._callback; + var receiver = promise._boundValue(); + promise._pushContext(); + var ret = tryCatch(callback).call(receiver, value, index, length); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + preservedValues !== null ? "Promise.filter" : "Promise.map", + promise + ); + if (ret === errorObj) { + this._reject(ret.e); + return true; + } + + var maybePromise = tryConvertToPromise(ret, this._promise); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + if (limit >= 1) this._inFlight++; + values[index] = maybePromise; + maybePromise._proxy(this, (index + 1) * -1); + return false; + } else if (((bitField & 33554432) !== 0)) { + ret = maybePromise._value(); + } else if (((bitField & 16777216) !== 0)) { + this._reject(maybePromise._reason()); + return true; + } else { + this._cancel(); + return true; + } + } + values[index] = ret; + } + var totalResolved = ++this._totalResolved; + if (totalResolved >= length) { + if (preservedValues !== null) { + this._filter(values, preservedValues); + } else { + this._resolve(values); + } + return true; + } + return false; +}; + +MappingPromiseArray.prototype._drainQueue = function () { + var queue = this._queue; + var limit = this._limit; + var values = this._values; + while (queue.length > 0 && this._inFlight < limit) { + if (this._isResolved()) return; + var index = queue.pop(); + this._promiseFulfilled(values[index], index); + } +}; + +MappingPromiseArray.prototype._filter = function (booleans, values) { + var len = values.length; + var ret = new Array(len); + var j = 0; + for (var i = 0; i < len; ++i) { + if (booleans[i]) ret[j++] = values[i]; + } + ret.length = j; + this._resolve(ret); +}; + +MappingPromiseArray.prototype.preservedValues = function () { + return this._preservedValues; +}; + +function map(promises, fn, options, _filter) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + + var limit = 0; + if (options !== undefined) { + if (typeof options === "object" && options !== null) { + if (typeof options.concurrency !== "number") { + return Promise.reject( + new TypeError("'concurrency' must be a number but it is " + + util.classString(options.concurrency))); + } + limit = options.concurrency; + } else { + return Promise.reject(new TypeError( + "options argument must be an object but it is " + + util.classString(options))); + } + } + limit = typeof limit === "number" && + isFinite(limit) && limit >= 1 ? limit : 0; + return new MappingPromiseArray(promises, fn, limit, _filter).promise(); +} + +Promise.prototype.map = function (fn, options) { + return map(this, fn, options, null); +}; + +Promise.map = function (promises, fn, options, _filter) { + return map(promises, fn, options, _filter); +}; + + +}; + +},{"./util":36}],19:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; + +Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; +}; + +Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; +}; + +Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } +}; +}; + +},{"./util":36}],20:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var maybeWrapAsError = util.maybeWrapAsError; +var errors = _dereq_("./errors"); +var OperationalError = errors.OperationalError; +var es5 = _dereq_("./es5"); + +function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; +} + +var rErrorKey = /^(?:name|message|stack|cause)$/; +function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; +} + +function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var args = [].slice.call(arguments, 1);; + promise._fulfill(args); + } + promise = null; + }; +} + +module.exports = nodebackForPromise; + +},{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +var util = _dereq_("./util"); +var async = Promise._async; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function spreadAdapter(val, nodeback) { + var promise = this; + if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); + var ret = + tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +function successAdapter(val, nodeback) { + var promise = this; + var receiver = promise._boundValue(); + var ret = val === undefined + ? tryCatch(nodeback).call(receiver, null) + : tryCatch(nodeback).call(receiver, null, val); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} +function errorAdapter(reason, nodeback) { + var promise = this; + if (!reason) { + var newReason = new Error(reason + ""); + newReason.cause = reason; + reason = newReason; + } + var ret = tryCatch(nodeback).call(promise._boundValue(), reason); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, + options) { + if (typeof nodeback == "function") { + var adapter = successAdapter; + if (options !== undefined && Object(options).spread) { + adapter = spreadAdapter; + } + this._then( + adapter, + errorAdapter, + undefined, + this, + nodeback + ); + } + return this; +}; +}; + +},{"./util":36}],22:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function() { +var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); +}; +var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); +}; +function Proxyable() {} +var UNDEFINED_BINDING = {}; +var util = _dereq_("./util"); +util.setReflectHandler(reflectHandler); + +var getDomain = function() { + var domain = process.domain; + if (domain === undefined) { + return null; + } + return domain; +}; +var getContextDefault = function() { + return null; +}; +var getContextDomain = function() { + return { + domain: getDomain(), + async: null + }; +}; +var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? + _dereq_("async_hooks").AsyncResource : null; +var getContextAsyncHooks = function() { + return { + domain: getDomain(), + async: new AsyncResource("Bluebird::Promise") + }; +}; +var getContext = util.isNode ? getContextDomain : getContextDefault; +util.notEnumerableProp(Promise, "_getContext", getContext); +var enableAsyncHooks = function() { + getContext = getContextAsyncHooks; + util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); +}; +var disableAsyncHooks = function() { + getContext = getContextDomain; + util.notEnumerableProp(Promise, "_getContext", getContextDomain); +}; + +var es5 = _dereq_("./es5"); +var Async = _dereq_("./async"); +var async = new Async(); +es5.defineProperty(Promise, "_async", {value: async}); +var errors = _dereq_("./errors"); +var TypeError = Promise.TypeError = errors.TypeError; +Promise.RangeError = errors.RangeError; +var CancellationError = Promise.CancellationError = errors.CancellationError; +Promise.TimeoutError = errors.TimeoutError; +Promise.OperationalError = errors.OperationalError; +Promise.RejectionError = errors.OperationalError; +Promise.AggregateError = errors.AggregateError; +var INTERNAL = function(){}; +var APPLY = {}; +var NEXT_FILTER = {}; +var tryConvertToPromise = _dereq_("./thenables")(Promise, INTERNAL); +var PromiseArray = + _dereq_("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); +var Context = _dereq_("./context")(Promise); + /*jshint unused:false*/ +var createContext = Context.create; + +var debug = _dereq_("./debuggability")(Promise, Context, + enableAsyncHooks, disableAsyncHooks); +var CapturedTrace = debug.CapturedTrace; +var PassThroughHandlerContext = + _dereq_("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); +var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER); +var nodebackForPromise = _dereq_("./nodeback"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +function check(self, executor) { + if (self == null || self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + +} + +function Promise(executor) { + if (executor !== INTERNAL) { + check(this, executor); + } + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + this._resolveFromExecutor(executor); + this._promiseCreated(); + this._fireEvent("promiseCreated", this); +} + +Promise.prototype.toString = function () { + return "[object Promise]"; +}; + +Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("Catch statement predicate: " + + "expecting an object but got " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + + if (typeof fn !== "function") { + throw new TypeError("The last argument to .catch() " + + "must be a function, got " + util.toString(fn)); + } + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); +}; + +Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); +}; + +Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); +}; + +Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); +}; + +Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); +}; + +Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; +}; + +Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); +}; + +Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); +}; + +Promise.getNewLibraryCopy = module.exports; + +Promise.is = function (val) { + return val instanceof Promise; +}; + +Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.all = function (promises) { + return new PromiseArray(promises).promise(); +}; + +Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; +}; + +Promise.resolve = Promise.fulfilled = Promise.cast; + +Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; +}; + +Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); +}; + +Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData +) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var context = getContext(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: util.contextBind(context, handler), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, + receiver, context); + } + + return promise; +}; + +Promise.prototype._length = function () { + return this._bitField & 65535; +}; + +Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; +}; + +Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; +}; + +Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); +}; + +Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); +}; + +Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); +}; + +Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); +}; + +Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; +}; + +Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; +}; + +Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); +}; + +Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); +}; + +Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; +}; + +Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + var bitField = this._bitField; + this._bitField = bitField | + (((bitField & 536870912) >> 2) ^ + 134217728); +}; + +Promise.prototype._setNoAsyncGuarantee = function() { + this._bitField = (this._bitField | 536870912) & + (~134217728); +}; + +Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; +}; + +Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; +}; + +Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; +}; + +Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; +}; + +Promise.prototype._boundValue = function() {}; + +Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + context +) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = util.contextBind(context, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + util.contextBind(context, reject); + } + } + this._setLength(index + 1); + return index; +}; + +Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); +}; + +Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(maybePromise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } +}; + +Promise.prototype._rejectCallback = +function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); +}; + +Promise.prototype._resolveFromExecutor = function (executor) { + if (executor === INTERNAL) return; + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } +}; + +Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise +) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } +}; + +Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; +}; + +Promise.prototype._followee = function() { + return this._rejectionHandler0; +}; + +Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; +}; + +Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } +}; + +Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } +}; + +Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); +}; + +Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); +}; + +Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; +}; + +Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + this._dereferenceTrace(); + } +}; + +Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } +}; + +Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } +}; + +Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } +}; + +Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); +}; + +Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } +}; + +if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + es5.defineProperty(Promise.prototype, Symbol.toStringTag, { + get: function () { + return "Object"; + } + }); +} + +function deferResolve(v) {this.promise._resolveCallback(v);} +function deferReject(v) {this.promise._rejectCallback(v, false);} + +Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; +}; + +util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + +_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); +_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); +_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug); +_dereq_("./direct_resolve")(Promise); +_dereq_("./synchronous_inspection")(Promise); +_dereq_("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); +Promise.Promise = Promise; +Promise.version = "3.7.2"; +_dereq_('./call_get.js')(Promise); +_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); +_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +_dereq_('./nodeify.js')(Promise); +_dereq_('./promisify.js')(Promise, INTERNAL); +_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); +_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); +_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +_dereq_('./settle.js')(Promise, PromiseArray, debug); +_dereq_('./some.js')(Promise, PromiseArray, apiRejection); +_dereq_('./timers.js')(Promise, INTERNAL, debug); +_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); +_dereq_('./any.js')(Promise); +_dereq_('./each.js')(Promise, INTERNAL); +_dereq_('./filter.js')(Promise, INTERNAL); + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + +}; + +},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,"async_hooks":undefined}],23:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { +var util = _dereq_("./util"); +var isArray = util.isArray; + +function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + case -6: return new Map(); + } +} + +function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + values.suppressUnhandledRejections(); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); +} +util.inherits(PromiseArray, Proxyable); + +PromiseArray.prototype.length = function () { + return this._length; +}; + +PromiseArray.prototype.promise = function () { + return this._promise; +}; + +PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); +}; + +PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); +}; + +PromiseArray.prototype._isResolved = function () { + return this._values === null; +}; + +PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); +}; + +PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); +}; + +PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); +}; + +PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; +}; + +PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; +}; + +PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } +}; + +PromiseArray.prototype.shouldCopyValues = function () { + return true; +}; + +PromiseArray.prototype.getActualLength = function (len) { + return len; +}; + +return PromiseArray; +}; + +},{"./util":36}],24:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var THIS = {}; +var util = _dereq_("./util"); +var nodebackForPromise = _dereq_("./nodeback"); +var withAppended = util.withAppended; +var maybeWrapAsError = util.maybeWrapAsError; +var canEvaluate = util.canEvaluate; +var TypeError = _dereq_("./errors").TypeError; +var defaultSuffix = "Async"; +var defaultPromisified = {__isPromisified__: true}; +var noCopyProps = [ + "arity", "length", + "name", + "arguments", + "caller", + "callee", + "prototype", + "__isPromisified__" +]; +var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$"); + +var defaultFilter = function(name) { + return util.isIdentifier(name) && + name.charAt(0) !== "_" && + name !== "constructor"; +}; + +function propsFilter(key) { + return !noCopyPropsPattern.test(key); +} + +function isPromisified(fn) { + try { + return fn.__isPromisified__ === true; + } + catch (e) { + return false; + } +} + +function hasPromisified(obj, key, suffix) { + var val = util.getDataPropertyOrDefault(obj, key + suffix, + defaultPromisified); + return val ? isPromisified(val) : false; +} +function checkValid(ret, suffix, suffixRegexp) { + for (var i = 0; i < ret.length; i += 2) { + var key = ret[i]; + if (suffixRegexp.test(key)) { + var keyWithoutAsyncSuffix = key.replace(suffixRegexp, ""); + for (var j = 0; j < ret.length; j += 2) { + if (ret[j] === keyWithoutAsyncSuffix) { + throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a" + .replace("%s", suffix)); + } + } + } + } +} + +function promisifiableMethods(obj, suffix, suffixRegexp, filter) { + var keys = util.inheritedDataKeys(obj); + var ret = []; + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var value = obj[key]; + var passesDefaultFilter = filter === defaultFilter + ? true : defaultFilter(key, value, obj); + if (typeof value === "function" && + !isPromisified(value) && + !hasPromisified(obj, key, suffix) && + filter(key, value, obj, passesDefaultFilter)) { + ret.push(key, value); + } + } + checkValid(ret, suffix, suffixRegexp); + return ret; +} + +var escapeIdentRegex = function(str) { + return str.replace(/([$])/, "\\$"); +}; + +var makeNodePromisifiedEval; +if (!true) { +var switchCaseArgumentOrder = function(likelyArgumentCount) { + var ret = [likelyArgumentCount]; + var min = Math.max(0, likelyArgumentCount - 1 - 3); + for(var i = likelyArgumentCount - 1; i >= min; --i) { + ret.push(i); + } + for(var i = likelyArgumentCount + 1; i <= 3; ++i) { + ret.push(i); + } + return ret; +}; + +var argumentSequence = function(argumentCount) { + return util.filledRange(argumentCount, "_arg", ""); +}; + +var parameterDeclaration = function(parameterCount) { + return util.filledRange( + Math.max(parameterCount, 3), "_arg", ""); +}; + +var parameterCount = function(fn) { + if (typeof fn.length === "number") { + return Math.max(Math.min(fn.length, 1023 + 1), 0); + } + return 0; +}; + +makeNodePromisifiedEval = +function(callback, receiver, originalName, fn, _, multiArgs) { + var newParameterCount = Math.max(0, parameterCount(fn) - 1); + var argumentOrder = switchCaseArgumentOrder(newParameterCount); + var shouldProxyThis = typeof callback === "string" || receiver === THIS; + + function generateCallForArgumentCount(count) { + var args = argumentSequence(count).join(", "); + var comma = count > 0 ? ", " : ""; + var ret; + if (shouldProxyThis) { + ret = "ret = callback.call(this, {{args}}, nodeback); break;\n"; + } else { + ret = receiver === undefined + ? "ret = callback({{args}}, nodeback); break;\n" + : "ret = callback.call(receiver, {{args}}, nodeback); break;\n"; + } + return ret.replace("{{args}}", args).replace(", ", comma); + } + + function generateArgumentSwitchCase() { + var ret = ""; + for (var i = 0; i < argumentOrder.length; ++i) { + ret += "case " + argumentOrder[i] +":" + + generateCallForArgumentCount(argumentOrder[i]); + } + + ret += " \n\ + default: \n\ + var args = new Array(len + 1); \n\ + var i = 0; \n\ + for (var i = 0; i < len; ++i) { \n\ + args[i] = arguments[i]; \n\ + } \n\ + args[i] = nodeback; \n\ + [CodeForCall] \n\ + break; \n\ + ".replace("[CodeForCall]", (shouldProxyThis + ? "ret = callback.apply(this, args);\n" + : "ret = callback.apply(receiver, args);\n")); + return ret; + } + + var getFunctionCode = typeof callback === "string" + ? ("this != null ? this['"+callback+"'] : fn") + : "fn"; + var body = "'use strict'; \n\ + var ret = function (Parameters) { \n\ + 'use strict'; \n\ + var len = arguments.length; \n\ + var promise = new Promise(INTERNAL); \n\ + promise._captureStackTrace(); \n\ + var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\ + var ret; \n\ + var callback = tryCatch([GetFunctionCode]); \n\ + switch(len) { \n\ + [CodeForSwitchCase] \n\ + } \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\ + } \n\ + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\ + return promise; \n\ + }; \n\ + notEnumerableProp(ret, '__isPromisified__', true); \n\ + return ret; \n\ + ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase()) + .replace("[GetFunctionCode]", getFunctionCode); + body = body.replace("Parameters", parameterDeclaration(newParameterCount)); + return new Function("Promise", + "fn", + "receiver", + "withAppended", + "maybeWrapAsError", + "nodebackForPromise", + "tryCatch", + "errorObj", + "notEnumerableProp", + "INTERNAL", + body)( + Promise, + fn, + receiver, + withAppended, + maybeWrapAsError, + nodebackForPromise, + util.tryCatch, + util.errorObj, + util.notEnumerableProp, + INTERNAL); +}; +} + +function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) { + var defaultThis = (function() {return this;})(); + var method = callback; + if (typeof method === "string") { + callback = fn; + } + function promisified() { + var _receiver = receiver; + if (receiver === THIS) _receiver = this; + var promise = new Promise(INTERNAL); + promise._captureStackTrace(); + var cb = typeof method === "string" && this !== defaultThis + ? this[method] : callback; + var fn = nodebackForPromise(promise, multiArgs); + try { + cb.apply(_receiver, withAppended(arguments, fn)); + } catch(e) { + promise._rejectCallback(maybeWrapAsError(e), true, true); + } + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); + return promise; + } + util.notEnumerableProp(promisified, "__isPromisified__", true); + return promisified; +} + +var makeNodePromisified = canEvaluate + ? makeNodePromisifiedEval + : makeNodePromisifiedClosure; + +function promisifyAll(obj, suffix, filter, promisifier, multiArgs) { + var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$"); + var methods = + promisifiableMethods(obj, suffix, suffixRegexp, filter); + + for (var i = 0, len = methods.length; i < len; i+= 2) { + var key = methods[i]; + var fn = methods[i+1]; + var promisifiedKey = key + suffix; + if (promisifier === makeNodePromisified) { + obj[promisifiedKey] = + makeNodePromisified(key, THIS, key, fn, suffix, multiArgs); + } else { + var promisified = promisifier(fn, function() { + return makeNodePromisified(key, THIS, key, + fn, suffix, multiArgs); + }); + util.notEnumerableProp(promisified, "__isPromisified__", true); + obj[promisifiedKey] = promisified; + } + } + util.toFastProperties(obj); + return obj; +} + +function promisify(callback, receiver, multiArgs) { + return makeNodePromisified(callback, receiver, undefined, + callback, null, multiArgs); +} + +Promise.promisify = function (fn, options) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + if (isPromisified(fn)) { + return fn; + } + options = Object(options); + var receiver = options.context === undefined ? THIS : options.context; + var multiArgs = !!options.multiArgs; + var ret = promisify(fn, receiver, multiArgs); + util.copyDescriptors(fn, ret, propsFilter); + return ret; +}; + +Promise.promisifyAll = function (target, options) { + if (typeof target !== "function" && typeof target !== "object") { + throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + options = Object(options); + var multiArgs = !!options.multiArgs; + var suffix = options.suffix; + if (typeof suffix !== "string") suffix = defaultSuffix; + var filter = options.filter; + if (typeof filter !== "function") filter = defaultFilter; + var promisifier = options.promisifier; + if (typeof promisifier !== "function") promisifier = makeNodePromisified; + + if (!util.isIdentifier(suffix)) { + throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + + var keys = util.inheritedDataKeys(target); + for (var i = 0; i < keys.length; ++i) { + var value = target[keys[i]]; + if (keys[i] !== "constructor" && + util.isClass(value)) { + promisifyAll(value.prototype, suffix, filter, promisifier, + multiArgs); + promisifyAll(value, suffix, filter, promisifier, multiArgs); + } + } + + return promisifyAll(target, suffix, filter, promisifier, multiArgs); +}; +}; + + +},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function( + Promise, PromiseArray, tryConvertToPromise, apiRejection) { +var util = _dereq_("./util"); +var isObject = util.isObject; +var es5 = _dereq_("./es5"); +var Es6Map; +if (typeof Map === "function") Es6Map = Map; + +var mapToEntries = (function() { + var index = 0; + var size = 0; + + function extractEntry(value, key) { + this[index] = value; + this[index + size] = key; + index++; + } + + return function mapToEntries(map) { + size = map.size; + index = 0; + var ret = new Array(map.size * 2); + map.forEach(extractEntry, ret); + return ret; + }; +})(); + +var entriesToMap = function(entries) { + var ret = new Es6Map(); + var length = entries.length / 2 | 0; + for (var i = 0; i < length; ++i) { + var key = entries[length + i]; + var value = entries[i]; + ret.set(key, value); + } + return ret; +}; + +function PropertiesPromiseArray(obj) { + var isMap = false; + var entries; + if (Es6Map !== undefined && obj instanceof Es6Map) { + entries = mapToEntries(obj); + isMap = true; + } else { + var keys = es5.keys(obj); + var len = keys.length; + entries = new Array(len * 2); + for (var i = 0; i < len; ++i) { + var key = keys[i]; + entries[i] = obj[key]; + entries[i + len] = key; + } + } + this.constructor$(entries); + this._isMap = isMap; + this._init$(undefined, isMap ? -6 : -3); +} +util.inherits(PropertiesPromiseArray, PromiseArray); + +PropertiesPromiseArray.prototype._init = function () {}; + +PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + var val; + if (this._isMap) { + val = entriesToMap(this._values); + } else { + val = {}; + var keyOffset = this.length(); + for (var i = 0, len = this.length(); i < len; ++i) { + val[this._values[i + keyOffset]] = this._values[i]; + } + } + this._resolve(val); + return true; + } + return false; +}; + +PropertiesPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +PropertiesPromiseArray.prototype.getActualLength = function (len) { + return len >> 1; +}; + +function props(promises) { + var ret; + var castValue = tryConvertToPromise(promises); + + if (!isObject(castValue)) { + return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } else if (castValue instanceof Promise) { + ret = castValue._then( + Promise.props, undefined, undefined, undefined, undefined); + } else { + ret = new PropertiesPromiseArray(castValue).promise(); + } + + if (castValue instanceof Promise) { + ret._propagateFrom(castValue, 2); + } + return ret; +} + +Promise.prototype.props = function () { + return props(this); +}; + +Promise.props = function (promises) { + return props(promises); +}; +}; + +},{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){ +"use strict"; +function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } +} + +function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; +} + +Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; +}; + +Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; +}; + +Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; +}; + +Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; +}; + +Queue.prototype.length = function () { + return this._length; +}; + +Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } +}; + +Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); +}; + +module.exports = Queue; + +},{}],27:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function( + Promise, INTERNAL, tryConvertToPromise, apiRejection) { +var util = _dereq_("./util"); + +var raceLater = function (promise) { + return promise.then(function(array) { + return race(array, promise); + }); +}; + +function race(promises, parent) { + var maybePromise = tryConvertToPromise(promises); + + if (maybePromise instanceof Promise) { + return raceLater(maybePromise); + } else { + promises = util.asArray(promises); + if (promises === null) + return apiRejection("expecting an array or an iterable object but got " + util.classString(promises)); + } + + var ret = new Promise(INTERNAL); + if (parent !== undefined) { + ret._propagateFrom(parent, 3); + } + var fulfill = ret._fulfill; + var reject = ret._reject; + for (var i = 0, len = promises.length; i < len; ++i) { + var val = promises[i]; + + if (val === undefined && !(i in promises)) { + continue; + } + + Promise.cast(val)._then(fulfill, reject, undefined, ret, null); + } + return ret; +} + +Promise.race = function (promises) { + return race(promises, undefined); +}; + +Promise.prototype.race = function () { + return race(this, undefined); +}; + +}; + +},{"./util":36}],28:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = _dereq_("./util"); +var tryCatch = util.tryCatch; + +function ReductionPromiseArray(promises, fn, initialValue, _each) { + this.constructor$(promises); + var context = Promise._getContext(); + this._fn = util.contextBind(context, fn); + if (initialValue !== undefined) { + initialValue = Promise.resolve(initialValue); + initialValue._attachCancellationCallback(this); + } + this._initialValue = initialValue; + this._currentCancellable = null; + if(_each === INTERNAL) { + this._eachValues = Array(this._length); + } else if (_each === 0) { + this._eachValues = null; + } else { + this._eachValues = undefined; + } + this._promise._captureStackTrace(); + this._init$(undefined, -5); +} +util.inherits(ReductionPromiseArray, PromiseArray); + +ReductionPromiseArray.prototype._gotAccum = function(accum) { + if (this._eachValues !== undefined && + this._eachValues !== null && + accum !== INTERNAL) { + this._eachValues.push(accum); + } +}; + +ReductionPromiseArray.prototype._eachComplete = function(value) { + if (this._eachValues !== null) { + this._eachValues.push(value); + } + return this._eachValues; +}; + +ReductionPromiseArray.prototype._init = function() {}; + +ReductionPromiseArray.prototype._resolveEmptyArray = function() { + this._resolve(this._eachValues !== undefined ? this._eachValues + : this._initialValue); +}; + +ReductionPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +ReductionPromiseArray.prototype._resolve = function(value) { + this._promise._resolveCallback(value); + this._values = null; +}; + +ReductionPromiseArray.prototype._resultCancelled = function(sender) { + if (sender === this._initialValue) return this._cancel(); + if (this._isResolved()) return; + this._resultCancelled$(); + if (this._currentCancellable instanceof Promise) { + this._currentCancellable.cancel(); + } + if (this._initialValue instanceof Promise) { + this._initialValue.cancel(); + } +}; + +ReductionPromiseArray.prototype._iterate = function (values) { + this._values = values; + var value; + var i; + var length = values.length; + if (this._initialValue !== undefined) { + value = this._initialValue; + i = 0; + } else { + value = Promise.resolve(values[0]); + i = 1; + } + + this._currentCancellable = value; + + for (var j = i; j < length; ++j) { + var maybePromise = values[j]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + + if (!value.isRejected()) { + for (; i < length; ++i) { + var ctx = { + accum: null, + value: values[i], + index: i, + length: length, + array: this + }; + + value = value._then(gotAccum, undefined, undefined, ctx, undefined); + + if ((i & 127) === 0) { + value._setNoAsyncGuarantee(); + } + } + } + + if (this._eachValues !== undefined) { + value = value + ._then(this._eachComplete, undefined, undefined, this, undefined); + } + value._then(completed, completed, undefined, value, this); +}; + +Promise.prototype.reduce = function (fn, initialValue) { + return reduce(this, fn, initialValue, null); +}; + +Promise.reduce = function (promises, fn, initialValue, _each) { + return reduce(promises, fn, initialValue, _each); +}; + +function completed(valueOrReason, array) { + if (this.isFulfilled()) { + array._resolve(valueOrReason); + } else { + array._reject(valueOrReason); + } +} + +function reduce(promises, fn, initialValue, _each) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var array = new ReductionPromiseArray(promises, fn, initialValue, _each); + return array.promise(); +} + +function gotAccum(accum) { + this.accum = accum; + this.array._gotAccum(accum); + var value = tryConvertToPromise(this.value, this.array._promise); + if (value instanceof Promise) { + this.array._currentCancellable = value; + return value._then(gotValue, undefined, undefined, this, undefined); + } else { + return gotValue.call(this, value); + } +} + +function gotValue(value) { + var array = this.array; + var promise = array._promise; + var fn = tryCatch(array._fn); + promise._pushContext(); + var ret; + if (array._eachValues !== undefined) { + ret = fn.call(promise._boundValue(), value, this.index, this.length); + } else { + ret = fn.call(promise._boundValue(), + this.accum, value, this.index, this.length); + } + if (ret instanceof Promise) { + array._currentCancellable = ret; + } + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", + promise + ); + return ret; +} +}; + +},{"./util":36}],29:[function(_dereq_,module,exports){ +"use strict"; +var util = _dereq_("./util"); +var schedule; +var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var NativePromise = util.getNativePromise(); +if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; +} else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova)) && + ("classList" in document.documentElement)) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); +} else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; +} else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; +} else { + schedule = noAsyncScheduler; +} +module.exports = schedule; + +},{"./util":36}],30:[function(_dereq_,module,exports){ +"use strict"; +module.exports = + function(Promise, PromiseArray, debug) { +var PromiseInspection = Promise.PromiseInspection; +var util = _dereq_("./util"); + +function SettledPromiseArray(values) { + this.constructor$(values); +} +util.inherits(SettledPromiseArray, PromiseArray); + +SettledPromiseArray.prototype._promiseResolved = function (index, inspection) { + this._values[index] = inspection; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +SettledPromiseArray.prototype._promiseFulfilled = function (value, index) { + var ret = new PromiseInspection(); + ret._bitField = 33554432; + ret._settledValueField = value; + return this._promiseResolved(index, ret); +}; +SettledPromiseArray.prototype._promiseRejected = function (reason, index) { + var ret = new PromiseInspection(); + ret._bitField = 16777216; + ret._settledValueField = reason; + return this._promiseResolved(index, ret); +}; + +Promise.settle = function (promises) { + debug.deprecated(".settle()", ".reflect()"); + return new SettledPromiseArray(promises).promise(); +}; + +Promise.allSettled = function (promises) { + return new SettledPromiseArray(promises).promise(); +}; + +Promise.prototype.settle = function () { + return Promise.settle(this); +}; +}; + +},{"./util":36}],31:[function(_dereq_,module,exports){ +"use strict"; +module.exports = +function(Promise, PromiseArray, apiRejection) { +var util = _dereq_("./util"); +var RangeError = _dereq_("./errors").RangeError; +var AggregateError = _dereq_("./errors").AggregateError; +var isArray = util.isArray; +var CANCELLATION = {}; + + +function SomePromiseArray(values) { + this.constructor$(values); + this._howMany = 0; + this._unwrap = false; + this._initialized = false; +} +util.inherits(SomePromiseArray, PromiseArray); + +SomePromiseArray.prototype._init = function () { + if (!this._initialized) { + return; + } + if (this._howMany === 0) { + this._resolve([]); + return; + } + this._init$(undefined, -5); + var isArrayResolved = isArray(this._values); + if (!this._isResolved() && + isArrayResolved && + this._howMany > this._canPossiblyFulfill()) { + this._reject(this._getRangeError(this.length())); + } +}; + +SomePromiseArray.prototype.init = function () { + this._initialized = true; + this._init(); +}; + +SomePromiseArray.prototype.setUnwrap = function () { + this._unwrap = true; +}; + +SomePromiseArray.prototype.howMany = function () { + return this._howMany; +}; + +SomePromiseArray.prototype.setHowMany = function (count) { + this._howMany = count; +}; + +SomePromiseArray.prototype._promiseFulfilled = function (value) { + this._addFulfilled(value); + if (this._fulfilled() === this.howMany()) { + this._values.length = this.howMany(); + if (this.howMany() === 1 && this._unwrap) { + this._resolve(this._values[0]); + } else { + this._resolve(this._values); + } + return true; + } + return false; + +}; +SomePromiseArray.prototype._promiseRejected = function (reason) { + this._addRejected(reason); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._promiseCancelled = function () { + if (this._values instanceof Promise || this._values == null) { + return this._cancel(); + } + this._addRejected(CANCELLATION); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._checkOutcome = function() { + if (this.howMany() > this._canPossiblyFulfill()) { + var e = new AggregateError(); + for (var i = this.length(); i < this._values.length; ++i) { + if (this._values[i] !== CANCELLATION) { + e.push(this._values[i]); + } + } + if (e.length > 0) { + this._reject(e); + } else { + this._cancel(); + } + return true; + } + return false; +}; + +SomePromiseArray.prototype._fulfilled = function () { + return this._totalResolved; +}; + +SomePromiseArray.prototype._rejected = function () { + return this._values.length - this.length(); +}; + +SomePromiseArray.prototype._addRejected = function (reason) { + this._values.push(reason); +}; + +SomePromiseArray.prototype._addFulfilled = function (value) { + this._values[this._totalResolved++] = value; +}; + +SomePromiseArray.prototype._canPossiblyFulfill = function () { + return this.length() - this._rejected(); +}; + +SomePromiseArray.prototype._getRangeError = function (count) { + var message = "Input array must contain at least " + + this._howMany + " items but contains only " + count + " items"; + return new RangeError(message); +}; + +SomePromiseArray.prototype._resolveEmptyArray = function () { + this._reject(this._getRangeError(0)); +}; + +function some(promises, howMany) { + if ((howMany | 0) !== howMany || howMany < 0) { + return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(howMany); + ret.init(); + return promise; +} + +Promise.some = function (promises, howMany) { + return some(promises, howMany); +}; + +Promise.prototype.some = function (howMany) { + return some(this, howMany); +}; + +Promise._SomePromiseArray = SomePromiseArray; +}; + +},{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise) { +function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } +} + +PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; +}; + +var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var reason = PromiseInspection.prototype.error = +PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; +}; + +var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; +}; + +var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; +}; + +var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; +}; + +PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; +}; + +Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; +}; + +Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); +}; + +Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; +}; + +Promise.prototype.isPending = function() { + return isPending.call(this._target()); +}; + +Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); +}; + +Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); +}; + +Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); +}; + +Promise.prototype.value = function() { + return value.call(this._target()); +}; + +Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); +}; + +Promise.prototype._value = function() { + return this._settledValue(); +}; + +Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); +}; + +Promise.PromiseInspection = PromiseInspection; +}; + +},{}],33:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var util = _dereq_("./util"); +var errorObj = util.errorObj; +var isObject = util.isObject; + +function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; +} + +function doGetThen(obj) { + return obj.then; +} + +function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} + +var hasProp = {}.hasOwnProperty; +function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } +} + +function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; +} + +return tryConvertToPromise; +}; + +},{"./util":36}],34:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function(Promise, INTERNAL, debug) { +var util = _dereq_("./util"); +var TimeoutError = Promise.TimeoutError; + +function HandleWrapper(handle) { + this.handle = handle; +} + +HandleWrapper.prototype._resultCancelled = function() { + clearTimeout(this.handle); +}; + +var afterValue = function(value) { return delay(+this).thenReturn(value); }; +var delay = Promise.delay = function (ms, value) { + var ret; + var handle; + if (value !== undefined) { + ret = Promise.resolve(value) + ._then(afterValue, null, null, ms, undefined); + if (debug.cancellation() && value instanceof Promise) { + ret._setOnCancel(value); + } + } else { + ret = new Promise(INTERNAL); + handle = setTimeout(function() { ret._fulfill(); }, +ms); + if (debug.cancellation()) { + ret._setOnCancel(new HandleWrapper(handle)); + } + ret._captureStackTrace(); + } + ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.prototype.delay = function (ms) { + return delay(ms, this); +}; + +var afterTimeout = function (promise, message, parent) { + var err; + if (typeof message !== "string") { + if (message instanceof Error) { + err = message; + } else { + err = new TimeoutError("operation timed out"); + } + } else { + err = new TimeoutError(message); + } + util.markAsOriginatingFromRejection(err); + promise._attachExtraTrace(err); + promise._reject(err); + + if (parent != null) { + parent.cancel(); + } +}; + +function successClear(value) { + clearTimeout(this.handle); + return value; +} + +function failureClear(reason) { + clearTimeout(this.handle); + throw reason; +} + +Promise.prototype.timeout = function (ms, message) { + ms = +ms; + var ret, parent; + + var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { + if (ret.isPending()) { + afterTimeout(ret, message, parent); + } + }, ms)); + + if (debug.cancellation()) { + parent = this.then(); + ret = parent._then(successClear, failureClear, + undefined, handleWrapper, undefined); + ret._setOnCancel(handleWrapper); + } else { + ret = this._then(successClear, failureClear, + undefined, handleWrapper, undefined); + } + + return ret; +}; + +}; + +},{"./util":36}],35:[function(_dereq_,module,exports){ +"use strict"; +module.exports = function (Promise, apiRejection, tryConvertToPromise, + createContext, INTERNAL, debug) { + var util = _dereq_("./util"); + var TypeError = _dereq_("./errors").TypeError; + var inherits = _dereq_("./util").inherits; + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + var NULL = {}; + + function thrower(e) { + setTimeout(function(){throw e;}, 0); + } + + function castPreservingDisposable(thenable) { + var maybePromise = tryConvertToPromise(thenable); + if (maybePromise !== thenable && + typeof thenable._isDisposable === "function" && + typeof thenable._getDisposer === "function" && + thenable._isDisposable()) { + maybePromise._setDisposable(thenable._getDisposer()); + } + return maybePromise; + } + function dispose(resources, inspection) { + var i = 0; + var len = resources.length; + var ret = new Promise(INTERNAL); + function iterator() { + if (i >= len) return ret._fulfill(); + var maybePromise = castPreservingDisposable(resources[i++]); + if (maybePromise instanceof Promise && + maybePromise._isDisposable()) { + try { + maybePromise = tryConvertToPromise( + maybePromise._getDisposer().tryDispose(inspection), + resources.promise); + } catch (e) { + return thrower(e); + } + if (maybePromise instanceof Promise) { + return maybePromise._then(iterator, thrower, + null, null, null); + } + } + iterator(); + } + iterator(); + return ret; + } + + function Disposer(data, promise, context) { + this._data = data; + this._promise = promise; + this._context = context; + } + + Disposer.prototype.data = function () { + return this._data; + }; + + Disposer.prototype.promise = function () { + return this._promise; + }; + + Disposer.prototype.resource = function () { + if (this.promise().isFulfilled()) { + return this.promise().value(); + } + return NULL; + }; + + Disposer.prototype.tryDispose = function(inspection) { + var resource = this.resource(); + var context = this._context; + if (context !== undefined) context._pushContext(); + var ret = resource !== NULL + ? this.doDispose(resource, inspection) : null; + if (context !== undefined) context._popContext(); + this._promise._unsetDisposable(); + this._data = null; + return ret; + }; + + Disposer.isDisposer = function (d) { + return (d != null && + typeof d.resource === "function" && + typeof d.tryDispose === "function"); + }; + + function FunctionDisposer(fn, promise, context) { + this.constructor$(fn, promise, context); + } + inherits(FunctionDisposer, Disposer); + + FunctionDisposer.prototype.doDispose = function (resource, inspection) { + var fn = this.data(); + return fn.call(resource, resource, inspection); + }; + + function maybeUnwrapDisposer(value) { + if (Disposer.isDisposer(value)) { + this.resources[this.index]._setDisposable(value); + return value.promise(); + } + return value; + } + + function ResourceList(length) { + this.length = length; + this.promise = null; + this[length-1] = null; + } + + ResourceList.prototype._resultCancelled = function() { + var len = this.length; + for (var i = 0; i < len; ++i) { + var item = this[i]; + if (item instanceof Promise) { + item.cancel(); + } + } + }; + + Promise.using = function () { + var len = arguments.length; + if (len < 2) return apiRejection( + "you must pass at least 2 arguments to Promise.using"); + var fn = arguments[len - 1]; + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var input; + var spreadArgs = true; + if (len === 2 && Array.isArray(arguments[0])) { + input = arguments[0]; + len = input.length; + spreadArgs = false; + } else { + input = arguments; + len--; + } + var resources = new ResourceList(len); + for (var i = 0; i < len; ++i) { + var resource = input[i]; + if (Disposer.isDisposer(resource)) { + var disposer = resource; + resource = resource.promise(); + resource._setDisposable(disposer); + } else { + var maybePromise = tryConvertToPromise(resource); + if (maybePromise instanceof Promise) { + resource = + maybePromise._then(maybeUnwrapDisposer, null, null, { + resources: resources, + index: i + }, undefined); + } + } + resources[i] = resource; + } + + var reflectedResources = new Array(resources.length); + for (var i = 0; i < reflectedResources.length; ++i) { + reflectedResources[i] = Promise.resolve(resources[i]).reflect(); + } + + var resultPromise = Promise.all(reflectedResources) + .then(function(inspections) { + for (var i = 0; i < inspections.length; ++i) { + var inspection = inspections[i]; + if (inspection.isRejected()) { + errorObj.e = inspection.error(); + return errorObj; + } else if (!inspection.isFulfilled()) { + resultPromise.cancel(); + return; + } + inspections[i] = inspection.value(); + } + promise._pushContext(); + + fn = tryCatch(fn); + var ret = spreadArgs + ? fn.apply(undefined, inspections) : fn(inspections); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, promiseCreated, "Promise.using", promise); + return ret; + }); + + var promise = resultPromise.lastly(function() { + var inspection = new Promise.PromiseInspection(resultPromise); + return dispose(resources, inspection); + }); + resources.promise = promise; + promise._setOnCancel(resources); + return promise; + }; + + Promise.prototype._setDisposable = function (disposer) { + this._bitField = this._bitField | 131072; + this._disposer = disposer; + }; + + Promise.prototype._isDisposable = function () { + return (this._bitField & 131072) > 0; + }; + + Promise.prototype._getDisposer = function () { + return this._disposer; + }; + + Promise.prototype._unsetDisposable = function () { + this._bitField = this._bitField & (~131072); + this._disposer = undefined; + }; + + Promise.prototype.disposer = function (fn) { + if (typeof fn === "function") { + return new FunctionDisposer(fn, this, createContext()); + } + throw new TypeError(); + }; + +}; + +},{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){ +"use strict"; +var es5 = _dereq_("./es5"); +var canEvaluate = typeof navigator == "undefined"; + +var errorObj = {e: {}}; +var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + +function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} +function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; +} + +var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; +}; + + +function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + +} + +function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; +} + +function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); +} + +function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; +} + +function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } +} + +function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; +} + +function thrower(r) { + throw r; +} + +var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + +})(); + +var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; +function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } +} + +function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var receiver = new FakeConstructor(); + function ic() { + return typeof receiver.foo; + } + ic(); + ic(); + return obj; + eval(obj); +} + +var rident = /^[a-z$_][a-z$_0-9]*$/i; +function isIdentifier(str) { + return rident.test(str); +} + +function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; +} + +function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } +} + +function isError(obj) { + return obj instanceof Error || + (obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"); +} + +function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} +} + +function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); +} + +function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); +} + +var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } +})(); + +function classString(obj) { + return {}.toString.call(obj); +} + +function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } +} + +var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; +}; + +if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; +} + +var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + +var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + +function env(key) { + return hasEnvVariables ? process.env[key] : undefined; +} + +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if (classString(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + +var reflectHandler; +function contextBind(ctx, cb) { + if (ctx === null || + typeof cb !== "function" || + cb === reflectHandler) { + return cb; + } + + if (ctx.domain !== null) { + cb = ctx.domain.bind(cb); + } + + var async = ctx.async; + if (async !== null) { + var old = cb; + cb = function() { + var args = (new Array(2)).concat([].slice.call(arguments));; + args[0] = old; + args[1] = this; + return async.runInAsyncScope.apply(async, args); + }; + } + return cb; +} + +var ret = { + setReflectHandler: function(fn) { + reflectHandler = fn; + }, + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + contextBind: contextBind +}; +ret.isRecentNode = ret.isNode && (function() { + var version; + if (process.versions && process.versions.node) { + version = process.versions.node.split(".").map(Number); + } else if (process.version) { + version = process.version.split(".").map(Number); + } + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); +})(); +ret.nodeSupportsAsyncResource = ret.isNode && (function() { + var supportsAsync = false; + try { + var res = _dereq_("async_hooks").AsyncResource; + supportsAsync = typeof res.prototype.runInAsyncScope === "function"; + } catch (e) { + supportsAsync = false; + } + return supportsAsync; +})(); + +if (ret.isNode) ret.toFastProperties(process); + +try {throw new Error(); } catch (e) {ret.lastLineError = e;} +module.exports = ret; + +},{"./es5":13,"async_hooks":undefined}]},{},[4])(4) +}); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; } \ No newline at end of file diff --git a/node_modules/bluebird/js/browser/bluebird.min.js b/node_modules/bluebird/js/browser/bluebird.min.js new file mode 100644 index 0000000..c1e907b --- /dev/null +++ b/node_modules/bluebird/js/browser/bluebird.min.js @@ -0,0 +1,31 @@ +/* @preserve + * The MIT License (MIT) + * + * Copyright (c) 2013-2018 Petka Antonov + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +/** + * bluebird build version 3.7.2 + * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each +*/ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(s,a){if(!e[s]){if(!t[s]){var c="function"==typeof _dereq_&&_dereq_;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n?n:e)},l,l.exports,r,t,e,n)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s0;)c(t)}function c(t){var e=t.shift();if("function"!=typeof e)e._settlePromises();else{var n=t.shift(),r=t.shift();e.call(n,r)}}var u;try{throw new Error}catch(l){u=l}var p=t("./schedule"),f=t("./queue");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=s,r.prototype._drainQueues=function(){a(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,a(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=u},{"./queue":26,"./schedule":29}],3:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var u=n(o),l=new t(e);l._propagateFrom(this,1);var p=this._target();if(l._setBoundTo(u),u instanceof t){var f={promiseRejectionQueued:!1,promise:l,target:p,bindingPromise:u};p._then(e,s,void 0,l,f),u._then(a,c,void 0,l,f),l._setOnCancel(u)}else l._resolveCallback(p);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],4:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":22}],5:[function(t,e,n){"use strict";var r=Object.create;if(r){var i=r(null),o=r(null);i[" size"]=o[" size"]=0}e.exports=function(e){function n(t,n){var r;if(null!=t&&(r=t[n]),"function"!=typeof r){var i="Object "+a.classString(t)+" has no method '"+a.toString(n)+"'";throw new e.TypeError(i)}return r}function r(t){var e=this.pop(),r=n(t,e);return r.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}var s,a=t("./util"),c=a.canEvaluate;a.isIdentifier;e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(r,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e,n="number"==typeof t;if(n)e=o;else if(c){var r=s(t);e=null!==r?r:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var n=0;n=0?o[t]:void 0}var i=!1,o=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,o.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=o.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,i=!1},i=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],9:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){function o(t,e){return{promise:e}}function s(){return!1}function a(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+B.toString(t));r._attachCancellationCallback(t)})}catch(i){return i}}function c(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?B.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function u(){return this._onCancelField}function l(t){this._onCancelField=t}function p(){this._cancellationParent=void 0,this._onCancelField=void 0}function f(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function h(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function _(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function d(){this._trace=new V(this._peekContext())}function v(t,e){if(q(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=F(t);B.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),B.notEnumerableProp(t,"__stackCleaned__",!0)}}}function y(){this._trace=void 0}function g(t,e,n,r,i){if(void 0===t&&null!==e&&Z){if(void 0!==i&&i._returnedNonUndefined())return;if(0===(65535&r._bitField))return;n&&(n+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),c=k(a),u=c.length-1;u>=0;--u){var l=c[u];if(!Q.test(l)){var p=l.match(G);p&&(o="at "+p[1]+":"+p[2]+":"+p[3]+" ");break}}if(c.length>0)for(var f=c[0],u=0;u0&&(s="\n"+a[u-1]);break}}var h="a promise was created in a "+n+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;r._warn(h,!0,e)}}function m(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),b(n)}function b(t,n,r){if(lt.warnings){var i,o=new U(t);if(n)r._attachExtraTrace(o);else if(lt.longStackTraces&&(i=e._peekContext()))i.attachExtraTrace(o);else{var s=F(o);o.stack=s.message+"\n"+s.stack.join("\n")}ot("warning",o)||x(o,"",!0)}}function w(t,e){for(var n=0;n=0;--a)if(r[a]===o){s=a;break}for(var a=s;a>=0;--a){var c=r[a];if(e[i]!==c)break;e.pop(),i--}e=r}}function k(t){for(var e=[],n=0;n0&&"SyntaxError"!=t.name&&(e=e.slice(n)),e}function F(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?E(t):[" (No stack trace)"],{message:n,stack:"SyntaxError"==t.name?e:k(e)}}function x(t,e,n){if("undefined"!=typeof console){var r;if(B.isObject(t)){var i=t.stack;r=e+X(i,t)}else r=e+String(t);"function"==typeof I?I(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function T(t,e,n,r){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(o){N.throwLater(o)}"unhandledRejection"===t?ot(t,n,r)||i||x(n,"Unhandled rejection "):ot(t,r)}function P(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():B.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+R(e)+">, no stack trace)"}function R(t){var e=41;return t.lengths||0>a||!n||!r||n!==r||s>=a||(at=function(t){if($.test(t))return!0;var e=O(t);return e&&e.fileName===n&&s<=e.line&&e.line<=a?!0:!1})}}function V(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);ut(this,V),e>32&&this.uncycle()}var H,D,I,L,N=e._async,U=t("./errors").Warning,B=t("./util"),M=t("./es5"),q=B.canAttachTrace,$=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,Q=/\((?:timers\.js):\d+:\d+\)/,G=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,z=null,X=null,W=!1,K=!(0==B.env("BLUEBIRD_DEBUG")||!B.env("BLUEBIRD_DEBUG")&&"development"!==B.env("NODE_ENV")),J=!(0==B.env("BLUEBIRD_WARNINGS")||!K&&!B.env("BLUEBIRD_WARNINGS")),Y=!(0==B.env("BLUEBIRD_LONG_STACK_TRACES")||!K&&!B.env("BLUEBIRD_LONG_STACK_TRACES")),Z=0!=B.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(J||!!B.env("BLUEBIRD_W_FORGOTTEN_RETURN"));!function(){function t(){for(var t=0;t0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return b(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var n=e._getContext();D=B.contextBind(n,t)},e.onUnhandledRejectionHandled=function(t){var n=e._getContext();H=B.contextBind(n,t)};var tt=function(){};e.longStackTraces=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!lt.longStackTraces&&S()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace,i=e.prototype._dereferenceTrace;lt.longStackTraces=!0,tt=function(){if(N.haveItemsQueued()&&!lt.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,e.prototype._dereferenceTrace=i,n.deactivateLongStackTraces(),lt.longStackTraces=!1},e.prototype._captureStackTrace=d,e.prototype._attachExtraTrace=v,e.prototype._dereferenceTrace=y,n.activateLongStackTraces()}},e.hasLongStackTraces=function(){return lt.longStackTraces&&S()};var et={unhandledrejection:{before:function(){var t=B.global.onunhandledrejection;return B.global.onunhandledrejection=null,t},after:function(t){B.global.onunhandledrejection=t}},rejectionhandled:{before:function(){var t=B.global.onrejectionhandled;return B.global.onrejectionhandled=null,t},after:function(t){B.global.onrejectionhandled=t}}},nt=function(){var t=function(t,e){if(!t)return!B.global.dispatchEvent(e);var n;try{return n=t.before(),!B.global.dispatchEvent(e)}finally{t.after(n)}};try{if("function"==typeof CustomEvent){var e=new CustomEvent("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r={detail:n,cancelable:!0},i=new CustomEvent(e,r);return M.defineProperty(i,"promise",{value:n.promise}),M.defineProperty(i,"reason",{value:n.reason}),t(et[e],i)}}if("function"==typeof Event){var e=new Event("CustomEvent");return B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=new Event(e,{cancelable:!0});return r.detail=n,M.defineProperty(r,"promise",{value:n.promise}),M.defineProperty(r,"reason",{value:n.reason}),t(et[e],r)}}var e=document.createEvent("CustomEvent");return e.initCustomEvent("testingtheevent",!1,!0,{}),B.global.dispatchEvent(e),function(e,n){e=e.toLowerCase();var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,!1,!0,n),t(et[e],r)}}catch(n){}return function(){return!1}}(),rt=function(){return B.isNode?function(){return process.emit.apply(process,arguments)}:B.global?function(t){var e="on"+t.toLowerCase(),n=B.global[e];return n?(n.apply(B.global,[].slice.call(arguments,1)),!0):!1}:function(){return!1}}(),it={promiseCreated:o,promiseFulfilled:o,promiseRejected:o,promiseResolved:o,promiseCancelled:o,promiseChained:function(t,e,n){return{promise:e,child:n}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,n){return{reason:e,promise:n}},rejectionHandled:o},ot=function(t){var e=!1;try{e=rt.apply(null,arguments)}catch(n){N.throwLater(n),e=!0}var r=!1;try{r=nt(t,it[t].apply(null,arguments))}catch(n){N.throwLater(n),r=!0}return r||e};e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&tt()),"warnings"in t){var n=t.warnings;lt.warnings=!!n,Z=lt.warnings,B.isObject(n)&&"wForgottenReturn"in n&&(Z=!!n.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!lt.cancellation){if(N.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=p,e.prototype._propagateFrom=f,e.prototype._onCancel=u,e.prototype._setOnCancel=l,e.prototype._attachCancellationCallback=c,e.prototype._execute=a,st=f,lt.cancellation=!0}if("monitoring"in t&&(t.monitoring&&!lt.monitoring?(lt.monitoring=!0,e.prototype._fireEvent=ot):!t.monitoring&<.monitoring&&(lt.monitoring=!1,e.prototype._fireEvent=s)),"asyncHooks"in t&&B.nodeSupportsAsyncResource){var o=lt.asyncHooks,h=!!t.asyncHooks;o!==h&&(lt.asyncHooks=h,h?r():i())}return e},e.prototype._fireEvent=s,e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(t){},e.prototype._attachCancellationCallback=function(t){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._dereferenceTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(t,e){};var st=h,at=function(){return!1},ct=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;B.inherits(V,Error),n.CapturedTrace=V,V.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,i=this;void 0!==i;++r)e.push(i),i=i._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var o=e[r].stack;void 0===n[o]&&(n[o]=r)}for(var r=0;t>r;++r){var s=e[r].stack,a=n[s];if(void 0!==a&&a!==r){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>a?(c._parent=e[a+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var u=c._length+1,l=r-2;l>=0;--l)e[l]._length=u,u++;return}}}},V.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=F(t),n=e.message,r=[e.stack],i=this;void 0!==i;)r.push(k(i.stack.split("\n"))),i=i._parent;j(r),C(r),B.notEnumerableProp(t,"stack",w(n,r)),B.notEnumerableProp(t,"__stackCleaned__",!0)}};var ut=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():P(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,z=t,X=e;var n=Error.captureStackTrace;return at=function(t){return $.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return z=/@/,X=e,W=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in r||!i||"number"!=typeof Error.stackTraceLimit?(X=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?P(e):e.toString()},null):(z=t,X=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]);"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(I=function(t){console.warn(t)},B.isNode&&process.stderr.isTTY?I=function(t,e){var n=e?"":"";console.warn(n+t+"\n")}:B.isNode||"string"!=typeof(new Error).stack||(I=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var lt={warnings:J,longStackTraces:!1,cancellation:!1,monitoring:!1,asyncHooks:!1};return Y&&e.longStackTraces(),{asyncHooks:function(){return lt.asyncHooks},longStackTraces:function(){return lt.longStackTraces},warnings:function(){return lt.warnings},cancellation:function(){return lt.cancellation},monitoring:function(){return lt.monitoring},propagateFromFunction:function(){return st},boundValueFunction:function(){return _},checkForgottenReturns:g,setBounds:A,warn:b,deprecated:m,CapturedTrace:V,fireDomEvent:nt,fireGlobalEvent:rt}}},{"./errors":12,"./es5":13,"./util":36}],10:[function(t,e,n){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var i=function(){return r};return this.caught(n,i)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t,e){function n(){return o(this)}function r(t,n){return i(t,n,e,e)}var i=t.reduce,o=t.all;t.prototype.each=function(t){return i(this,t,e,0)._then(n,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return i(this,t,e,e)},t.each=function(t,r){return i(t,r,e,0)._then(n,void 0,void 0,t,void 0)},t.mapSeries=r}},{}],12:[function(t,e,n){"use strict";function r(t,e){function n(r){return this instanceof n?(p(this,"message","string"==typeof r?r:e),p(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return l(n,Error),n}function i(t){return this instanceof i?(p(this,"name","OperationalError"),p(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(p(this,"message",t.message),p(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new i(t)}var o,s,a=t("./es5"),c=a.freeze,u=t("./util"),l=u.inherits,p=u.notEnumerableProp,f=r("Warning","warning"),h=r("CancellationError","cancellation error"),_=r("TimeoutError","timeout error"),d=r("AggregateError","aggregate error");try{o=TypeError,s=RangeError}catch(v){o=r("TypeError","type error"),s=r("RangeError","range error")}for(var y="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),g=0;g1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function a(){return u.call(this,this.promise._target()._settledValue())}function c(t){return s(this,t)?void 0:(f.e=t,f)}function u(t){var i=this.promise,u=this.handler;if(!this.called){this.called=!0;var l=this.isFinallyHandler()?u.call(i._boundValue()):u.call(i._boundValue(),t);if(l===r)return l;if(void 0!==l){i._setReturnedNonUndefined();var h=n(l,i);if(h instanceof e){if(null!=this.cancelPromise){if(h._isCancelled()){var _=new p("late cancellation observer");return i._attachExtraTrace(_),f.e=_,f}h.isPending()&&h._attachCancellationCallback(new o(this))}return h._then(a,c,void 0,this,void 0)}}}return i.isRejected()?(s(this),f.e=t,f):(s(this),t)}var l=t("./util"),p=e.CancellationError,f=l.errorObj,h=t("./catch_filter")(r);return i.prototype.isFinallyHandler=function(){return 0===this.type},o.prototype._resultCancelled=function(){s(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,new i(this,e,t),void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,u,u)},e.prototype.tap=function(t){return this._passThrough(t,1,u)},e.prototype.tapCatch=function(t){var n=arguments.length;if(1===n)return this._passThrough(t,1,void 0,u);var r,i=new Array(n-1),o=0;for(r=0;n-1>r;++r){var s=arguments[r];if(!l.isObject(s))return e.reject(new TypeError("tapCatch statement predicate: expecting an object but got "+l.classString(s)));i[o++]=s}i.length=o;var a=arguments[r];return this._passThrough(h(i,a,this),1,void 0,u)},i}},{"./catch_filter":7,"./util":36}],16:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r){for(var o=0;o0&&"function"==typeof arguments[e]){t=arguments[e];var r}var i=[].slice.call(arguments);t&&i.pop();var r=new n(i).promise();return void 0!==t?r.spread(t):r}}},{"./util":36}],18:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t),this._promise._captureStackTrace();var s=e._getContext();if(this._callback=u.contextBind(s,n),this._preservedValues=i===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0),u.isArray(t))for(var a=0;a=1?s:0,new a(t,n,s,o).promise()}var u=t("./util"),l=u.tryCatch,p=u.errorObj,f=e._async;u.inherits(a,n),a.prototype._asyncInit=function(){this._init$(void 0,-2)},a.prototype._init=function(){},a.prototype._promiseFulfilled=function(t,n){var r=this._values,o=this.length(),a=this._preservedValues,c=this._limit;if(0>n){if(n=-1*n-1,r[n]=t,c>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(c>=1&&this._inFlight>=c)return r[n]=t,this._queue.push(n),!1;null!==a&&(a[n]=t);var u=this._promise,f=this._callback,h=u._boundValue();u._pushContext();var _=l(f).call(h,t,n,o),d=u._popContext();if(s.checkForgottenReturns(_,d,null!==a?"Promise.filter":"Promise.map",u),_===p)return this._reject(_.e),!0;var v=i(_,this._promise);if(v instanceof e){v=v._target();var y=v._bitField;if(0===(50397184&y))return c>=1&&this._inFlight++,r[n]=v,v._proxy(this,-1*(n+1)),!1;if(0===(33554432&y))return 0!==(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);_=v._value()}r[n]=_}var g=++this._totalResolved;return g>=o?(null!==a?this._filter(r,a):this._resolve(r),!0):!1},a.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,n=this._values;t.length>0&&this._inFlighto;++o)t[o]&&(r[i++]=e[o]);r.length=i,this._resolve(r)},a.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return c(this,t,e,null)},e.map=function(t,e,n,r){return c(t,e,n,r)}}},{"./util":36}],19:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util"),a=s.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+s.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var i=a(t).apply(this,arguments),s=r._popContext();return o.checkForgottenReturns(i,s,"Promise.method",r),r._resolveFromSyncValue(i),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return i("expecting a function but got "+s.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){o.deprecated("calling Promise.try with more than 1 argument");var u=arguments[1],l=arguments[2];c=s.isArray(u)?a(t).apply(l,u):a(t).call(l,u)}else c=a(t)();var p=r._popContext();return o.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&l.getPrototypeOf(t)===Error.prototype}function i(t){var e;if(r(t)){e=new u(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=l.keys(t),i=0;i1){var n,r=new Array(e-1),i=0;for(n=0;e-1>n;++n){var o=arguments[n];if(!f.isObject(o))return l("Catch statement predicate: expecting an object but got "+f.classString(o));r[i++]=o}if(r.length=i,t=arguments[n],"function"!=typeof t)throw new E("The last argument to .catch() must be a function, got "+f.toString(t));return this.then(void 0,D(r,t,this))}return this.then(void 0,t)},i.prototype.reflect=function(){return this._then(u,u,void 0,this,void 0)},i.prototype.then=function(t,e){if(V.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+f.classString(t);arguments.length>1&&(n+=", "+f.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},i.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},i.prototype.spread=function(t){return"function"!=typeof t?l("expecting a function but got "+f.classString(t)):this.all()._then(t,void 0,void 0,T,void 0)},i.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},i.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new S(this).promise()},i.prototype.error=function(t){return this.caught(f.originatesFromRejection,t)},i.getNewLibraryCopy=e.exports,i.is=function(t){return t instanceof i},i.fromNode=i.fromCallback=function(t){var e=new i(x);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=N(t)(I(e,n));return r===L&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},i.all=function(t){return new S(t).promise()},i.cast=function(t){var e=R(t);return e instanceof i||(e=new i(x),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},i.resolve=i.fulfilled=i.cast,i.reject=i.rejected=function(t){var e=new i(x);return e._captureStackTrace(),e._rejectCallback(t,!0),e},i.setScheduler=function(t){if("function"!=typeof t)throw new E("expecting a function but got "+f.classString(t));return j.setScheduler(t)},i.prototype._then=function(t,e,n,r,o){var s=void 0!==o,a=s?o:new i(x),c=this._target(),u=c._bitField;s||(a._propagateFrom(this,3),a._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&u)?this._boundValue():c===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,a));var l=g();if(0!==(50397184&u)){var p,h,_=c._settlePromiseCtx;0!==(33554432&u)?(h=c._rejectionHandler0,p=t):0!==(16777216&u)?(h=c._fulfillmentHandler0,p=e,c._unsetRejectionIsUnhandled()):(_=c._settlePromiseLateCancellationObserver,h=new F("late cancellation observer"),c._attachExtraTrace(h),p=e),j.invoke(_,c,{handler:f.contextBind(l,p),promise:a,receiver:r,value:h})}else c._addCallbacks(t,e,a,r,l);return a},i.prototype._length=function(){return 65535&this._bitField},i.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},i.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},i.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},i.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},i.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},i.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},i.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},i.prototype._isFinal=function(){return(4194304&this._bitField)>0},i.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},i.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},i.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},i.prototype._setAsyncGuaranteed=function(){if(!j.hasCustomScheduler()){var t=this._bitField;this._bitField=t|(536870912&t)>>2^134217728}},i.prototype._setNoAsyncGuarantee=function(){this._bitField=-134217729&(536870912|this._bitField)},i.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},i.prototype._promiseAt=function(t){return this[4*t-4+2]},i.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},i.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},i.prototype._boundValue=function(){},i.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=p),this._addCallbacks(e,n,r,i,null)},i.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=p),this._addCallbacks(n,r,i,o,null)},i.prototype._addCallbacks=function(t,e,n,r,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=f.contextBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=f.contextBind(i,e));else{var s=4*o-4;this[s+2]=n,this[s+3]=r,"function"==typeof t&&(this[s+0]=f.contextBind(i,t)),"function"==typeof e&&(this[s+1]=f.contextBind(i,e))}return this._setLength(o+1),o},i.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},i.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=R(t,this);if(!(n instanceof i))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(c());var o=r._bitField;if(0===(50397184&o)){var s=this._length();s>0&&r._migrateCallback0(this);for(var a=1;s>a;++a)r._migrateCallbackAt(this,a);this._setFollowing(),this._setLength(0),this._setFollowee(n)}else if(0!==(33554432&o))this._fulfill(r._value());else if(0!==(16777216&o))this._reject(r._reason());else{var u=new F("late cancellation observer");r._attachExtraTrace(u),this._reject(u)}}},i.prototype._rejectCallback=function(t,e,n){var r=f.ensureErrorObject(t),i=r===t;if(!i&&!n&&V.warnings()){var o="a promise was rejected with a non-error: "+f.classString(t);this._warn(o,!0)}this._attachExtraTrace(r,e?i:!1),this._reject(t)},i.prototype._resolveFromExecutor=function(t){if(t!==x){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)}},i.prototype._settlePromiseFromHandler=function(t,e,n,r){var i=r._bitField;if(0===(65536&i)){r._pushContext();var o;e===T?n&&"number"==typeof n.length?o=N(t).apply(this._boundValue(),n):(o=L,o.e=new E("cannot .spread() a non-array: "+f.classString(n))):o=N(t).call(e,n);var s=r._popContext();i=r._bitField,0===(65536&i)&&(o===P?r._reject(n):o===L?r._rejectCallback(o.e,!1):(V.checkForgottenReturns(o,s,"",r,this),r._resolveCallback(o)))}},i.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},i.prototype._followee=function(){return this._rejectionHandler0},i.prototype._setFollowee=function(t){this._rejectionHandler0=t},i.prototype._settlePromise=function(t,e,r,o){var s=t instanceof i,a=this._bitField,c=0!==(134217728&a);0!==(65536&a)?(s&&t._invokeInternalOnCancel(),r instanceof H&&r.isFinallyHandler()?(r.cancelPromise=t,N(e).call(r,o)===L&&t._reject(L.e)):e===u?t._fulfill(u.call(r)):r instanceof n?r._promiseCancelled(t):s||t instanceof S?t._cancel():r.cancel()):"function"==typeof e?s?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(e,r,o,t)):e.call(r,o,t):r instanceof n?r._isResolved()||(0!==(33554432&a)?r._promiseFulfilled(o,t):r._promiseRejected(o,t)):s&&(c&&t._setAsyncGuaranteed(),0!==(33554432&a)?t._fulfill(o):t._reject(o))},i.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,r=t.receiver,o=t.value;"function"==typeof e?n instanceof i?this._settlePromiseFromHandler(e,r,o,n):e.call(r,o,n):n instanceof i&&n._reject(o)},i.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},i.prototype._settlePromise0=function(t,e,n){var r=this._promise0,i=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(r,t,i,e)},i.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},i.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():j.settlePromises(this),this._dereferenceTrace())}},i.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?j.fatalError(t,f.isNode):void((65535&e)>0?j.settlePromises(this):this._ensurePossibleRejectionHandled())},i.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},i.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},i.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},"undefined"!=typeof Symbol&&Symbol.toStringTag&&w.defineProperty(i.prototype,Symbol.toStringTag,{get:function(){return"Object"}}),i.defer=i.pending=function(){V.deprecated("Promise.defer","new Promise");var t=new i(x);return{promise:t,resolve:o,reject:s}},f.notEnumerableProp(i,"_makeSelfResolutionError",c),t("./method")(i,x,R,l,V),t("./bind")(i,x,R,V),t("./cancel")(i,S,l,V),t("./direct_resolve")(i),t("./synchronous_inspection")(i),t("./join")(i,S,R,x,j),i.Promise=i,i.version="3.7.2",t("./call_get.js")(i),t("./generators.js")(i,l,x,R,n,V),t("./map.js")(i,S,l,R,x,V),t("./nodeify.js")(i),t("./promisify.js")(i,x),t("./props.js")(i,S,R,l),t("./race.js")(i,x,R,l),t("./reduce.js")(i,S,l,R,x,V),t("./settle.js")(i,S,V),t("./some.js")(i,S,l),t("./timers.js")(i,x,V),t("./using.js")(i,l,R,A,x,V),t("./any.js")(i),t("./each.js")(i,x),t("./filter.js")(i,x),f.toFastProperties(i),f.toFastProperties(i.prototype),a({a:1}),a({b:2}),a({c:3}),a(1),a(function(){}),a(void 0),a(!1),a(new i(x)),V.setBounds(C.firstLineError,f.lastLineError),i}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36,async_hooks:void 0}],23:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){function s(t){switch(t){case-2:return[];case-3:return{};case-6:return new Map}}function a(t){var r=this._promise=new e(n);t instanceof e&&(r._propagateFrom(t,3),t.suppressUnhandledRejections()),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var c=t("./util");c.isArray;return c.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function u(t,n){var o=r(this._values,this._promise);if(o instanceof e){o=o._target();var a=o._bitField;if(this._values=o,0===(50397184&a))return this._promise._setAsyncGuaranteed(),o._then(u,this._reject,void 0,this,n);if(0===(33554432&a))return 0!==(16777216&a)?this._reject(o._reason()):this._cancel();o=o._value()}if(o=c.asArray(o),null===o){var l=i("expecting an array or an iterable object but got "+c.classString(o)).reason();return void this._promise._rejectCallback(l,!1)}return 0===o.length?void(-5===n?this._resolveEmptyArray():this._resolve(s(n))):void this._iterate(o)},a.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var i=this._promise,o=!1,s=null,a=0;n>a;++a){var c=r(t[a],i);c instanceof e?(c=c._target(),s=c._bitField):s=null,o?null!==s&&c.suppressUnhandledRejections():null!==s?0===(50397184&s)?(c._proxy(this,a),this._values[a]=c):o=0!==(33554432&s)?this._promiseFulfilled(c._value(),a):0!==(16777216&s)?this._promiseRejected(c._reason(),a):this._promiseCancelled(a):o=this._promiseFulfilled(c,a)}o||i._setAsyncGuaranteed()},a.prototype._isResolved=function(){return null===this._values},a.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},a.prototype._cancel=function(){!this._isResolved()&&this._promise._isCancellable()&&(this._values=null,this._promise._cancel())},a.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},a.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;nc;c+=2){var l=s[c],p=s[c+1],_=l+e;if(r===E)t[_]=E(l,f,l,p,e,i);else{var d=r(p,function(){return E(l,f,l,p,e,i)});h.notEnumerableProp(d,"__isPromisified__",!0),t[_]=d}}return h.toFastProperties(t),t}function l(t,e,n){return E(t,e,void 0,t,null,n)}var p,f={},h=t("./util"),_=t("./nodeback"),d=h.withAppended,v=h.maybeWrapAsError,y=h.canEvaluate,g=t("./errors").TypeError,m="Async",b={__isPromisified__:!0},w=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],C=new RegExp("^(?:"+w.join("|")+")$"),j=function(t){return h.isIdentifier(t)&&"_"!==t.charAt(0)&&"constructor"!==t},k=function(t){return t.replace(/([$])/,"\\$")},E=y?p:c;e.promisify=function(t,e){if("function"!=typeof t)throw new g("expecting a function but got "+h.classString(t));if(i(t))return t;e=Object(e);var n=void 0===e.context?f:e.context,o=!!e.multiArgs,s=l(t,n,o);return h.copyDescriptors(t,s,r),s},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/MqrFmX\n");e=Object(e);var n=!!e.multiArgs,r=e.suffix;"string"!=typeof r&&(r=m);var i=e.filter;"function"!=typeof i&&(i=j);var o=e.promisifier;if("function"!=typeof o&&(o=E),!h.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/MqrFmX\n");for(var s=h.inheritedDataKeys(t),a=0;ao;++o){var s=r[o];e[o]=t[s],e[o+i]=s}}this.constructor$(e),this._isMap=n,this._init$(void 0,n?-6:-3)}function s(t){var n,s=r(t);return u(s)?(n=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&n._propagateFrom(s,2),n):i("cannot await properties of a non-object\n\n See http://goo.gl/MqrFmX\n")}var a,c=t("./util"),u=c.isObject,l=t("./es5");"function"==typeof Map&&(a=Map);var p=function(){function t(t,r){this[e]=t,this[e+n]=r,e++}var e=0,n=0;return function(r){n=r.size,e=0;var i=new Array(2*r.size);return r.forEach(t,i),i}}(),f=function(t){for(var e=new a,n=t.length/2|0,r=0;n>r;++r){var i=t[n+r],o=t[r];e.set(i,o)}return e};c.inherits(o,n),o.prototype._init=function(){},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;if(n>=this._length){var r;if(this._isMap)r=f(this._values);else{r={};for(var i=this.length(),o=0,s=this.length();s>o;++o)r[this._values[o+i]]=this._values[o]}return this._resolve(r),!0}return!1},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,n){"use strict";function r(t,e,n,r,i){for(var o=0;i>o;++o)n[o+r]=t[o+e],t[o+e]=void 0}function i(t){this._capacity=t,this._length=0,this._front=0}i.prototype._willBeOverCapacity=function(t){return this._capacityf;++f){var _=t[f];(void 0!==_||f in t)&&e.cast(_)._then(l,p,void 0,u,null)}return u}var s=t("./util"),a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util":36}],28:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t);var s=e._getContext();this._fn=f.contextBind(s,n),void 0!==r&&(r=e.resolve(r),r._attachCancellationCallback(this)),this._initialValue=r,this._currentCancellable=null,i===o?this._eachValues=Array(this._length):0===i?this._eachValues=null:this._eachValues=void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function c(t,e){this.isFulfilled()?e._resolve(t):e._reject(t)}function u(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+f.classString(e));var o=new a(t,e,n,i);return o.promise()}function l(t){this.accum=t,this.array._gotAccum(t);var n=i(this.value,this.array._promise);return n instanceof e?(this.array._currentCancellable=n,n._then(p,void 0,void 0,this,void 0)):p.call(this,n)}function p(t){var n=this.array,r=n._promise,i=h(n._fn);r._pushContext();var o;o=void 0!==n._eachValues?i.call(r._boundValue(),t,this.index,this.length):i.call(r._boundValue(),this.accum,t,this.index,this.length),o instanceof e&&(n._currentCancellable=o);var a=r._popContext();return s.checkForgottenReturns(o,a,void 0!==n._eachValues?"Promise.each":"Promise.reduce",r),o}var f=t("./util"),h=f.tryCatch;f.inherits(a,n),a.prototype._gotAccum=function(t){void 0!==this._eachValues&&null!==this._eachValues&&t!==o&&this._eachValues.push(t)},a.prototype._eachComplete=function(t){return null!==this._eachValues&&this._eachValues.push(t),this._eachValues},a.prototype._init=function(){},a.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},a.prototype.shouldCopyValues=function(){return!1},a.prototype._resolve=function(t){this._promise._resolveCallback(t),this._values=null},a.prototype._resultCancelled=function(t){return t===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof e&&this._currentCancellable.cancel(),this._initialValue instanceof e&&this._initialValue.cancel()))},a.prototype._iterate=function(t){this._values=t;var n,r,i=t.length;void 0!==this._initialValue?(n=this._initialValue,r=0):(n=e.resolve(t[0]),r=1),this._currentCancellable=n;for(var o=r;i>o;++o){var s=t[o];s instanceof e&&s.suppressUnhandledRejections()}if(!n.isRejected())for(;i>r;++r){var a={accum:null,value:t[r],index:r,length:i,array:this};n=n._then(l,void 0,void 0,a,void 0),0===(127&r)&&n._setNoAsyncGuarantee()}void 0!==this._eachValues&&(n=n._then(this._eachComplete,void 0,void 0,this,void 0)),n._then(c,c,void 0,n,this)},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,n,r){return u(t,e,n,r)}}},{"./util":36}],29:[function(t,e,n){"use strict";var r,i=t("./util"),o=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")},s=i.getNativePromise();if(i.isNode&&"undefined"==typeof MutationObserver){var a=global.setImmediate,c=process.nextTick;r=i.isRecentNode?function(t){a.call(global,t)}:function(t){c.call(process,t)}}else if("function"==typeof s&&"function"==typeof s.resolve){ +var u=s.resolve();r=function(t){u.then(t)}}else r="undefined"!=typeof MutationObserver&&("undefined"==typeof window||!window.navigator||!window.navigator.standalone&&!window.cordova)&&"classList"in document.documentElement?function(){var t=document.createElement("div"),e={attributes:!0},n=!1,r=document.createElement("div"),i=new MutationObserver(function(){t.classList.toggle("foo"),n=!1});i.observe(r,e);var o=function(){n||(n=!0,r.classList.toggle("foo"))};return function(n){var r=new MutationObserver(function(){r.disconnect(),n()});r.observe(t,e),o()}}():"undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:o;e.exports=r},{"./util":36}],30:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t)}var o=e.PromiseInspection,s=t("./util");s.inherits(i,n),i.prototype._promiseResolved=function(t,e){this._values[t]=e;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},i.prototype._promiseFulfilled=function(t,e){var n=new o;return n._bitField=33554432,n._settledValueField=t,this._promiseResolved(e,n)},i.prototype._promiseRejected=function(t,e){var n=new o;return n._bitField=16777216,n._settledValueField=t,this._promiseResolved(e,n)},e.settle=function(t){return r.deprecated(".settle()",".reflect()"),new i(t).promise()},e.allSettled=function(t){return new i(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return r("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");var n=new i(t),o=n.promise();return n.setHowMany(e),n.init(),o}var s=t("./util"),a=t("./errors").RangeError,c=t("./errors").AggregateError,u=s.isArray,l={};s.inherits(i,n),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=u(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},i.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},i.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(l),this._checkOutcome())},i.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new c,e=this.length();e0?this._reject(t):this._cancel(),!0}return!1},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors":12,"./util":36}],32:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(l(t)){if(t instanceof e)return t;var i=o(t);if(i===u){r&&r._pushContext();var c=e.reject(i.e);return r&&r._popContext(),c}if("function"==typeof i){if(s(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return a(t,i,r)}}return t}function i(t){return t.then}function o(t){try{return i(t)}catch(e){return u.e=e,u}}function s(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function a(t,r,i){function o(t){a&&(a._resolveCallback(t),a=null)}function s(t){a&&(a._rejectCallback(t,p,!0),a=null)}var a=new e(n),l=a;i&&i._pushContext(),a._captureStackTrace(),i&&i._popContext();var p=!0,f=c.tryCatch(r).call(t,o,s);return p=!1,a&&f===u&&(a._rejectCallback(f.e,!0,!0),a=null),l}var c=t("./util"),u=c.errorObj,l=c.isObject,p={}.hasOwnProperty;return r}},{"./util":36}],34:[function(t,e,n){"use strict";e.exports=function(e,n,r){function i(t){this.handle=t}function o(t){return clearTimeout(this.handle),t}function s(t){throw clearTimeout(this.handle),t}var a=t("./util"),c=e.TimeoutError;i.prototype._resultCancelled=function(){clearTimeout(this.handle)};var u=function(t){return l(+this).thenReturn(t)},l=e.delay=function(t,o){var s,a;return void 0!==o?(s=e.resolve(o)._then(u,null,null,t,void 0),r.cancellation()&&o instanceof e&&s._setOnCancel(o)):(s=new e(n),a=setTimeout(function(){s._fulfill()},+t),r.cancellation()&&s._setOnCancel(new i(a)),s._captureStackTrace()),s._setAsyncGuaranteed(),s};e.prototype.delay=function(t){return l(t,this)};var p=function(t,e,n){var r;r="string"!=typeof e?e instanceof Error?e:new c("operation timed out"):new c(e),a.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._reject(r),null!=n&&n.cancel()};e.prototype.timeout=function(t,e){t=+t;var n,a,c=new i(setTimeout(function(){n.isPending()&&p(n,e,a)},t));return r.cancellation()?(a=this.then(),n=a._then(o,s,void 0,c,void 0),n._setOnCancel(c)):n=this._then(o,s,void 0,c,void 0),n}}},{"./util":36}],35:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t){setTimeout(function(){throw t},0)}function c(t){var e=r(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,n){function i(){if(s>=u)return l._fulfill();var o=c(t[s++]);if(o instanceof e&&o._isDisposable()){try{o=r(o._getDisposer().tryDispose(n),t.promise)}catch(p){return a(p)}if(o instanceof e)return o._then(i,a,null,null,null)}i()}var s=0,u=t.length,l=new e(o);return i(),l}function l(t,e,n){this._data=t,this._promise=e,this._context=n}function p(t,e,n){this.constructor$(t,e,n)}function f(t){return l.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function h(t){this.length=t,this.promise=null,this[t-1]=null}var _=t("./util"),d=t("./errors").TypeError,v=t("./util").inherits,y=_.errorObj,g=_.tryCatch,m={};l.prototype.data=function(){return this._data},l.prototype.promise=function(){return this._promise},l.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():m},l.prototype.tryDispose=function(t){var e=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=e!==m?this.doDispose(e,t):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},l.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},v(p,l),p.prototype.doDispose=function(t,e){var n=this.data();return n.call(t,t,e)},h.prototype._resultCancelled=function(){for(var t=this.length,n=0;t>n;++n){var r=this[n];r instanceof e&&r.cancel()}},e.using=function(){var t=arguments.length;if(2>t)return n("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return n("expecting a function but got "+_.classString(i));var o,a=!0;2===t&&Array.isArray(arguments[0])?(o=arguments[0],t=o.length,a=!1):(o=arguments,t--);for(var c=new h(t),p=0;t>p;++p){var d=o[p];if(l.isDisposer(d)){var v=d;d=d.promise(),d._setDisposable(v)}else{var m=r(d);m instanceof e&&(d=m._then(f,null,null,{resources:c,index:p},void 0))}c[p]=d}for(var b=new Array(c.length),p=0;p0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new d}}},{"./errors":12,"./util":36}],36:[function(t,e,n){"use strict";function r(){try{var t=P;return P=null,t.apply(this,arguments)}catch(e){return T.e=e,T}}function i(t){return P=t,r}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return o(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,i=new Array(r+1);for(n=0;r>n;++n)i[n]=t[n];return i[n]=e,i}function u(t,e,n){if(!F.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function l(t,e,n){if(o(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return F.defineProperty(t,e,r),t}function p(t){throw t}function f(t){try{if("function"==typeof t){var e=F.names(t.prototype),n=F.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=A.test(t+"")&&F.names(t).length>0;if(n||r||i)return!0}return!1}catch(o){return!1}}function h(t){function e(){}function n(){return typeof r.foo}e.prototype=t;var r=new e;return n(),n(),t}function _(t){return V.test(t)}function d(t,e,n){for(var r=new Array(t),i=0;t>i;++i)r[i]=e+i+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){return t instanceof Error||null!==t&&"object"==typeof t&&"string"==typeof t.message&&"string"==typeof t.name}function g(t){try{l(t,"isOperational",!0)}catch(e){}}function m(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function b(t){return y(t)&&F.propertyIsWritable(t,"stack")}function w(t){return{}.toString.call(t)}function C(t,e,n){for(var r=F.names(t),i=0;i10||t[0]>0}(),B.nodeSupportsAsyncResource=B.isNode&&function(){var e=!1;try{var n=t("async_hooks").AsyncResource;e="function"==typeof n.prototype.runInAsyncScope}catch(r){e=!1}return e}(),B.isNode&&B.toFastProperties(process);try{throw new Error}catch(M){B.lastLineError=M}e.exports=B},{"./es5":13,async_hooks:void 0}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise); \ No newline at end of file diff --git a/node_modules/bluebird/js/release/any.js b/node_modules/bluebird/js/release/any.js new file mode 100644 index 0000000..05a6228 --- /dev/null +++ b/node_modules/bluebird/js/release/any.js @@ -0,0 +1,21 @@ +"use strict"; +module.exports = function(Promise) { +var SomePromiseArray = Promise._SomePromiseArray; +function any(promises) { + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(1); + ret.setUnwrap(); + ret.init(); + return promise; +} + +Promise.any = function (promises) { + return any(promises); +}; + +Promise.prototype.any = function () { + return any(this); +}; + +}; diff --git a/node_modules/bluebird/js/release/assert.js b/node_modules/bluebird/js/release/assert.js new file mode 100644 index 0000000..4518231 --- /dev/null +++ b/node_modules/bluebird/js/release/assert.js @@ -0,0 +1,55 @@ +"use strict"; +module.exports = (function(){ +var AssertionError = (function() { + function AssertionError(a) { + this.constructor$(a); + this.message = a; + this.name = "AssertionError"; + } + AssertionError.prototype = new Error(); + AssertionError.prototype.constructor = AssertionError; + AssertionError.prototype.constructor$ = Error; + return AssertionError; +})(); + +function getParams(args) { + var params = []; + for (var i = 0; i < args.length; ++i) params.push("arg" + i); + return params; +} + +function nativeAssert(callName, args, expect) { + try { + var params = getParams(args); + var constructorArgs = params; + constructorArgs.push("return " + + callName + "("+ params.join(",") + ");"); + var fn = Function.apply(null, constructorArgs); + return fn.apply(null, args); + } catch (e) { + if (!(e instanceof SyntaxError)) { + throw e; + } else { + return expect; + } + } +} + +return function assert(boolExpr, message) { + if (boolExpr === true) return; + + if (typeof boolExpr === "string" && + boolExpr.charAt(0) === "%") { + var nativeCallName = boolExpr; + var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];}; + if (nativeAssert(nativeCallName, args, message) === message) return; + message = (nativeCallName + " !== " + message); + } + + var ret = new AssertionError(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(ret, assert); + } + throw ret; +}; +})(); diff --git a/node_modules/bluebird/js/release/async.js b/node_modules/bluebird/js/release/async.js new file mode 100644 index 0000000..8eab6f8 --- /dev/null +++ b/node_modules/bluebird/js/release/async.js @@ -0,0 +1,120 @@ +"use strict"; +var firstLineError; +try {throw new Error(); } catch (e) {firstLineError = e;} +var schedule = require("./schedule"); +var Queue = require("./queue"); + +function Async() { + this._customScheduler = false; + this._isTickUsed = false; + this._lateQueue = new Queue(16); + this._normalQueue = new Queue(16); + this._haveDrainedQueues = false; + var self = this; + this.drainQueues = function () { + self._drainQueues(); + }; + this._schedule = schedule; +} + +Async.prototype.setScheduler = function(fn) { + var prev = this._schedule; + this._schedule = fn; + this._customScheduler = true; + return prev; +}; + +Async.prototype.hasCustomScheduler = function() { + return this._customScheduler; +}; + +Async.prototype.haveItemsQueued = function () { + return this._isTickUsed || this._haveDrainedQueues; +}; + + +Async.prototype.fatalError = function(e, isNode) { + if (isNode) { + process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) + + "\n"); + process.exit(2); + } else { + this.throwLater(e); + } +}; + +Async.prototype.throwLater = function(fn, arg) { + if (arguments.length === 1) { + arg = fn; + fn = function () { throw arg; }; + } + if (typeof setTimeout !== "undefined") { + setTimeout(function() { + fn(arg); + }, 0); + } else try { + this._schedule(function() { + fn(arg); + }); + } catch (e) { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } +}; + +function AsyncInvokeLater(fn, receiver, arg) { + this._lateQueue.push(fn, receiver, arg); + this._queueTick(); +} + +function AsyncInvoke(fn, receiver, arg) { + this._normalQueue.push(fn, receiver, arg); + this._queueTick(); +} + +function AsyncSettlePromises(promise) { + this._normalQueue._pushOne(promise); + this._queueTick(); +} + +Async.prototype.invokeLater = AsyncInvokeLater; +Async.prototype.invoke = AsyncInvoke; +Async.prototype.settlePromises = AsyncSettlePromises; + + +function _drainQueue(queue) { + while (queue.length() > 0) { + _drainQueueStep(queue); + } +} + +function _drainQueueStep(queue) { + var fn = queue.shift(); + if (typeof fn !== "function") { + fn._settlePromises(); + } else { + var receiver = queue.shift(); + var arg = queue.shift(); + fn.call(receiver, arg); + } +} + +Async.prototype._drainQueues = function () { + _drainQueue(this._normalQueue); + this._reset(); + this._haveDrainedQueues = true; + _drainQueue(this._lateQueue); +}; + +Async.prototype._queueTick = function () { + if (!this._isTickUsed) { + this._isTickUsed = true; + this._schedule(this.drainQueues); + } +}; + +Async.prototype._reset = function () { + this._isTickUsed = false; +}; + +module.exports = Async; +module.exports.firstLineError = firstLineError; diff --git a/node_modules/bluebird/js/release/bind.js b/node_modules/bluebird/js/release/bind.js new file mode 100644 index 0000000..fc3379d --- /dev/null +++ b/node_modules/bluebird/js/release/bind.js @@ -0,0 +1,67 @@ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) { +var calledBind = false; +var rejectThis = function(_, e) { + this._reject(e); +}; + +var targetRejected = function(e, context) { + context.promiseRejectionQueued = true; + context.bindingPromise._then(rejectThis, rejectThis, null, this, e); +}; + +var bindingResolved = function(thisArg, context) { + if (((this._bitField & 50397184) === 0)) { + this._resolveCallback(context.target); + } +}; + +var bindingRejected = function(e, context) { + if (!context.promiseRejectionQueued) this._reject(e); +}; + +Promise.prototype.bind = function (thisArg) { + if (!calledBind) { + calledBind = true; + Promise.prototype._propagateFrom = debug.propagateFromFunction(); + Promise.prototype._boundValue = debug.boundValueFunction(); + } + var maybePromise = tryConvertToPromise(thisArg); + var ret = new Promise(INTERNAL); + ret._propagateFrom(this, 1); + var target = this._target(); + ret._setBoundTo(maybePromise); + if (maybePromise instanceof Promise) { + var context = { + promiseRejectionQueued: false, + promise: ret, + target: target, + bindingPromise: maybePromise + }; + target._then(INTERNAL, targetRejected, undefined, ret, context); + maybePromise._then( + bindingResolved, bindingRejected, undefined, ret, context); + ret._setOnCancel(maybePromise); + } else { + ret._resolveCallback(target); + } + return ret; +}; + +Promise.prototype._setBoundTo = function (obj) { + if (obj !== undefined) { + this._bitField = this._bitField | 2097152; + this._boundTo = obj; + } else { + this._bitField = this._bitField & (~2097152); + } +}; + +Promise.prototype._isBound = function () { + return (this._bitField & 2097152) === 2097152; +}; + +Promise.bind = function (thisArg, value) { + return Promise.resolve(value).bind(thisArg); +}; +}; diff --git a/node_modules/bluebird/js/release/bluebird.js b/node_modules/bluebird/js/release/bluebird.js new file mode 100644 index 0000000..1c36cf3 --- /dev/null +++ b/node_modules/bluebird/js/release/bluebird.js @@ -0,0 +1,11 @@ +"use strict"; +var old; +if (typeof Promise !== "undefined") old = Promise; +function noConflict() { + try { if (Promise === bluebird) Promise = old; } + catch (e) {} + return bluebird; +} +var bluebird = require("./promise")(); +bluebird.noConflict = noConflict; +module.exports = bluebird; diff --git a/node_modules/bluebird/js/release/call_get.js b/node_modules/bluebird/js/release/call_get.js new file mode 100644 index 0000000..0ed7714 --- /dev/null +++ b/node_modules/bluebird/js/release/call_get.js @@ -0,0 +1,123 @@ +"use strict"; +var cr = Object.create; +if (cr) { + var callerCache = cr(null); + var getterCache = cr(null); + callerCache[" size"] = getterCache[" size"] = 0; +} + +module.exports = function(Promise) { +var util = require("./util"); +var canEvaluate = util.canEvaluate; +var isIdentifier = util.isIdentifier; + +var getMethodCaller; +var getGetter; +if (!false) { +var makeMethodCaller = function (methodName) { + return new Function("ensureMethod", " \n\ + return function(obj) { \n\ + 'use strict' \n\ + var len = this.length; \n\ + ensureMethod(obj, 'methodName'); \n\ + switch(len) { \n\ + case 1: return obj.methodName(this[0]); \n\ + case 2: return obj.methodName(this[0], this[1]); \n\ + case 3: return obj.methodName(this[0], this[1], this[2]); \n\ + case 0: return obj.methodName(); \n\ + default: \n\ + return obj.methodName.apply(obj, this); \n\ + } \n\ + }; \n\ + ".replace(/methodName/g, methodName))(ensureMethod); +}; + +var makeGetter = function (propertyName) { + return new Function("obj", " \n\ + 'use strict'; \n\ + return obj.propertyName; \n\ + ".replace("propertyName", propertyName)); +}; + +var getCompiled = function(name, compiler, cache) { + var ret = cache[name]; + if (typeof ret !== "function") { + if (!isIdentifier(name)) { + return null; + } + ret = compiler(name); + cache[name] = ret; + cache[" size"]++; + if (cache[" size"] > 512) { + var keys = Object.keys(cache); + for (var i = 0; i < 256; ++i) delete cache[keys[i]]; + cache[" size"] = keys.length - 256; + } + } + return ret; +}; + +getMethodCaller = function(name) { + return getCompiled(name, makeMethodCaller, callerCache); +}; + +getGetter = function(name) { + return getCompiled(name, makeGetter, getterCache); +}; +} + +function ensureMethod(obj, methodName) { + var fn; + if (obj != null) fn = obj[methodName]; + if (typeof fn !== "function") { + var message = "Object " + util.classString(obj) + " has no method '" + + util.toString(methodName) + "'"; + throw new Promise.TypeError(message); + } + return fn; +} + +function caller(obj) { + var methodName = this.pop(); + var fn = ensureMethod(obj, methodName); + return fn.apply(obj, this); +} +Promise.prototype.call = function (methodName) { + var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}; + if (!false) { + if (canEvaluate) { + var maybeCaller = getMethodCaller(methodName); + if (maybeCaller !== null) { + return this._then( + maybeCaller, undefined, undefined, args, undefined); + } + } + } + args.push(methodName); + return this._then(caller, undefined, undefined, args, undefined); +}; + +function namedGetter(obj) { + return obj[this]; +} +function indexedGetter(obj) { + var index = +this; + if (index < 0) index = Math.max(0, index + obj.length); + return obj[index]; +} +Promise.prototype.get = function (propertyName) { + var isIndex = (typeof propertyName === "number"); + var getter; + if (!isIndex) { + if (canEvaluate) { + var maybeGetter = getGetter(propertyName); + getter = maybeGetter !== null ? maybeGetter : namedGetter; + } else { + getter = namedGetter; + } + } else { + getter = indexedGetter; + } + return this._then(getter, undefined, undefined, propertyName, undefined); +}; +}; diff --git a/node_modules/bluebird/js/release/cancel.js b/node_modules/bluebird/js/release/cancel.js new file mode 100644 index 0000000..7a12415 --- /dev/null +++ b/node_modules/bluebird/js/release/cancel.js @@ -0,0 +1,129 @@ +"use strict"; +module.exports = function(Promise, PromiseArray, apiRejection, debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +Promise.prototype["break"] = Promise.prototype.cancel = function() { + if (!debug.cancellation()) return this._warn("cancellation is disabled"); + + var promise = this; + var child = promise; + while (promise._isCancellable()) { + if (!promise._cancelBy(child)) { + if (child._isFollowing()) { + child._followee().cancel(); + } else { + child._cancelBranched(); + } + break; + } + + var parent = promise._cancellationParent; + if (parent == null || !parent._isCancellable()) { + if (promise._isFollowing()) { + promise._followee().cancel(); + } else { + promise._cancelBranched(); + } + break; + } else { + if (promise._isFollowing()) promise._followee().cancel(); + promise._setWillBeCancelled(); + child = promise; + promise = parent; + } + } +}; + +Promise.prototype._branchHasCancelled = function() { + this._branchesRemainingToCancel--; +}; + +Promise.prototype._enoughBranchesHaveCancelled = function() { + return this._branchesRemainingToCancel === undefined || + this._branchesRemainingToCancel <= 0; +}; + +Promise.prototype._cancelBy = function(canceller) { + if (canceller === this) { + this._branchesRemainingToCancel = 0; + this._invokeOnCancel(); + return true; + } else { + this._branchHasCancelled(); + if (this._enoughBranchesHaveCancelled()) { + this._invokeOnCancel(); + return true; + } + } + return false; +}; + +Promise.prototype._cancelBranched = function() { + if (this._enoughBranchesHaveCancelled()) { + this._cancel(); + } +}; + +Promise.prototype._cancel = function() { + if (!this._isCancellable()) return; + this._setCancelled(); + async.invoke(this._cancelPromises, this, undefined); +}; + +Promise.prototype._cancelPromises = function() { + if (this._length() > 0) this._settlePromises(); +}; + +Promise.prototype._unsetOnCancel = function() { + this._onCancelField = undefined; +}; + +Promise.prototype._isCancellable = function() { + return this.isPending() && !this._isCancelled(); +}; + +Promise.prototype.isCancellable = function() { + return this.isPending() && !this.isCancelled(); +}; + +Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) { + if (util.isArray(onCancelCallback)) { + for (var i = 0; i < onCancelCallback.length; ++i) { + this._doInvokeOnCancel(onCancelCallback[i], internalOnly); + } + } else if (onCancelCallback !== undefined) { + if (typeof onCancelCallback === "function") { + if (!internalOnly) { + var e = tryCatch(onCancelCallback).call(this._boundValue()); + if (e === errorObj) { + this._attachExtraTrace(e.e); + async.throwLater(e.e); + } + } + } else { + onCancelCallback._resultCancelled(this); + } + } +}; + +Promise.prototype._invokeOnCancel = function() { + var onCancelCallback = this._onCancel(); + this._unsetOnCancel(); + async.invoke(this._doInvokeOnCancel, this, onCancelCallback); +}; + +Promise.prototype._invokeInternalOnCancel = function() { + if (this._isCancellable()) { + this._doInvokeOnCancel(this._onCancel(), true); + this._unsetOnCancel(); + } +}; + +Promise.prototype._resultCancelled = function() { + this.cancel(); +}; + +}; diff --git a/node_modules/bluebird/js/release/catch_filter.js b/node_modules/bluebird/js/release/catch_filter.js new file mode 100644 index 0000000..0f24ce2 --- /dev/null +++ b/node_modules/bluebird/js/release/catch_filter.js @@ -0,0 +1,42 @@ +"use strict"; +module.exports = function(NEXT_FILTER) { +var util = require("./util"); +var getKeys = require("./es5").keys; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function catchFilter(instances, cb, promise) { + return function(e) { + var boundTo = promise._boundValue(); + predicateLoop: for (var i = 0; i < instances.length; ++i) { + var item = instances[i]; + + if (item === Error || + (item != null && item.prototype instanceof Error)) { + if (e instanceof item) { + return tryCatch(cb).call(boundTo, e); + } + } else if (typeof item === "function") { + var matchesPredicate = tryCatch(item).call(boundTo, e); + if (matchesPredicate === errorObj) { + return matchesPredicate; + } else if (matchesPredicate) { + return tryCatch(cb).call(boundTo, e); + } + } else if (util.isObject(e)) { + var keys = getKeys(item); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + if (item[key] != e[key]) { + continue predicateLoop; + } + } + return tryCatch(cb).call(boundTo, e); + } + } + return NEXT_FILTER; + }; +} + +return catchFilter; +}; diff --git a/node_modules/bluebird/js/release/context.js b/node_modules/bluebird/js/release/context.js new file mode 100644 index 0000000..c307414 --- /dev/null +++ b/node_modules/bluebird/js/release/context.js @@ -0,0 +1,69 @@ +"use strict"; +module.exports = function(Promise) { +var longStackTraces = false; +var contextStack = []; + +Promise.prototype._promiseCreated = function() {}; +Promise.prototype._pushContext = function() {}; +Promise.prototype._popContext = function() {return null;}; +Promise._peekContext = Promise.prototype._peekContext = function() {}; + +function Context() { + this._trace = new Context.CapturedTrace(peekContext()); +} +Context.prototype._pushContext = function () { + if (this._trace !== undefined) { + this._trace._promiseCreated = null; + contextStack.push(this._trace); + } +}; + +Context.prototype._popContext = function () { + if (this._trace !== undefined) { + var trace = contextStack.pop(); + var ret = trace._promiseCreated; + trace._promiseCreated = null; + return ret; + } + return null; +}; + +function createContext() { + if (longStackTraces) return new Context(); +} + +function peekContext() { + var lastIndex = contextStack.length - 1; + if (lastIndex >= 0) { + return contextStack[lastIndex]; + } + return undefined; +} +Context.CapturedTrace = null; +Context.create = createContext; +Context.deactivateLongStackTraces = function() {}; +Context.activateLongStackTraces = function() { + var Promise_pushContext = Promise.prototype._pushContext; + var Promise_popContext = Promise.prototype._popContext; + var Promise_PeekContext = Promise._peekContext; + var Promise_peekContext = Promise.prototype._peekContext; + var Promise_promiseCreated = Promise.prototype._promiseCreated; + Context.deactivateLongStackTraces = function() { + Promise.prototype._pushContext = Promise_pushContext; + Promise.prototype._popContext = Promise_popContext; + Promise._peekContext = Promise_PeekContext; + Promise.prototype._peekContext = Promise_peekContext; + Promise.prototype._promiseCreated = Promise_promiseCreated; + longStackTraces = false; + }; + longStackTraces = true; + Promise.prototype._pushContext = Context.prototype._pushContext; + Promise.prototype._popContext = Context.prototype._popContext; + Promise._peekContext = Promise.prototype._peekContext = peekContext; + Promise.prototype._promiseCreated = function() { + var ctx = this._peekContext(); + if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this; + }; +}; +return Context; +}; diff --git a/node_modules/bluebird/js/release/debuggability.js b/node_modules/bluebird/js/release/debuggability.js new file mode 100644 index 0000000..ce997ee --- /dev/null +++ b/node_modules/bluebird/js/release/debuggability.js @@ -0,0 +1,1009 @@ +"use strict"; +module.exports = function(Promise, Context, + enableAsyncHooks, disableAsyncHooks) { +var async = Promise._async; +var Warning = require("./errors").Warning; +var util = require("./util"); +var es5 = require("./es5"); +var canAttachTrace = util.canAttachTrace; +var unhandledRejectionHandled; +var possiblyUnhandledRejection; +var bluebirdFramePattern = + /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/; +var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/; +var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/; +var stackFramePattern = null; +var formatStack = null; +var indentStackFrames = false; +var printWarning; +var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 && + (false || + util.env("BLUEBIRD_DEBUG") || + util.env("NODE_ENV") === "development")); + +var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 && + (debugging || util.env("BLUEBIRD_WARNINGS"))); + +var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 && + (debugging || util.env("BLUEBIRD_LONG_STACK_TRACES"))); + +var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 && + (warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN")); + +var deferUnhandledRejectionCheck; +(function() { + var promises = []; + + function unhandledRejectionCheck() { + for (var i = 0; i < promises.length; ++i) { + promises[i]._notifyUnhandledRejection(); + } + unhandledRejectionClear(); + } + + function unhandledRejectionClear() { + promises.length = 0; + } + + deferUnhandledRejectionCheck = function(promise) { + promises.push(promise); + setTimeout(unhandledRejectionCheck, 1); + }; + + es5.defineProperty(Promise, "_unhandledRejectionCheck", { + value: unhandledRejectionCheck + }); + es5.defineProperty(Promise, "_unhandledRejectionClear", { + value: unhandledRejectionClear + }); +})(); + +Promise.prototype.suppressUnhandledRejections = function() { + var target = this._target(); + target._bitField = ((target._bitField & (~1048576)) | + 524288); +}; + +Promise.prototype._ensurePossibleRejectionHandled = function () { + if ((this._bitField & 524288) !== 0) return; + this._setRejectionIsUnhandled(); + deferUnhandledRejectionCheck(this); +}; + +Promise.prototype._notifyUnhandledRejectionIsHandled = function () { + fireRejectionEvent("rejectionHandled", + unhandledRejectionHandled, undefined, this); +}; + +Promise.prototype._setReturnedNonUndefined = function() { + this._bitField = this._bitField | 268435456; +}; + +Promise.prototype._returnedNonUndefined = function() { + return (this._bitField & 268435456) !== 0; +}; + +Promise.prototype._notifyUnhandledRejection = function () { + if (this._isRejectionUnhandled()) { + var reason = this._settledValue(); + this._setUnhandledRejectionIsNotified(); + fireRejectionEvent("unhandledRejection", + possiblyUnhandledRejection, reason, this); + } +}; + +Promise.prototype._setUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField | 262144; +}; + +Promise.prototype._unsetUnhandledRejectionIsNotified = function () { + this._bitField = this._bitField & (~262144); +}; + +Promise.prototype._isUnhandledRejectionNotified = function () { + return (this._bitField & 262144) > 0; +}; + +Promise.prototype._setRejectionIsUnhandled = function () { + this._bitField = this._bitField | 1048576; +}; + +Promise.prototype._unsetRejectionIsUnhandled = function () { + this._bitField = this._bitField & (~1048576); + if (this._isUnhandledRejectionNotified()) { + this._unsetUnhandledRejectionIsNotified(); + this._notifyUnhandledRejectionIsHandled(); + } +}; + +Promise.prototype._isRejectionUnhandled = function () { + return (this._bitField & 1048576) > 0; +}; + +Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) { + return warn(message, shouldUseOwnTrace, promise || this); +}; + +Promise.onPossiblyUnhandledRejection = function (fn) { + var context = Promise._getContext(); + possiblyUnhandledRejection = util.contextBind(context, fn); +}; + +Promise.onUnhandledRejectionHandled = function (fn) { + var context = Promise._getContext(); + unhandledRejectionHandled = util.contextBind(context, fn); +}; + +var disableLongStackTraces = function() {}; +Promise.longStackTraces = function () { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (!config.longStackTraces && longStackTracesIsSupported()) { + var Promise_captureStackTrace = Promise.prototype._captureStackTrace; + var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace; + var Promise_dereferenceTrace = Promise.prototype._dereferenceTrace; + config.longStackTraces = true; + disableLongStackTraces = function() { + if (async.haveItemsQueued() && !config.longStackTraces) { + throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + Promise.prototype._captureStackTrace = Promise_captureStackTrace; + Promise.prototype._attachExtraTrace = Promise_attachExtraTrace; + Promise.prototype._dereferenceTrace = Promise_dereferenceTrace; + Context.deactivateLongStackTraces(); + config.longStackTraces = false; + }; + Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace; + Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace; + Promise.prototype._dereferenceTrace = longStackTracesDereferenceTrace; + Context.activateLongStackTraces(); + } +}; + +Promise.hasLongStackTraces = function () { + return config.longStackTraces && longStackTracesIsSupported(); +}; + + +var legacyHandlers = { + unhandledrejection: { + before: function() { + var ret = util.global.onunhandledrejection; + util.global.onunhandledrejection = null; + return ret; + }, + after: function(fn) { + util.global.onunhandledrejection = fn; + } + }, + rejectionhandled: { + before: function() { + var ret = util.global.onrejectionhandled; + util.global.onrejectionhandled = null; + return ret; + }, + after: function(fn) { + util.global.onrejectionhandled = fn; + } + } +}; + +var fireDomEvent = (function() { + var dispatch = function(legacy, e) { + if (legacy) { + var fn; + try { + fn = legacy.before(); + return !util.global.dispatchEvent(e); + } finally { + legacy.after(fn); + } + } else { + return !util.global.dispatchEvent(e); + } + }; + try { + if (typeof CustomEvent === "function") { + var event = new CustomEvent("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var eventData = { + detail: event, + cancelable: true + }; + var domEvent = new CustomEvent(name, eventData); + es5.defineProperty( + domEvent, "promise", {value: event.promise}); + es5.defineProperty( + domEvent, "reason", {value: event.reason}); + + return dispatch(legacyHandlers[name], domEvent); + }; + } else if (typeof Event === "function") { + var event = new Event("CustomEvent"); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = new Event(name, { + cancelable: true + }); + domEvent.detail = event; + es5.defineProperty(domEvent, "promise", {value: event.promise}); + es5.defineProperty(domEvent, "reason", {value: event.reason}); + return dispatch(legacyHandlers[name], domEvent); + }; + } else { + var event = document.createEvent("CustomEvent"); + event.initCustomEvent("testingtheevent", false, true, {}); + util.global.dispatchEvent(event); + return function(name, event) { + name = name.toLowerCase(); + var domEvent = document.createEvent("CustomEvent"); + domEvent.initCustomEvent(name, false, true, + event); + return dispatch(legacyHandlers[name], domEvent); + }; + } + } catch (e) {} + return function() { + return false; + }; +})(); + +var fireGlobalEvent = (function() { + if (util.isNode) { + return function() { + return process.emit.apply(process, arguments); + }; + } else { + if (!util.global) { + return function() { + return false; + }; + } + return function(name) { + var methodName = "on" + name.toLowerCase(); + var method = util.global[methodName]; + if (!method) return false; + method.apply(util.global, [].slice.call(arguments, 1)); + return true; + }; + } +})(); + +function generatePromiseLifecycleEventObject(name, promise) { + return {promise: promise}; +} + +var eventToObjectGenerator = { + promiseCreated: generatePromiseLifecycleEventObject, + promiseFulfilled: generatePromiseLifecycleEventObject, + promiseRejected: generatePromiseLifecycleEventObject, + promiseResolved: generatePromiseLifecycleEventObject, + promiseCancelled: generatePromiseLifecycleEventObject, + promiseChained: function(name, promise, child) { + return {promise: promise, child: child}; + }, + warning: function(name, warning) { + return {warning: warning}; + }, + unhandledRejection: function (name, reason, promise) { + return {reason: reason, promise: promise}; + }, + rejectionHandled: generatePromiseLifecycleEventObject +}; + +var activeFireEvent = function (name) { + var globalEventFired = false; + try { + globalEventFired = fireGlobalEvent.apply(null, arguments); + } catch (e) { + async.throwLater(e); + globalEventFired = true; + } + + var domEventFired = false; + try { + domEventFired = fireDomEvent(name, + eventToObjectGenerator[name].apply(null, arguments)); + } catch (e) { + async.throwLater(e); + domEventFired = true; + } + + return domEventFired || globalEventFired; +}; + +Promise.config = function(opts) { + opts = Object(opts); + if ("longStackTraces" in opts) { + if (opts.longStackTraces) { + Promise.longStackTraces(); + } else if (!opts.longStackTraces && Promise.hasLongStackTraces()) { + disableLongStackTraces(); + } + } + if ("warnings" in opts) { + var warningsOption = opts.warnings; + config.warnings = !!warningsOption; + wForgottenReturn = config.warnings; + + if (util.isObject(warningsOption)) { + if ("wForgottenReturn" in warningsOption) { + wForgottenReturn = !!warningsOption.wForgottenReturn; + } + } + } + if ("cancellation" in opts && opts.cancellation && !config.cancellation) { + if (async.haveItemsQueued()) { + throw new Error( + "cannot enable cancellation after promises are in use"); + } + Promise.prototype._clearCancellationData = + cancellationClearCancellationData; + Promise.prototype._propagateFrom = cancellationPropagateFrom; + Promise.prototype._onCancel = cancellationOnCancel; + Promise.prototype._setOnCancel = cancellationSetOnCancel; + Promise.prototype._attachCancellationCallback = + cancellationAttachCancellationCallback; + Promise.prototype._execute = cancellationExecute; + propagateFromFunction = cancellationPropagateFrom; + config.cancellation = true; + } + if ("monitoring" in opts) { + if (opts.monitoring && !config.monitoring) { + config.monitoring = true; + Promise.prototype._fireEvent = activeFireEvent; + } else if (!opts.monitoring && config.monitoring) { + config.monitoring = false; + Promise.prototype._fireEvent = defaultFireEvent; + } + } + if ("asyncHooks" in opts && util.nodeSupportsAsyncResource) { + var prev = config.asyncHooks; + var cur = !!opts.asyncHooks; + if (prev !== cur) { + config.asyncHooks = cur; + if (cur) { + enableAsyncHooks(); + } else { + disableAsyncHooks(); + } + } + } + return Promise; +}; + +function defaultFireEvent() { return false; } + +Promise.prototype._fireEvent = defaultFireEvent; +Promise.prototype._execute = function(executor, resolve, reject) { + try { + executor(resolve, reject); + } catch (e) { + return e; + } +}; +Promise.prototype._onCancel = function () {}; +Promise.prototype._setOnCancel = function (handler) { ; }; +Promise.prototype._attachCancellationCallback = function(onCancel) { + ; +}; +Promise.prototype._captureStackTrace = function () {}; +Promise.prototype._attachExtraTrace = function () {}; +Promise.prototype._dereferenceTrace = function () {}; +Promise.prototype._clearCancellationData = function() {}; +Promise.prototype._propagateFrom = function (parent, flags) { + ; + ; +}; + +function cancellationExecute(executor, resolve, reject) { + var promise = this; + try { + executor(resolve, reject, function(onCancel) { + if (typeof onCancel !== "function") { + throw new TypeError("onCancel must be a function, got: " + + util.toString(onCancel)); + } + promise._attachCancellationCallback(onCancel); + }); + } catch (e) { + return e; + } +} + +function cancellationAttachCancellationCallback(onCancel) { + if (!this._isCancellable()) return this; + + var previousOnCancel = this._onCancel(); + if (previousOnCancel !== undefined) { + if (util.isArray(previousOnCancel)) { + previousOnCancel.push(onCancel); + } else { + this._setOnCancel([previousOnCancel, onCancel]); + } + } else { + this._setOnCancel(onCancel); + } +} + +function cancellationOnCancel() { + return this._onCancelField; +} + +function cancellationSetOnCancel(onCancel) { + this._onCancelField = onCancel; +} + +function cancellationClearCancellationData() { + this._cancellationParent = undefined; + this._onCancelField = undefined; +} + +function cancellationPropagateFrom(parent, flags) { + if ((flags & 1) !== 0) { + this._cancellationParent = parent; + var branchesRemainingToCancel = parent._branchesRemainingToCancel; + if (branchesRemainingToCancel === undefined) { + branchesRemainingToCancel = 0; + } + parent._branchesRemainingToCancel = branchesRemainingToCancel + 1; + } + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} + +function bindingPropagateFrom(parent, flags) { + if ((flags & 2) !== 0 && parent._isBound()) { + this._setBoundTo(parent._boundTo); + } +} +var propagateFromFunction = bindingPropagateFrom; + +function boundValueFunction() { + var ret = this._boundTo; + if (ret !== undefined) { + if (ret instanceof Promise) { + if (ret.isFulfilled()) { + return ret.value(); + } else { + return undefined; + } + } + } + return ret; +} + +function longStackTracesCaptureStackTrace() { + this._trace = new CapturedTrace(this._peekContext()); +} + +function longStackTracesAttachExtraTrace(error, ignoreSelf) { + if (canAttachTrace(error)) { + var trace = this._trace; + if (trace !== undefined) { + if (ignoreSelf) trace = trace._parent; + } + if (trace !== undefined) { + trace.attachExtraTrace(error); + } else if (!error.__stackCleaned__) { + var parsed = parseStackAndMessage(error); + util.notEnumerableProp(error, "stack", + parsed.message + "\n" + parsed.stack.join("\n")); + util.notEnumerableProp(error, "__stackCleaned__", true); + } + } +} + +function longStackTracesDereferenceTrace() { + this._trace = undefined; +} + +function checkForgottenReturns(returnValue, promiseCreated, name, promise, + parent) { + if (returnValue === undefined && promiseCreated !== null && + wForgottenReturn) { + if (parent !== undefined && parent._returnedNonUndefined()) return; + if ((promise._bitField & 65535) === 0) return; + + if (name) name = name + " "; + var handlerLine = ""; + var creatorLine = ""; + if (promiseCreated._trace) { + var traceLines = promiseCreated._trace.stack.split("\n"); + var stack = cleanStack(traceLines); + for (var i = stack.length - 1; i >= 0; --i) { + var line = stack[i]; + if (!nodeFramePattern.test(line)) { + var lineMatches = line.match(parseLinePattern); + if (lineMatches) { + handlerLine = "at " + lineMatches[1] + + ":" + lineMatches[2] + ":" + lineMatches[3] + " "; + } + break; + } + } + + if (stack.length > 0) { + var firstUserLine = stack[0]; + for (var i = 0; i < traceLines.length; ++i) { + + if (traceLines[i] === firstUserLine) { + if (i > 0) { + creatorLine = "\n" + traceLines[i - 1]; + } + break; + } + } + + } + } + var msg = "a promise was created in a " + name + + "handler " + handlerLine + "but was not returned from it, " + + "see http://goo.gl/rRqMUw" + + creatorLine; + promise._warn(msg, true, promiseCreated); + } +} + +function deprecated(name, replacement) { + var message = name + + " is deprecated and will be removed in a future version."; + if (replacement) message += " Use " + replacement + " instead."; + return warn(message); +} + +function warn(message, shouldUseOwnTrace, promise) { + if (!config.warnings) return; + var warning = new Warning(message); + var ctx; + if (shouldUseOwnTrace) { + promise._attachExtraTrace(warning); + } else if (config.longStackTraces && (ctx = Promise._peekContext())) { + ctx.attachExtraTrace(warning); + } else { + var parsed = parseStackAndMessage(warning); + warning.stack = parsed.message + "\n" + parsed.stack.join("\n"); + } + + if (!activeFireEvent("warning", warning)) { + formatAndLogError(warning, "", true); + } +} + +function reconstructStack(message, stacks) { + for (var i = 0; i < stacks.length - 1; ++i) { + stacks[i].push("From previous event:"); + stacks[i] = stacks[i].join("\n"); + } + if (i < stacks.length) { + stacks[i] = stacks[i].join("\n"); + } + return message + "\n" + stacks.join("\n"); +} + +function removeDuplicateOrEmptyJumps(stacks) { + for (var i = 0; i < stacks.length; ++i) { + if (stacks[i].length === 0 || + ((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) { + stacks.splice(i, 1); + i--; + } + } +} + +function removeCommonRoots(stacks) { + var current = stacks[0]; + for (var i = 1; i < stacks.length; ++i) { + var prev = stacks[i]; + var currentLastIndex = current.length - 1; + var currentLastLine = current[currentLastIndex]; + var commonRootMeetPoint = -1; + + for (var j = prev.length - 1; j >= 0; --j) { + if (prev[j] === currentLastLine) { + commonRootMeetPoint = j; + break; + } + } + + for (var j = commonRootMeetPoint; j >= 0; --j) { + var line = prev[j]; + if (current[currentLastIndex] === line) { + current.pop(); + currentLastIndex--; + } else { + break; + } + } + current = prev; + } +} + +function cleanStack(stack) { + var ret = []; + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + var isTraceLine = " (No stack trace)" === line || + stackFramePattern.test(line); + var isInternalFrame = isTraceLine && shouldIgnore(line); + if (isTraceLine && !isInternalFrame) { + if (indentStackFrames && line.charAt(0) !== " ") { + line = " " + line; + } + ret.push(line); + } + } + return ret; +} + +function stackFramesAsArray(error) { + var stack = error.stack.replace(/\s+$/g, "").split("\n"); + for (var i = 0; i < stack.length; ++i) { + var line = stack[i]; + if (" (No stack trace)" === line || stackFramePattern.test(line)) { + break; + } + } + if (i > 0 && error.name != "SyntaxError") { + stack = stack.slice(i); + } + return stack; +} + +function parseStackAndMessage(error) { + var stack = error.stack; + var message = error.toString(); + stack = typeof stack === "string" && stack.length > 0 + ? stackFramesAsArray(error) : [" (No stack trace)"]; + return { + message: message, + stack: error.name == "SyntaxError" ? stack : cleanStack(stack) + }; +} + +function formatAndLogError(error, title, isSoft) { + if (typeof console !== "undefined") { + var message; + if (util.isObject(error)) { + var stack = error.stack; + message = title + formatStack(stack, error); + } else { + message = title + String(error); + } + if (typeof printWarning === "function") { + printWarning(message, isSoft); + } else if (typeof console.log === "function" || + typeof console.log === "object") { + console.log(message); + } + } +} + +function fireRejectionEvent(name, localHandler, reason, promise) { + var localEventFired = false; + try { + if (typeof localHandler === "function") { + localEventFired = true; + if (name === "rejectionHandled") { + localHandler(promise); + } else { + localHandler(reason, promise); + } + } + } catch (e) { + async.throwLater(e); + } + + if (name === "unhandledRejection") { + if (!activeFireEvent(name, reason, promise) && !localEventFired) { + formatAndLogError(reason, "Unhandled rejection "); + } + } else { + activeFireEvent(name, promise); + } +} + +function formatNonError(obj) { + var str; + if (typeof obj === "function") { + str = "[function " + + (obj.name || "anonymous") + + "]"; + } else { + str = obj && typeof obj.toString === "function" + ? obj.toString() : util.toString(obj); + var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/; + if (ruselessToString.test(str)) { + try { + var newStr = JSON.stringify(obj); + str = newStr; + } + catch(e) { + + } + } + if (str.length === 0) { + str = "(empty array)"; + } + } + return ("(<" + snip(str) + ">, no stack trace)"); +} + +function snip(str) { + var maxChars = 41; + if (str.length < maxChars) { + return str; + } + return str.substr(0, maxChars - 3) + "..."; +} + +function longStackTracesIsSupported() { + return typeof captureStackTrace === "function"; +} + +var shouldIgnore = function() { return false; }; +var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/; +function parseLineInfo(line) { + var matches = line.match(parseLineInfoRegex); + if (matches) { + return { + fileName: matches[1], + line: parseInt(matches[2], 10) + }; + } +} + +function setBounds(firstLineError, lastLineError) { + if (!longStackTracesIsSupported()) return; + var firstStackLines = (firstLineError.stack || "").split("\n"); + var lastStackLines = (lastLineError.stack || "").split("\n"); + var firstIndex = -1; + var lastIndex = -1; + var firstFileName; + var lastFileName; + for (var i = 0; i < firstStackLines.length; ++i) { + var result = parseLineInfo(firstStackLines[i]); + if (result) { + firstFileName = result.fileName; + firstIndex = result.line; + break; + } + } + for (var i = 0; i < lastStackLines.length; ++i) { + var result = parseLineInfo(lastStackLines[i]); + if (result) { + lastFileName = result.fileName; + lastIndex = result.line; + break; + } + } + if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName || + firstFileName !== lastFileName || firstIndex >= lastIndex) { + return; + } + + shouldIgnore = function(line) { + if (bluebirdFramePattern.test(line)) return true; + var info = parseLineInfo(line); + if (info) { + if (info.fileName === firstFileName && + (firstIndex <= info.line && info.line <= lastIndex)) { + return true; + } + } + return false; + }; +} + +function CapturedTrace(parent) { + this._parent = parent; + this._promisesCreated = 0; + var length = this._length = 1 + (parent === undefined ? 0 : parent._length); + captureStackTrace(this, CapturedTrace); + if (length > 32) this.uncycle(); +} +util.inherits(CapturedTrace, Error); +Context.CapturedTrace = CapturedTrace; + +CapturedTrace.prototype.uncycle = function() { + var length = this._length; + if (length < 2) return; + var nodes = []; + var stackToIndex = {}; + + for (var i = 0, node = this; node !== undefined; ++i) { + nodes.push(node); + node = node._parent; + } + length = this._length = i; + for (var i = length - 1; i >= 0; --i) { + var stack = nodes[i].stack; + if (stackToIndex[stack] === undefined) { + stackToIndex[stack] = i; + } + } + for (var i = 0; i < length; ++i) { + var currentStack = nodes[i].stack; + var index = stackToIndex[currentStack]; + if (index !== undefined && index !== i) { + if (index > 0) { + nodes[index - 1]._parent = undefined; + nodes[index - 1]._length = 1; + } + nodes[i]._parent = undefined; + nodes[i]._length = 1; + var cycleEdgeNode = i > 0 ? nodes[i - 1] : this; + + if (index < length - 1) { + cycleEdgeNode._parent = nodes[index + 1]; + cycleEdgeNode._parent.uncycle(); + cycleEdgeNode._length = + cycleEdgeNode._parent._length + 1; + } else { + cycleEdgeNode._parent = undefined; + cycleEdgeNode._length = 1; + } + var currentChildLength = cycleEdgeNode._length + 1; + for (var j = i - 2; j >= 0; --j) { + nodes[j]._length = currentChildLength; + currentChildLength++; + } + return; + } + } +}; + +CapturedTrace.prototype.attachExtraTrace = function(error) { + if (error.__stackCleaned__) return; + this.uncycle(); + var parsed = parseStackAndMessage(error); + var message = parsed.message; + var stacks = [parsed.stack]; + + var trace = this; + while (trace !== undefined) { + stacks.push(cleanStack(trace.stack.split("\n"))); + trace = trace._parent; + } + removeCommonRoots(stacks); + removeDuplicateOrEmptyJumps(stacks); + util.notEnumerableProp(error, "stack", reconstructStack(message, stacks)); + util.notEnumerableProp(error, "__stackCleaned__", true); +}; + +var captureStackTrace = (function stackDetection() { + var v8stackFramePattern = /^\s*at\s*/; + var v8stackFormatter = function(stack, error) { + if (typeof stack === "string") return stack; + + if (error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + if (typeof Error.stackTraceLimit === "number" && + typeof Error.captureStackTrace === "function") { + Error.stackTraceLimit += 6; + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + var captureStackTrace = Error.captureStackTrace; + + shouldIgnore = function(line) { + return bluebirdFramePattern.test(line); + }; + return function(receiver, ignoreUntil) { + Error.stackTraceLimit += 6; + captureStackTrace(receiver, ignoreUntil); + Error.stackTraceLimit -= 6; + }; + } + var err = new Error(); + + if (typeof err.stack === "string" && + err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) { + stackFramePattern = /@/; + formatStack = v8stackFormatter; + indentStackFrames = true; + return function captureStackTrace(o) { + o.stack = new Error().stack; + }; + } + + var hasStackAfterThrow; + try { throw new Error(); } + catch(e) { + hasStackAfterThrow = ("stack" in e); + } + if (!("stack" in err) && hasStackAfterThrow && + typeof Error.stackTraceLimit === "number") { + stackFramePattern = v8stackFramePattern; + formatStack = v8stackFormatter; + return function captureStackTrace(o) { + Error.stackTraceLimit += 6; + try { throw new Error(); } + catch(e) { o.stack = e.stack; } + Error.stackTraceLimit -= 6; + }; + } + + formatStack = function(stack, error) { + if (typeof stack === "string") return stack; + + if ((typeof error === "object" || + typeof error === "function") && + error.name !== undefined && + error.message !== undefined) { + return error.toString(); + } + return formatNonError(error); + }; + + return null; + +})([]); + +if (typeof console !== "undefined" && typeof console.warn !== "undefined") { + printWarning = function (message) { + console.warn(message); + }; + if (util.isNode && process.stderr.isTTY) { + printWarning = function(message, isSoft) { + var color = isSoft ? "\u001b[33m" : "\u001b[31m"; + console.warn(color + message + "\u001b[0m\n"); + }; + } else if (!util.isNode && typeof (new Error().stack) === "string") { + printWarning = function(message, isSoft) { + console.warn("%c" + message, + isSoft ? "color: darkorange" : "color: red"); + }; + } +} + +var config = { + warnings: warnings, + longStackTraces: false, + cancellation: false, + monitoring: false, + asyncHooks: false +}; + +if (longStackTraces) Promise.longStackTraces(); + +return { + asyncHooks: function() { + return config.asyncHooks; + }, + longStackTraces: function() { + return config.longStackTraces; + }, + warnings: function() { + return config.warnings; + }, + cancellation: function() { + return config.cancellation; + }, + monitoring: function() { + return config.monitoring; + }, + propagateFromFunction: function() { + return propagateFromFunction; + }, + boundValueFunction: function() { + return boundValueFunction; + }, + checkForgottenReturns: checkForgottenReturns, + setBounds: setBounds, + warn: warn, + deprecated: deprecated, + CapturedTrace: CapturedTrace, + fireDomEvent: fireDomEvent, + fireGlobalEvent: fireGlobalEvent +}; +}; diff --git a/node_modules/bluebird/js/release/direct_resolve.js b/node_modules/bluebird/js/release/direct_resolve.js new file mode 100644 index 0000000..a890298 --- /dev/null +++ b/node_modules/bluebird/js/release/direct_resolve.js @@ -0,0 +1,46 @@ +"use strict"; +module.exports = function(Promise) { +function returner() { + return this.value; +} +function thrower() { + throw this.reason; +} + +Promise.prototype["return"] = +Promise.prototype.thenReturn = function (value) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + returner, undefined, undefined, {value: value}, undefined); +}; + +Promise.prototype["throw"] = +Promise.prototype.thenThrow = function (reason) { + return this._then( + thrower, undefined, undefined, {reason: reason}, undefined); +}; + +Promise.prototype.catchThrow = function (reason) { + if (arguments.length <= 1) { + return this._then( + undefined, thrower, undefined, {reason: reason}, undefined); + } else { + var _reason = arguments[1]; + var handler = function() {throw _reason;}; + return this.caught(reason, handler); + } +}; + +Promise.prototype.catchReturn = function (value) { + if (arguments.length <= 1) { + if (value instanceof Promise) value.suppressUnhandledRejections(); + return this._then( + undefined, returner, undefined, {value: value}, undefined); + } else { + var _value = arguments[1]; + if (_value instanceof Promise) _value.suppressUnhandledRejections(); + var handler = function() {return _value;}; + return this.caught(value, handler); + } +}; +}; diff --git a/node_modules/bluebird/js/release/each.js b/node_modules/bluebird/js/release/each.js new file mode 100644 index 0000000..e4f3d05 --- /dev/null +++ b/node_modules/bluebird/js/release/each.js @@ -0,0 +1,30 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseReduce = Promise.reduce; +var PromiseAll = Promise.all; + +function promiseAllThis() { + return PromiseAll(this); +} + +function PromiseMapSeries(promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, INTERNAL); +} + +Promise.prototype.each = function (fn) { + return PromiseReduce(this, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, this, undefined); +}; + +Promise.prototype.mapSeries = function (fn) { + return PromiseReduce(this, fn, INTERNAL, INTERNAL); +}; + +Promise.each = function (promises, fn) { + return PromiseReduce(promises, fn, INTERNAL, 0) + ._then(promiseAllThis, undefined, undefined, promises, undefined); +}; + +Promise.mapSeries = PromiseMapSeries; +}; + diff --git a/node_modules/bluebird/js/release/errors.js b/node_modules/bluebird/js/release/errors.js new file mode 100644 index 0000000..f62f323 --- /dev/null +++ b/node_modules/bluebird/js/release/errors.js @@ -0,0 +1,116 @@ +"use strict"; +var es5 = require("./es5"); +var Objectfreeze = es5.freeze; +var util = require("./util"); +var inherits = util.inherits; +var notEnumerableProp = util.notEnumerableProp; + +function subError(nameProperty, defaultMessage) { + function SubError(message) { + if (!(this instanceof SubError)) return new SubError(message); + notEnumerableProp(this, "message", + typeof message === "string" ? message : defaultMessage); + notEnumerableProp(this, "name", nameProperty); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + Error.call(this); + } + } + inherits(SubError, Error); + return SubError; +} + +var _TypeError, _RangeError; +var Warning = subError("Warning", "warning"); +var CancellationError = subError("CancellationError", "cancellation error"); +var TimeoutError = subError("TimeoutError", "timeout error"); +var AggregateError = subError("AggregateError", "aggregate error"); +try { + _TypeError = TypeError; + _RangeError = RangeError; +} catch(e) { + _TypeError = subError("TypeError", "type error"); + _RangeError = subError("RangeError", "range error"); +} + +var methods = ("join pop push shift unshift slice filter forEach some " + + "every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" "); + +for (var i = 0; i < methods.length; ++i) { + if (typeof Array.prototype[methods[i]] === "function") { + AggregateError.prototype[methods[i]] = Array.prototype[methods[i]]; + } +} + +es5.defineProperty(AggregateError.prototype, "length", { + value: 0, + configurable: false, + writable: true, + enumerable: true +}); +AggregateError.prototype["isOperational"] = true; +var level = 0; +AggregateError.prototype.toString = function() { + var indent = Array(level * 4 + 1).join(" "); + var ret = "\n" + indent + "AggregateError of:" + "\n"; + level++; + indent = Array(level * 4 + 1).join(" "); + for (var i = 0; i < this.length; ++i) { + var str = this[i] === this ? "[Circular AggregateError]" : this[i] + ""; + var lines = str.split("\n"); + for (var j = 0; j < lines.length; ++j) { + lines[j] = indent + lines[j]; + } + str = lines.join("\n"); + ret += str + "\n"; + } + level--; + return ret; +}; + +function OperationalError(message) { + if (!(this instanceof OperationalError)) + return new OperationalError(message); + notEnumerableProp(this, "name", "OperationalError"); + notEnumerableProp(this, "message", message); + this.cause = message; + this["isOperational"] = true; + + if (message instanceof Error) { + notEnumerableProp(this, "message", message.message); + notEnumerableProp(this, "stack", message.stack); + } else if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + +} +inherits(OperationalError, Error); + +var errorTypes = Error["__BluebirdErrorTypes__"]; +if (!errorTypes) { + errorTypes = Objectfreeze({ + CancellationError: CancellationError, + TimeoutError: TimeoutError, + OperationalError: OperationalError, + RejectionError: OperationalError, + AggregateError: AggregateError + }); + es5.defineProperty(Error, "__BluebirdErrorTypes__", { + value: errorTypes, + writable: false, + enumerable: false, + configurable: false + }); +} + +module.exports = { + Error: Error, + TypeError: _TypeError, + RangeError: _RangeError, + CancellationError: errorTypes.CancellationError, + OperationalError: errorTypes.OperationalError, + TimeoutError: errorTypes.TimeoutError, + AggregateError: errorTypes.AggregateError, + Warning: Warning +}; diff --git a/node_modules/bluebird/js/release/es5.js b/node_modules/bluebird/js/release/es5.js new file mode 100644 index 0000000..ea41d5a --- /dev/null +++ b/node_modules/bluebird/js/release/es5.js @@ -0,0 +1,80 @@ +var isES5 = (function(){ + "use strict"; + return this === undefined; +})(); + +if (isES5) { + module.exports = { + freeze: Object.freeze, + defineProperty: Object.defineProperty, + getDescriptor: Object.getOwnPropertyDescriptor, + keys: Object.keys, + names: Object.getOwnPropertyNames, + getPrototypeOf: Object.getPrototypeOf, + isArray: Array.isArray, + isES5: isES5, + propertyIsWritable: function(obj, prop) { + var descriptor = Object.getOwnPropertyDescriptor(obj, prop); + return !!(!descriptor || descriptor.writable || descriptor.set); + } + }; +} else { + var has = {}.hasOwnProperty; + var str = {}.toString; + var proto = {}.constructor.prototype; + + var ObjectKeys = function (o) { + var ret = []; + for (var key in o) { + if (has.call(o, key)) { + ret.push(key); + } + } + return ret; + }; + + var ObjectGetDescriptor = function(o, key) { + return {value: o[key]}; + }; + + var ObjectDefineProperty = function (o, key, desc) { + o[key] = desc.value; + return o; + }; + + var ObjectFreeze = function (obj) { + return obj; + }; + + var ObjectGetPrototypeOf = function (obj) { + try { + return Object(obj).constructor.prototype; + } + catch (e) { + return proto; + } + }; + + var ArrayIsArray = function (obj) { + try { + return str.call(obj) === "[object Array]"; + } + catch(e) { + return false; + } + }; + + module.exports = { + isArray: ArrayIsArray, + keys: ObjectKeys, + names: ObjectKeys, + defineProperty: ObjectDefineProperty, + getDescriptor: ObjectGetDescriptor, + freeze: ObjectFreeze, + getPrototypeOf: ObjectGetPrototypeOf, + isES5: isES5, + propertyIsWritable: function() { + return true; + } + }; +} diff --git a/node_modules/bluebird/js/release/filter.js b/node_modules/bluebird/js/release/filter.js new file mode 100644 index 0000000..ed57bf0 --- /dev/null +++ b/node_modules/bluebird/js/release/filter.js @@ -0,0 +1,12 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var PromiseMap = Promise.map; + +Promise.prototype.filter = function (fn, options) { + return PromiseMap(this, fn, options, INTERNAL); +}; + +Promise.filter = function (promises, fn, options) { + return PromiseMap(promises, fn, options, INTERNAL); +}; +}; diff --git a/node_modules/bluebird/js/release/finally.js b/node_modules/bluebird/js/release/finally.js new file mode 100644 index 0000000..d57444b --- /dev/null +++ b/node_modules/bluebird/js/release/finally.js @@ -0,0 +1,146 @@ +"use strict"; +module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) { +var util = require("./util"); +var CancellationError = Promise.CancellationError; +var errorObj = util.errorObj; +var catchFilter = require("./catch_filter")(NEXT_FILTER); + +function PassThroughHandlerContext(promise, type, handler) { + this.promise = promise; + this.type = type; + this.handler = handler; + this.called = false; + this.cancelPromise = null; +} + +PassThroughHandlerContext.prototype.isFinallyHandler = function() { + return this.type === 0; +}; + +function FinallyHandlerCancelReaction(finallyHandler) { + this.finallyHandler = finallyHandler; +} + +FinallyHandlerCancelReaction.prototype._resultCancelled = function() { + checkCancel(this.finallyHandler); +}; + +function checkCancel(ctx, reason) { + if (ctx.cancelPromise != null) { + if (arguments.length > 1) { + ctx.cancelPromise._reject(reason); + } else { + ctx.cancelPromise._cancel(); + } + ctx.cancelPromise = null; + return true; + } + return false; +} + +function succeed() { + return finallyHandler.call(this, this.promise._target()._settledValue()); +} +function fail(reason) { + if (checkCancel(this, reason)) return; + errorObj.e = reason; + return errorObj; +} +function finallyHandler(reasonOrValue) { + var promise = this.promise; + var handler = this.handler; + + if (!this.called) { + this.called = true; + var ret = this.isFinallyHandler() + ? handler.call(promise._boundValue()) + : handler.call(promise._boundValue(), reasonOrValue); + if (ret === NEXT_FILTER) { + return ret; + } else if (ret !== undefined) { + promise._setReturnedNonUndefined(); + var maybePromise = tryConvertToPromise(ret, promise); + if (maybePromise instanceof Promise) { + if (this.cancelPromise != null) { + if (maybePromise._isCancelled()) { + var reason = + new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + errorObj.e = reason; + return errorObj; + } else if (maybePromise.isPending()) { + maybePromise._attachCancellationCallback( + new FinallyHandlerCancelReaction(this)); + } + } + return maybePromise._then( + succeed, fail, undefined, this, undefined); + } + } + } + + if (promise.isRejected()) { + checkCancel(this); + errorObj.e = reasonOrValue; + return errorObj; + } else { + checkCancel(this); + return reasonOrValue; + } +} + +Promise.prototype._passThrough = function(handler, type, success, fail) { + if (typeof handler !== "function") return this.then(); + return this._then(success, + fail, + undefined, + new PassThroughHandlerContext(this, type, handler), + undefined); +}; + +Promise.prototype.lastly = +Promise.prototype["finally"] = function (handler) { + return this._passThrough(handler, + 0, + finallyHandler, + finallyHandler); +}; + + +Promise.prototype.tap = function (handler) { + return this._passThrough(handler, 1, finallyHandler); +}; + +Promise.prototype.tapCatch = function (handlerOrPredicate) { + var len = arguments.length; + if(len === 1) { + return this._passThrough(handlerOrPredicate, + 1, + undefined, + finallyHandler); + } else { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return Promise.reject(new TypeError( + "tapCatch statement predicate: " + + "expecting an object but got " + util.classString(item) + )); + } + } + catchInstances.length = j; + var handler = arguments[i]; + return this._passThrough(catchFilter(catchInstances, handler, this), + 1, + undefined, + finallyHandler); + } + +}; + +return PassThroughHandlerContext; +}; diff --git a/node_modules/bluebird/js/release/generators.js b/node_modules/bluebird/js/release/generators.js new file mode 100644 index 0000000..500c280 --- /dev/null +++ b/node_modules/bluebird/js/release/generators.js @@ -0,0 +1,223 @@ +"use strict"; +module.exports = function(Promise, + apiRejection, + INTERNAL, + tryConvertToPromise, + Proxyable, + debug) { +var errors = require("./errors"); +var TypeError = errors.TypeError; +var util = require("./util"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +var yieldHandlers = []; + +function promiseFromYieldHandler(value, yieldHandlers, traceParent) { + for (var i = 0; i < yieldHandlers.length; ++i) { + traceParent._pushContext(); + var result = tryCatch(yieldHandlers[i])(value); + traceParent._popContext(); + if (result === errorObj) { + traceParent._pushContext(); + var ret = Promise.reject(errorObj.e); + traceParent._popContext(); + return ret; + } + var maybePromise = tryConvertToPromise(result, traceParent); + if (maybePromise instanceof Promise) return maybePromise; + } + return null; +} + +function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) { + if (debug.cancellation()) { + var internal = new Promise(INTERNAL); + var _finallyPromise = this._finallyPromise = new Promise(INTERNAL); + this._promise = internal.lastly(function() { + return _finallyPromise; + }); + internal._captureStackTrace(); + internal._setOnCancel(this); + } else { + var promise = this._promise = new Promise(INTERNAL); + promise._captureStackTrace(); + } + this._stack = stack; + this._generatorFunction = generatorFunction; + this._receiver = receiver; + this._generator = undefined; + this._yieldHandlers = typeof yieldHandler === "function" + ? [yieldHandler].concat(yieldHandlers) + : yieldHandlers; + this._yieldedPromise = null; + this._cancellationPhase = false; +} +util.inherits(PromiseSpawn, Proxyable); + +PromiseSpawn.prototype._isResolved = function() { + return this._promise === null; +}; + +PromiseSpawn.prototype._cleanup = function() { + this._promise = this._generator = null; + if (debug.cancellation() && this._finallyPromise !== null) { + this._finallyPromise._fulfill(); + this._finallyPromise = null; + } +}; + +PromiseSpawn.prototype._promiseCancelled = function() { + if (this._isResolved()) return; + var implementsReturn = typeof this._generator["return"] !== "undefined"; + + var result; + if (!implementsReturn) { + var reason = new Promise.CancellationError( + "generator .return() sentinel"); + Promise.coroutine.returnSentinel = reason; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + result = tryCatch(this._generator["throw"]).call(this._generator, + reason); + this._promise._popContext(); + } else { + this._promise._pushContext(); + result = tryCatch(this._generator["return"]).call(this._generator, + undefined); + this._promise._popContext(); + } + this._cancellationPhase = true; + this._yieldedPromise = null; + this._continue(result); +}; + +PromiseSpawn.prototype._promiseFulfilled = function(value) { + this._yieldedPromise = null; + this._promise._pushContext(); + var result = tryCatch(this._generator.next).call(this._generator, value); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._promiseRejected = function(reason) { + this._yieldedPromise = null; + this._promise._attachExtraTrace(reason); + this._promise._pushContext(); + var result = tryCatch(this._generator["throw"]) + .call(this._generator, reason); + this._promise._popContext(); + this._continue(result); +}; + +PromiseSpawn.prototype._resultCancelled = function() { + if (this._yieldedPromise instanceof Promise) { + var promise = this._yieldedPromise; + this._yieldedPromise = null; + promise.cancel(); + } +}; + +PromiseSpawn.prototype.promise = function () { + return this._promise; +}; + +PromiseSpawn.prototype._run = function () { + this._generator = this._generatorFunction.call(this._receiver); + this._receiver = + this._generatorFunction = undefined; + this._promiseFulfilled(undefined); +}; + +PromiseSpawn.prototype._continue = function (result) { + var promise = this._promise; + if (result === errorObj) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._rejectCallback(result.e, false); + } + } + + var value = result.value; + if (result.done === true) { + this._cleanup(); + if (this._cancellationPhase) { + return promise.cancel(); + } else { + return promise._resolveCallback(value); + } + } else { + var maybePromise = tryConvertToPromise(value, this._promise); + if (!(maybePromise instanceof Promise)) { + maybePromise = + promiseFromYieldHandler(maybePromise, + this._yieldHandlers, + this._promise); + if (maybePromise === null) { + this._promiseRejected( + new TypeError( + "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) + + "From coroutine:\u000a" + + this._stack.split("\n").slice(1, -7).join("\n") + ) + ); + return; + } + } + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + this._yieldedPromise = maybePromise; + maybePromise._proxy(this, null); + } else if (((bitField & 33554432) !== 0)) { + Promise._async.invoke( + this._promiseFulfilled, this, maybePromise._value() + ); + } else if (((bitField & 16777216) !== 0)) { + Promise._async.invoke( + this._promiseRejected, this, maybePromise._reason() + ); + } else { + this._promiseCancelled(); + } + } +}; + +Promise.coroutine = function (generatorFunction, options) { + if (typeof generatorFunction !== "function") { + throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var yieldHandler = Object(options).yieldHandler; + var PromiseSpawn$ = PromiseSpawn; + var stack = new Error().stack; + return function () { + var generator = generatorFunction.apply(this, arguments); + var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler, + stack); + var ret = spawn.promise(); + spawn._generator = generator; + spawn._promiseFulfilled(undefined); + return ret; + }; +}; + +Promise.coroutine.addYieldHandler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + yieldHandlers.push(fn); +}; + +Promise.spawn = function (generatorFunction) { + debug.deprecated("Promise.spawn()", "Promise.coroutine()"); + if (typeof generatorFunction !== "function") { + return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var spawn = new PromiseSpawn(generatorFunction, this); + var ret = spawn.promise(); + spawn._run(Promise.spawn); + return ret; +}; +}; diff --git a/node_modules/bluebird/js/release/join.js b/node_modules/bluebird/js/release/join.js new file mode 100644 index 0000000..e7e19f0 --- /dev/null +++ b/node_modules/bluebird/js/release/join.js @@ -0,0 +1,165 @@ +"use strict"; +module.exports = +function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) { +var util = require("./util"); +var canEvaluate = util.canEvaluate; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var reject; + +if (!false) { +if (canEvaluate) { + var thenCallback = function(i) { + return new Function("value", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = value; \n\ + holder.checkFulfillment(this); \n\ + ".replace(/Index/g, i)); + }; + + var promiseSetter = function(i) { + return new Function("promise", "holder", " \n\ + 'use strict'; \n\ + holder.pIndex = promise; \n\ + ".replace(/Index/g, i)); + }; + + var generateHolderClass = function(total) { + var props = new Array(total); + for (var i = 0; i < props.length; ++i) { + props[i] = "this.p" + (i+1); + } + var assignment = props.join(" = ") + " = null;"; + var cancellationCode= "var promise;\n" + props.map(function(prop) { + return " \n\ + promise = " + prop + "; \n\ + if (promise instanceof Promise) { \n\ + promise.cancel(); \n\ + } \n\ + "; + }).join("\n"); + var passedArguments = props.join(", "); + var name = "Holder$" + total; + + + var code = "return function(tryCatch, errorObj, Promise, async) { \n\ + 'use strict'; \n\ + function [TheName](fn) { \n\ + [TheProperties] \n\ + this.fn = fn; \n\ + this.asyncNeeded = true; \n\ + this.now = 0; \n\ + } \n\ + \n\ + [TheName].prototype._callFunction = function(promise) { \n\ + promise._pushContext(); \n\ + var ret = tryCatch(this.fn)([ThePassedArguments]); \n\ + promise._popContext(); \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(ret.e, false); \n\ + } else { \n\ + promise._resolveCallback(ret); \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype.checkFulfillment = function(promise) { \n\ + var now = ++this.now; \n\ + if (now === [TheTotal]) { \n\ + if (this.asyncNeeded) { \n\ + async.invoke(this._callFunction, this, promise); \n\ + } else { \n\ + this._callFunction(promise); \n\ + } \n\ + \n\ + } \n\ + }; \n\ + \n\ + [TheName].prototype._resultCancelled = function() { \n\ + [CancellationCode] \n\ + }; \n\ + \n\ + return [TheName]; \n\ + }(tryCatch, errorObj, Promise, async); \n\ + "; + + code = code.replace(/\[TheName\]/g, name) + .replace(/\[TheTotal\]/g, total) + .replace(/\[ThePassedArguments\]/g, passedArguments) + .replace(/\[TheProperties\]/g, assignment) + .replace(/\[CancellationCode\]/g, cancellationCode); + + return new Function("tryCatch", "errorObj", "Promise", "async", code) + (tryCatch, errorObj, Promise, async); + }; + + var holderClasses = []; + var thenCallbacks = []; + var promiseSetters = []; + + for (var i = 0; i < 8; ++i) { + holderClasses.push(generateHolderClass(i + 1)); + thenCallbacks.push(thenCallback(i + 1)); + promiseSetters.push(promiseSetter(i + 1)); + } + + reject = function (reason) { + this._reject(reason); + }; +}} + +Promise.join = function () { + var last = arguments.length - 1; + var fn; + if (last > 0 && typeof arguments[last] === "function") { + fn = arguments[last]; + if (!false) { + if (last <= 8 && canEvaluate) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var HolderClass = holderClasses[last - 1]; + var holder = new HolderClass(fn); + var callbacks = thenCallbacks; + + for (var i = 0; i < last; ++i) { + var maybePromise = tryConvertToPromise(arguments[i], ret); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + maybePromise._then(callbacks[i], reject, + undefined, ret, holder); + promiseSetters[i](maybePromise, holder); + holder.asyncNeeded = false; + } else if (((bitField & 33554432) !== 0)) { + callbacks[i].call(ret, + maybePromise._value(), holder); + } else if (((bitField & 16777216) !== 0)) { + ret._reject(maybePromise._reason()); + } else { + ret._cancel(); + } + } else { + callbacks[i].call(ret, maybePromise, holder); + } + } + + if (!ret._isFateSealed()) { + if (holder.asyncNeeded) { + var context = Promise._getContext(); + holder.fn = util.contextBind(context, holder.fn); + } + ret._setAsyncGuaranteed(); + ret._setOnCancel(holder); + } + return ret; + } + } + } + var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i ];}; + if (fn) args.pop(); + var ret = new PromiseArray(args).promise(); + return fn !== undefined ? ret.spread(fn) : ret; +}; + +}; diff --git a/node_modules/bluebird/js/release/map.js b/node_modules/bluebird/js/release/map.js new file mode 100644 index 0000000..91d5a82 --- /dev/null +++ b/node_modules/bluebird/js/release/map.js @@ -0,0 +1,175 @@ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; +var async = Promise._async; + +function MappingPromiseArray(promises, fn, limit, _filter) { + this.constructor$(promises); + this._promise._captureStackTrace(); + var context = Promise._getContext(); + this._callback = util.contextBind(context, fn); + this._preservedValues = _filter === INTERNAL + ? new Array(this.length()) + : null; + this._limit = limit; + this._inFlight = 0; + this._queue = []; + async.invoke(this._asyncInit, this, undefined); + if (util.isArray(promises)) { + for (var i = 0; i < promises.length; ++i) { + var maybePromise = promises[i]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + } +} +util.inherits(MappingPromiseArray, PromiseArray); + +MappingPromiseArray.prototype._asyncInit = function() { + this._init$(undefined, -2); +}; + +MappingPromiseArray.prototype._init = function () {}; + +MappingPromiseArray.prototype._promiseFulfilled = function (value, index) { + var values = this._values; + var length = this.length(); + var preservedValues = this._preservedValues; + var limit = this._limit; + + if (index < 0) { + index = (index * -1) - 1; + values[index] = value; + if (limit >= 1) { + this._inFlight--; + this._drainQueue(); + if (this._isResolved()) return true; + } + } else { + if (limit >= 1 && this._inFlight >= limit) { + values[index] = value; + this._queue.push(index); + return false; + } + if (preservedValues !== null) preservedValues[index] = value; + + var promise = this._promise; + var callback = this._callback; + var receiver = promise._boundValue(); + promise._pushContext(); + var ret = tryCatch(callback).call(receiver, value, index, length); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + preservedValues !== null ? "Promise.filter" : "Promise.map", + promise + ); + if (ret === errorObj) { + this._reject(ret.e); + return true; + } + + var maybePromise = tryConvertToPromise(ret, this._promise); + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + var bitField = maybePromise._bitField; + ; + if (((bitField & 50397184) === 0)) { + if (limit >= 1) this._inFlight++; + values[index] = maybePromise; + maybePromise._proxy(this, (index + 1) * -1); + return false; + } else if (((bitField & 33554432) !== 0)) { + ret = maybePromise._value(); + } else if (((bitField & 16777216) !== 0)) { + this._reject(maybePromise._reason()); + return true; + } else { + this._cancel(); + return true; + } + } + values[index] = ret; + } + var totalResolved = ++this._totalResolved; + if (totalResolved >= length) { + if (preservedValues !== null) { + this._filter(values, preservedValues); + } else { + this._resolve(values); + } + return true; + } + return false; +}; + +MappingPromiseArray.prototype._drainQueue = function () { + var queue = this._queue; + var limit = this._limit; + var values = this._values; + while (queue.length > 0 && this._inFlight < limit) { + if (this._isResolved()) return; + var index = queue.pop(); + this._promiseFulfilled(values[index], index); + } +}; + +MappingPromiseArray.prototype._filter = function (booleans, values) { + var len = values.length; + var ret = new Array(len); + var j = 0; + for (var i = 0; i < len; ++i) { + if (booleans[i]) ret[j++] = values[i]; + } + ret.length = j; + this._resolve(ret); +}; + +MappingPromiseArray.prototype.preservedValues = function () { + return this._preservedValues; +}; + +function map(promises, fn, options, _filter) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + + var limit = 0; + if (options !== undefined) { + if (typeof options === "object" && options !== null) { + if (typeof options.concurrency !== "number") { + return Promise.reject( + new TypeError("'concurrency' must be a number but it is " + + util.classString(options.concurrency))); + } + limit = options.concurrency; + } else { + return Promise.reject(new TypeError( + "options argument must be an object but it is " + + util.classString(options))); + } + } + limit = typeof limit === "number" && + isFinite(limit) && limit >= 1 ? limit : 0; + return new MappingPromiseArray(promises, fn, limit, _filter).promise(); +} + +Promise.prototype.map = function (fn, options) { + return map(this, fn, options, null); +}; + +Promise.map = function (promises, fn, options, _filter) { + return map(promises, fn, options, _filter); +}; + + +}; diff --git a/node_modules/bluebird/js/release/method.js b/node_modules/bluebird/js/release/method.js new file mode 100644 index 0000000..ce9e4db --- /dev/null +++ b/node_modules/bluebird/js/release/method.js @@ -0,0 +1,55 @@ +"use strict"; +module.exports = +function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; + +Promise.method = function (fn) { + if (typeof fn !== "function") { + throw new Promise.TypeError("expecting a function but got " + util.classString(fn)); + } + return function () { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value = tryCatch(fn).apply(this, arguments); + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.method", ret); + ret._resolveFromSyncValue(value); + return ret; + }; +}; + +Promise.attempt = Promise["try"] = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._pushContext(); + var value; + if (arguments.length > 1) { + debug.deprecated("calling Promise.try with more than 1 argument"); + var arg = arguments[1]; + var ctx = arguments[2]; + value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg) + : tryCatch(fn).call(ctx, arg); + } else { + value = tryCatch(fn)(); + } + var promiseCreated = ret._popContext(); + debug.checkForgottenReturns( + value, promiseCreated, "Promise.try", ret); + ret._resolveFromSyncValue(value); + return ret; +}; + +Promise.prototype._resolveFromSyncValue = function (value) { + if (value === util.errorObj) { + this._rejectCallback(value.e, false); + } else { + this._resolveCallback(value, true); + } +}; +}; diff --git a/node_modules/bluebird/js/release/nodeback.js b/node_modules/bluebird/js/release/nodeback.js new file mode 100644 index 0000000..71e69eb --- /dev/null +++ b/node_modules/bluebird/js/release/nodeback.js @@ -0,0 +1,51 @@ +"use strict"; +var util = require("./util"); +var maybeWrapAsError = util.maybeWrapAsError; +var errors = require("./errors"); +var OperationalError = errors.OperationalError; +var es5 = require("./es5"); + +function isUntypedError(obj) { + return obj instanceof Error && + es5.getPrototypeOf(obj) === Error.prototype; +} + +var rErrorKey = /^(?:name|message|stack|cause)$/; +function wrapAsOperationalError(obj) { + var ret; + if (isUntypedError(obj)) { + ret = new OperationalError(obj); + ret.name = obj.name; + ret.message = obj.message; + ret.stack = obj.stack; + var keys = es5.keys(obj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (!rErrorKey.test(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + util.markAsOriginatingFromRejection(obj); + return obj; +} + +function nodebackForPromise(promise, multiArgs) { + return function(err, value) { + if (promise === null) return; + if (err) { + var wrapped = wrapAsOperationalError(maybeWrapAsError(err)); + promise._attachExtraTrace(wrapped); + promise._reject(wrapped); + } else if (!multiArgs) { + promise._fulfill(value); + } else { + var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}; + promise._fulfill(args); + } + promise = null; + }; +} + +module.exports = nodebackForPromise; diff --git a/node_modules/bluebird/js/release/nodeify.js b/node_modules/bluebird/js/release/nodeify.js new file mode 100644 index 0000000..ce2b190 --- /dev/null +++ b/node_modules/bluebird/js/release/nodeify.js @@ -0,0 +1,58 @@ +"use strict"; +module.exports = function(Promise) { +var util = require("./util"); +var async = Promise._async; +var tryCatch = util.tryCatch; +var errorObj = util.errorObj; + +function spreadAdapter(val, nodeback) { + var promise = this; + if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback); + var ret = + tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val)); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +function successAdapter(val, nodeback) { + var promise = this; + var receiver = promise._boundValue(); + var ret = val === undefined + ? tryCatch(nodeback).call(receiver, null) + : tryCatch(nodeback).call(receiver, null, val); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} +function errorAdapter(reason, nodeback) { + var promise = this; + if (!reason) { + var newReason = new Error(reason + ""); + newReason.cause = reason; + reason = newReason; + } + var ret = tryCatch(nodeback).call(promise._boundValue(), reason); + if (ret === errorObj) { + async.throwLater(ret.e); + } +} + +Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback, + options) { + if (typeof nodeback == "function") { + var adapter = successAdapter; + if (options !== undefined && Object(options).spread) { + adapter = spreadAdapter; + } + this._then( + adapter, + errorAdapter, + undefined, + this, + nodeback + ); + } + return this; +}; +}; diff --git a/node_modules/bluebird/js/release/promise.js b/node_modules/bluebird/js/release/promise.js new file mode 100644 index 0000000..622a86f --- /dev/null +++ b/node_modules/bluebird/js/release/promise.js @@ -0,0 +1,819 @@ +"use strict"; +module.exports = function() { +var makeSelfResolutionError = function () { + return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var reflectHandler = function() { + return new Promise.PromiseInspection(this._target()); +}; +var apiRejection = function(msg) { + return Promise.reject(new TypeError(msg)); +}; +function Proxyable() {} +var UNDEFINED_BINDING = {}; +var util = require("./util"); +util.setReflectHandler(reflectHandler); + +var getDomain = function() { + var domain = process.domain; + if (domain === undefined) { + return null; + } + return domain; +}; +var getContextDefault = function() { + return null; +}; +var getContextDomain = function() { + return { + domain: getDomain(), + async: null + }; +}; +var AsyncResource = util.isNode && util.nodeSupportsAsyncResource ? + require("async_hooks").AsyncResource : null; +var getContextAsyncHooks = function() { + return { + domain: getDomain(), + async: new AsyncResource("Bluebird::Promise") + }; +}; +var getContext = util.isNode ? getContextDomain : getContextDefault; +util.notEnumerableProp(Promise, "_getContext", getContext); +var enableAsyncHooks = function() { + getContext = getContextAsyncHooks; + util.notEnumerableProp(Promise, "_getContext", getContextAsyncHooks); +}; +var disableAsyncHooks = function() { + getContext = getContextDomain; + util.notEnumerableProp(Promise, "_getContext", getContextDomain); +}; + +var es5 = require("./es5"); +var Async = require("./async"); +var async = new Async(); +es5.defineProperty(Promise, "_async", {value: async}); +var errors = require("./errors"); +var TypeError = Promise.TypeError = errors.TypeError; +Promise.RangeError = errors.RangeError; +var CancellationError = Promise.CancellationError = errors.CancellationError; +Promise.TimeoutError = errors.TimeoutError; +Promise.OperationalError = errors.OperationalError; +Promise.RejectionError = errors.OperationalError; +Promise.AggregateError = errors.AggregateError; +var INTERNAL = function(){}; +var APPLY = {}; +var NEXT_FILTER = {}; +var tryConvertToPromise = require("./thenables")(Promise, INTERNAL); +var PromiseArray = + require("./promise_array")(Promise, INTERNAL, + tryConvertToPromise, apiRejection, Proxyable); +var Context = require("./context")(Promise); + /*jshint unused:false*/ +var createContext = Context.create; + +var debug = require("./debuggability")(Promise, Context, + enableAsyncHooks, disableAsyncHooks); +var CapturedTrace = debug.CapturedTrace; +var PassThroughHandlerContext = + require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER); +var catchFilter = require("./catch_filter")(NEXT_FILTER); +var nodebackForPromise = require("./nodeback"); +var errorObj = util.errorObj; +var tryCatch = util.tryCatch; +function check(self, executor) { + if (self == null || self.constructor !== Promise) { + throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + if (typeof executor !== "function") { + throw new TypeError("expecting a function but got " + util.classString(executor)); + } + +} + +function Promise(executor) { + if (executor !== INTERNAL) { + check(this, executor); + } + this._bitField = 0; + this._fulfillmentHandler0 = undefined; + this._rejectionHandler0 = undefined; + this._promise0 = undefined; + this._receiver0 = undefined; + this._resolveFromExecutor(executor); + this._promiseCreated(); + this._fireEvent("promiseCreated", this); +} + +Promise.prototype.toString = function () { + return "[object Promise]"; +}; + +Promise.prototype.caught = Promise.prototype["catch"] = function (fn) { + var len = arguments.length; + if (len > 1) { + var catchInstances = new Array(len - 1), + j = 0, i; + for (i = 0; i < len - 1; ++i) { + var item = arguments[i]; + if (util.isObject(item)) { + catchInstances[j++] = item; + } else { + return apiRejection("Catch statement predicate: " + + "expecting an object but got " + util.classString(item)); + } + } + catchInstances.length = j; + fn = arguments[i]; + + if (typeof fn !== "function") { + throw new TypeError("The last argument to .catch() " + + "must be a function, got " + util.toString(fn)); + } + return this.then(undefined, catchFilter(catchInstances, fn, this)); + } + return this.then(undefined, fn); +}; + +Promise.prototype.reflect = function () { + return this._then(reflectHandler, + reflectHandler, undefined, this, undefined); +}; + +Promise.prototype.then = function (didFulfill, didReject) { + if (debug.warnings() && arguments.length > 0 && + typeof didFulfill !== "function" && + typeof didReject !== "function") { + var msg = ".then() only accepts functions but was passed: " + + util.classString(didFulfill); + if (arguments.length > 1) { + msg += ", " + util.classString(didReject); + } + this._warn(msg); + } + return this._then(didFulfill, didReject, undefined, undefined, undefined); +}; + +Promise.prototype.done = function (didFulfill, didReject) { + var promise = + this._then(didFulfill, didReject, undefined, undefined, undefined); + promise._setIsFinal(); +}; + +Promise.prototype.spread = function (fn) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + return this.all()._then(fn, undefined, undefined, APPLY, undefined); +}; + +Promise.prototype.toJSON = function () { + var ret = { + isFulfilled: false, + isRejected: false, + fulfillmentValue: undefined, + rejectionReason: undefined + }; + if (this.isFulfilled()) { + ret.fulfillmentValue = this.value(); + ret.isFulfilled = true; + } else if (this.isRejected()) { + ret.rejectionReason = this.reason(); + ret.isRejected = true; + } + return ret; +}; + +Promise.prototype.all = function () { + if (arguments.length > 0) { + this._warn(".all() was passed arguments but it does not take any"); + } + return new PromiseArray(this).promise(); +}; + +Promise.prototype.error = function (fn) { + return this.caught(util.originatesFromRejection, fn); +}; + +Promise.getNewLibraryCopy = module.exports; + +Promise.is = function (val) { + return val instanceof Promise; +}; + +Promise.fromNode = Promise.fromCallback = function(fn) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs + : false; + var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs)); + if (result === errorObj) { + ret._rejectCallback(result.e, true); + } + if (!ret._isFateSealed()) ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.all = function (promises) { + return new PromiseArray(promises).promise(); +}; + +Promise.cast = function (obj) { + var ret = tryConvertToPromise(obj); + if (!(ret instanceof Promise)) { + ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._setFulfilled(); + ret._rejectionHandler0 = obj; + } + return ret; +}; + +Promise.resolve = Promise.fulfilled = Promise.cast; + +Promise.reject = Promise.rejected = function (reason) { + var ret = new Promise(INTERNAL); + ret._captureStackTrace(); + ret._rejectCallback(reason, true); + return ret; +}; + +Promise.setScheduler = function(fn) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + return async.setScheduler(fn); +}; + +Promise.prototype._then = function ( + didFulfill, + didReject, + _, receiver, + internalData +) { + var haveInternalData = internalData !== undefined; + var promise = haveInternalData ? internalData : new Promise(INTERNAL); + var target = this._target(); + var bitField = target._bitField; + + if (!haveInternalData) { + promise._propagateFrom(this, 3); + promise._captureStackTrace(); + if (receiver === undefined && + ((this._bitField & 2097152) !== 0)) { + if (!((bitField & 50397184) === 0)) { + receiver = this._boundValue(); + } else { + receiver = target === this ? undefined : this._boundTo; + } + } + this._fireEvent("promiseChained", this, promise); + } + + var context = getContext(); + if (!((bitField & 50397184) === 0)) { + var handler, value, settler = target._settlePromiseCtx; + if (((bitField & 33554432) !== 0)) { + value = target._rejectionHandler0; + handler = didFulfill; + } else if (((bitField & 16777216) !== 0)) { + value = target._fulfillmentHandler0; + handler = didReject; + target._unsetRejectionIsUnhandled(); + } else { + settler = target._settlePromiseLateCancellationObserver; + value = new CancellationError("late cancellation observer"); + target._attachExtraTrace(value); + handler = didReject; + } + + async.invoke(settler, target, { + handler: util.contextBind(context, handler), + promise: promise, + receiver: receiver, + value: value + }); + } else { + target._addCallbacks(didFulfill, didReject, promise, + receiver, context); + } + + return promise; +}; + +Promise.prototype._length = function () { + return this._bitField & 65535; +}; + +Promise.prototype._isFateSealed = function () { + return (this._bitField & 117506048) !== 0; +}; + +Promise.prototype._isFollowing = function () { + return (this._bitField & 67108864) === 67108864; +}; + +Promise.prototype._setLength = function (len) { + this._bitField = (this._bitField & -65536) | + (len & 65535); +}; + +Promise.prototype._setFulfilled = function () { + this._bitField = this._bitField | 33554432; + this._fireEvent("promiseFulfilled", this); +}; + +Promise.prototype._setRejected = function () { + this._bitField = this._bitField | 16777216; + this._fireEvent("promiseRejected", this); +}; + +Promise.prototype._setFollowing = function () { + this._bitField = this._bitField | 67108864; + this._fireEvent("promiseResolved", this); +}; + +Promise.prototype._setIsFinal = function () { + this._bitField = this._bitField | 4194304; +}; + +Promise.prototype._isFinal = function () { + return (this._bitField & 4194304) > 0; +}; + +Promise.prototype._unsetCancelled = function() { + this._bitField = this._bitField & (~65536); +}; + +Promise.prototype._setCancelled = function() { + this._bitField = this._bitField | 65536; + this._fireEvent("promiseCancelled", this); +}; + +Promise.prototype._setWillBeCancelled = function() { + this._bitField = this._bitField | 8388608; +}; + +Promise.prototype._setAsyncGuaranteed = function() { + if (async.hasCustomScheduler()) return; + var bitField = this._bitField; + this._bitField = bitField | + (((bitField & 536870912) >> 2) ^ + 134217728); +}; + +Promise.prototype._setNoAsyncGuarantee = function() { + this._bitField = (this._bitField | 536870912) & + (~134217728); +}; + +Promise.prototype._receiverAt = function (index) { + var ret = index === 0 ? this._receiver0 : this[ + index * 4 - 4 + 3]; + if (ret === UNDEFINED_BINDING) { + return undefined; + } else if (ret === undefined && this._isBound()) { + return this._boundValue(); + } + return ret; +}; + +Promise.prototype._promiseAt = function (index) { + return this[ + index * 4 - 4 + 2]; +}; + +Promise.prototype._fulfillmentHandlerAt = function (index) { + return this[ + index * 4 - 4 + 0]; +}; + +Promise.prototype._rejectionHandlerAt = function (index) { + return this[ + index * 4 - 4 + 1]; +}; + +Promise.prototype._boundValue = function() {}; + +Promise.prototype._migrateCallback0 = function (follower) { + var bitField = follower._bitField; + var fulfill = follower._fulfillmentHandler0; + var reject = follower._rejectionHandler0; + var promise = follower._promise0; + var receiver = follower._receiverAt(0); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._migrateCallbackAt = function (follower, index) { + var fulfill = follower._fulfillmentHandlerAt(index); + var reject = follower._rejectionHandlerAt(index); + var promise = follower._promiseAt(index); + var receiver = follower._receiverAt(index); + if (receiver === undefined) receiver = UNDEFINED_BINDING; + this._addCallbacks(fulfill, reject, promise, receiver, null); +}; + +Promise.prototype._addCallbacks = function ( + fulfill, + reject, + promise, + receiver, + context +) { + var index = this._length(); + + if (index >= 65535 - 4) { + index = 0; + this._setLength(0); + } + + if (index === 0) { + this._promise0 = promise; + this._receiver0 = receiver; + if (typeof fulfill === "function") { + this._fulfillmentHandler0 = util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this._rejectionHandler0 = util.contextBind(context, reject); + } + } else { + var base = index * 4 - 4; + this[base + 2] = promise; + this[base + 3] = receiver; + if (typeof fulfill === "function") { + this[base + 0] = + util.contextBind(context, fulfill); + } + if (typeof reject === "function") { + this[base + 1] = + util.contextBind(context, reject); + } + } + this._setLength(index + 1); + return index; +}; + +Promise.prototype._proxy = function (proxyable, arg) { + this._addCallbacks(undefined, undefined, arg, proxyable, null); +}; + +Promise.prototype._resolveCallback = function(value, shouldBind) { + if (((this._bitField & 117506048) !== 0)) return; + if (value === this) + return this._rejectCallback(makeSelfResolutionError(), false); + var maybePromise = tryConvertToPromise(value, this); + if (!(maybePromise instanceof Promise)) return this._fulfill(value); + + if (shouldBind) this._propagateFrom(maybePromise, 2); + + + var promise = maybePromise._target(); + + if (promise === this) { + this._reject(makeSelfResolutionError()); + return; + } + + var bitField = promise._bitField; + if (((bitField & 50397184) === 0)) { + var len = this._length(); + if (len > 0) promise._migrateCallback0(this); + for (var i = 1; i < len; ++i) { + promise._migrateCallbackAt(this, i); + } + this._setFollowing(); + this._setLength(0); + this._setFollowee(maybePromise); + } else if (((bitField & 33554432) !== 0)) { + this._fulfill(promise._value()); + } else if (((bitField & 16777216) !== 0)) { + this._reject(promise._reason()); + } else { + var reason = new CancellationError("late cancellation observer"); + promise._attachExtraTrace(reason); + this._reject(reason); + } +}; + +Promise.prototype._rejectCallback = +function(reason, synchronous, ignoreNonErrorWarnings) { + var trace = util.ensureErrorObject(reason); + var hasStack = trace === reason; + if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) { + var message = "a promise was rejected with a non-error: " + + util.classString(reason); + this._warn(message, true); + } + this._attachExtraTrace(trace, synchronous ? hasStack : false); + this._reject(reason); +}; + +Promise.prototype._resolveFromExecutor = function (executor) { + if (executor === INTERNAL) return; + var promise = this; + this._captureStackTrace(); + this._pushContext(); + var synchronous = true; + var r = this._execute(executor, function(value) { + promise._resolveCallback(value); + }, function (reason) { + promise._rejectCallback(reason, synchronous); + }); + synchronous = false; + this._popContext(); + + if (r !== undefined) { + promise._rejectCallback(r, true); + } +}; + +Promise.prototype._settlePromiseFromHandler = function ( + handler, receiver, value, promise +) { + var bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + promise._pushContext(); + var x; + if (receiver === APPLY) { + if (!value || typeof value.length !== "number") { + x = errorObj; + x.e = new TypeError("cannot .spread() a non-array: " + + util.classString(value)); + } else { + x = tryCatch(handler).apply(this._boundValue(), value); + } + } else { + x = tryCatch(handler).call(receiver, value); + } + var promiseCreated = promise._popContext(); + bitField = promise._bitField; + if (((bitField & 65536) !== 0)) return; + + if (x === NEXT_FILTER) { + promise._reject(value); + } else if (x === errorObj) { + promise._rejectCallback(x.e, false); + } else { + debug.checkForgottenReturns(x, promiseCreated, "", promise, this); + promise._resolveCallback(x); + } +}; + +Promise.prototype._target = function() { + var ret = this; + while (ret._isFollowing()) ret = ret._followee(); + return ret; +}; + +Promise.prototype._followee = function() { + return this._rejectionHandler0; +}; + +Promise.prototype._setFollowee = function(promise) { + this._rejectionHandler0 = promise; +}; + +Promise.prototype._settlePromise = function(promise, handler, receiver, value) { + var isPromise = promise instanceof Promise; + var bitField = this._bitField; + var asyncGuaranteed = ((bitField & 134217728) !== 0); + if (((bitField & 65536) !== 0)) { + if (isPromise) promise._invokeInternalOnCancel(); + + if (receiver instanceof PassThroughHandlerContext && + receiver.isFinallyHandler()) { + receiver.cancelPromise = promise; + if (tryCatch(handler).call(receiver, value) === errorObj) { + promise._reject(errorObj.e); + } + } else if (handler === reflectHandler) { + promise._fulfill(reflectHandler.call(receiver)); + } else if (receiver instanceof Proxyable) { + receiver._promiseCancelled(promise); + } else if (isPromise || promise instanceof PromiseArray) { + promise._cancel(); + } else { + receiver.cancel(); + } + } else if (typeof handler === "function") { + if (!isPromise) { + handler.call(receiver, value, promise); + } else { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (receiver instanceof Proxyable) { + if (!receiver._isResolved()) { + if (((bitField & 33554432) !== 0)) { + receiver._promiseFulfilled(value, promise); + } else { + receiver._promiseRejected(value, promise); + } + } + } else if (isPromise) { + if (asyncGuaranteed) promise._setAsyncGuaranteed(); + if (((bitField & 33554432) !== 0)) { + promise._fulfill(value); + } else { + promise._reject(value); + } + } +}; + +Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) { + var handler = ctx.handler; + var promise = ctx.promise; + var receiver = ctx.receiver; + var value = ctx.value; + if (typeof handler === "function") { + if (!(promise instanceof Promise)) { + handler.call(receiver, value, promise); + } else { + this._settlePromiseFromHandler(handler, receiver, value, promise); + } + } else if (promise instanceof Promise) { + promise._reject(value); + } +}; + +Promise.prototype._settlePromiseCtx = function(ctx) { + this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value); +}; + +Promise.prototype._settlePromise0 = function(handler, value, bitField) { + var promise = this._promise0; + var receiver = this._receiverAt(0); + this._promise0 = undefined; + this._receiver0 = undefined; + this._settlePromise(promise, handler, receiver, value); +}; + +Promise.prototype._clearCallbackDataAtIndex = function(index) { + var base = index * 4 - 4; + this[base + 2] = + this[base + 3] = + this[base + 0] = + this[base + 1] = undefined; +}; + +Promise.prototype._fulfill = function (value) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + if (value === this) { + var err = makeSelfResolutionError(); + this._attachExtraTrace(err); + return this._reject(err); + } + this._setFulfilled(); + this._rejectionHandler0 = value; + + if ((bitField & 65535) > 0) { + if (((bitField & 134217728) !== 0)) { + this._settlePromises(); + } else { + async.settlePromises(this); + } + this._dereferenceTrace(); + } +}; + +Promise.prototype._reject = function (reason) { + var bitField = this._bitField; + if (((bitField & 117506048) >>> 16)) return; + this._setRejected(); + this._fulfillmentHandler0 = reason; + + if (this._isFinal()) { + return async.fatalError(reason, util.isNode); + } + + if ((bitField & 65535) > 0) { + async.settlePromises(this); + } else { + this._ensurePossibleRejectionHandled(); + } +}; + +Promise.prototype._fulfillPromises = function (len, value) { + for (var i = 1; i < len; i++) { + var handler = this._fulfillmentHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, value); + } +}; + +Promise.prototype._rejectPromises = function (len, reason) { + for (var i = 1; i < len; i++) { + var handler = this._rejectionHandlerAt(i); + var promise = this._promiseAt(i); + var receiver = this._receiverAt(i); + this._clearCallbackDataAtIndex(i); + this._settlePromise(promise, handler, receiver, reason); + } +}; + +Promise.prototype._settlePromises = function () { + var bitField = this._bitField; + var len = (bitField & 65535); + + if (len > 0) { + if (((bitField & 16842752) !== 0)) { + var reason = this._fulfillmentHandler0; + this._settlePromise0(this._rejectionHandler0, reason, bitField); + this._rejectPromises(len, reason); + } else { + var value = this._rejectionHandler0; + this._settlePromise0(this._fulfillmentHandler0, value, bitField); + this._fulfillPromises(len, value); + } + this._setLength(0); + } + this._clearCancellationData(); +}; + +Promise.prototype._settledValue = function() { + var bitField = this._bitField; + if (((bitField & 33554432) !== 0)) { + return this._rejectionHandler0; + } else if (((bitField & 16777216) !== 0)) { + return this._fulfillmentHandler0; + } +}; + +if (typeof Symbol !== "undefined" && Symbol.toStringTag) { + es5.defineProperty(Promise.prototype, Symbol.toStringTag, { + get: function () { + return "Object"; + } + }); +} + +function deferResolve(v) {this.promise._resolveCallback(v);} +function deferReject(v) {this.promise._rejectCallback(v, false);} + +Promise.defer = Promise.pending = function() { + debug.deprecated("Promise.defer", "new Promise"); + var promise = new Promise(INTERNAL); + return { + promise: promise, + resolve: deferResolve, + reject: deferReject + }; +}; + +util.notEnumerableProp(Promise, + "_makeSelfResolutionError", + makeSelfResolutionError); + +require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection, + debug); +require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug); +require("./cancel")(Promise, PromiseArray, apiRejection, debug); +require("./direct_resolve")(Promise); +require("./synchronous_inspection")(Promise); +require("./join")( + Promise, PromiseArray, tryConvertToPromise, INTERNAL, async); +Promise.Promise = Promise; +Promise.version = "3.7.2"; +require('./call_get.js')(Promise); +require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug); +require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +require('./nodeify.js')(Promise); +require('./promisify.js')(Promise, INTERNAL); +require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection); +require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection); +require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug); +require('./settle.js')(Promise, PromiseArray, debug); +require('./some.js')(Promise, PromiseArray, apiRejection); +require('./timers.js')(Promise, INTERNAL, debug); +require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug); +require('./any.js')(Promise); +require('./each.js')(Promise, INTERNAL); +require('./filter.js')(Promise, INTERNAL); + + util.toFastProperties(Promise); + util.toFastProperties(Promise.prototype); + function fillTypes(value) { + var p = new Promise(INTERNAL); + p._fulfillmentHandler0 = value; + p._rejectionHandler0 = value; + p._promise0 = value; + p._receiver0 = value; + } + // Complete slack tracking, opt out of field-type tracking and + // stabilize map + fillTypes({a: 1}); + fillTypes({b: 2}); + fillTypes({c: 3}); + fillTypes(1); + fillTypes(function(){}); + fillTypes(undefined); + fillTypes(false); + fillTypes(new Promise(INTERNAL)); + debug.setBounds(Async.firstLineError, util.lastLineError); + return Promise; + +}; diff --git a/node_modules/bluebird/js/release/promise_array.js b/node_modules/bluebird/js/release/promise_array.js new file mode 100644 index 0000000..8fc665a --- /dev/null +++ b/node_modules/bluebird/js/release/promise_array.js @@ -0,0 +1,186 @@ +"use strict"; +module.exports = function(Promise, INTERNAL, tryConvertToPromise, + apiRejection, Proxyable) { +var util = require("./util"); +var isArray = util.isArray; + +function toResolutionValue(val) { + switch(val) { + case -2: return []; + case -3: return {}; + case -6: return new Map(); + } +} + +function PromiseArray(values) { + var promise = this._promise = new Promise(INTERNAL); + if (values instanceof Promise) { + promise._propagateFrom(values, 3); + values.suppressUnhandledRejections(); + } + promise._setOnCancel(this); + this._values = values; + this._length = 0; + this._totalResolved = 0; + this._init(undefined, -2); +} +util.inherits(PromiseArray, Proxyable); + +PromiseArray.prototype.length = function () { + return this._length; +}; + +PromiseArray.prototype.promise = function () { + return this._promise; +}; + +PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) { + var values = tryConvertToPromise(this._values, this._promise); + if (values instanceof Promise) { + values = values._target(); + var bitField = values._bitField; + ; + this._values = values; + + if (((bitField & 50397184) === 0)) { + this._promise._setAsyncGuaranteed(); + return values._then( + init, + this._reject, + undefined, + this, + resolveValueIfEmpty + ); + } else if (((bitField & 33554432) !== 0)) { + values = values._value(); + } else if (((bitField & 16777216) !== 0)) { + return this._reject(values._reason()); + } else { + return this._cancel(); + } + } + values = util.asArray(values); + if (values === null) { + var err = apiRejection( + "expecting an array or an iterable object but got " + util.classString(values)).reason(); + this._promise._rejectCallback(err, false); + return; + } + + if (values.length === 0) { + if (resolveValueIfEmpty === -5) { + this._resolveEmptyArray(); + } + else { + this._resolve(toResolutionValue(resolveValueIfEmpty)); + } + return; + } + this._iterate(values); +}; + +PromiseArray.prototype._iterate = function(values) { + var len = this.getActualLength(values.length); + this._length = len; + this._values = this.shouldCopyValues() ? new Array(len) : this._values; + var result = this._promise; + var isResolved = false; + var bitField = null; + for (var i = 0; i < len; ++i) { + var maybePromise = tryConvertToPromise(values[i], result); + + if (maybePromise instanceof Promise) { + maybePromise = maybePromise._target(); + bitField = maybePromise._bitField; + } else { + bitField = null; + } + + if (isResolved) { + if (bitField !== null) { + maybePromise.suppressUnhandledRejections(); + } + } else if (bitField !== null) { + if (((bitField & 50397184) === 0)) { + maybePromise._proxy(this, i); + this._values[i] = maybePromise; + } else if (((bitField & 33554432) !== 0)) { + isResolved = this._promiseFulfilled(maybePromise._value(), i); + } else if (((bitField & 16777216) !== 0)) { + isResolved = this._promiseRejected(maybePromise._reason(), i); + } else { + isResolved = this._promiseCancelled(i); + } + } else { + isResolved = this._promiseFulfilled(maybePromise, i); + } + } + if (!isResolved) result._setAsyncGuaranteed(); +}; + +PromiseArray.prototype._isResolved = function () { + return this._values === null; +}; + +PromiseArray.prototype._resolve = function (value) { + this._values = null; + this._promise._fulfill(value); +}; + +PromiseArray.prototype._cancel = function() { + if (this._isResolved() || !this._promise._isCancellable()) return; + this._values = null; + this._promise._cancel(); +}; + +PromiseArray.prototype._reject = function (reason) { + this._values = null; + this._promise._rejectCallback(reason, false); +}; + +PromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +PromiseArray.prototype._promiseCancelled = function() { + this._cancel(); + return true; +}; + +PromiseArray.prototype._promiseRejected = function (reason) { + this._totalResolved++; + this._reject(reason); + return true; +}; + +PromiseArray.prototype._resultCancelled = function() { + if (this._isResolved()) return; + var values = this._values; + this._cancel(); + if (values instanceof Promise) { + values.cancel(); + } else { + for (var i = 0; i < values.length; ++i) { + if (values[i] instanceof Promise) { + values[i].cancel(); + } + } + } +}; + +PromiseArray.prototype.shouldCopyValues = function () { + return true; +}; + +PromiseArray.prototype.getActualLength = function (len) { + return len; +}; + +return PromiseArray; +}; diff --git a/node_modules/bluebird/js/release/promisify.js b/node_modules/bluebird/js/release/promisify.js new file mode 100644 index 0000000..aa98e5b --- /dev/null +++ b/node_modules/bluebird/js/release/promisify.js @@ -0,0 +1,314 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var THIS = {}; +var util = require("./util"); +var nodebackForPromise = require("./nodeback"); +var withAppended = util.withAppended; +var maybeWrapAsError = util.maybeWrapAsError; +var canEvaluate = util.canEvaluate; +var TypeError = require("./errors").TypeError; +var defaultSuffix = "Async"; +var defaultPromisified = {__isPromisified__: true}; +var noCopyProps = [ + "arity", "length", + "name", + "arguments", + "caller", + "callee", + "prototype", + "__isPromisified__" +]; +var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$"); + +var defaultFilter = function(name) { + return util.isIdentifier(name) && + name.charAt(0) !== "_" && + name !== "constructor"; +}; + +function propsFilter(key) { + return !noCopyPropsPattern.test(key); +} + +function isPromisified(fn) { + try { + return fn.__isPromisified__ === true; + } + catch (e) { + return false; + } +} + +function hasPromisified(obj, key, suffix) { + var val = util.getDataPropertyOrDefault(obj, key + suffix, + defaultPromisified); + return val ? isPromisified(val) : false; +} +function checkValid(ret, suffix, suffixRegexp) { + for (var i = 0; i < ret.length; i += 2) { + var key = ret[i]; + if (suffixRegexp.test(key)) { + var keyWithoutAsyncSuffix = key.replace(suffixRegexp, ""); + for (var j = 0; j < ret.length; j += 2) { + if (ret[j] === keyWithoutAsyncSuffix) { + throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a" + .replace("%s", suffix)); + } + } + } + } +} + +function promisifiableMethods(obj, suffix, suffixRegexp, filter) { + var keys = util.inheritedDataKeys(obj); + var ret = []; + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var value = obj[key]; + var passesDefaultFilter = filter === defaultFilter + ? true : defaultFilter(key, value, obj); + if (typeof value === "function" && + !isPromisified(value) && + !hasPromisified(obj, key, suffix) && + filter(key, value, obj, passesDefaultFilter)) { + ret.push(key, value); + } + } + checkValid(ret, suffix, suffixRegexp); + return ret; +} + +var escapeIdentRegex = function(str) { + return str.replace(/([$])/, "\\$"); +}; + +var makeNodePromisifiedEval; +if (!false) { +var switchCaseArgumentOrder = function(likelyArgumentCount) { + var ret = [likelyArgumentCount]; + var min = Math.max(0, likelyArgumentCount - 1 - 3); + for(var i = likelyArgumentCount - 1; i >= min; --i) { + ret.push(i); + } + for(var i = likelyArgumentCount + 1; i <= 3; ++i) { + ret.push(i); + } + return ret; +}; + +var argumentSequence = function(argumentCount) { + return util.filledRange(argumentCount, "_arg", ""); +}; + +var parameterDeclaration = function(parameterCount) { + return util.filledRange( + Math.max(parameterCount, 3), "_arg", ""); +}; + +var parameterCount = function(fn) { + if (typeof fn.length === "number") { + return Math.max(Math.min(fn.length, 1023 + 1), 0); + } + return 0; +}; + +makeNodePromisifiedEval = +function(callback, receiver, originalName, fn, _, multiArgs) { + var newParameterCount = Math.max(0, parameterCount(fn) - 1); + var argumentOrder = switchCaseArgumentOrder(newParameterCount); + var shouldProxyThis = typeof callback === "string" || receiver === THIS; + + function generateCallForArgumentCount(count) { + var args = argumentSequence(count).join(", "); + var comma = count > 0 ? ", " : ""; + var ret; + if (shouldProxyThis) { + ret = "ret = callback.call(this, {{args}}, nodeback); break;\n"; + } else { + ret = receiver === undefined + ? "ret = callback({{args}}, nodeback); break;\n" + : "ret = callback.call(receiver, {{args}}, nodeback); break;\n"; + } + return ret.replace("{{args}}", args).replace(", ", comma); + } + + function generateArgumentSwitchCase() { + var ret = ""; + for (var i = 0; i < argumentOrder.length; ++i) { + ret += "case " + argumentOrder[i] +":" + + generateCallForArgumentCount(argumentOrder[i]); + } + + ret += " \n\ + default: \n\ + var args = new Array(len + 1); \n\ + var i = 0; \n\ + for (var i = 0; i < len; ++i) { \n\ + args[i] = arguments[i]; \n\ + } \n\ + args[i] = nodeback; \n\ + [CodeForCall] \n\ + break; \n\ + ".replace("[CodeForCall]", (shouldProxyThis + ? "ret = callback.apply(this, args);\n" + : "ret = callback.apply(receiver, args);\n")); + return ret; + } + + var getFunctionCode = typeof callback === "string" + ? ("this != null ? this['"+callback+"'] : fn") + : "fn"; + var body = "'use strict'; \n\ + var ret = function (Parameters) { \n\ + 'use strict'; \n\ + var len = arguments.length; \n\ + var promise = new Promise(INTERNAL); \n\ + promise._captureStackTrace(); \n\ + var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\ + var ret; \n\ + var callback = tryCatch([GetFunctionCode]); \n\ + switch(len) { \n\ + [CodeForSwitchCase] \n\ + } \n\ + if (ret === errorObj) { \n\ + promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\ + } \n\ + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\ + return promise; \n\ + }; \n\ + notEnumerableProp(ret, '__isPromisified__', true); \n\ + return ret; \n\ + ".replace("[CodeForSwitchCase]", generateArgumentSwitchCase()) + .replace("[GetFunctionCode]", getFunctionCode); + body = body.replace("Parameters", parameterDeclaration(newParameterCount)); + return new Function("Promise", + "fn", + "receiver", + "withAppended", + "maybeWrapAsError", + "nodebackForPromise", + "tryCatch", + "errorObj", + "notEnumerableProp", + "INTERNAL", + body)( + Promise, + fn, + receiver, + withAppended, + maybeWrapAsError, + nodebackForPromise, + util.tryCatch, + util.errorObj, + util.notEnumerableProp, + INTERNAL); +}; +} + +function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) { + var defaultThis = (function() {return this;})(); + var method = callback; + if (typeof method === "string") { + callback = fn; + } + function promisified() { + var _receiver = receiver; + if (receiver === THIS) _receiver = this; + var promise = new Promise(INTERNAL); + promise._captureStackTrace(); + var cb = typeof method === "string" && this !== defaultThis + ? this[method] : callback; + var fn = nodebackForPromise(promise, multiArgs); + try { + cb.apply(_receiver, withAppended(arguments, fn)); + } catch(e) { + promise._rejectCallback(maybeWrapAsError(e), true, true); + } + if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); + return promise; + } + util.notEnumerableProp(promisified, "__isPromisified__", true); + return promisified; +} + +var makeNodePromisified = canEvaluate + ? makeNodePromisifiedEval + : makeNodePromisifiedClosure; + +function promisifyAll(obj, suffix, filter, promisifier, multiArgs) { + var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$"); + var methods = + promisifiableMethods(obj, suffix, suffixRegexp, filter); + + for (var i = 0, len = methods.length; i < len; i+= 2) { + var key = methods[i]; + var fn = methods[i+1]; + var promisifiedKey = key + suffix; + if (promisifier === makeNodePromisified) { + obj[promisifiedKey] = + makeNodePromisified(key, THIS, key, fn, suffix, multiArgs); + } else { + var promisified = promisifier(fn, function() { + return makeNodePromisified(key, THIS, key, + fn, suffix, multiArgs); + }); + util.notEnumerableProp(promisified, "__isPromisified__", true); + obj[promisifiedKey] = promisified; + } + } + util.toFastProperties(obj); + return obj; +} + +function promisify(callback, receiver, multiArgs) { + return makeNodePromisified(callback, receiver, undefined, + callback, null, multiArgs); +} + +Promise.promisify = function (fn, options) { + if (typeof fn !== "function") { + throw new TypeError("expecting a function but got " + util.classString(fn)); + } + if (isPromisified(fn)) { + return fn; + } + options = Object(options); + var receiver = options.context === undefined ? THIS : options.context; + var multiArgs = !!options.multiArgs; + var ret = promisify(fn, receiver, multiArgs); + util.copyDescriptors(fn, ret, propsFilter); + return ret; +}; + +Promise.promisifyAll = function (target, options) { + if (typeof target !== "function" && typeof target !== "object") { + throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + options = Object(options); + var multiArgs = !!options.multiArgs; + var suffix = options.suffix; + if (typeof suffix !== "string") suffix = defaultSuffix; + var filter = options.filter; + if (typeof filter !== "function") filter = defaultFilter; + var promisifier = options.promisifier; + if (typeof promisifier !== "function") promisifier = makeNodePromisified; + + if (!util.isIdentifier(suffix)) { + throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + + var keys = util.inheritedDataKeys(target); + for (var i = 0; i < keys.length; ++i) { + var value = target[keys[i]]; + if (keys[i] !== "constructor" && + util.isClass(value)) { + promisifyAll(value.prototype, suffix, filter, promisifier, + multiArgs); + promisifyAll(value, suffix, filter, promisifier, multiArgs); + } + } + + return promisifyAll(target, suffix, filter, promisifier, multiArgs); +}; +}; + diff --git a/node_modules/bluebird/js/release/props.js b/node_modules/bluebird/js/release/props.js new file mode 100644 index 0000000..6a34aaf --- /dev/null +++ b/node_modules/bluebird/js/release/props.js @@ -0,0 +1,118 @@ +"use strict"; +module.exports = function( + Promise, PromiseArray, tryConvertToPromise, apiRejection) { +var util = require("./util"); +var isObject = util.isObject; +var es5 = require("./es5"); +var Es6Map; +if (typeof Map === "function") Es6Map = Map; + +var mapToEntries = (function() { + var index = 0; + var size = 0; + + function extractEntry(value, key) { + this[index] = value; + this[index + size] = key; + index++; + } + + return function mapToEntries(map) { + size = map.size; + index = 0; + var ret = new Array(map.size * 2); + map.forEach(extractEntry, ret); + return ret; + }; +})(); + +var entriesToMap = function(entries) { + var ret = new Es6Map(); + var length = entries.length / 2 | 0; + for (var i = 0; i < length; ++i) { + var key = entries[length + i]; + var value = entries[i]; + ret.set(key, value); + } + return ret; +}; + +function PropertiesPromiseArray(obj) { + var isMap = false; + var entries; + if (Es6Map !== undefined && obj instanceof Es6Map) { + entries = mapToEntries(obj); + isMap = true; + } else { + var keys = es5.keys(obj); + var len = keys.length; + entries = new Array(len * 2); + for (var i = 0; i < len; ++i) { + var key = keys[i]; + entries[i] = obj[key]; + entries[i + len] = key; + } + } + this.constructor$(entries); + this._isMap = isMap; + this._init$(undefined, isMap ? -6 : -3); +} +util.inherits(PropertiesPromiseArray, PromiseArray); + +PropertiesPromiseArray.prototype._init = function () {}; + +PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) { + this._values[index] = value; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + var val; + if (this._isMap) { + val = entriesToMap(this._values); + } else { + val = {}; + var keyOffset = this.length(); + for (var i = 0, len = this.length(); i < len; ++i) { + val[this._values[i + keyOffset]] = this._values[i]; + } + } + this._resolve(val); + return true; + } + return false; +}; + +PropertiesPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +PropertiesPromiseArray.prototype.getActualLength = function (len) { + return len >> 1; +}; + +function props(promises) { + var ret; + var castValue = tryConvertToPromise(promises); + + if (!isObject(castValue)) { + return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } else if (castValue instanceof Promise) { + ret = castValue._then( + Promise.props, undefined, undefined, undefined, undefined); + } else { + ret = new PropertiesPromiseArray(castValue).promise(); + } + + if (castValue instanceof Promise) { + ret._propagateFrom(castValue, 2); + } + return ret; +} + +Promise.prototype.props = function () { + return props(this); +}; + +Promise.props = function (promises) { + return props(promises); +}; +}; diff --git a/node_modules/bluebird/js/release/queue.js b/node_modules/bluebird/js/release/queue.js new file mode 100644 index 0000000..ffd36fd --- /dev/null +++ b/node_modules/bluebird/js/release/queue.js @@ -0,0 +1,73 @@ +"use strict"; +function arrayMove(src, srcIndex, dst, dstIndex, len) { + for (var j = 0; j < len; ++j) { + dst[j + dstIndex] = src[j + srcIndex]; + src[j + srcIndex] = void 0; + } +} + +function Queue(capacity) { + this._capacity = capacity; + this._length = 0; + this._front = 0; +} + +Queue.prototype._willBeOverCapacity = function (size) { + return this._capacity < size; +}; + +Queue.prototype._pushOne = function (arg) { + var length = this.length(); + this._checkCapacity(length + 1); + var i = (this._front + length) & (this._capacity - 1); + this[i] = arg; + this._length = length + 1; +}; + +Queue.prototype.push = function (fn, receiver, arg) { + var length = this.length() + 3; + if (this._willBeOverCapacity(length)) { + this._pushOne(fn); + this._pushOne(receiver); + this._pushOne(arg); + return; + } + var j = this._front + length - 3; + this._checkCapacity(length); + var wrapMask = this._capacity - 1; + this[(j + 0) & wrapMask] = fn; + this[(j + 1) & wrapMask] = receiver; + this[(j + 2) & wrapMask] = arg; + this._length = length; +}; + +Queue.prototype.shift = function () { + var front = this._front, + ret = this[front]; + + this[front] = undefined; + this._front = (front + 1) & (this._capacity - 1); + this._length--; + return ret; +}; + +Queue.prototype.length = function () { + return this._length; +}; + +Queue.prototype._checkCapacity = function (size) { + if (this._capacity < size) { + this._resizeTo(this._capacity << 1); + } +}; + +Queue.prototype._resizeTo = function (capacity) { + var oldCapacity = this._capacity; + this._capacity = capacity; + var front = this._front; + var length = this._length; + var moveItemsCount = (front + length) & (oldCapacity - 1); + arrayMove(this, 0, this, oldCapacity, moveItemsCount); +}; + +module.exports = Queue; diff --git a/node_modules/bluebird/js/release/race.js b/node_modules/bluebird/js/release/race.js new file mode 100644 index 0000000..b862f46 --- /dev/null +++ b/node_modules/bluebird/js/release/race.js @@ -0,0 +1,49 @@ +"use strict"; +module.exports = function( + Promise, INTERNAL, tryConvertToPromise, apiRejection) { +var util = require("./util"); + +var raceLater = function (promise) { + return promise.then(function(array) { + return race(array, promise); + }); +}; + +function race(promises, parent) { + var maybePromise = tryConvertToPromise(promises); + + if (maybePromise instanceof Promise) { + return raceLater(maybePromise); + } else { + promises = util.asArray(promises); + if (promises === null) + return apiRejection("expecting an array or an iterable object but got " + util.classString(promises)); + } + + var ret = new Promise(INTERNAL); + if (parent !== undefined) { + ret._propagateFrom(parent, 3); + } + var fulfill = ret._fulfill; + var reject = ret._reject; + for (var i = 0, len = promises.length; i < len; ++i) { + var val = promises[i]; + + if (val === undefined && !(i in promises)) { + continue; + } + + Promise.cast(val)._then(fulfill, reject, undefined, ret, null); + } + return ret; +} + +Promise.race = function (promises) { + return race(promises, undefined); +}; + +Promise.prototype.race = function () { + return race(this, undefined); +}; + +}; diff --git a/node_modules/bluebird/js/release/reduce.js b/node_modules/bluebird/js/release/reduce.js new file mode 100644 index 0000000..101ac22 --- /dev/null +++ b/node_modules/bluebird/js/release/reduce.js @@ -0,0 +1,183 @@ +"use strict"; +module.exports = function(Promise, + PromiseArray, + apiRejection, + tryConvertToPromise, + INTERNAL, + debug) { +var util = require("./util"); +var tryCatch = util.tryCatch; + +function ReductionPromiseArray(promises, fn, initialValue, _each) { + this.constructor$(promises); + var context = Promise._getContext(); + this._fn = util.contextBind(context, fn); + if (initialValue !== undefined) { + initialValue = Promise.resolve(initialValue); + initialValue._attachCancellationCallback(this); + } + this._initialValue = initialValue; + this._currentCancellable = null; + if(_each === INTERNAL) { + this._eachValues = Array(this._length); + } else if (_each === 0) { + this._eachValues = null; + } else { + this._eachValues = undefined; + } + this._promise._captureStackTrace(); + this._init$(undefined, -5); +} +util.inherits(ReductionPromiseArray, PromiseArray); + +ReductionPromiseArray.prototype._gotAccum = function(accum) { + if (this._eachValues !== undefined && + this._eachValues !== null && + accum !== INTERNAL) { + this._eachValues.push(accum); + } +}; + +ReductionPromiseArray.prototype._eachComplete = function(value) { + if (this._eachValues !== null) { + this._eachValues.push(value); + } + return this._eachValues; +}; + +ReductionPromiseArray.prototype._init = function() {}; + +ReductionPromiseArray.prototype._resolveEmptyArray = function() { + this._resolve(this._eachValues !== undefined ? this._eachValues + : this._initialValue); +}; + +ReductionPromiseArray.prototype.shouldCopyValues = function () { + return false; +}; + +ReductionPromiseArray.prototype._resolve = function(value) { + this._promise._resolveCallback(value); + this._values = null; +}; + +ReductionPromiseArray.prototype._resultCancelled = function(sender) { + if (sender === this._initialValue) return this._cancel(); + if (this._isResolved()) return; + this._resultCancelled$(); + if (this._currentCancellable instanceof Promise) { + this._currentCancellable.cancel(); + } + if (this._initialValue instanceof Promise) { + this._initialValue.cancel(); + } +}; + +ReductionPromiseArray.prototype._iterate = function (values) { + this._values = values; + var value; + var i; + var length = values.length; + if (this._initialValue !== undefined) { + value = this._initialValue; + i = 0; + } else { + value = Promise.resolve(values[0]); + i = 1; + } + + this._currentCancellable = value; + + for (var j = i; j < length; ++j) { + var maybePromise = values[j]; + if (maybePromise instanceof Promise) { + maybePromise.suppressUnhandledRejections(); + } + } + + if (!value.isRejected()) { + for (; i < length; ++i) { + var ctx = { + accum: null, + value: values[i], + index: i, + length: length, + array: this + }; + + value = value._then(gotAccum, undefined, undefined, ctx, undefined); + + if ((i & 127) === 0) { + value._setNoAsyncGuarantee(); + } + } + } + + if (this._eachValues !== undefined) { + value = value + ._then(this._eachComplete, undefined, undefined, this, undefined); + } + value._then(completed, completed, undefined, value, this); +}; + +Promise.prototype.reduce = function (fn, initialValue) { + return reduce(this, fn, initialValue, null); +}; + +Promise.reduce = function (promises, fn, initialValue, _each) { + return reduce(promises, fn, initialValue, _each); +}; + +function completed(valueOrReason, array) { + if (this.isFulfilled()) { + array._resolve(valueOrReason); + } else { + array._reject(valueOrReason); + } +} + +function reduce(promises, fn, initialValue, _each) { + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var array = new ReductionPromiseArray(promises, fn, initialValue, _each); + return array.promise(); +} + +function gotAccum(accum) { + this.accum = accum; + this.array._gotAccum(accum); + var value = tryConvertToPromise(this.value, this.array._promise); + if (value instanceof Promise) { + this.array._currentCancellable = value; + return value._then(gotValue, undefined, undefined, this, undefined); + } else { + return gotValue.call(this, value); + } +} + +function gotValue(value) { + var array = this.array; + var promise = array._promise; + var fn = tryCatch(array._fn); + promise._pushContext(); + var ret; + if (array._eachValues !== undefined) { + ret = fn.call(promise._boundValue(), value, this.index, this.length); + } else { + ret = fn.call(promise._boundValue(), + this.accum, value, this.index, this.length); + } + if (ret instanceof Promise) { + array._currentCancellable = ret; + } + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, + promiseCreated, + array._eachValues !== undefined ? "Promise.each" : "Promise.reduce", + promise + ); + return ret; +} +}; diff --git a/node_modules/bluebird/js/release/schedule.js b/node_modules/bluebird/js/release/schedule.js new file mode 100644 index 0000000..15197d1 --- /dev/null +++ b/node_modules/bluebird/js/release/schedule.js @@ -0,0 +1,62 @@ +"use strict"; +var util = require("./util"); +var schedule; +var noAsyncScheduler = function() { + throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a"); +}; +var NativePromise = util.getNativePromise(); +if (util.isNode && typeof MutationObserver === "undefined") { + var GlobalSetImmediate = global.setImmediate; + var ProcessNextTick = process.nextTick; + schedule = util.isRecentNode + ? function(fn) { GlobalSetImmediate.call(global, fn); } + : function(fn) { ProcessNextTick.call(process, fn); }; +} else if (typeof NativePromise === "function" && + typeof NativePromise.resolve === "function") { + var nativePromise = NativePromise.resolve(); + schedule = function(fn) { + nativePromise.then(fn); + }; +} else if ((typeof MutationObserver !== "undefined") && + !(typeof window !== "undefined" && + window.navigator && + (window.navigator.standalone || window.cordova)) && + ("classList" in document.documentElement)) { + schedule = (function() { + var div = document.createElement("div"); + var opts = {attributes: true}; + var toggleScheduled = false; + var div2 = document.createElement("div"); + var o2 = new MutationObserver(function() { + div.classList.toggle("foo"); + toggleScheduled = false; + }); + o2.observe(div2, opts); + + var scheduleToggle = function() { + if (toggleScheduled) return; + toggleScheduled = true; + div2.classList.toggle("foo"); + }; + + return function schedule(fn) { + var o = new MutationObserver(function() { + o.disconnect(); + fn(); + }); + o.observe(div, opts); + scheduleToggle(); + }; + })(); +} else if (typeof setImmediate !== "undefined") { + schedule = function (fn) { + setImmediate(fn); + }; +} else if (typeof setTimeout !== "undefined") { + schedule = function (fn) { + setTimeout(fn, 0); + }; +} else { + schedule = noAsyncScheduler; +} +module.exports = schedule; diff --git a/node_modules/bluebird/js/release/settle.js b/node_modules/bluebird/js/release/settle.js new file mode 100644 index 0000000..e24b204 --- /dev/null +++ b/node_modules/bluebird/js/release/settle.js @@ -0,0 +1,47 @@ +"use strict"; +module.exports = + function(Promise, PromiseArray, debug) { +var PromiseInspection = Promise.PromiseInspection; +var util = require("./util"); + +function SettledPromiseArray(values) { + this.constructor$(values); +} +util.inherits(SettledPromiseArray, PromiseArray); + +SettledPromiseArray.prototype._promiseResolved = function (index, inspection) { + this._values[index] = inspection; + var totalResolved = ++this._totalResolved; + if (totalResolved >= this._length) { + this._resolve(this._values); + return true; + } + return false; +}; + +SettledPromiseArray.prototype._promiseFulfilled = function (value, index) { + var ret = new PromiseInspection(); + ret._bitField = 33554432; + ret._settledValueField = value; + return this._promiseResolved(index, ret); +}; +SettledPromiseArray.prototype._promiseRejected = function (reason, index) { + var ret = new PromiseInspection(); + ret._bitField = 16777216; + ret._settledValueField = reason; + return this._promiseResolved(index, ret); +}; + +Promise.settle = function (promises) { + debug.deprecated(".settle()", ".reflect()"); + return new SettledPromiseArray(promises).promise(); +}; + +Promise.allSettled = function (promises) { + return new SettledPromiseArray(promises).promise(); +}; + +Promise.prototype.settle = function () { + return Promise.settle(this); +}; +}; diff --git a/node_modules/bluebird/js/release/some.js b/node_modules/bluebird/js/release/some.js new file mode 100644 index 0000000..400d852 --- /dev/null +++ b/node_modules/bluebird/js/release/some.js @@ -0,0 +1,148 @@ +"use strict"; +module.exports = +function(Promise, PromiseArray, apiRejection) { +var util = require("./util"); +var RangeError = require("./errors").RangeError; +var AggregateError = require("./errors").AggregateError; +var isArray = util.isArray; +var CANCELLATION = {}; + + +function SomePromiseArray(values) { + this.constructor$(values); + this._howMany = 0; + this._unwrap = false; + this._initialized = false; +} +util.inherits(SomePromiseArray, PromiseArray); + +SomePromiseArray.prototype._init = function () { + if (!this._initialized) { + return; + } + if (this._howMany === 0) { + this._resolve([]); + return; + } + this._init$(undefined, -5); + var isArrayResolved = isArray(this._values); + if (!this._isResolved() && + isArrayResolved && + this._howMany > this._canPossiblyFulfill()) { + this._reject(this._getRangeError(this.length())); + } +}; + +SomePromiseArray.prototype.init = function () { + this._initialized = true; + this._init(); +}; + +SomePromiseArray.prototype.setUnwrap = function () { + this._unwrap = true; +}; + +SomePromiseArray.prototype.howMany = function () { + return this._howMany; +}; + +SomePromiseArray.prototype.setHowMany = function (count) { + this._howMany = count; +}; + +SomePromiseArray.prototype._promiseFulfilled = function (value) { + this._addFulfilled(value); + if (this._fulfilled() === this.howMany()) { + this._values.length = this.howMany(); + if (this.howMany() === 1 && this._unwrap) { + this._resolve(this._values[0]); + } else { + this._resolve(this._values); + } + return true; + } + return false; + +}; +SomePromiseArray.prototype._promiseRejected = function (reason) { + this._addRejected(reason); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._promiseCancelled = function () { + if (this._values instanceof Promise || this._values == null) { + return this._cancel(); + } + this._addRejected(CANCELLATION); + return this._checkOutcome(); +}; + +SomePromiseArray.prototype._checkOutcome = function() { + if (this.howMany() > this._canPossiblyFulfill()) { + var e = new AggregateError(); + for (var i = this.length(); i < this._values.length; ++i) { + if (this._values[i] !== CANCELLATION) { + e.push(this._values[i]); + } + } + if (e.length > 0) { + this._reject(e); + } else { + this._cancel(); + } + return true; + } + return false; +}; + +SomePromiseArray.prototype._fulfilled = function () { + return this._totalResolved; +}; + +SomePromiseArray.prototype._rejected = function () { + return this._values.length - this.length(); +}; + +SomePromiseArray.prototype._addRejected = function (reason) { + this._values.push(reason); +}; + +SomePromiseArray.prototype._addFulfilled = function (value) { + this._values[this._totalResolved++] = value; +}; + +SomePromiseArray.prototype._canPossiblyFulfill = function () { + return this.length() - this._rejected(); +}; + +SomePromiseArray.prototype._getRangeError = function (count) { + var message = "Input array must contain at least " + + this._howMany + " items but contains only " + count + " items"; + return new RangeError(message); +}; + +SomePromiseArray.prototype._resolveEmptyArray = function () { + this._reject(this._getRangeError(0)); +}; + +function some(promises, howMany) { + if ((howMany | 0) !== howMany || howMany < 0) { + return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + var ret = new SomePromiseArray(promises); + var promise = ret.promise(); + ret.setHowMany(howMany); + ret.init(); + return promise; +} + +Promise.some = function (promises, howMany) { + return some(promises, howMany); +}; + +Promise.prototype.some = function (howMany) { + return some(this, howMany); +}; + +Promise._SomePromiseArray = SomePromiseArray; +}; diff --git a/node_modules/bluebird/js/release/synchronous_inspection.js b/node_modules/bluebird/js/release/synchronous_inspection.js new file mode 100644 index 0000000..9c49d2e --- /dev/null +++ b/node_modules/bluebird/js/release/synchronous_inspection.js @@ -0,0 +1,103 @@ +"use strict"; +module.exports = function(Promise) { +function PromiseInspection(promise) { + if (promise !== undefined) { + promise = promise._target(); + this._bitField = promise._bitField; + this._settledValueField = promise._isFateSealed() + ? promise._settledValue() : undefined; + } + else { + this._bitField = 0; + this._settledValueField = undefined; + } +} + +PromiseInspection.prototype._settledValue = function() { + return this._settledValueField; +}; + +var value = PromiseInspection.prototype.value = function () { + if (!this.isFulfilled()) { + throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var reason = PromiseInspection.prototype.error = +PromiseInspection.prototype.reason = function () { + if (!this.isRejected()) { + throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a"); + } + return this._settledValue(); +}; + +var isFulfilled = PromiseInspection.prototype.isFulfilled = function() { + return (this._bitField & 33554432) !== 0; +}; + +var isRejected = PromiseInspection.prototype.isRejected = function () { + return (this._bitField & 16777216) !== 0; +}; + +var isPending = PromiseInspection.prototype.isPending = function () { + return (this._bitField & 50397184) === 0; +}; + +var isResolved = PromiseInspection.prototype.isResolved = function () { + return (this._bitField & 50331648) !== 0; +}; + +PromiseInspection.prototype.isCancelled = function() { + return (this._bitField & 8454144) !== 0; +}; + +Promise.prototype.__isCancelled = function() { + return (this._bitField & 65536) === 65536; +}; + +Promise.prototype._isCancelled = function() { + return this._target().__isCancelled(); +}; + +Promise.prototype.isCancelled = function() { + return (this._target()._bitField & 8454144) !== 0; +}; + +Promise.prototype.isPending = function() { + return isPending.call(this._target()); +}; + +Promise.prototype.isRejected = function() { + return isRejected.call(this._target()); +}; + +Promise.prototype.isFulfilled = function() { + return isFulfilled.call(this._target()); +}; + +Promise.prototype.isResolved = function() { + return isResolved.call(this._target()); +}; + +Promise.prototype.value = function() { + return value.call(this._target()); +}; + +Promise.prototype.reason = function() { + var target = this._target(); + target._unsetRejectionIsUnhandled(); + return reason.call(target); +}; + +Promise.prototype._value = function() { + return this._settledValue(); +}; + +Promise.prototype._reason = function() { + this._unsetRejectionIsUnhandled(); + return this._settledValue(); +}; + +Promise.PromiseInspection = PromiseInspection; +}; diff --git a/node_modules/bluebird/js/release/thenables.js b/node_modules/bluebird/js/release/thenables.js new file mode 100644 index 0000000..d6ab9aa --- /dev/null +++ b/node_modules/bluebird/js/release/thenables.js @@ -0,0 +1,86 @@ +"use strict"; +module.exports = function(Promise, INTERNAL) { +var util = require("./util"); +var errorObj = util.errorObj; +var isObject = util.isObject; + +function tryConvertToPromise(obj, context) { + if (isObject(obj)) { + if (obj instanceof Promise) return obj; + var then = getThen(obj); + if (then === errorObj) { + if (context) context._pushContext(); + var ret = Promise.reject(then.e); + if (context) context._popContext(); + return ret; + } else if (typeof then === "function") { + if (isAnyBluebirdPromise(obj)) { + var ret = new Promise(INTERNAL); + obj._then( + ret._fulfill, + ret._reject, + undefined, + ret, + null + ); + return ret; + } + return doThenable(obj, then, context); + } + } + return obj; +} + +function doGetThen(obj) { + return obj.then; +} + +function getThen(obj) { + try { + return doGetThen(obj); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} + +var hasProp = {}.hasOwnProperty; +function isAnyBluebirdPromise(obj) { + try { + return hasProp.call(obj, "_promise0"); + } catch (e) { + return false; + } +} + +function doThenable(x, then, context) { + var promise = new Promise(INTERNAL); + var ret = promise; + if (context) context._pushContext(); + promise._captureStackTrace(); + if (context) context._popContext(); + var synchronous = true; + var result = util.tryCatch(then).call(x, resolve, reject); + synchronous = false; + + if (promise && result === errorObj) { + promise._rejectCallback(result.e, true, true); + promise = null; + } + + function resolve(value) { + if (!promise) return; + promise._resolveCallback(value); + promise = null; + } + + function reject(reason) { + if (!promise) return; + promise._rejectCallback(reason, synchronous, true); + promise = null; + } + return ret; +} + +return tryConvertToPromise; +}; diff --git a/node_modules/bluebird/js/release/timers.js b/node_modules/bluebird/js/release/timers.js new file mode 100644 index 0000000..cb8f1f4 --- /dev/null +++ b/node_modules/bluebird/js/release/timers.js @@ -0,0 +1,93 @@ +"use strict"; +module.exports = function(Promise, INTERNAL, debug) { +var util = require("./util"); +var TimeoutError = Promise.TimeoutError; + +function HandleWrapper(handle) { + this.handle = handle; +} + +HandleWrapper.prototype._resultCancelled = function() { + clearTimeout(this.handle); +}; + +var afterValue = function(value) { return delay(+this).thenReturn(value); }; +var delay = Promise.delay = function (ms, value) { + var ret; + var handle; + if (value !== undefined) { + ret = Promise.resolve(value) + ._then(afterValue, null, null, ms, undefined); + if (debug.cancellation() && value instanceof Promise) { + ret._setOnCancel(value); + } + } else { + ret = new Promise(INTERNAL); + handle = setTimeout(function() { ret._fulfill(); }, +ms); + if (debug.cancellation()) { + ret._setOnCancel(new HandleWrapper(handle)); + } + ret._captureStackTrace(); + } + ret._setAsyncGuaranteed(); + return ret; +}; + +Promise.prototype.delay = function (ms) { + return delay(ms, this); +}; + +var afterTimeout = function (promise, message, parent) { + var err; + if (typeof message !== "string") { + if (message instanceof Error) { + err = message; + } else { + err = new TimeoutError("operation timed out"); + } + } else { + err = new TimeoutError(message); + } + util.markAsOriginatingFromRejection(err); + promise._attachExtraTrace(err); + promise._reject(err); + + if (parent != null) { + parent.cancel(); + } +}; + +function successClear(value) { + clearTimeout(this.handle); + return value; +} + +function failureClear(reason) { + clearTimeout(this.handle); + throw reason; +} + +Promise.prototype.timeout = function (ms, message) { + ms = +ms; + var ret, parent; + + var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { + if (ret.isPending()) { + afterTimeout(ret, message, parent); + } + }, ms)); + + if (debug.cancellation()) { + parent = this.then(); + ret = parent._then(successClear, failureClear, + undefined, handleWrapper, undefined); + ret._setOnCancel(handleWrapper); + } else { + ret = this._then(successClear, failureClear, + undefined, handleWrapper, undefined); + } + + return ret; +}; + +}; diff --git a/node_modules/bluebird/js/release/using.js b/node_modules/bluebird/js/release/using.js new file mode 100644 index 0000000..65de531 --- /dev/null +++ b/node_modules/bluebird/js/release/using.js @@ -0,0 +1,226 @@ +"use strict"; +module.exports = function (Promise, apiRejection, tryConvertToPromise, + createContext, INTERNAL, debug) { + var util = require("./util"); + var TypeError = require("./errors").TypeError; + var inherits = require("./util").inherits; + var errorObj = util.errorObj; + var tryCatch = util.tryCatch; + var NULL = {}; + + function thrower(e) { + setTimeout(function(){throw e;}, 0); + } + + function castPreservingDisposable(thenable) { + var maybePromise = tryConvertToPromise(thenable); + if (maybePromise !== thenable && + typeof thenable._isDisposable === "function" && + typeof thenable._getDisposer === "function" && + thenable._isDisposable()) { + maybePromise._setDisposable(thenable._getDisposer()); + } + return maybePromise; + } + function dispose(resources, inspection) { + var i = 0; + var len = resources.length; + var ret = new Promise(INTERNAL); + function iterator() { + if (i >= len) return ret._fulfill(); + var maybePromise = castPreservingDisposable(resources[i++]); + if (maybePromise instanceof Promise && + maybePromise._isDisposable()) { + try { + maybePromise = tryConvertToPromise( + maybePromise._getDisposer().tryDispose(inspection), + resources.promise); + } catch (e) { + return thrower(e); + } + if (maybePromise instanceof Promise) { + return maybePromise._then(iterator, thrower, + null, null, null); + } + } + iterator(); + } + iterator(); + return ret; + } + + function Disposer(data, promise, context) { + this._data = data; + this._promise = promise; + this._context = context; + } + + Disposer.prototype.data = function () { + return this._data; + }; + + Disposer.prototype.promise = function () { + return this._promise; + }; + + Disposer.prototype.resource = function () { + if (this.promise().isFulfilled()) { + return this.promise().value(); + } + return NULL; + }; + + Disposer.prototype.tryDispose = function(inspection) { + var resource = this.resource(); + var context = this._context; + if (context !== undefined) context._pushContext(); + var ret = resource !== NULL + ? this.doDispose(resource, inspection) : null; + if (context !== undefined) context._popContext(); + this._promise._unsetDisposable(); + this._data = null; + return ret; + }; + + Disposer.isDisposer = function (d) { + return (d != null && + typeof d.resource === "function" && + typeof d.tryDispose === "function"); + }; + + function FunctionDisposer(fn, promise, context) { + this.constructor$(fn, promise, context); + } + inherits(FunctionDisposer, Disposer); + + FunctionDisposer.prototype.doDispose = function (resource, inspection) { + var fn = this.data(); + return fn.call(resource, resource, inspection); + }; + + function maybeUnwrapDisposer(value) { + if (Disposer.isDisposer(value)) { + this.resources[this.index]._setDisposable(value); + return value.promise(); + } + return value; + } + + function ResourceList(length) { + this.length = length; + this.promise = null; + this[length-1] = null; + } + + ResourceList.prototype._resultCancelled = function() { + var len = this.length; + for (var i = 0; i < len; ++i) { + var item = this[i]; + if (item instanceof Promise) { + item.cancel(); + } + } + }; + + Promise.using = function () { + var len = arguments.length; + if (len < 2) return apiRejection( + "you must pass at least 2 arguments to Promise.using"); + var fn = arguments[len - 1]; + if (typeof fn !== "function") { + return apiRejection("expecting a function but got " + util.classString(fn)); + } + var input; + var spreadArgs = true; + if (len === 2 && Array.isArray(arguments[0])) { + input = arguments[0]; + len = input.length; + spreadArgs = false; + } else { + input = arguments; + len--; + } + var resources = new ResourceList(len); + for (var i = 0; i < len; ++i) { + var resource = input[i]; + if (Disposer.isDisposer(resource)) { + var disposer = resource; + resource = resource.promise(); + resource._setDisposable(disposer); + } else { + var maybePromise = tryConvertToPromise(resource); + if (maybePromise instanceof Promise) { + resource = + maybePromise._then(maybeUnwrapDisposer, null, null, { + resources: resources, + index: i + }, undefined); + } + } + resources[i] = resource; + } + + var reflectedResources = new Array(resources.length); + for (var i = 0; i < reflectedResources.length; ++i) { + reflectedResources[i] = Promise.resolve(resources[i]).reflect(); + } + + var resultPromise = Promise.all(reflectedResources) + .then(function(inspections) { + for (var i = 0; i < inspections.length; ++i) { + var inspection = inspections[i]; + if (inspection.isRejected()) { + errorObj.e = inspection.error(); + return errorObj; + } else if (!inspection.isFulfilled()) { + resultPromise.cancel(); + return; + } + inspections[i] = inspection.value(); + } + promise._pushContext(); + + fn = tryCatch(fn); + var ret = spreadArgs + ? fn.apply(undefined, inspections) : fn(inspections); + var promiseCreated = promise._popContext(); + debug.checkForgottenReturns( + ret, promiseCreated, "Promise.using", promise); + return ret; + }); + + var promise = resultPromise.lastly(function() { + var inspection = new Promise.PromiseInspection(resultPromise); + return dispose(resources, inspection); + }); + resources.promise = promise; + promise._setOnCancel(resources); + return promise; + }; + + Promise.prototype._setDisposable = function (disposer) { + this._bitField = this._bitField | 131072; + this._disposer = disposer; + }; + + Promise.prototype._isDisposable = function () { + return (this._bitField & 131072) > 0; + }; + + Promise.prototype._getDisposer = function () { + return this._disposer; + }; + + Promise.prototype._unsetDisposable = function () { + this._bitField = this._bitField & (~131072); + this._disposer = undefined; + }; + + Promise.prototype.disposer = function (fn) { + if (typeof fn === "function") { + return new FunctionDisposer(fn, this, createContext()); + } + throw new TypeError(); + }; + +}; diff --git a/node_modules/bluebird/js/release/util.js b/node_modules/bluebird/js/release/util.js new file mode 100644 index 0000000..8ca4d91 --- /dev/null +++ b/node_modules/bluebird/js/release/util.js @@ -0,0 +1,421 @@ +"use strict"; +var es5 = require("./es5"); +var canEvaluate = typeof navigator == "undefined"; + +var errorObj = {e: {}}; +var tryCatchTarget; +var globalObject = typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : + typeof global !== "undefined" ? global : + this !== undefined ? this : null; + +function tryCatcher() { + try { + var target = tryCatchTarget; + tryCatchTarget = null; + return target.apply(this, arguments); + } catch (e) { + errorObj.e = e; + return errorObj; + } +} +function tryCatch(fn) { + tryCatchTarget = fn; + return tryCatcher; +} + +var inherits = function(Child, Parent) { + var hasProp = {}.hasOwnProperty; + + function T() { + this.constructor = Child; + this.constructor$ = Parent; + for (var propertyName in Parent.prototype) { + if (hasProp.call(Parent.prototype, propertyName) && + propertyName.charAt(propertyName.length-1) !== "$" + ) { + this[propertyName + "$"] = Parent.prototype[propertyName]; + } + } + } + T.prototype = Parent.prototype; + Child.prototype = new T(); + return Child.prototype; +}; + + +function isPrimitive(val) { + return val == null || val === true || val === false || + typeof val === "string" || typeof val === "number"; + +} + +function isObject(value) { + return typeof value === "function" || + typeof value === "object" && value !== null; +} + +function maybeWrapAsError(maybeError) { + if (!isPrimitive(maybeError)) return maybeError; + + return new Error(safeToString(maybeError)); +} + +function withAppended(target, appendee) { + var len = target.length; + var ret = new Array(len + 1); + var i; + for (i = 0; i < len; ++i) { + ret[i] = target[i]; + } + ret[i] = appendee; + return ret; +} + +function getDataPropertyOrDefault(obj, key, defaultValue) { + if (es5.isES5) { + var desc = Object.getOwnPropertyDescriptor(obj, key); + + if (desc != null) { + return desc.get == null && desc.set == null + ? desc.value + : defaultValue; + } + } else { + return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined; + } +} + +function notEnumerableProp(obj, name, value) { + if (isPrimitive(obj)) return obj; + var descriptor = { + value: value, + configurable: true, + enumerable: false, + writable: true + }; + es5.defineProperty(obj, name, descriptor); + return obj; +} + +function thrower(r) { + throw r; +} + +var inheritedDataKeys = (function() { + var excludedPrototypes = [ + Array.prototype, + Object.prototype, + Function.prototype + ]; + + var isExcludedProto = function(val) { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (excludedPrototypes[i] === val) { + return true; + } + } + return false; + }; + + if (es5.isES5) { + var getKeys = Object.getOwnPropertyNames; + return function(obj) { + var ret = []; + var visitedKeys = Object.create(null); + while (obj != null && !isExcludedProto(obj)) { + var keys; + try { + keys = getKeys(obj); + } catch (e) { + return ret; + } + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (visitedKeys[key]) continue; + visitedKeys[key] = true; + var desc = Object.getOwnPropertyDescriptor(obj, key); + if (desc != null && desc.get == null && desc.set == null) { + ret.push(key); + } + } + obj = es5.getPrototypeOf(obj); + } + return ret; + }; + } else { + var hasProp = {}.hasOwnProperty; + return function(obj) { + if (isExcludedProto(obj)) return []; + var ret = []; + + /*jshint forin:false */ + enumeration: for (var key in obj) { + if (hasProp.call(obj, key)) { + ret.push(key); + } else { + for (var i = 0; i < excludedPrototypes.length; ++i) { + if (hasProp.call(excludedPrototypes[i], key)) { + continue enumeration; + } + } + ret.push(key); + } + } + return ret; + }; + } + +})(); + +var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/; +function isClass(fn) { + try { + if (typeof fn === "function") { + var keys = es5.names(fn.prototype); + + var hasMethods = es5.isES5 && keys.length > 1; + var hasMethodsOtherThanConstructor = keys.length > 0 && + !(keys.length === 1 && keys[0] === "constructor"); + var hasThisAssignmentAndStaticMethods = + thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0; + + if (hasMethods || hasMethodsOtherThanConstructor || + hasThisAssignmentAndStaticMethods) { + return true; + } + } + return false; + } catch (e) { + return false; + } +} + +function toFastProperties(obj) { + /*jshint -W027,-W055,-W031*/ + function FakeConstructor() {} + FakeConstructor.prototype = obj; + var receiver = new FakeConstructor(); + function ic() { + return typeof receiver.foo; + } + ic(); + ic(); + return obj; + eval(obj); +} + +var rident = /^[a-z$_][a-z$_0-9]*$/i; +function isIdentifier(str) { + return rident.test(str); +} + +function filledRange(count, prefix, suffix) { + var ret = new Array(count); + for(var i = 0; i < count; ++i) { + ret[i] = prefix + i + suffix; + } + return ret; +} + +function safeToString(obj) { + try { + return obj + ""; + } catch (e) { + return "[no string representation]"; + } +} + +function isError(obj) { + return obj instanceof Error || + (obj !== null && + typeof obj === "object" && + typeof obj.message === "string" && + typeof obj.name === "string"); +} + +function markAsOriginatingFromRejection(e) { + try { + notEnumerableProp(e, "isOperational", true); + } + catch(ignore) {} +} + +function originatesFromRejection(e) { + if (e == null) return false; + return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) || + e["isOperational"] === true); +} + +function canAttachTrace(obj) { + return isError(obj) && es5.propertyIsWritable(obj, "stack"); +} + +var ensureErrorObject = (function() { + if (!("stack" in new Error())) { + return function(value) { + if (canAttachTrace(value)) return value; + try {throw new Error(safeToString(value));} + catch(err) {return err;} + }; + } else { + return function(value) { + if (canAttachTrace(value)) return value; + return new Error(safeToString(value)); + }; + } +})(); + +function classString(obj) { + return {}.toString.call(obj); +} + +function copyDescriptors(from, to, filter) { + var keys = es5.names(from); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + if (filter(key)) { + try { + es5.defineProperty(to, key, es5.getDescriptor(from, key)); + } catch (ignore) {} + } + } +} + +var asArray = function(v) { + if (es5.isArray(v)) { + return v; + } + return null; +}; + +if (typeof Symbol !== "undefined" && Symbol.iterator) { + var ArrayFrom = typeof Array.from === "function" ? function(v) { + return Array.from(v); + } : function(v) { + var ret = []; + var it = v[Symbol.iterator](); + var itResult; + while (!((itResult = it.next()).done)) { + ret.push(itResult.value); + } + return ret; + }; + + asArray = function(v) { + if (es5.isArray(v)) { + return v; + } else if (v != null && typeof v[Symbol.iterator] === "function") { + return ArrayFrom(v); + } + return null; + }; +} + +var isNode = typeof process !== "undefined" && + classString(process).toLowerCase() === "[object process]"; + +var hasEnvVariables = typeof process !== "undefined" && + typeof process.env !== "undefined"; + +function env(key) { + return hasEnvVariables ? process.env[key] : undefined; +} + +function getNativePromise() { + if (typeof Promise === "function") { + try { + var promise = new Promise(function(){}); + if (classString(promise) === "[object Promise]") { + return Promise; + } + } catch (e) {} + } +} + +var reflectHandler; +function contextBind(ctx, cb) { + if (ctx === null || + typeof cb !== "function" || + cb === reflectHandler) { + return cb; + } + + if (ctx.domain !== null) { + cb = ctx.domain.bind(cb); + } + + var async = ctx.async; + if (async !== null) { + var old = cb; + cb = function() { + var $_len = arguments.length + 2;var args = new Array($_len); for(var $_i = 2; $_i < $_len ; ++$_i) {args[$_i] = arguments[$_i - 2];}; + args[0] = old; + args[1] = this; + return async.runInAsyncScope.apply(async, args); + }; + } + return cb; +} + +var ret = { + setReflectHandler: function(fn) { + reflectHandler = fn; + }, + isClass: isClass, + isIdentifier: isIdentifier, + inheritedDataKeys: inheritedDataKeys, + getDataPropertyOrDefault: getDataPropertyOrDefault, + thrower: thrower, + isArray: es5.isArray, + asArray: asArray, + notEnumerableProp: notEnumerableProp, + isPrimitive: isPrimitive, + isObject: isObject, + isError: isError, + canEvaluate: canEvaluate, + errorObj: errorObj, + tryCatch: tryCatch, + inherits: inherits, + withAppended: withAppended, + maybeWrapAsError: maybeWrapAsError, + toFastProperties: toFastProperties, + filledRange: filledRange, + toString: safeToString, + canAttachTrace: canAttachTrace, + ensureErrorObject: ensureErrorObject, + originatesFromRejection: originatesFromRejection, + markAsOriginatingFromRejection: markAsOriginatingFromRejection, + classString: classString, + copyDescriptors: copyDescriptors, + isNode: isNode, + hasEnvVariables: hasEnvVariables, + env: env, + global: globalObject, + getNativePromise: getNativePromise, + contextBind: contextBind +}; +ret.isRecentNode = ret.isNode && (function() { + var version; + if (process.versions && process.versions.node) { + version = process.versions.node.split(".").map(Number); + } else if (process.version) { + version = process.version.split(".").map(Number); + } + return (version[0] === 0 && version[1] > 10) || (version[0] > 0); +})(); +ret.nodeSupportsAsyncResource = ret.isNode && (function() { + var supportsAsync = false; + try { + var res = require("async_hooks").AsyncResource; + supportsAsync = typeof res.prototype.runInAsyncScope === "function"; + } catch (e) { + supportsAsync = false; + } + return supportsAsync; +})(); + +if (ret.isNode) ret.toFastProperties(process); + +try {throw new Error(); } catch (e) {ret.lastLineError = e;} +module.exports = ret; diff --git a/node_modules/bluebird/package.json b/node_modules/bluebird/package.json new file mode 100644 index 0000000..33f696c --- /dev/null +++ b/node_modules/bluebird/package.json @@ -0,0 +1,78 @@ +{ + "name": "bluebird", + "description": "Full featured Promises/A+ implementation with exceptionally good performance", + "version": "3.7.2", + "keywords": [ + "promise", + "performance", + "promises", + "promises-a", + "promises-aplus", + "async", + "await", + "deferred", + "deferreds", + "future", + "flow control", + "dsl", + "fluent interface" + ], + "scripts": { + "lint": "node scripts/jshint.js", + "test": "node --expose-gc tools/test.js", + "istanbul": "istanbul", + "prepublish": "npm run generate-browser-core && npm run generate-browser-full", + "generate-browser-full": "node tools/build.js --no-clean --no-debug --release --browser --minify", + "generate-browser-core": "node tools/build.js --features=core --no-debug --release --zalgo --browser --minify && mv js/browser/bluebird.js js/browser/bluebird.core.js && mv js/browser/bluebird.min.js js/browser/bluebird.core.min.js" + }, + "homepage": "https://github.com/petkaantonov/bluebird", + "repository": { + "type": "git", + "url": "git://github.com/petkaantonov/bluebird.git" + }, + "bugs": { + "url": "http://github.com/petkaantonov/bluebird/issues" + }, + "license": "MIT", + "author": { + "name": "Petka Antonov", + "email": "petka_antonov@hotmail.com", + "url": "http://github.com/petkaantonov/" + }, + "devDependencies": { + "acorn": "^6.0.2", + "acorn-walk": "^6.1.0", + "baconjs": "^0.7.43", + "bluebird": "^2.9.2", + "body-parser": "^1.10.2", + "browserify": "^8.1.1", + "cli-table": "~0.3.1", + "co": "^4.2.0", + "cross-spawn": "^0.2.3", + "glob": "^4.3.2", + "grunt-saucelabs": "~8.4.1", + "highland": "^2.3.0", + "istanbul": "^0.3.5", + "jshint": "^2.6.0", + "jshint-stylish": "~0.2.0", + "kefir": "^2.4.1", + "mkdirp": "~0.5.0", + "mocha": "~2.1", + "open": "~0.0.5", + "optimist": "~0.6.1", + "rimraf": "~2.2.6", + "rx": "^2.3.25", + "serve-static": "^1.7.1", + "sinon": "~1.7.3", + "uglify-js": "~2.4.16" + }, + "readmeFilename": "README.md", + "main": "./js/release/bluebird.js", + "webpack": "./js/release/bluebird.js", + "browser": "./js/browser/bluebird.js", + "files": [ + "js/browser", + "js/release", + "LICENSE" + ] +} diff --git a/node_modules/commander/CHANGELOG.md b/node_modules/commander/CHANGELOG.md new file mode 100644 index 0000000..9b8359b --- /dev/null +++ b/node_modules/commander/CHANGELOG.md @@ -0,0 +1,361 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). (Format adopted after v3.0.0.) + + + + +## [6.2.1] (2020-12-13) + +### Fixed + +- some tests failed if directory path included a space ([1390]) + +## [6.2.0] (2020-10-25) + +### Added + +- added 'tsx' file extension for stand-alone executable subcommands ([#1368]) +- documented second parameter to `.description()` to describe command arguments ([#1353]) +- documentation of special cases with options taking varying numbers of option-arguments ([#1332]) +- documentation for terminology ([#1361]) + +### Fixed + +- add missing TypeScript definition for `.addHelpCommand()' ([#1375]) +- removed blank line after "Arguments:" in help, to match "Options:" and "Commands:" ([#1360]) + +### Changed + +- update dependencies + +## [6.1.0] (2020-08-28) + +### Added + +- include URL to relevant section of README for error for potential conflict between Command properties and option values ([#1306]) +- `.combineFlagAndOptionalValue(false)` to ease upgrade path from older versions of Commander ([#1326]) +- allow disabling the built-in help option using `.helpOption(false)` ([#1325]) +- allow just some arguments in `argumentDescription` to `.description()` ([#1323]) + +### Changed + +- tidy async test and remove lint override ([#1312]) + +### Fixed + +- executable subcommand launching when script path not known ([#1322]) + +## [6.0.0] (2020-07-21) + +### Added + +- add support for variadic options ([#1250]) +- allow options to be added with just a short flag ([#1256]) + - *Breaking* the option property has same case as flag. e.g. flag `-n` accessed as `opts().n` (previously uppercase) +- *Breaking* throw an error if there might be a clash between option name and a Command property, with advice on how to resolve ([#1275]) + +### Fixed + +- Options which contain -no- in the middle of the option flag should not be treated as negatable. ([#1301]) + +## [6.0.0-0] (2020-06-20) + +(Released in 6.0.0) + +## [5.1.0] (2020-04-25) + +### Added + +- support for multiple command aliases, the first of which is shown in the auto-generated help ([#531], [#1236]) +- configuration support in `addCommand()` for `hidden` and `isDefault` ([#1232]) + +### Fixed + +- omit masked help flags from the displayed help ([#645], [#1247]) +- remove old short help flag when change help flags using `helpOption` ([#1248]) + +### Changed + +- remove use of `arguments` to improve auto-generated help in editors ([#1235]) +- rename `.command()` configuration `noHelp` to `hidden` (but not remove old support) ([#1232]) +- improvements to documentation +- update dependencies +- update tested versions of node +- eliminate lint errors in TypeScript ([#1208]) + +## [5.0.0] (2020-03-14) + +### Added + +* support for nested commands with action-handlers ([#1] [#764] [#1149]) +* `.addCommand()` for adding a separately configured command ([#764] [#1149]) +* allow a non-executable to be set as the default command ([#742] [#1149]) +* implicit help command when there are subcommands (previously only if executables) ([#1149]) +* customise implicit help command with `.addHelpCommand()` ([#1149]) +* display error message for unknown subcommand, by default ([#432] [#1088] [#1149]) +* display help for missing subcommand, by default ([#1088] [#1149]) +* combined short options as single argument may include boolean flags and value flag and value (e.g. `-a -b -p 80` can be written as `-abp80`) ([#1145]) +* `.parseOption()` includes short flag and long flag expansions ([#1145]) +* `.helpInformation()` returns help text as a string, previously a private routine ([#1169]) +* `.parse()` implicitly uses `process.argv` if arguments not specified ([#1172]) +* optionally specify where `.parse()` arguments "from", if not following node conventions ([#512] [#1172]) +* suggest help option along with unknown command error ([#1179]) +* TypeScript definition for `commands` property of `Command` ([#1184]) +* export `program` property ([#1195]) +* `createCommand` factory method to simplify subclassing ([#1191]) + +### Fixed + +* preserve argument order in subcommands ([#508] [#962] [#1138]) +* do not emit `command:*` for executable subcommands ([#809] [#1149]) +* action handler called whether or not there are non-option arguments ([#1062] [#1149]) +* combining option short flag and value in single argument now works for subcommands ([#1145]) +* only add implicit help command when it will not conflict with other uses of argument ([#1153] [#1149]) +* implicit help command works with command aliases ([#948] [#1149]) +* options are validated whether or not there is an action handler ([#1149]) + +### Changed + +* *Breaking* `.args` contains command arguments with just recognised options removed ([#1032] [#1138]) +* *Breaking* display error if required argument for command is missing ([#995] [#1149]) +* tighten TypeScript definition of custom option processing function passed to `.option()` ([#1119]) +* *Breaking* `.allowUnknownOption()` ([#802] [#1138]) + * unknown options included in arguments passed to command action handler + * unknown options included in `.args` +* only recognised option short flags and long flags are expanded (e.g. `-ab` or `--foo=bar`) ([#1145]) +* *Breaking* `.parseOptions()` ([#1138]) + * `args` in returned result renamed `operands` and does not include anything after first unknown option + * `unknown` in returned result has arguments after first unknown option including operands, not just options and values +* *Breaking* `.on('command:*', callback)` and other command events passed (changed) results from `.parseOptions`, i.e. operands and unknown ([#1138]) +* refactor Option from prototype to class ([#1133]) +* refactor Command from prototype to class ([#1159]) +* changes to error handling ([#1165]) + * throw for author error, not just display message + * preflight for variadic error + * add tips to missing subcommand executable +* TypeScript fluent return types changed to be more subclass friendly, return `this` rather than `Command` ([#1180]) +* `.parseAsync` returns `Promise` to be consistent with `.parse()` ([#1180]) +* update dependencies + +### Removed + +* removed EventEmitter from TypeScript definition for Command, eliminating implicit peer dependency on `@types/node` ([#1146]) +* removed private function `normalize` (the functionality has been integrated into `parseOptions`) ([#1145]) +* `parseExpectedArgs` is now private ([#1149]) + +### Migration Tips + +If you use `.on('command:*')` or more complicated tests to detect an unrecognised subcommand, you may be able to delete the code and rely on the default behaviour. + +If you use `program.args` or more complicated tests to detect a missing subcommand, you may be able to delete the code and rely on the default behaviour. + +If you use `.command('*')` to add a default command, you may be be able to switch to `isDefault:true` with a named command. + +If you want to continue combining short options with optional values as though they were boolean flags, set `combineFlagAndOptionalValue(false)` +to expand `-fb` to `-f -b` rather than `-f b`. + +## [5.0.0-4] (2020-03-03) + +(Released in 5.0.0) + +## [5.0.0-3] (2020-02-20) + +(Released in 5.0.0) + +## [5.0.0-2] (2020-02-10) + +(Released in 5.0.0) + +## [5.0.0-1] (2020-02-08) + +(Released in 5.0.0) + +## [5.0.0-0] (2020-02-02) + +(Released in 5.0.0) + +## [4.1.1] (2020-02-02) + +### Fixed + +* TypeScript definition for `.action()` should include Promise for async ([#1157]) + +## [4.1.0] (2020-01-06) + +### Added + +* two routines to change how option values are handled, and eliminate name clashes with command properties ([#933] [#1102]) + * see storeOptionsAsProperties and passCommandToAction in README +* `.parseAsync` to use instead of `.parse` if supply async action handlers ([#806] [#1118]) + +### Fixed + +* Remove trailing blanks from wrapped help text ([#1096]) + +### Changed + +* update dependencies +* extend security coverage for Commander 2.x to 2020-02-03 +* improvements to README +* improvements to TypeScript definition documentation +* move old versions out of main CHANGELOG +* removed explicit use of `ts-node` in tests + +## [4.0.1] (2019-11-12) + +### Fixed + +* display help when requested, even if there are missing required options ([#1091]) + +## [4.0.0] (2019-11-02) + +### Added + +* automatically wrap and indent help descriptions for options and commands ([#1051]) +* `.exitOverride()` allows override of calls to `process.exit` for additional error handling and to keep program running ([#1040]) +* support for declaring required options with `.requiredOptions()` ([#1071]) +* GitHub Actions support ([#1027]) +* translation links in README + +### Changed + +* dev: switch tests from Sinon+Should to Jest with major rewrite of tests ([#1035]) +* call default subcommand even when there are unknown options ([#1047]) +* *Breaking* Commander is only officially supported on Node 8 and above, and requires Node 6 ([#1053]) + +### Fixed + +* *Breaking* keep command object out of program.args when action handler called ([#1048]) + * also, action handler now passed array of unknown arguments +* complain about unknown options when program argument supplied and action handler ([#1049]) + * this changes parameters to `command:*` event to include unknown arguments +* removed deprecated `customFds` option from call to `child_process.spawn` ([#1052]) +* rework TypeScript declarations to bring all types into imported namespace ([#1081]) + +### Migration Tips + +#### Testing for no arguments + +If you were previously using code like: + +```js +if (!program.args.length) ... +``` + +a partial replacement is: + +```js +if (program.rawArgs.length < 3) ... +``` + +## [4.0.0-1] Prerelease (2019-10-08) + +(Released in 4.0.0) + +## [4.0.0-0] Prerelease (2019-10-01) + +(Released in 4.0.0) + +## Older versions + +* [3.x](./changelogs/CHANGELOG-3.md) +* [2.x](./changelogs/CHANGELOG-2.md) +* [1.x](./changelogs/CHANGELOG-1.md) +* [0.x](./changelogs/CHANGELOG-0.md) + +[#1]: https://github.com/tj/commander.js/issues/1 +[#432]: https://github.com/tj/commander.js/issues/432 +[#508]: https://github.com/tj/commander.js/issues/508 +[#512]: https://github.com/tj/commander.js/issues/512 +[#531]: https://github.com/tj/commander.js/issues/531 +[#645]: https://github.com/tj/commander.js/issues/645 +[#742]: https://github.com/tj/commander.js/issues/742 +[#764]: https://github.com/tj/commander.js/issues/764 +[#802]: https://github.com/tj/commander.js/issues/802 +[#806]: https://github.com/tj/commander.js/issues/806 +[#809]: https://github.com/tj/commander.js/issues/809 +[#948]: https://github.com/tj/commander.js/issues/948 +[#962]: https://github.com/tj/commander.js/issues/962 +[#995]: https://github.com/tj/commander.js/issues/995 +[#1027]: https://github.com/tj/commander.js/pull/1027 +[#1032]: https://github.com/tj/commander.js/issues/1032 +[#1035]: https://github.com/tj/commander.js/pull/1035 +[#1040]: https://github.com/tj/commander.js/pull/1040 +[#1047]: https://github.com/tj/commander.js/pull/1047 +[#1048]: https://github.com/tj/commander.js/pull/1048 +[#1049]: https://github.com/tj/commander.js/pull/1049 +[#1051]: https://github.com/tj/commander.js/pull/1051 +[#1052]: https://github.com/tj/commander.js/pull/1052 +[#1053]: https://github.com/tj/commander.js/pull/1053 +[#1062]: https://github.com/tj/commander.js/pull/1062 +[#1071]: https://github.com/tj/commander.js/pull/1071 +[#1081]: https://github.com/tj/commander.js/pull/1081 +[#1088]: https://github.com/tj/commander.js/issues/1088 +[#1091]: https://github.com/tj/commander.js/pull/1091 +[#1096]: https://github.com/tj/commander.js/pull/1096 +[#1102]: https://github.com/tj/commander.js/pull/1102 +[#1118]: https://github.com/tj/commander.js/pull/1118 +[#1119]: https://github.com/tj/commander.js/pull/1119 +[#1133]: https://github.com/tj/commander.js/pull/1133 +[#1138]: https://github.com/tj/commander.js/pull/1138 +[#1145]: https://github.com/tj/commander.js/pull/1145 +[#1146]: https://github.com/tj/commander.js/pull/1146 +[#1149]: https://github.com/tj/commander.js/pull/1149 +[#1153]: https://github.com/tj/commander.js/issues/1153 +[#1157]: https://github.com/tj/commander.js/pull/1157 +[#1159]: https://github.com/tj/commander.js/pull/1159 +[#1165]: https://github.com/tj/commander.js/pull/1165 +[#1169]: https://github.com/tj/commander.js/pull/1169 +[#1172]: https://github.com/tj/commander.js/pull/1172 +[#1179]: https://github.com/tj/commander.js/pull/1179 +[#1180]: https://github.com/tj/commander.js/pull/1180 +[#1184]: https://github.com/tj/commander.js/pull/1184 +[#1191]: https://github.com/tj/commander.js/pull/1191 +[#1195]: https://github.com/tj/commander.js/pull/1195 +[#1208]: https://github.com/tj/commander.js/pull/1208 +[#1232]: https://github.com/tj/commander.js/pull/1232 +[#1235]: https://github.com/tj/commander.js/pull/1235 +[#1236]: https://github.com/tj/commander.js/pull/1236 +[#1247]: https://github.com/tj/commander.js/pull/1247 +[#1248]: https://github.com/tj/commander.js/pull/1248 +[#1250]: https://github.com/tj/commander.js/pull/1250 +[#1256]: https://github.com/tj/commander.js/pull/1256 +[#1275]: https://github.com/tj/commander.js/pull/1275 +[#1301]: https://github.com/tj/commander.js/issues/1301 +[#1306]: https://github.com/tj/commander.js/pull/1306 +[#1312]: https://github.com/tj/commander.js/pull/1312 +[#1322]: https://github.com/tj/commander.js/pull/1322 +[#1323]: https://github.com/tj/commander.js/pull/1323 +[#1325]: https://github.com/tj/commander.js/pull/1325 +[#1326]: https://github.com/tj/commander.js/pull/1326 +[#1332]: https://github.com/tj/commander.js/pull/1332 +[#1353]: https://github.com/tj/commander.js/pull/1353 +[#1360]: https://github.com/tj/commander.js/pull/1360 +[#1361]: https://github.com/tj/commander.js/pull/1361 +[#1368]: https://github.com/tj/commander.js/pull/1368 +[#1375]: https://github.com/tj/commander.js/pull/1375 +[#1390]: https://github.com/tj/commander.js/pull/1390 + +[Unreleased]: https://github.com/tj/commander.js/compare/master...develop +[6.2.1]: https://github.com/tj/commander.js/compare/v6.2.0..v6.2.1 +[6.2.0]: https://github.com/tj/commander.js/compare/v6.1.0..v6.2.0 +[6.1.0]: https://github.com/tj/commander.js/compare/v6.0.0..v6.1.0 +[6.0.0]: https://github.com/tj/commander.js/compare/v5.1.0..v6.0.0 +[6.0.0-0]: https://github.com/tj/commander.js/compare/v5.1.0..v6.0.0-0 +[5.1.0]: https://github.com/tj/commander.js/compare/v5.0.0..v5.1.0 +[5.0.0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0 +[5.0.0-4]: https://github.com/tj/commander.js/compare/v5.0.0-3..v5.0.0-4 +[5.0.0-3]: https://github.com/tj/commander.js/compare/v5.0.0-2..v5.0.0-3 +[5.0.0-2]: https://github.com/tj/commander.js/compare/v5.0.0-1..v5.0.0-2 +[5.0.0-1]: https://github.com/tj/commander.js/compare/v5.0.0-0..v5.0.0-1 +[5.0.0-0]: https://github.com/tj/commander.js/compare/v4.1.1..v5.0.0-0 +[4.1.1]: https://github.com/tj/commander.js/compare/v4.1.0..v4.1.1 +[4.1.0]: https://github.com/tj/commander.js/compare/v4.0.1..v4.1.0 +[4.0.1]: https://github.com/tj/commander.js/compare/v4.0.0..v4.0.1 +[4.0.0]: https://github.com/tj/commander.js/compare/v3.0.2..v4.0.0 +[4.0.0-1]: https://github.com/tj/commander.js/compare/v4.0.0-0..v4.0.0-1 +[4.0.0-0]: https://github.com/tj/commander.js/compare/v3.0.2...v4.0.0-0 diff --git a/node_modules/commander/LICENSE b/node_modules/commander/LICENSE new file mode 100644 index 0000000..10f997a --- /dev/null +++ b/node_modules/commander/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/commander/Readme.md b/node_modules/commander/Readme.md new file mode 100644 index 0000000..45cd755 --- /dev/null +++ b/node_modules/commander/Readme.md @@ -0,0 +1,791 @@ +# Commander.js + +[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js) +[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) +[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) +[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) + +The complete solution for [node.js](http://nodejs.org) command-line interfaces. + +Read this in other languages: English | [简体中文](./Readme_zh-CN.md) + +- [Commander.js](#commanderjs) + - [Installation](#installation) + - [Declaring _program_ variable](#declaring-program-variable) + - [Options](#options) + - [Common option types, boolean and value](#common-option-types-boolean-and-value) + - [Default option value](#default-option-value) + - [Other option types, negatable boolean and boolean|value](#other-option-types-negatable-boolean-and-booleanvalue) + - [Custom option processing](#custom-option-processing) + - [Required option](#required-option) + - [Variadic option](#variadic-option) + - [Version option](#version-option) + - [Commands](#commands) + - [Specify the argument syntax](#specify-the-argument-syntax) + - [Action handler (sub)commands](#action-handler-subcommands) + - [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands) + - [Automated help](#automated-help) + - [Custom help](#custom-help) + - [.usage and .name](#usage-and-name) + - [.help(cb)](#helpcb) + - [.outputHelp(cb)](#outputhelpcb) + - [.helpInformation()](#helpinformation) + - [.helpOption(flags, description)](#helpoptionflags-description) + - [.addHelpCommand()](#addhelpcommand) + - [Custom event listeners](#custom-event-listeners) + - [Bits and pieces](#bits-and-pieces) + - [.parse() and .parseAsync()](#parse-and-parseasync) + - [Avoiding option name clashes](#avoiding-option-name-clashes) + - [TypeScript](#typescript) + - [createCommand()](#createcommand) + - [Import into ECMAScript Module](#import-into-ecmascript-module) + - [Node options such as `--harmony`](#node-options-such-as---harmony) + - [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands) + - [Override exit handling](#override-exit-handling) + - [Examples](#examples) + - [Support](#support) + - [Commander for enterprise](#commander-for-enterprise) + +For information about terms used in this document see: [terminology](./docs/terminology.md) + +## Installation + +```bash +npm install commander +``` + +## Declaring _program_ variable + +Commander exports a global object which is convenient for quick programs. +This is used in the examples in this README for brevity. + +```js +const { program } = require('commander'); +program.version('0.0.1'); +``` + +For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. + +```js +const { Command } = require('commander'); +const program = new Command(); +program.version('0.0.1'); +``` + +## Options + +Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|'). + +The options can be accessed as properties on the Command object. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. See also optional new behaviour to [avoid name clashes](#avoiding-option-name-clashes). + +Multiple short flags may optionally be combined in a single argument following the dash: boolean flags, followed by a single option taking a value (possibly followed by the value). +For example `-a -b -p 80` may be written as `-ab -p80` or even `-abp80`. + +You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted. + +Options on the command line are not positional, and can be specified before or after other arguments. + +### Common option types, boolean and value + +The two most used option types are a boolean option, and an option which takes its value +from the following argument (declared with angle brackets like `--expect `). Both are `undefined` unless specified on command line. + +Example file: [options-common.js](./examples/options-common.js) + +```js +program + .option('-d, --debug', 'output extra debugging') + .option('-s, --small', 'small pizza size') + .option('-p, --pizza-type ', 'flavour of pizza'); + +program.parse(process.argv); + +if (program.debug) console.log(program.opts()); +console.log('pizza details:'); +if (program.small) console.log('- small pizza size'); +if (program.pizzaType) console.log(`- ${program.pizzaType}`); +``` + +```bash +$ pizza-options -d +{ debug: true, small: undefined, pizzaType: undefined } +pizza details: +$ pizza-options -p +error: option '-p, --pizza-type ' argument missing +$ pizza-options -ds -p vegetarian +{ debug: true, small: true, pizzaType: 'vegetarian' } +pizza details: +- small pizza size +- vegetarian +$ pizza-options --pizza-type=cheese +pizza details: +- cheese +``` + +`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array. + +### Default option value + +You can specify a default value for an option which takes a value. + +Example file: [options-defaults.js](./examples/options-defaults.js) + +```js +program + .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); + +program.parse(process.argv); + +console.log(`cheese: ${program.cheese}`); +``` + +```bash +$ pizza-options +cheese: blue +$ pizza-options --cheese stilton +cheese: stilton +``` + +### Other option types, negatable boolean and boolean|value + +You can define a boolean option long name with a leading `no-` to set the option value to false when used. +Defined alone this also makes the option true by default. + +If you define `--foo` first, adding `--no-foo` does not change the default value from what it would +otherwise be. You can specify a default boolean value for a boolean option and it can be overridden on command line. + +Example file: [options-negatable.js](./examples/options-negatable.js) + +```js +program + .option('--no-sauce', 'Remove sauce') + .option('--cheese ', 'cheese flavour', 'mozzarella') + .option('--no-cheese', 'plain with no cheese') + .parse(process.argv); + +const sauceStr = program.sauce ? 'sauce' : 'no sauce'; +const cheeseStr = (program.cheese === false) ? 'no cheese' : `${program.cheese} cheese`; +console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); +``` + +```bash +$ pizza-options +You ordered a pizza with sauce and mozzarella cheese +$ pizza-options --sauce +error: unknown option '--sauce' +$ pizza-options --cheese=blue +You ordered a pizza with sauce and blue cheese +$ pizza-options --no-sauce --no-cheese +You ordered a pizza with no sauce and no cheese +``` + +You can specify an option which may be used as a boolean option but may optionally take an option-argument +(declared with square brackets like `--optional [value]`). + +Example file: [options-boolean-or-value.js](./examples/options-boolean-or-value.js) + +```js +program + .option('-c, --cheese [type]', 'Add cheese with optional type'); + +program.parse(process.argv); + +if (program.cheese === undefined) console.log('no cheese'); +else if (program.cheese === true) console.log('add cheese'); +else console.log(`add cheese type ${program.cheese}`); +``` + +```bash +$ pizza-options +no cheese +$ pizza-options --cheese +add cheese +$ pizza-options --cheese mozzarella +add cheese type mozzarella +``` + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Custom option processing + +You may specify a function to do custom processing of option-arguments. The callback function receives two parameters, +the user specified option-argument and the previous value for the option. It returns the new value for the option. + +This allows you to coerce the option-argument to the desired type, or accumulate values, or do entirely custom processing. + +You can optionally specify the default/starting value for the option after the function parameter. + +Example file: [options-custom-processing.js](./examples/options-custom-processing.js) + +```js +function myParseInt(value, dummyPrevious) { + // parseInt takes a string and an optional radix + return parseInt(value); +} + +function increaseVerbosity(dummyValue, previous) { + return previous + 1; +} + +function collect(value, previous) { + return previous.concat([value]); +} + +function commaSeparatedList(value, dummyPrevious) { + return value.split(','); +} + +program + .option('-f, --float ', 'float argument', parseFloat) + .option('-i, --integer ', 'integer argument', myParseInt) + .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) + .option('-c, --collect ', 'repeatable value', collect, []) + .option('-l, --list ', 'comma separated list', commaSeparatedList) +; + +program.parse(process.argv); + +if (program.float !== undefined) console.log(`float: ${program.float}`); +if (program.integer !== undefined) console.log(`integer: ${program.integer}`); +if (program.verbose > 0) console.log(`verbosity: ${program.verbose}`); +if (program.collect.length > 0) console.log(program.collect); +if (program.list !== undefined) console.log(program.list); +``` + +```bash +$ custom -f 1e2 +float: 100 +$ custom --integer 2 +integer: 2 +$ custom -v -v -v +verbose: 3 +$ custom -c a -c b -c c +[ 'a', 'b', 'c' ] +$ custom --list x,y,z +[ 'x', 'y', 'z' ] +``` + +### Required option + +You may specify a required (mandatory) option using `.requiredOption`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option` in format, taking flags and description, and optional default value or custom processing. + +Example file: [options-required.js](./examples/options-required.js) + +```js +program + .requiredOption('-c, --cheese ', 'pizza must have cheese'); + +program.parse(process.argv); +``` + +```bash +$ pizza +error: required option '-c, --cheese ' not specified +``` + +### Variadic option + +You may make an option variadic by appending `...` to the value placeholder when declaring the option. On the command line you +can then specify multiple option-arguments, and the parsed option value will be an array. The extra arguments +are read until the first argument starting with a dash. The special argument `--` stops option processing entirely. If a value +is specified in the same argument as the option then no further values are read. + +Example file: [options-variadic.js](./examples/options-variadic.js) + +```js +program + .option('-n, --number ', 'specify numbers') + .option('-l, --letter [letters...]', 'specify letters'); + +program.parse(); + +console.log('Options: ', program.opts()); +console.log('Remaining arguments: ', program.args); +``` + +```bash +$ collect -n 1 2 3 --letter a b c +Options: { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] } +Remaining arguments: [] +$ collect --letter=A -n80 operand +Options: { number: [ '80' ], letter: [ 'A' ] } +Remaining arguments: [ 'operand' ] +$ collect --letter -n 1 -n 2 3 -- operand +Options: { number: [ '1', '2', '3' ], letter: true } +Remaining arguments: [ 'operand' ] +``` + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Version option + +The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. + +```js +program.version('0.0.1'); +``` + +```bash +$ ./examples/pizza -V +0.0.1 +``` + +You may change the flags and description by passing additional parameters to the `version` method, using +the same syntax for flags as the `option` method. + +```js +program.version('0.0.1', '-v, --vers', 'output the current version'); +``` + +## Commands + +You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)). + +In the first parameter to `.command()` you specify the command name and any command-arguments. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. + +You can use `.addCommand()` to add an already configured subcommand to the program. + +For example: + +```js +// Command implemented using action handler (description is supplied separately to `.command`) +// Returns new command for configuring. +program + .command('clone [destination]') + .description('clone a repository into a newly created directory') + .action((source, destination) => { + console.log('clone command called'); + }); + +// Command implemented using stand-alone executable file (description is second parameter to `.command`) +// Returns `this` for adding more commands. +program + .command('start ', 'start named service') + .command('stop [service]', 'stop named service, or all if no name supplied'); + +// Command prepared separately. +// Returns `this` for adding more commands. +program + .addCommand(build.makeBuildCommand()); +``` + +Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `hidden: true` will +remove the command from the generated help output. Specifying `isDefault: true` will run the subcommand if no other +subcommand is specified ([example](./examples/defaultCommand.js)). + +### Specify the argument syntax + +You use `.arguments` to specify the expected command-arguments for the top-level command, and for subcommands they are usually +included in the `.command` call. Angled brackets (e.g. ``) indicate required command-arguments. +Square brackets (e.g. `[optional]`) indicate optional command-arguments. +You can optionally describe the arguments in the help by supplying a hash as second parameter to `.description()`. + +Example file: [env](./examples/env) + +```js +program + .version('0.1.0') + .arguments(' [env]') + .description('test command', { + cmd: 'command to run', + env: 'environment to run test in' + }) + .action(function (cmd, env) { + console.log('command:', cmd); + console.log('environment:', env || 'no environment given'); + }); + +program.parse(process.argv); +``` + + The last argument of a command can be variadic, and only the last argument. To make an argument variadic you + append `...` to the argument name. For example: + +```js +const { program } = require('commander'); + +program + .version('0.1.0') + .command('rmdir [otherDirs...]') + .action(function (dir, otherDirs) { + console.log('rmdir %s', dir); + if (otherDirs) { + otherDirs.forEach(function (oDir) { + console.log('rmdir %s', oDir); + }); + } + }); + +program.parse(process.argv); +``` + +The variadic argument is passed to the action handler as an array. + +### Action handler (sub)commands + +You can add options to a command that uses an action handler. +The action handler gets passed a parameter for each argument you declared, and one additional argument which is the +command object itself. This command argument has the values for the command-specific options added as properties. + +```js +const { program } = require('commander'); + +program + .command('rm ') + .option('-r, --recursive', 'Remove recursively') + .action(function (dir, cmdObj) { + console.log('remove ' + dir + (cmdObj.recursive ? ' recursively' : '')) + }) + +program.parse(process.argv) +``` + +You may supply an `async` action handler, in which case you call `.parseAsync` rather than `.parse`. + +```js +async function run() { /* code goes here */ } + +async function main() { + program + .command('run') + .action(run); + await program.parseAsync(process.argv); +} +``` + +A command's options on the command line are validated when the command is used. Any unknown options will be reported as an error. + +### Stand-alone executable (sub)commands + +When `.command()` is invoked with a description argument, this tells Commander that you're going to use stand-alone executables for subcommands. +Commander will search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-subcommand`, like `pm-install`, `pm-search`. +You can specify a custom name with the `executableFile` configuration option. + +You handle the options for an executable (sub)command in the executable, and don't declare them at the top-level. + +Example file: [pm](./examples/pm) + +```js +program + .version('0.1.0') + .command('install [name]', 'install one or more packages') + .command('search [query]', 'search with optional query') + .command('update', 'update installed packages', { executableFile: 'myUpdateSubCommand' }) + .command('list', 'list packages installed', { isDefault: true }); + +program.parse(process.argv); +``` + +If the program is designed to be installed globally, make sure the executables have proper modes, like `755`. + +## Automated help + +The help information is auto-generated based on the information commander already knows about your program. The default +help option is `-h,--help`. + +Example file: [pizza](./examples/pizza) + +```bash +$ node ./examples/pizza --help +Usage: pizza [options] + +An application for pizzas ordering + +Options: + -V, --version output the version number + -p, --peppers Add peppers + -c, --cheese Add the specified type of cheese (default: "marble") + -C, --no-cheese You do not want any cheese + -h, --help display help for command +``` + +A `help` command is added by default if your command has subcommands. It can be used alone, or with a subcommand name to show +further help for the subcommand. These are effectively the same if the `shell` program has implicit help: + +```bash +shell help +shell --help + +shell help spawn +shell spawn --help +``` + +### Custom help + +You can display extra information by listening for "--help". + +Example file: [custom-help](./examples/custom-help) + +```js +program + .option('-f, --foo', 'enable some foo'); + +// must be before .parse() +program.on('--help', () => { + console.log(''); + console.log('Example call:'); + console.log(' $ custom-help --help'); +}); +``` + +Yields the following help output: + +```Text +Usage: custom-help [options] + +Options: + -f, --foo enable some foo + -h, --help display help for command + +Example call: + $ custom-help --help +``` + +### .usage and .name + +These allow you to customise the usage description in the first line of the help. The name is otherwise +deduced from the (full) program arguments. Given: + +```js +program + .name("my-command") + .usage("[global options] command") +``` + +The help will start with: + +```Text +Usage: my-command [global options] command +``` + +### .help(cb) + +Output help information and exit immediately. Optional callback cb allows post-processing of help text before it is displayed. + +### .outputHelp(cb) + +Output help information without exiting. +Optional callback cb allows post-processing of help text before it is displayed. + +### .helpInformation() + +Get the command help information as a string for processing or displaying yourself. (The text does not include the custom help +from `--help` listeners.) + +### .helpOption(flags, description) + +Override the default help flags and description. Pass false to disable the built-in help option. + +```js +program + .helpOption('-e, --HELP', 'read more information'); +``` + +### .addHelpCommand() + +You can explicitly turn on or off the implicit help command with `.addHelpCommand()` and `.addHelpCommand(false)`. + +You can both turn on and customise the help command by supplying the name and description: + +```js +program.addHelpCommand('assist [command]', 'show assistance'); +``` + +## Custom event listeners + +You can execute custom actions by listening to command and option events. + +```js +program.on('option:verbose', function () { + process.env.VERBOSE = this.verbose; +}); + +program.on('command:*', function (operands) { + console.error(`error: unknown command '${operands[0]}'`); + const availableCommands = program.commands.map(cmd => cmd.name()); + mySuggestBestMatch(operands[0], availableCommands); + process.exitCode = 1; +}); +``` + +## Bits and pieces + +### .parse() and .parseAsync() + +The first argument to `.parse` is the array of strings to parse. You may omit the parameter to implicitly use `process.argv`. + +If the arguments follow different conventions than node you can pass a `from` option in the second parameter: + +- 'node': default, `argv[0]` is the application and `argv[1]` is the script being run, with user parameters after that +- 'electron': `argv[1]` varies depending on whether the electron application is packaged +- 'user': all of the arguments from the user + +For example: + +```js +program.parse(process.argv); // Explicit, node conventions +program.parse(); // Implicit, and auto-detect electron +program.parse(['-f', 'filename'], { from: 'user' }); +``` + +### Avoiding option name clashes + +The original and default behaviour is that the option values are stored +as properties on the program, and the action handler is passed a +command object with the options values stored as properties. +This is very convenient to code, but the downside is possible clashes with +existing properties of Command. + +There are two new routines to change the behaviour, and the default behaviour may change in the future: + +- `storeOptionsAsProperties`: whether to store option values as properties on command object, or store separately (specify false) and access using `.opts()` +- `passCommandToAction`: whether to pass command to action handler, +or just the options (specify false) + +Example file: [storeOptionsAsProperties-action.js](./examples/storeOptionsAsProperties-action.js) + +```js +program + .storeOptionsAsProperties(false) + .passCommandToAction(false); + +program + .name('my-program-name') + .option('-n,--name '); + +program + .command('show') + .option('-a,--action ') + .action((options) => { + console.log(options.action); + }); + +program.parse(process.argv); + +const programOptions = program.opts(); +console.log(programOptions.name); +``` + +### TypeScript + +The Commander package includes its TypeScript Definition file. + +If you use `ts-node` and stand-alone executable subcommands written as `.ts` files, you need to call your program through node to get the subcommands called correctly. e.g. + +```bash +node -r ts-node/register pm.ts +``` + +### createCommand() + +This factory function creates a new command. It is exported and may be used instead of using `new`, like: + +```js +const { createCommand } = require('commander'); +const program = createCommand(); +``` + +`createCommand` is also a method of the Command object, and creates a new command rather than a subcommand. This gets used internally +when creating subcommands using `.command()`, and you may override it to +customise the new subcommand (examples using [subclass](./examples/custom-command-class.js) and [function](./examples/custom-command-function.js)). + +### Import into ECMAScript Module + +Commander is currently a CommonJS package, and the default export can be imported into an ES Module: + +```js +// index.mjs +import commander from 'commander'; +const program = commander.program; +const newCommand = new commander.Command(); +``` + +### Node options such as `--harmony` + +You can enable `--harmony` option in two ways: + +- Use `#! /usr/bin/env node --harmony` in the subcommands scripts. (Note Windows does not support this pattern.) +- Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning subcommand process. + +### Debugging stand-alone executable subcommands + +An executable subcommand is launched as a separate child process. + +If you are using the node inspector for [debugging](https://nodejs.org/en/docs/guides/debugging-getting-started/) executable subcommands using `node --inspect` et al, +the inspector port is incremented by 1 for the spawned subcommand. + +If you are using VSCode to debug executable subcommands you need to set the `"autoAttachChildProcesses": true` flag in your launch.json configuration. + +### Override exit handling + +By default Commander calls `process.exit` when it detects errors, or after displaying the help or version. You can override +this behaviour and optionally supply a callback. The default override throws a `CommanderError`. + +The override callback is passed a `CommanderError` with properties `exitCode` number, `code` string, and `message`. The default override behaviour is to throw the error, except for async handling of executable subcommand completion which carries on. The normal display of error messages or version or help +is not affected by the override which is called after the display. + +```js +program.exitOverride(); + +try { + program.parse(process.argv); +} catch (err) { + // custom processing... +} +``` + +## Examples + +Example file: [deploy](./examples/deploy) + +```js +const { program } = require('commander'); + +program + .version('0.1.0') + .option('-C, --chdir ', 'change the working directory') + .option('-c, --config ', 'set config path. defaults to ./deploy.conf') + .option('-T, --no-tests', 'ignore test hook'); + +program + .command('setup [env]') + .description('run setup commands for all envs') + .option("-s, --setup_mode [mode]", "Which setup mode to use") + .action(function(env, options){ + const mode = options.setup_mode || "normal"; + env = env || 'all'; + console.log('setup for %s env(s) with %s mode', env, mode); + }); + +program + .command('exec ') + .alias('ex') + .description('execute the given remote cmd') + .option("-e, --exec_mode ", "Which exec mode to use") + .action(function(cmd, options){ + console.log('exec "%s" using %s mode', cmd, options.exec_mode); + }).on('--help', function() { + console.log(''); + console.log('Examples:'); + console.log(''); + console.log(' $ deploy exec sequential'); + console.log(' $ deploy exec async'); + }); + +program.parse(process.argv); +``` + +More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. + +## Support + +The current version of Commander is fully supported on Long Term Support versions of Node, and is likely to work with Node 6 but not tested. +(For versions of Node below Node 6, use Commander 3.x or 2.x.) + +The main forum for free and community support is the project [Issues](https://github.com/tj/commander.js/issues) on GitHub. + +### Commander for enterprise + +Available as part of the Tidelift Subscription + +The maintainers of Commander and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-commander?utm_source=npm-commander&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/node_modules/commander/index.js b/node_modules/commander/index.js new file mode 100644 index 0000000..c85f725 --- /dev/null +++ b/node_modules/commander/index.js @@ -0,0 +1,1881 @@ +/** + * Module dependencies. + */ + +const EventEmitter = require('events').EventEmitter; +const spawn = require('child_process').spawn; +const path = require('path'); +const fs = require('fs'); + +// @ts-check + +class Option { + /** + * Initialize a new `Option` with the given `flags` and `description`. + * + * @param {string} flags + * @param {string} description + * @api public + */ + + constructor(flags, description) { + this.flags = flags; + this.required = flags.includes('<'); // A value must be supplied when the option is specified. + this.optional = flags.includes('['); // A value is optional when the option is specified. + // variadic test ignores et al which might be used to describe custom splitting of single argument + this.variadic = /\w\.\.\.[>\]]$/.test(flags); // The option can take multiple values. + this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line. + const optionFlags = _parseOptionFlags(flags); + this.short = optionFlags.shortFlag; + this.long = optionFlags.longFlag; + this.negate = false; + if (this.long) { + this.negate = this.long.startsWith('--no-'); + } + this.description = description || ''; + this.defaultValue = undefined; + } + + /** + * Return option name. + * + * @return {string} + * @api private + */ + + name() { + if (this.long) { + return this.long.replace(/^--/, ''); + } + return this.short.replace(/^-/, ''); + }; + + /** + * Return option name, in a camelcase format that can be used + * as a object attribute key. + * + * @return {string} + * @api private + */ + + attributeName() { + return camelcase(this.name().replace(/^no-/, '')); + }; + + /** + * Check if `arg` matches the short or long flag. + * + * @param {string} arg + * @return {boolean} + * @api private + */ + + is(arg) { + return this.short === arg || this.long === arg; + }; +} + +/** + * CommanderError class + * @class + */ +class CommanderError extends Error { + /** + * Constructs the CommanderError class + * @param {number} exitCode suggested exit code which could be used with process.exit + * @param {string} code an id string representing the error + * @param {string} message human-readable description of the error + * @constructor + */ + constructor(exitCode, code, message) { + super(message); + // properly capture stack trace in Node.js + Error.captureStackTrace(this, this.constructor); + this.name = this.constructor.name; + this.code = code; + this.exitCode = exitCode; + this.nestedError = undefined; + } +} + +class Command extends EventEmitter { + /** + * Initialize a new `Command`. + * + * @param {string} [name] + * @api public + */ + + constructor(name) { + super(); + this.commands = []; + this.options = []; + this.parent = null; + this._allowUnknownOption = false; + this._args = []; + this.rawArgs = null; + this._scriptPath = null; + this._name = name || ''; + this._optionValues = {}; + this._storeOptionsAsProperties = true; // backwards compatible by default + this._storeOptionsAsPropertiesCalled = false; + this._passCommandToAction = true; // backwards compatible by default + this._actionResults = []; + this._actionHandler = null; + this._executableHandler = false; + this._executableFile = null; // custom name for executable + this._defaultCommandName = null; + this._exitCallback = null; + this._aliases = []; + this._combineFlagAndOptionalValue = true; + + this._hidden = false; + this._hasHelpOption = true; + this._helpFlags = '-h, --help'; + this._helpDescription = 'display help for command'; + this._helpShortFlag = '-h'; + this._helpLongFlag = '--help'; + this._hasImplicitHelpCommand = undefined; // Deliberately undefined, not decided whether true or false + this._helpCommandName = 'help'; + this._helpCommandnameAndArgs = 'help [command]'; + this._helpCommandDescription = 'display help for command'; + } + + /** + * Define a command. + * + * There are two styles of command: pay attention to where to put the description. + * + * Examples: + * + * // Command implemented using action handler (description is supplied separately to `.command`) + * program + * .command('clone [destination]') + * .description('clone a repository into a newly created directory') + * .action((source, destination) => { + * console.log('clone command called'); + * }); + * + * // Command implemented using separate executable file (description is second parameter to `.command`) + * program + * .command('start ', 'start named service') + * .command('stop [service]', 'stop named service, or all if no name supplied'); + * + * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param {Object|string} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) + * @param {Object} [execOpts] - configuration options (for executable) + * @return {Command} returns new command for action handler, or `this` for executable command + * @api public + */ + + command(nameAndArgs, actionOptsOrExecDesc, execOpts) { + let desc = actionOptsOrExecDesc; + let opts = execOpts; + if (typeof desc === 'object' && desc !== null) { + opts = desc; + desc = null; + } + opts = opts || {}; + const args = nameAndArgs.split(/ +/); + const cmd = this.createCommand(args.shift()); + + if (desc) { + cmd.description(desc); + cmd._executableHandler = true; + } + if (opts.isDefault) this._defaultCommandName = cmd._name; + + cmd._hidden = !!(opts.noHelp || opts.hidden); + cmd._hasHelpOption = this._hasHelpOption; + cmd._helpFlags = this._helpFlags; + cmd._helpDescription = this._helpDescription; + cmd._helpShortFlag = this._helpShortFlag; + cmd._helpLongFlag = this._helpLongFlag; + cmd._helpCommandName = this._helpCommandName; + cmd._helpCommandnameAndArgs = this._helpCommandnameAndArgs; + cmd._helpCommandDescription = this._helpCommandDescription; + cmd._exitCallback = this._exitCallback; + cmd._storeOptionsAsProperties = this._storeOptionsAsProperties; + cmd._passCommandToAction = this._passCommandToAction; + cmd._combineFlagAndOptionalValue = this._combineFlagAndOptionalValue; + + cmd._executableFile = opts.executableFile || null; // Custom name for executable file, set missing to null to match constructor + this.commands.push(cmd); + cmd._parseExpectedArgs(args); + cmd.parent = this; + + if (desc) return this; + return cmd; + }; + + /** + * Factory routine to create a new unattached command. + * + * See .command() for creating an attached subcommand, which uses this routine to + * create the command. You can override createCommand to customise subcommands. + * + * @param {string} [name] + * @return {Command} new command + * @api public + */ + + createCommand(name) { + return new Command(name); + }; + + /** + * Add a prepared subcommand. + * + * See .command() for creating an attached subcommand which inherits settings from its parent. + * + * @param {Command} cmd - new subcommand + * @param {Object} [opts] - configuration options + * @return {Command} `this` command for chaining + * @api public + */ + + addCommand(cmd, opts) { + if (!cmd._name) throw new Error('Command passed to .addCommand() must have a name'); + + // To keep things simple, block automatic name generation for deeply nested executables. + // Fail fast and detect when adding rather than later when parsing. + function checkExplicitNames(commandArray) { + commandArray.forEach((cmd) => { + if (cmd._executableHandler && !cmd._executableFile) { + throw new Error(`Must specify executableFile for deeply nested executable: ${cmd.name()}`); + } + checkExplicitNames(cmd.commands); + }); + } + checkExplicitNames(cmd.commands); + + opts = opts || {}; + if (opts.isDefault) this._defaultCommandName = cmd._name; + if (opts.noHelp || opts.hidden) cmd._hidden = true; // modifying passed command due to existing implementation + + this.commands.push(cmd); + cmd.parent = this; + return this; + }; + + /** + * Define argument syntax for the command. + * + * @api public + */ + + arguments(desc) { + return this._parseExpectedArgs(desc.split(/ +/)); + }; + + /** + * Override default decision whether to add implicit help command. + * + * addHelpCommand() // force on + * addHelpCommand(false); // force off + * addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details + * + * @return {Command} `this` command for chaining + * @api public + */ + + addHelpCommand(enableOrNameAndArgs, description) { + if (enableOrNameAndArgs === false) { + this._hasImplicitHelpCommand = false; + } else { + this._hasImplicitHelpCommand = true; + if (typeof enableOrNameAndArgs === 'string') { + this._helpCommandName = enableOrNameAndArgs.split(' ')[0]; + this._helpCommandnameAndArgs = enableOrNameAndArgs; + } + this._helpCommandDescription = description || this._helpCommandDescription; + } + return this; + }; + + /** + * @return {boolean} + * @api private + */ + + _lazyHasImplicitHelpCommand() { + if (this._hasImplicitHelpCommand === undefined) { + this._hasImplicitHelpCommand = this.commands.length && !this._actionHandler && !this._findCommand('help'); + } + return this._hasImplicitHelpCommand; + }; + + /** + * Parse expected `args`. + * + * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. + * + * @param {Array} args + * @return {Command} `this` command for chaining + * @api private + */ + + _parseExpectedArgs(args) { + if (!args.length) return; + args.forEach((arg) => { + const argDetails = { + required: false, + name: '', + variadic: false + }; + + switch (arg[0]) { + case '<': + argDetails.required = true; + argDetails.name = arg.slice(1, -1); + break; + case '[': + argDetails.name = arg.slice(1, -1); + break; + } + + if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') { + argDetails.variadic = true; + argDetails.name = argDetails.name.slice(0, -3); + } + if (argDetails.name) { + this._args.push(argDetails); + } + }); + this._args.forEach((arg, i) => { + if (arg.variadic && i < this._args.length - 1) { + throw new Error(`only the last argument can be variadic '${arg.name}'`); + } + }); + return this; + }; + + /** + * Register callback to use as replacement for calling process.exit. + * + * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing + * @return {Command} `this` command for chaining + * @api public + */ + + exitOverride(fn) { + if (fn) { + this._exitCallback = fn; + } else { + this._exitCallback = (err) => { + if (err.code !== 'commander.executeSubCommandAsync') { + throw err; + } else { + // Async callback from spawn events, not useful to throw. + } + }; + } + return this; + }; + + /** + * Call process.exit, and _exitCallback if defined. + * + * @param {number} exitCode exit code for using with process.exit + * @param {string} code an id string representing the error + * @param {string} message human-readable description of the error + * @return never + * @api private + */ + + _exit(exitCode, code, message) { + if (this._exitCallback) { + this._exitCallback(new CommanderError(exitCode, code, message)); + // Expecting this line is not reached. + } + process.exit(exitCode); + }; + + /** + * Register callback `fn` for the command. + * + * Examples: + * + * program + * .command('help') + * .description('display verbose help') + * .action(function() { + * // output help here + * }); + * + * @param {Function} fn + * @return {Command} `this` command for chaining + * @api public + */ + + action(fn) { + const listener = (args) => { + // The .action callback takes an extra parameter which is the command or options. + const expectedArgsCount = this._args.length; + const actionArgs = args.slice(0, expectedArgsCount); + if (this._passCommandToAction) { + actionArgs[expectedArgsCount] = this; + } else { + actionArgs[expectedArgsCount] = this.opts(); + } + // Add the extra arguments so available too. + if (args.length > expectedArgsCount) { + actionArgs.push(args.slice(expectedArgsCount)); + } + + const actionResult = fn.apply(this, actionArgs); + // Remember result in case it is async. Assume parseAsync getting called on root. + let rootCommand = this; + while (rootCommand.parent) { + rootCommand = rootCommand.parent; + } + rootCommand._actionResults.push(actionResult); + }; + this._actionHandler = listener; + return this; + }; + + /** + * Internal routine to check whether there is a clash storing option value with a Command property. + * + * @param {Option} option + * @api private + */ + + _checkForOptionNameClash(option) { + if (!this._storeOptionsAsProperties || this._storeOptionsAsPropertiesCalled) { + // Storing options safely, or user has been explicit and up to them. + return; + } + // User may override help, and hard to tell if worth warning. + if (option.name() === 'help') { + return; + } + + const commandProperty = this._getOptionValue(option.attributeName()); + if (commandProperty === undefined) { + // no clash + return; + } + + let foundClash = true; + if (option.negate) { + // It is ok if define foo before --no-foo. + const positiveLongFlag = option.long.replace(/^--no-/, '--'); + foundClash = !this._findOption(positiveLongFlag); + } else if (option.long) { + const negativeLongFlag = option.long.replace(/^--/, '--no-'); + foundClash = !this._findOption(negativeLongFlag); + } + + if (foundClash) { + throw new Error(`option '${option.name()}' clashes with existing property '${option.attributeName()}' on Command +- call storeOptionsAsProperties(false) to store option values safely, +- or call storeOptionsAsProperties(true) to suppress this check, +- or change option name + +Read more on https://git.io/JJc0W`); + } + }; + + /** + * Internal implementation shared by .option() and .requiredOption() + * + * @param {Object} config + * @param {string} flags + * @param {string} description + * @param {Function|*} [fn] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + * @api private + */ + + _optionEx(config, flags, description, fn, defaultValue) { + const option = new Option(flags, description); + const oname = option.name(); + const name = option.attributeName(); + option.mandatory = !!config.mandatory; + + this._checkForOptionNameClash(option); + + // default as 3rd arg + if (typeof fn !== 'function') { + if (fn instanceof RegExp) { + // This is a bit simplistic (especially no error messages), and probably better handled by caller using custom option processing. + // No longer documented in README, but still present for backwards compatibility. + const regex = fn; + fn = (val, def) => { + const m = regex.exec(val); + return m ? m[0] : def; + }; + } else { + defaultValue = fn; + fn = null; + } + } + + // preassign default value for --no-*, [optional], , or plain flag if boolean value + if (option.negate || option.optional || option.required || typeof defaultValue === 'boolean') { + // when --no-foo we make sure default is true, unless a --foo option is already defined + if (option.negate) { + const positiveLongFlag = option.long.replace(/^--no-/, '--'); + defaultValue = this._findOption(positiveLongFlag) ? this._getOptionValue(name) : true; + } + // preassign only if we have a default + if (defaultValue !== undefined) { + this._setOptionValue(name, defaultValue); + option.defaultValue = defaultValue; + } + } + + // register the option + this.options.push(option); + + // when it's passed assign the value + // and conditionally invoke the callback + this.on('option:' + oname, (val) => { + const oldValue = this._getOptionValue(name); + + // custom processing + if (val !== null && fn) { + val = fn(val, oldValue === undefined ? defaultValue : oldValue); + } else if (val !== null && option.variadic) { + if (oldValue === defaultValue || !Array.isArray(oldValue)) { + val = [val]; + } else { + val = oldValue.concat(val); + } + } + + // unassigned or boolean value + if (typeof oldValue === 'boolean' || typeof oldValue === 'undefined') { + // if no value, negate false, and we have a default, then use it! + if (val == null) { + this._setOptionValue(name, option.negate + ? false + : defaultValue || true); + } else { + this._setOptionValue(name, val); + } + } else if (val !== null) { + // reassign + this._setOptionValue(name, option.negate ? false : val); + } + }); + + return this; + }; + + /** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * Examples: + * + * // simple boolean defaulting to undefined + * program.option('-p, --pepper', 'add pepper'); + * + * program.pepper + * // => undefined + * + * --pepper + * program.pepper + * // => true + * + * // simple boolean defaulting to true (unless non-negated option is also defined) + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => false + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @param {string} flags + * @param {string} description + * @param {Function|*} [fn] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + * @api public + */ + + option(flags, description, fn, defaultValue) { + return this._optionEx({}, flags, description, fn, defaultValue); + }; + + /** + * Add a required option which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space. + * + * @param {string} flags + * @param {string} description + * @param {Function|*} [fn] - custom option processing function or default value + * @param {*} [defaultValue] + * @return {Command} `this` command for chaining + * @api public + */ + + requiredOption(flags, description, fn, defaultValue) { + return this._optionEx({ mandatory: true }, flags, description, fn, defaultValue); + }; + + /** + * Alter parsing of short flags with optional values. + * + * Examples: + * + * // for `.option('-f,--flag [value]'): + * .combineFlagAndOptionalValue(true) // `-f80` is treated like `--flag=80`, this is the default behaviour + * .combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` + * + * @param {Boolean} [arg] - if `true` or omitted, an optional value can be specified directly after the flag. + * @api public + */ + combineFlagAndOptionalValue(arg) { + this._combineFlagAndOptionalValue = (arg === undefined) || arg; + return this; + }; + + /** + * Allow unknown options on the command line. + * + * @param {Boolean} [arg] - if `true` or omitted, no error will be thrown + * for unknown options. + * @api public + */ + allowUnknownOption(arg) { + this._allowUnknownOption = (arg === undefined) || arg; + return this; + }; + + /** + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @param {boolean} value + * @return {Command} `this` command for chaining + * @api public + */ + + storeOptionsAsProperties(value) { + this._storeOptionsAsPropertiesCalled = true; + this._storeOptionsAsProperties = (value === undefined) || value; + if (this.options.length) { + throw new Error('call .storeOptionsAsProperties() before adding options'); + } + return this; + }; + + /** + * Whether to pass command to action handler, + * or just the options (specify false). + * + * @param {boolean} value + * @return {Command} `this` command for chaining + * @api public + */ + + passCommandToAction(value) { + this._passCommandToAction = (value === undefined) || value; + return this; + }; + + /** + * Store option value + * + * @param {string} key + * @param {Object} value + * @api private + */ + + _setOptionValue(key, value) { + if (this._storeOptionsAsProperties) { + this[key] = value; + } else { + this._optionValues[key] = value; + } + }; + + /** + * Retrieve option value + * + * @param {string} key + * @return {Object} value + * @api private + */ + + _getOptionValue(key) { + if (this._storeOptionsAsProperties) { + return this[key]; + } + return this._optionValues[key]; + }; + + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * The default expectation is that the arguments are from node and have the application as argv[0] + * and the script being run in argv[1], with user parameters after that. + * + * Examples: + * + * program.parse(process.argv); + * program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] + * + * @param {string[]} [argv] - optional, defaults to process.argv + * @param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron + * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron' + * @return {Command} `this` command for chaining + * @api public + */ + + parse(argv, parseOptions) { + if (argv !== undefined && !Array.isArray(argv)) { + throw new Error('first parameter to parse must be array or undefined'); + } + parseOptions = parseOptions || {}; + + // Default to using process.argv + if (argv === undefined) { + argv = process.argv; + // @ts-ignore + if (process.versions && process.versions.electron) { + parseOptions.from = 'electron'; + } + } + this.rawArgs = argv.slice(); + + // make it a little easier for callers by supporting various argv conventions + let userArgs; + switch (parseOptions.from) { + case undefined: + case 'node': + this._scriptPath = argv[1]; + userArgs = argv.slice(2); + break; + case 'electron': + // @ts-ignore + if (process.defaultApp) { + this._scriptPath = argv[1]; + userArgs = argv.slice(2); + } else { + userArgs = argv.slice(1); + } + break; + case 'user': + userArgs = argv.slice(0); + break; + default: + throw new Error(`unexpected parse option { from: '${parseOptions.from}' }`); + } + if (!this._scriptPath && process.mainModule) { + this._scriptPath = process.mainModule.filename; + } + + // Guess name, used in usage in help. + this._name = this._name || (this._scriptPath && path.basename(this._scriptPath, path.extname(this._scriptPath))); + + // Let's go! + this._parseCommand([], userArgs); + + return this; + }; + + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * + * The default expectation is that the arguments are from node and have the application as argv[0] + * and the script being run in argv[1], with user parameters after that. + * + * Examples: + * + * program.parseAsync(process.argv); + * program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] + * + * @param {string[]} [argv] + * @param {Object} [parseOptions] + * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron' + * @return {Promise} + * @api public + */ + + parseAsync(argv, parseOptions) { + this.parse(argv, parseOptions); + return Promise.all(this._actionResults).then(() => this); + }; + + /** + * Execute a sub-command executable. + * + * @api private + */ + + _executeSubCommand(subcommand, args) { + args = args.slice(); + let launchWithNode = false; // Use node for source targets so do not need to get permissions correct, and on Windows. + const sourceExt = ['.js', '.ts', '.tsx', '.mjs']; + + // Not checking for help first. Unlikely to have mandatory and executable, and can't robustly test for help flags in external command. + this._checkForMissingMandatoryOptions(); + + // Want the entry script as the reference for command name and directory for searching for other files. + let scriptPath = this._scriptPath; + // Fallback in case not set, due to how Command created or called. + if (!scriptPath && process.mainModule) { + scriptPath = process.mainModule.filename; + } + + let baseDir; + try { + const resolvedLink = fs.realpathSync(scriptPath); + baseDir = path.dirname(resolvedLink); + } catch (e) { + baseDir = '.'; // dummy, probably not going to find executable! + } + + // name of the subcommand, like `pm-install` + let bin = path.basename(scriptPath, path.extname(scriptPath)) + '-' + subcommand._name; + if (subcommand._executableFile) { + bin = subcommand._executableFile; + } + + const localBin = path.join(baseDir, bin); + if (fs.existsSync(localBin)) { + // prefer local `./` to bin in the $PATH + bin = localBin; + } else { + // Look for source files. + sourceExt.forEach((ext) => { + if (fs.existsSync(`${localBin}${ext}`)) { + bin = `${localBin}${ext}`; + } + }); + } + launchWithNode = sourceExt.includes(path.extname(bin)); + + let proc; + if (process.platform !== 'win32') { + if (launchWithNode) { + args.unshift(bin); + // add executable arguments to spawn + args = incrementNodeInspectorPort(process.execArgv).concat(args); + + proc = spawn(process.argv[0], args, { stdio: 'inherit' }); + } else { + proc = spawn(bin, args, { stdio: 'inherit' }); + } + } else { + args.unshift(bin); + // add executable arguments to spawn + args = incrementNodeInspectorPort(process.execArgv).concat(args); + proc = spawn(process.execPath, args, { stdio: 'inherit' }); + } + + const signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP']; + signals.forEach((signal) => { + // @ts-ignore + process.on(signal, () => { + if (proc.killed === false && proc.exitCode === null) { + proc.kill(signal); + } + }); + }); + + // By default terminate process when spawned process terminates. + // Suppressing the exit if exitCallback defined is a bit messy and of limited use, but does allow process to stay running! + const exitCallback = this._exitCallback; + if (!exitCallback) { + proc.on('close', process.exit.bind(process)); + } else { + proc.on('close', () => { + exitCallback(new CommanderError(process.exitCode || 0, 'commander.executeSubCommandAsync', '(close)')); + }); + } + proc.on('error', (err) => { + // @ts-ignore + if (err.code === 'ENOENT') { + const executableMissing = `'${bin}' does not exist + - if '${subcommand._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead + - if the default executable name is not suitable, use the executableFile option to supply a custom name`; + throw new Error(executableMissing); + // @ts-ignore + } else if (err.code === 'EACCES') { + throw new Error(`'${bin}' not executable`); + } + if (!exitCallback) { + process.exit(1); + } else { + const wrappedError = new CommanderError(1, 'commander.executeSubCommandAsync', '(error)'); + wrappedError.nestedError = err; + exitCallback(wrappedError); + } + }); + + // Store the reference to the child process + this.runningCommand = proc; + }; + + /** + * @api private + */ + _dispatchSubcommand(commandName, operands, unknown) { + const subCommand = this._findCommand(commandName); + if (!subCommand) this._helpAndError(); + + if (subCommand._executableHandler) { + this._executeSubCommand(subCommand, operands.concat(unknown)); + } else { + subCommand._parseCommand(operands, unknown); + } + }; + + /** + * Process arguments in context of this command. + * + * @api private + */ + + _parseCommand(operands, unknown) { + const parsed = this.parseOptions(unknown); + operands = operands.concat(parsed.operands); + unknown = parsed.unknown; + this.args = operands.concat(unknown); + + if (operands && this._findCommand(operands[0])) { + this._dispatchSubcommand(operands[0], operands.slice(1), unknown); + } else if (this._lazyHasImplicitHelpCommand() && operands[0] === this._helpCommandName) { + if (operands.length === 1) { + this.help(); + } else { + this._dispatchSubcommand(operands[1], [], [this._helpLongFlag]); + } + } else if (this._defaultCommandName) { + outputHelpIfRequested(this, unknown); // Run the help for default command from parent rather than passing to default command + this._dispatchSubcommand(this._defaultCommandName, operands, unknown); + } else { + if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { + // probably missing subcommand and no handler, user needs help + this._helpAndError(); + } + + outputHelpIfRequested(this, parsed.unknown); + this._checkForMissingMandatoryOptions(); + if (parsed.unknown.length > 0) { + this.unknownOption(parsed.unknown[0]); + } + + if (this._actionHandler) { + const args = this.args.slice(); + this._args.forEach((arg, i) => { + if (arg.required && args[i] == null) { + this.missingArgument(arg.name); + } else if (arg.variadic) { + args[i] = args.splice(i); + } + }); + + this._actionHandler(args); + this.emit('command:' + this.name(), operands, unknown); + } else if (operands.length) { + if (this._findCommand('*')) { + this._dispatchSubcommand('*', operands, unknown); + } else if (this.listenerCount('command:*')) { + this.emit('command:*', operands, unknown); + } else if (this.commands.length) { + this.unknownCommand(); + } + } else if (this.commands.length) { + // This command has subcommands and nothing hooked up at this level, so display help. + this._helpAndError(); + } else { + // fall through for caller to handle after calling .parse() + } + } + }; + + /** + * Find matching command. + * + * @api private + */ + _findCommand(name) { + if (!name) return undefined; + return this.commands.find(cmd => cmd._name === name || cmd._aliases.includes(name)); + }; + + /** + * Return an option matching `arg` if any. + * + * @param {string} arg + * @return {Option} + * @api private + */ + + _findOption(arg) { + return this.options.find(option => option.is(arg)); + }; + + /** + * Display an error message if a mandatory option does not have a value. + * Lazy calling after checking for help flags from leaf subcommand. + * + * @api private + */ + + _checkForMissingMandatoryOptions() { + // Walk up hierarchy so can call in subcommand after checking for displaying help. + for (let cmd = this; cmd; cmd = cmd.parent) { + cmd.options.forEach((anOption) => { + if (anOption.mandatory && (cmd._getOptionValue(anOption.attributeName()) === undefined)) { + cmd.missingMandatoryOptionValue(anOption); + } + }); + } + }; + + /** + * Parse options from `argv` removing known options, + * and return argv split into operands and unknown arguments. + * + * Examples: + * + * argv => operands, unknown + * --known kkk op => [op], [] + * op --known kkk => [op], [] + * sub --unknown uuu op => [sub], [--unknown uuu op] + * sub -- --unknown uuu op => [sub --unknown uuu op], [] + * + * @param {String[]} argv + * @return {{operands: String[], unknown: String[]}} + * @api public + */ + + parseOptions(argv) { + const operands = []; // operands, not options or values + const unknown = []; // first unknown option and remaining unknown args + let dest = operands; + const args = argv.slice(); + + function maybeOption(arg) { + return arg.length > 1 && arg[0] === '-'; + } + + // parse options + let activeVariadicOption = null; + while (args.length) { + const arg = args.shift(); + + // literal + if (arg === '--') { + if (dest === unknown) dest.push(arg); + dest.push(...args); + break; + } + + if (activeVariadicOption && !maybeOption(arg)) { + this.emit(`option:${activeVariadicOption.name()}`, arg); + continue; + } + activeVariadicOption = null; + + if (maybeOption(arg)) { + const option = this._findOption(arg); + // recognised option, call listener to assign value with possible custom processing + if (option) { + if (option.required) { + const value = args.shift(); + if (value === undefined) this.optionMissingArgument(option); + this.emit(`option:${option.name()}`, value); + } else if (option.optional) { + let value = null; + // historical behaviour is optional value is following arg unless an option + if (args.length > 0 && !maybeOption(args[0])) { + value = args.shift(); + } + this.emit(`option:${option.name()}`, value); + } else { // boolean flag + this.emit(`option:${option.name()}`); + } + activeVariadicOption = option.variadic ? option : null; + continue; + } + } + + // Look for combo options following single dash, eat first one if known. + if (arg.length > 2 && arg[0] === '-' && arg[1] !== '-') { + const option = this._findOption(`-${arg[1]}`); + if (option) { + if (option.required || (option.optional && this._combineFlagAndOptionalValue)) { + // option with value following in same argument + this.emit(`option:${option.name()}`, arg.slice(2)); + } else { + // boolean option, emit and put back remainder of arg for further processing + this.emit(`option:${option.name()}`); + args.unshift(`-${arg.slice(2)}`); + } + continue; + } + } + + // Look for known long flag with value, like --foo=bar + if (/^--[^=]+=/.test(arg)) { + const index = arg.indexOf('='); + const option = this._findOption(arg.slice(0, index)); + if (option && (option.required || option.optional)) { + this.emit(`option:${option.name()}`, arg.slice(index + 1)); + continue; + } + } + + // looks like an option but unknown, unknowns from here + if (arg.length > 1 && arg[0] === '-') { + dest = unknown; + } + + // add arg + dest.push(arg); + } + + return { operands, unknown }; + }; + + /** + * Return an object containing options as key-value pairs + * + * @return {Object} + * @api public + */ + opts() { + if (this._storeOptionsAsProperties) { + // Preserve original behaviour so backwards compatible when still using properties + const result = {}; + const len = this.options.length; + + for (let i = 0; i < len; i++) { + const key = this.options[i].attributeName(); + result[key] = key === this._versionOptionName ? this._version : this[key]; + } + return result; + } + + return this._optionValues; + }; + + /** + * Argument `name` is missing. + * + * @param {string} name + * @api private + */ + + missingArgument(name) { + const message = `error: missing required argument '${name}'`; + console.error(message); + this._exit(1, 'commander.missingArgument', message); + }; + + /** + * `Option` is missing an argument, but received `flag` or nothing. + * + * @param {Option} option + * @param {string} [flag] + * @api private + */ + + optionMissingArgument(option, flag) { + let message; + if (flag) { + message = `error: option '${option.flags}' argument missing, got '${flag}'`; + } else { + message = `error: option '${option.flags}' argument missing`; + } + console.error(message); + this._exit(1, 'commander.optionMissingArgument', message); + }; + + /** + * `Option` does not have a value, and is a mandatory option. + * + * @param {Option} option + * @api private + */ + + missingMandatoryOptionValue(option) { + const message = `error: required option '${option.flags}' not specified`; + console.error(message); + this._exit(1, 'commander.missingMandatoryOptionValue', message); + }; + + /** + * Unknown option `flag`. + * + * @param {string} flag + * @api private + */ + + unknownOption(flag) { + if (this._allowUnknownOption) return; + const message = `error: unknown option '${flag}'`; + console.error(message); + this._exit(1, 'commander.unknownOption', message); + }; + + /** + * Unknown command. + * + * @api private + */ + + unknownCommand() { + const partCommands = [this.name()]; + for (let parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) { + partCommands.unshift(parentCmd.name()); + } + const fullCommand = partCommands.join(' '); + const message = `error: unknown command '${this.args[0]}'.` + + (this._hasHelpOption ? ` See '${fullCommand} ${this._helpLongFlag}'.` : ''); + console.error(message); + this._exit(1, 'commander.unknownCommand', message); + }; + + /** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * You can optionally supply the flags and description to override the defaults. + * + * @param {string} str + * @param {string} [flags] + * @param {string} [description] + * @return {this | string} `this` command for chaining, or version string if no arguments + * @api public + */ + + version(str, flags, description) { + if (str === undefined) return this._version; + this._version = str; + flags = flags || '-V, --version'; + description = description || 'output the version number'; + const versionOption = new Option(flags, description); + this._versionOptionName = versionOption.attributeName(); + this.options.push(versionOption); + this.on('option:' + versionOption.name(), () => { + process.stdout.write(str + '\n'); + this._exit(0, 'commander.version', str); + }); + return this; + }; + + /** + * Set the description to `str`. + * + * @param {string} str + * @param {Object} [argsDescription] + * @return {string|Command} + * @api public + */ + + description(str, argsDescription) { + if (str === undefined && argsDescription === undefined) return this._description; + this._description = str; + this._argsDescription = argsDescription; + return this; + }; + + /** + * Set an alias for the command. + * + * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help. + * + * @param {string} [alias] + * @return {string|Command} + * @api public + */ + + alias(alias) { + if (alias === undefined) return this._aliases[0]; // just return first, for backwards compatibility + + let command = this; + if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) { + // assume adding alias for last added executable subcommand, rather than this + command = this.commands[this.commands.length - 1]; + } + + if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); + + command._aliases.push(alias); + return this; + }; + + /** + * Set aliases for the command. + * + * Only the first alias is shown in the auto-generated help. + * + * @param {string[]} [aliases] + * @return {string[]|Command} + * @api public + */ + + aliases(aliases) { + // Getter for the array of aliases is the main reason for having aliases() in addition to alias(). + if (aliases === undefined) return this._aliases; + + aliases.forEach((alias) => this.alias(alias)); + return this; + }; + + /** + * Set / get the command usage `str`. + * + * @param {string} [str] + * @return {String|Command} + * @api public + */ + + usage(str) { + if (str === undefined) { + if (this._usage) return this._usage; + + const args = this._args.map((arg) => { + return humanReadableArgName(arg); + }); + return [].concat( + (this.options.length || this._hasHelpOption ? '[options]' : []), + (this.commands.length ? '[command]' : []), + (this._args.length ? args : []) + ).join(' '); + } + + this._usage = str; + return this; + }; + + /** + * Get or set the name of the command + * + * @param {string} [str] + * @return {String|Command} + * @api public + */ + + name(str) { + if (str === undefined) return this._name; + this._name = str; + return this; + }; + + /** + * Return prepared commands. + * + * @return {Array} + * @api private + */ + + prepareCommands() { + const commandDetails = this.commands.filter((cmd) => { + return !cmd._hidden; + }).map((cmd) => { + const args = cmd._args.map((arg) => { + return humanReadableArgName(arg); + }).join(' '); + + return [ + cmd._name + + (cmd._aliases[0] ? '|' + cmd._aliases[0] : '') + + (cmd.options.length ? ' [options]' : '') + + (args ? ' ' + args : ''), + cmd._description + ]; + }); + + if (this._lazyHasImplicitHelpCommand()) { + commandDetails.push([this._helpCommandnameAndArgs, this._helpCommandDescription]); + } + return commandDetails; + }; + + /** + * Return the largest command length. + * + * @return {number} + * @api private + */ + + largestCommandLength() { + const commands = this.prepareCommands(); + return commands.reduce((max, command) => { + return Math.max(max, command[0].length); + }, 0); + }; + + /** + * Return the largest option length. + * + * @return {number} + * @api private + */ + + largestOptionLength() { + const options = [].slice.call(this.options); + options.push({ + flags: this._helpFlags + }); + + return options.reduce((max, option) => { + return Math.max(max, option.flags.length); + }, 0); + }; + + /** + * Return the largest arg length. + * + * @return {number} + * @api private + */ + + largestArgLength() { + return this._args.reduce((max, arg) => { + return Math.max(max, arg.name.length); + }, 0); + }; + + /** + * Return the pad width. + * + * @return {number} + * @api private + */ + + padWidth() { + let width = this.largestOptionLength(); + if (this._argsDescription && this._args.length) { + if (this.largestArgLength() > width) { + width = this.largestArgLength(); + } + } + + if (this.commands && this.commands.length) { + if (this.largestCommandLength() > width) { + width = this.largestCommandLength(); + } + } + + return width; + }; + + /** + * Return help for options. + * + * @return {string} + * @api private + */ + + optionHelp() { + const width = this.padWidth(); + const columns = process.stdout.columns || 80; + const descriptionWidth = columns - width - 4; + function padOptionDetails(flags, description) { + return pad(flags, width) + ' ' + optionalWrap(description, descriptionWidth, width + 2); + }; + + // Explicit options (including version) + const help = this.options.map((option) => { + const fullDesc = option.description + + ((!option.negate && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : ''); + return padOptionDetails(option.flags, fullDesc); + }); + + // Implicit help + const showShortHelpFlag = this._hasHelpOption && this._helpShortFlag && !this._findOption(this._helpShortFlag); + const showLongHelpFlag = this._hasHelpOption && !this._findOption(this._helpLongFlag); + if (showShortHelpFlag || showLongHelpFlag) { + let helpFlags = this._helpFlags; + if (!showShortHelpFlag) { + helpFlags = this._helpLongFlag; + } else if (!showLongHelpFlag) { + helpFlags = this._helpShortFlag; + } + help.push(padOptionDetails(helpFlags, this._helpDescription)); + } + + return help.join('\n'); + }; + + /** + * Return command help documentation. + * + * @return {string} + * @api private + */ + + commandHelp() { + if (!this.commands.length && !this._lazyHasImplicitHelpCommand()) return ''; + + const commands = this.prepareCommands(); + const width = this.padWidth(); + + const columns = process.stdout.columns || 80; + const descriptionWidth = columns - width - 4; + + return [ + 'Commands:', + commands.map((cmd) => { + const desc = cmd[1] ? ' ' + cmd[1] : ''; + return (desc ? pad(cmd[0], width) : cmd[0]) + optionalWrap(desc, descriptionWidth, width + 2); + }).join('\n').replace(/^/gm, ' '), + '' + ].join('\n'); + }; + + /** + * Return program help documentation. + * + * @return {string} + * @api public + */ + + helpInformation() { + let desc = []; + if (this._description) { + desc = [ + this._description, + '' + ]; + + const argsDescription = this._argsDescription; + if (argsDescription && this._args.length) { + const width = this.padWidth(); + const columns = process.stdout.columns || 80; + const descriptionWidth = columns - width - 5; + desc.push('Arguments:'); + this._args.forEach((arg) => { + desc.push(' ' + pad(arg.name, width) + ' ' + wrap(argsDescription[arg.name] || '', descriptionWidth, width + 4)); + }); + desc.push(''); + } + } + + let cmdName = this._name; + if (this._aliases[0]) { + cmdName = cmdName + '|' + this._aliases[0]; + } + let parentCmdNames = ''; + for (let parentCmd = this.parent; parentCmd; parentCmd = parentCmd.parent) { + parentCmdNames = parentCmd.name() + ' ' + parentCmdNames; + } + const usage = [ + 'Usage: ' + parentCmdNames + cmdName + ' ' + this.usage(), + '' + ]; + + let cmds = []; + const commandHelp = this.commandHelp(); + if (commandHelp) cmds = [commandHelp]; + + let options = []; + if (this._hasHelpOption || this.options.length > 0) { + options = [ + 'Options:', + '' + this.optionHelp().replace(/^/gm, ' '), + '' + ]; + } + + return usage + .concat(desc) + .concat(options) + .concat(cmds) + .join('\n'); + }; + + /** + * Output help information for this command. + * + * When listener(s) are available for the helpLongFlag + * those callbacks are invoked. + * + * @api public + */ + + outputHelp(cb) { + if (!cb) { + cb = (passthru) => { + return passthru; + }; + } + const cbOutput = cb(this.helpInformation()); + if (typeof cbOutput !== 'string' && !Buffer.isBuffer(cbOutput)) { + throw new Error('outputHelp callback must return a string or a Buffer'); + } + process.stdout.write(cbOutput); + this.emit(this._helpLongFlag); + }; + + /** + * You can pass in flags and a description to override the help + * flags and help description for your command. Pass in false to + * disable the built-in help option. + * + * @param {string | boolean} [flags] + * @param {string} [description] + * @return {Command} `this` command for chaining + * @api public + */ + + helpOption(flags, description) { + if (typeof flags === 'boolean') { + this._hasHelpOption = flags; + return this; + } + this._helpFlags = flags || this._helpFlags; + this._helpDescription = description || this._helpDescription; + + const helpFlags = _parseOptionFlags(this._helpFlags); + this._helpShortFlag = helpFlags.shortFlag; + this._helpLongFlag = helpFlags.longFlag; + + return this; + }; + + /** + * Output help information and exit. + * + * @param {Function} [cb] + * @api public + */ + + help(cb) { + this.outputHelp(cb); + // exitCode: preserving original behaviour which was calling process.exit() + // message: do not have all displayed text available so only passing placeholder. + this._exit(process.exitCode || 0, 'commander.help', '(outputHelp)'); + }; + + /** + * Output help information and exit. Display for error situations. + * + * @api private + */ + + _helpAndError() { + this.outputHelp(); + // message: do not have all displayed text available so only passing placeholder. + this._exit(1, 'commander.help', '(outputHelp)'); + }; +}; + +/** + * Expose the root command. + */ + +exports = module.exports = new Command(); +exports.program = exports; // More explicit access to global command. + +/** + * Expose classes + */ + +exports.Command = Command; +exports.Option = Option; +exports.CommanderError = CommanderError; + +/** + * Camel-case the given `flag` + * + * @param {string} flag + * @return {string} + * @api private + */ + +function camelcase(flag) { + return flag.split('-').reduce((str, word) => { + return str + word[0].toUpperCase() + word.slice(1); + }); +} + +/** + * Pad `str` to `width`. + * + * @param {string} str + * @param {number} width + * @return {string} + * @api private + */ + +function pad(str, width) { + const len = Math.max(0, width - str.length); + return str + Array(len + 1).join(' '); +} + +/** + * Wraps the given string with line breaks at the specified width while breaking + * words and indenting every but the first line on the left. + * + * @param {string} str + * @param {number} width + * @param {number} indent + * @return {string} + * @api private + */ +function wrap(str, width, indent) { + const regex = new RegExp('.{1,' + (width - 1) + '}([\\s\u200B]|$)|[^\\s\u200B]+?([\\s\u200B]|$)', 'g'); + const lines = str.match(regex) || []; + return lines.map((line, i) => { + if (line.slice(-1) === '\n') { + line = line.slice(0, line.length - 1); + } + return ((i > 0 && indent) ? Array(indent + 1).join(' ') : '') + line.trimRight(); + }).join('\n'); +} + +/** + * Optionally wrap the given str to a max width of width characters per line + * while indenting with indent spaces. Do not wrap if insufficient width or + * string is manually formatted. + * + * @param {string} str + * @param {number} width + * @param {number} indent + * @return {string} + * @api private + */ +function optionalWrap(str, width, indent) { + // Detect manually wrapped and indented strings by searching for line breaks + // followed by multiple spaces/tabs. + if (str.match(/[\n]\s+/)) return str; + // Do not wrap to narrow columns (or can end up with a word per line). + const minWidth = 40; + if (width < minWidth) return str; + + return wrap(str, width, indent); +} + +/** + * Output help information if help flags specified + * + * @param {Command} cmd - command to output help for + * @param {Array} args - array of options to search for help flags + * @api private + */ + +function outputHelpIfRequested(cmd, args) { + const helpOption = cmd._hasHelpOption && args.find(arg => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag); + if (helpOption) { + cmd.outputHelp(); + // (Do not have all displayed text available so only passing placeholder.) + cmd._exit(0, 'commander.helpDisplayed', '(outputHelp)'); + } +} + +/** + * Takes an argument and returns its human readable equivalent for help usage. + * + * @param {Object} arg + * @return {string} + * @api private + */ + +function humanReadableArgName(arg) { + const nameOutput = arg.name + (arg.variadic === true ? '...' : ''); + + return arg.required + ? '<' + nameOutput + '>' + : '[' + nameOutput + ']'; +} + +/** + * Parse the short and long flag out of something like '-m,--mixed ' + * + * @api private + */ + +function _parseOptionFlags(flags) { + let shortFlag; + let longFlag; + // Use original very loose parsing to maintain backwards compatibility for now, + // which allowed for example unintended `-sw, --short-word` [sic]. + const flagParts = flags.split(/[ |,]+/); + if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift(); + longFlag = flagParts.shift(); + // Add support for lone short flag without significantly changing parsing! + if (!shortFlag && /^-[^-]$/.test(longFlag)) { + shortFlag = longFlag; + longFlag = undefined; + } + return { shortFlag, longFlag }; +} + +/** + * Scan arguments and increment port number for inspect calls (to avoid conflicts when spawning new command). + * + * @param {string[]} args - array of arguments from node.execArgv + * @returns {string[]} + * @api private + */ + +function incrementNodeInspectorPort(args) { + // Testing for these options: + // --inspect[=[host:]port] + // --inspect-brk[=[host:]port] + // --inspect-port=[host:]port + return args.map((arg) => { + if (!arg.startsWith('--inspect')) { + return arg; + } + let debugOption; + let debugHost = '127.0.0.1'; + let debugPort = '9229'; + let match; + if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { + // e.g. --inspect + debugOption = match[1]; + } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { + debugOption = match[1]; + if (/^\d+$/.test(match[3])) { + // e.g. --inspect=1234 + debugPort = match[3]; + } else { + // e.g. --inspect=localhost + debugHost = match[3]; + } + } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { + // e.g. --inspect=localhost:1234 + debugOption = match[1]; + debugHost = match[3]; + debugPort = match[4]; + } + + if (debugOption && debugPort !== '0') { + return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`; + } + return arg; + }); +} diff --git a/node_modules/commander/package.json b/node_modules/commander/package.json new file mode 100644 index 0000000..69a67b9 --- /dev/null +++ b/node_modules/commander/package.json @@ -0,0 +1,51 @@ +{ + "name": "commander", + "version": "6.2.1", + "description": "the complete solution for node.js command-line programs", + "keywords": [ + "commander", + "command", + "option", + "parser", + "cli", + "argument", + "args", + "argv" + ], + "author": "TJ Holowaychuk ", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/tj/commander.js.git" + }, + "scripts": { + "lint": "eslint index.js \"tests/**/*.js\"", + "typescript-lint": "eslint typings/*.ts", + "test": "jest && npm run test-typings", + "test-typings": "tsc -p tsconfig.json" + }, + "main": "index", + "files": [ + "index.js", + "typings/index.d.ts" + ], + "dependencies": {}, + "devDependencies": { + "@types/jest": "^26.0.15", + "@types/node": "^14.14.2", + "@typescript-eslint/eslint-plugin": "^4.5.0", + "eslint": "^7.11.0", + "eslint-config-standard-with-typescript": "^19.0.1", + "eslint-plugin-jest": "^24.1.0", + "jest": "^26.6.0", + "standard": "^15.0.0", + "typescript": "^4.0.3" + }, + "typings": "typings/index.d.ts", + "jest": { + "collectCoverage": true + }, + "engines": { + "node": ">= 6" + } +} diff --git a/node_modules/commander/typings/index.d.ts b/node_modules/commander/typings/index.d.ts new file mode 100644 index 0000000..479446d --- /dev/null +++ b/node_modules/commander/typings/index.d.ts @@ -0,0 +1,410 @@ +// Type definitions for commander +// Original definitions by: Alan Agius , Marcelo Dezem , vvakame , Jules Randolph + +declare namespace commander { + + interface CommanderError extends Error { + code: string; + exitCode: number; + message: string; + nestedError?: string; + } + type CommanderErrorConstructor = new (exitCode: number, code: string, message: string) => CommanderError; + + interface Option { + flags: string; + required: boolean; // A value must be supplied when the option is specified. + optional: boolean; // A value is optional when the option is specified. + mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line. + bool: boolean; + short?: string; + long: string; + description: string; + } + type OptionConstructor = new (flags: string, description?: string) => Option; + + interface ParseOptions { + from: 'node' | 'electron' | 'user'; + } + + interface Command { + [key: string]: any; // options as properties + + args: string[]; + + commands: Command[]; + + /** + * Set the program version to `str`. + * + * This method auto-registers the "-V, --version" flag + * which will print the version number when passed. + * + * You can optionally supply the flags and description to override the defaults. + */ + version(str: string, flags?: string, description?: string): this; + + /** + * Define a command, implemented using an action handler. + * + * @remarks + * The command description is supplied using `.description`, not as a parameter to `.command`. + * + * @example + * ```ts + * program + * .command('clone [destination]') + * .description('clone a repository into a newly created directory') + * .action((source, destination) => { + * console.log('clone command called'); + * }); + * ``` + * + * @param nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param opts - configuration options + * @returns new command + */ + command(nameAndArgs: string, opts?: CommandOptions): ReturnType; + /** + * Define a command, implemented in a separate executable file. + * + * @remarks + * The command description is supplied as the second parameter to `.command`. + * + * @example + * ```ts + * program + * .command('start ', 'start named service') + * .command('stop [service]', 'stop named service, or all if no name supplied'); + * ``` + * + * @param nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` + * @param description - description of executable command + * @param opts - configuration options + * @returns `this` command for chaining + */ + command(nameAndArgs: string, description: string, opts?: commander.ExecutableCommandOptions): this; + + /** + * Factory routine to create a new unattached command. + * + * See .command() for creating an attached subcommand, which uses this routine to + * create the command. You can override createCommand to customise subcommands. + */ + createCommand(name?: string): Command; + + /** + * Add a prepared subcommand. + * + * See .command() for creating an attached subcommand which inherits settings from its parent. + * + * @returns `this` command for chaining + */ + addCommand(cmd: Command, opts?: CommandOptions): this; + + /** + * Define argument syntax for command. + * + * @returns `this` command for chaining + */ + arguments(desc: string): this; + + /** + * Override default decision whether to add implicit help command. + * + * addHelpCommand() // force on + * addHelpCommand(false); // force off + * addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details + * + * @returns `this` command for chaining + */ + addHelpCommand(enableOrNameAndArgs?: string | boolean, description?: string): this; + + /** + * Register callback to use as replacement for calling process.exit. + */ + exitOverride(callback?: (err: CommanderError) => never|void): this; + + /** + * Register callback `fn` for the command. + * + * @example + * program + * .command('help') + * .description('display verbose help') + * .action(function() { + * // output help here + * }); + * + * @returns `this` command for chaining + */ + action(fn: (...args: any[]) => void | Promise): this; + + /** + * Define option with `flags`, `description` and optional + * coercion `fn`. + * + * The `flags` string should contain both the short and long flags, + * separated by comma, a pipe or space. The following are all valid + * all will output this way when `--help` is used. + * + * "-p, --pepper" + * "-p|--pepper" + * "-p --pepper" + * + * @example + * // simple boolean defaulting to false + * program.option('-p, --pepper', 'add pepper'); + * + * --pepper + * program.pepper + * // => Boolean + * + * // simple boolean defaulting to true + * program.option('-C, --no-cheese', 'remove cheese'); + * + * program.cheese + * // => true + * + * --no-cheese + * program.cheese + * // => false + * + * // required argument + * program.option('-C, --chdir ', 'change the working directory'); + * + * --chdir /tmp + * program.chdir + * // => "/tmp" + * + * // optional argument + * program.option('-c, --cheese [type]', 'add cheese [marble]'); + * + * @returns `this` command for chaining + */ + option(flags: string, description?: string, defaultValue?: string | boolean): this; + option(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean): this; + option(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this; + + /** + * Define a required option, which must have a value after parsing. This usually means + * the option must be specified on the command line. (Otherwise the same as .option().) + * + * The `flags` string should contain both the short and long flags, separated by comma, a pipe or space. + */ + requiredOption(flags: string, description?: string, defaultValue?: string | boolean): this; + requiredOption(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean): this; + requiredOption(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this; + + /** + * Whether to store option values as properties on command object, + * or store separately (specify false). In both cases the option values can be accessed using .opts(). + * + * @returns `this` command for chaining + */ + storeOptionsAsProperties(value?: boolean): this; + + /** + * Whether to pass command to action handler, + * or just the options (specify false). + * + * @returns `this` command for chaining + */ + passCommandToAction(value?: boolean): this; + + /** + * Alter parsing of short flags with optional values. + * + * @example + * // for `.option('-f,--flag [value]'): + * .combineFlagAndOptionalValue(true) // `-f80` is treated like `--flag=80`, this is the default behaviour + * .combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` + * + * @returns `this` command for chaining + */ + combineFlagAndOptionalValue(arg?: boolean): this; + + /** + * Allow unknown options on the command line. + * + * @param [arg] if `true` or omitted, no error will be thrown for unknown options. + * @returns `this` command for chaining + */ + allowUnknownOption(arg?: boolean): this; + + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * The default expectation is that the arguments are from node and have the application as argv[0] + * and the script being run in argv[1], with user parameters after that. + * + * Examples: + * + * program.parse(process.argv); + * program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] + * + * @returns `this` command for chaining + */ + parse(argv?: string[], options?: ParseOptions): this; + + /** + * Parse `argv`, setting options and invoking commands when defined. + * + * Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise. + * + * The default expectation is that the arguments are from node and have the application as argv[0] + * and the script being run in argv[1], with user parameters after that. + * + * Examples: + * + * program.parseAsync(process.argv); + * program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions + * program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] + * + * @returns Promise + */ + parseAsync(argv?: string[], options?: ParseOptions): Promise; + + /** + * Parse options from `argv` removing known options, + * and return argv split into operands and unknown arguments. + * + * @example + * argv => operands, unknown + * --known kkk op => [op], [] + * op --known kkk => [op], [] + * sub --unknown uuu op => [sub], [--unknown uuu op] + * sub -- --unknown uuu op => [sub --unknown uuu op], [] + */ + parseOptions(argv: string[]): commander.ParseOptionsResult; + + /** + * Return an object containing options as key-value pairs + */ + opts(): { [key: string]: any }; + + /** + * Set the description. + * + * @returns `this` command for chaining + */ + description(str: string, argsDescription?: {[argName: string]: string}): this; + /** + * Get the description. + */ + description(): string; + + /** + * Set an alias for the command. + * + * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help. + * + * @returns `this` command for chaining + */ + alias(alias: string): this; + /** + * Get alias for the command. + */ + alias(): string; + + /** + * Set aliases for the command. + * + * Only the first alias is shown in the auto-generated help. + * + * @returns `this` command for chaining + */ + aliases(aliases: string[]): this; + /** + * Get aliases for the command. + */ + aliases(): string[]; + + /** + * Set the command usage. + * + * @returns `this` command for chaining + */ + usage(str: string): this; + /** + * Get the command usage. + */ + usage(): string; + + /** + * Set the name of the command. + * + * @returns `this` command for chaining + */ + name(str: string): this; + /** + * Get the name of the command. + */ + name(): string; + + /** + * Output help information for this command. + * + * When listener(s) are available for the helpLongFlag + * those callbacks are invoked. + */ + outputHelp(cb?: (str: string) => string): void; + + /** + * Return command help documentation. + */ + helpInformation(): string; + + /** + * You can pass in flags and a description to override the help + * flags and help description for your command. Pass in false + * to disable the built-in help option. + */ + helpOption(flags?: string | boolean, description?: string): this; + + /** + * Output help information and exit. + */ + help(cb?: (str: string) => string): never; + + /** + * Add a listener (callback) for when events occur. (Implemented using EventEmitter.) + * + * @example + * program + * .on('--help', () -> { + * console.log('See web site for more information.'); + * }); + */ + on(event: string | symbol, listener: (...args: any[]) => void): this; + } + type CommandConstructor = new (name?: string) => Command; + + interface CommandOptions { + noHelp?: boolean; // old name for hidden + hidden?: boolean; + isDefault?: boolean; + } + interface ExecutableCommandOptions extends CommandOptions { + executableFile?: string; + } + + interface ParseOptionsResult { + operands: string[]; + unknown: string[]; + } + + interface CommanderStatic extends Command { + program: Command; + Command: CommandConstructor; + Option: OptionConstructor; + CommanderError: CommanderErrorConstructor; + } + +} + +// Declaring namespace AND global +// eslint-disable-next-line @typescript-eslint/no-redeclare +declare const commander: commander.CommanderStatic; +export = commander; diff --git a/node_modules/csvtojson/.coveralls.yml b/node_modules/csvtojson/.coveralls.yml new file mode 100644 index 0000000..56377a6 --- /dev/null +++ b/node_modules/csvtojson/.coveralls.yml @@ -0,0 +1 @@ +repo_token: heQI90WrL7uiBgb87gsUokB6YqdnSfs6O \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/081f64d5edb0cbe31f73fbc9234d8e0e.json b/node_modules/csvtojson/.nyc_output/081f64d5edb0cbe31f73fbc9234d8e0e.json new file mode 100644 index 0000000..a304cc4 --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/081f64d5edb0cbe31f73fbc9234d8e0e.json @@ -0,0 +1 @@ +{"/Users/kxiang/work/projects/csv2json/src/CSVError.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/CSVError.test.ts","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":6,"column":2}},"1":{"start":{"line":4,"column":2},"end":{"line":5,"column":4}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":21}},"loc":{"start":{"line":3,"column":24},"end":{"line":6,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":26},"end":{"line":4,"column":27}},"loc":{"start":{"line":4,"column":30},"end":{"line":5,"column":3}},"line":4}},"branchMap":{},"s":{"0":0,"1":0},"f":{"0":0,"1":0},"b":{}},"/Users/kxiang/work/projects/csv2json/src/dataClean.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/dataClean.ts","statementMap":{"0":{"start":{"line":10,"column":20},"end":{"line":10,"column":51}},"1":{"start":{"line":11,"column":2},"end":{"line":11,"column":36}},"2":{"start":{"line":12,"column":25},"end":{"line":12,"column":76}},"3":{"start":{"line":13,"column":2},"end":{"line":17,"column":3}},"4":{"start":{"line":14,"column":4},"end":{"line":14,"column":36}},"5":{"start":{"line":16,"column":4},"end":{"line":16,"column":26}},"6":{"start":{"line":23,"column":2},"end":{"line":27,"column":3}},"7":{"start":{"line":24,"column":4},"end":{"line":24,"column":57}},"8":{"start":{"line":26,"column":4},"end":{"line":26,"column":17}},"9":{"start":{"line":33,"column":12},"end":{"line":33,"column":28}},"10":{"start":{"line":41,"column":2},"end":{"line":46,"column":3}},"11":{"start":{"line":42,"column":4},"end":{"line":44,"column":5}},"12":{"start":{"line":43,"column":6},"end":{"line":43,"column":12}},"13":{"start":{"line":45,"column":4},"end":{"line":45,"column":10}},"14":{"start":{"line":47,"column":2},"end":{"line":62,"column":3}},"15":{"start":{"line":48,"column":4},"end":{"line":48,"column":49}},"16":{"start":{"line":49,"column":4},"end":{"line":49,"column":34}},"17":{"start":{"line":61,"column":4},"end":{"line":61,"column":17}}},"fnMap":{"0":{"name":"prepareData","decl":{"start":{"line":9,"column":16},"end":{"line":9,"column":27}},"loc":{"start":{"line":9,"column":74},"end":{"line":18,"column":1}},"line":9},"1":{"name":"concatLeftChunk","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":24}},"loc":{"start":{"line":22,"column":71},"end":{"line":28,"column":1}},"line":22},"2":{"name":"cleanUtf8Split","decl":{"start":{"line":32,"column":9},"end":{"line":32,"column":23}},"loc":{"start":{"line":32,"column":70},"end":{"line":63,"column":1}},"line":32}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":13,"column":2},"end":{"line":17,"column":3}},{"start":{"line":13,"column":2},"end":{"line":17,"column":3}}],"line":13},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":27,"column":3}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":27,"column":3}},{"start":{"line":23,"column":2},"end":{"line":27,"column":3}}],"line":23},"2":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":63}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":27}},{"start":{"line":23,"column":31},"end":{"line":23,"column":63}}],"line":23},"3":{"loc":{"start":{"line":41,"column":2},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":46,"column":3}},{"start":{"line":41,"column":2},"end":{"line":46,"column":3}}],"line":41},"4":{"loc":{"start":{"line":47,"column":2},"end":{"line":62,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":62,"column":3}},{"start":{"line":47,"column":2},"end":{"line":62,"column":3}}],"line":47}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0]}},"/Users/kxiang/work/projects/csv2json/src/fileline.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/fileline.test.ts","statementMap":{"0":{"start":{"line":4,"column":13},"end":{"line":4,"column":30}},"1":{"start":{"line":5,"column":0},"end":{"line":14,"column":3}},"2":{"start":{"line":6,"column":2},"end":{"line":13,"column":5}},"3":{"start":{"line":7,"column":15},"end":{"line":7,"column":30}},"4":{"start":{"line":8,"column":15},"end":{"line":8,"column":28}},"5":{"start":{"line":9,"column":17},"end":{"line":9,"column":55}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":41}},"7":{"start":{"line":11,"column":4},"end":{"line":11,"column":41}},"8":{"start":{"line":12,"column":4},"end":{"line":12,"column":43}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":30},"end":{"line":5,"column":31}},"loc":{"start":{"line":5,"column":41},"end":{"line":14,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":48},"end":{"line":6,"column":49}},"loc":{"start":{"line":6,"column":59},"end":{"line":13,"column":3}},"line":6}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0,"1":0},"b":{}},"/Users/kxiang/work/projects/csv2json/src/fileline.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/fileline.ts","statementMap":{"0":{"start":{"line":11,"column":14},"end":{"line":11,"column":33}},"1":{"start":{"line":12,"column":16},"end":{"line":12,"column":31}},"2":{"start":{"line":13,"column":18},"end":{"line":13,"column":35}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":44}}},"fnMap":{"0":{"name":"stringToLines","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":29}},"loc":{"start":{"line":10,"column":86},"end":{"line":15,"column":1}},"line":10}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":18},"end":{"line":13,"column":35}},"type":"binary-expr","locations":[{"start":{"line":13,"column":18},"end":{"line":13,"column":29}},{"start":{"line":13,"column":33},"end":{"line":13,"column":35}}],"line":13}},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0},"b":{"0":[0,0]}},"/Users/kxiang/work/projects/csv2json/src/getEol.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/getEol.ts","statementMap":{"0":{"start":{"line":4,"column":2},"end":{"line":19,"column":3}},"1":{"start":{"line":5,"column":4},"end":{"line":18,"column":5}},"2":{"start":{"line":6,"column":6},"end":{"line":17,"column":7}},"3":{"start":{"line":7,"column":8},"end":{"line":13,"column":9}},"4":{"start":{"line":8,"column":10},"end":{"line":8,"column":29}},"5":{"start":{"line":9,"column":10},"end":{"line":9,"column":16}},"6":{"start":{"line":10,"column":15},"end":{"line":13,"column":9}},"7":{"start":{"line":11,"column":10},"end":{"line":11,"column":27}},"8":{"start":{"line":12,"column":10},"end":{"line":12,"column":16}},"9":{"start":{"line":14,"column":13},"end":{"line":17,"column":7}},"10":{"start":{"line":15,"column":8},"end":{"line":15,"column":25}},"11":{"start":{"line":16,"column":8},"end":{"line":16,"column":14}},"12":{"start":{"line":20,"column":2},"end":{"line":20,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":15},"end":{"line":3,"column":16}},"loc":{"start":{"line":3,"column":68},"end":{"line":21,"column":1}},"line":3}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":4,"column":2},"end":{"line":19,"column":3}},{"start":{"line":4,"column":2},"end":{"line":19,"column":3}}],"line":4},"1":{"loc":{"start":{"line":4,"column":6},"end":{"line":4,"column":24}},"type":"binary-expr","locations":[{"start":{"line":4,"column":6},"end":{"line":4,"column":16}},{"start":{"line":4,"column":20},"end":{"line":4,"column":24}}],"line":4},"2":{"loc":{"start":{"line":6,"column":6},"end":{"line":17,"column":7}},"type":"if","locations":[{"start":{"line":6,"column":6},"end":{"line":17,"column":7}},{"start":{"line":6,"column":6},"end":{"line":17,"column":7}}],"line":6},"3":{"loc":{"start":{"line":7,"column":8},"end":{"line":13,"column":9}},"type":"if","locations":[{"start":{"line":7,"column":8},"end":{"line":13,"column":9}},{"start":{"line":7,"column":8},"end":{"line":13,"column":9}}],"line":7},"4":{"loc":{"start":{"line":10,"column":15},"end":{"line":13,"column":9}},"type":"if","locations":[{"start":{"line":10,"column":15},"end":{"line":13,"column":9}},{"start":{"line":10,"column":15},"end":{"line":13,"column":9}}],"line":10},"5":{"loc":{"start":{"line":14,"column":13},"end":{"line":17,"column":7}},"type":"if","locations":[{"start":{"line":14,"column":13},"end":{"line":17,"column":7}},{"start":{"line":14,"column":13},"end":{"line":17,"column":7}}],"line":14},"6":{"loc":{"start":{"line":20,"column":9},"end":{"line":20,"column":26}},"type":"binary-expr","locations":[{"start":{"line":20,"column":9},"end":{"line":20,"column":18}},{"start":{"line":20,"column":22},"end":{"line":20,"column":26}}],"line":20}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]}},"/Users/kxiang/work/projects/csv2json/src/Parameters.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/Parameters.ts","statementMap":{"0":{"start":{"line":83,"column":38},"end":{"line":102,"column":3}},"1":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"2":{"start":{"line":104,"column":4},"end":{"line":104,"column":16}},"3":{"start":{"line":106,"column":2},"end":{"line":114,"column":3}},"4":{"start":{"line":107,"column":4},"end":{"line":113,"column":5}},"5":{"start":{"line":108,"column":6},"end":{"line":112,"column":7}},"6":{"start":{"line":109,"column":8},"end":{"line":109,"column":51}},"7":{"start":{"line":111,"column":8},"end":{"line":111,"column":40}},"8":{"start":{"line":115,"column":2},"end":{"line":115,"column":22}}},"fnMap":{"0":{"name":"mergeParams","decl":{"start":{"line":82,"column":16},"end":{"line":82,"column":27}},"loc":{"start":{"line":82,"column":76},"end":{"line":116,"column":1}},"line":82}},"branchMap":{"0":{"loc":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},{"start":{"line":103,"column":2},"end":{"line":105,"column":3}}],"line":103},"1":{"loc":{"start":{"line":107,"column":4},"end":{"line":113,"column":5}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":113,"column":5}},{"start":{"line":107,"column":4},"end":{"line":113,"column":5}}],"line":107},"2":{"loc":{"start":{"line":108,"column":6},"end":{"line":112,"column":7}},"type":"if","locations":[{"start":{"line":108,"column":6},"end":{"line":112,"column":7}},{"start":{"line":108,"column":6},"end":{"line":112,"column":7}}],"line":108}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}},"/Users/kxiang/work/projects/csv2json/src/ParseRuntime.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/ParseRuntime.ts","statementMap":{"0":{"start":{"line":64,"column":17},"end":{"line":64,"column":37}},"1":{"start":{"line":65,"column":28},"end":{"line":82,"column":3}},"2":{"start":{"line":83,"column":2},"end":{"line":85,"column":3}},"3":{"start":{"line":84,"column":4},"end":{"line":84,"column":39}},"4":{"start":{"line":86,"column":2},"end":{"line":88,"column":3}},"5":{"start":{"line":87,"column":4},"end":{"line":87,"column":40}},"6":{"start":{"line":89,"column":2},"end":{"line":89,"column":13}}},"fnMap":{"0":{"name":"initParseRuntime","decl":{"start":{"line":63,"column":16},"end":{"line":63,"column":32}},"loc":{"start":{"line":63,"column":69},"end":{"line":90,"column":1}},"line":63}},"branchMap":{"0":{"loc":{"start":{"line":83,"column":2},"end":{"line":85,"column":3}},"type":"if","locations":[{"start":{"line":83,"column":2},"end":{"line":85,"column":3}},{"start":{"line":83,"column":2},"end":{"line":85,"column":3}}],"line":83},"1":{"loc":{"start":{"line":86,"column":2},"end":{"line":88,"column":3}},"type":"if","locations":[{"start":{"line":86,"column":2},"end":{"line":88,"column":3}},{"start":{"line":86,"column":2},"end":{"line":88,"column":3}}],"line":86}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]}},"/Users/kxiang/work/projects/csv2json/src/rowSplit.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/rowSplit.test.ts","statementMap":{"0":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"1":{"start":{"line":5,"column":0},"end":{"line":40,"column":3}},"2":{"start":{"line":6,"column":23},"end":{"line":14,"column":3}},"3":{"start":{"line":7,"column":4},"end":{"line":13,"column":12}},"4":{"start":{"line":16,"column":2},"end":{"line":21,"column":5}},"5":{"start":{"line":17,"column":20},"end":{"line":17,"column":23}},"6":{"start":{"line":18,"column":17},"end":{"line":18,"column":24}},"7":{"start":{"line":19,"column":28},"end":{"line":19,"column":68}},"8":{"start":{"line":20,"column":4},"end":{"line":20,"column":47}},"9":{"start":{"line":23,"column":2},"end":{"line":27,"column":5}},"10":{"start":{"line":24,"column":17},"end":{"line":24,"column":24}},"11":{"start":{"line":25,"column":28},"end":{"line":25,"column":71}},"12":{"start":{"line":26,"column":4},"end":{"line":26,"column":38}},"13":{"start":{"line":29,"column":2},"end":{"line":33,"column":5}},"14":{"start":{"line":30,"column":17},"end":{"line":30,"column":22}},"15":{"start":{"line":31,"column":28},"end":{"line":31,"column":71}},"16":{"start":{"line":32,"column":4},"end":{"line":32,"column":38}},"17":{"start":{"line":35,"column":2},"end":{"line":39,"column":5}},"18":{"start":{"line":36,"column":17},"end":{"line":36,"column":24}},"19":{"start":{"line":37,"column":28},"end":{"line":37,"column":80}},"20":{"start":{"line":38,"column":4},"end":{"line":38,"column":38}},"21":{"start":{"line":42,"column":0},"end":{"line":83,"column":3}},"22":{"start":{"line":43,"column":19},"end":{"line":43,"column":48}},"23":{"start":{"line":44,"column":15},"end":{"line":46,"column":3}},"24":{"start":{"line":45,"column":4},"end":{"line":45,"column":43}},"25":{"start":{"line":47,"column":2},"end":{"line":56,"column":5}},"26":{"start":{"line":48,"column":16},"end":{"line":52,"column":5}},"27":{"start":{"line":53,"column":14},"end":{"line":53,"column":25}},"28":{"start":{"line":54,"column":4},"end":{"line":54,"column":42}},"29":{"start":{"line":55,"column":4},"end":{"line":55,"column":34}},"30":{"start":{"line":58,"column":2},"end":{"line":71,"column":5}},"31":{"start":{"line":59,"column":16},"end":{"line":64,"column":5}},"32":{"start":{"line":65,"column":14},"end":{"line":65,"column":25}},"33":{"start":{"line":66,"column":4},"end":{"line":66,"column":42}},"34":{"start":{"line":67,"column":4},"end":{"line":67,"column":46}},"35":{"start":{"line":68,"column":4},"end":{"line":68,"column":49}},"36":{"start":{"line":69,"column":4},"end":{"line":69,"column":46}},"37":{"start":{"line":70,"column":4},"end":{"line":70,"column":34}},"38":{"start":{"line":73,"column":2},"end":{"line":82,"column":5}},"39":{"start":{"line":74,"column":16},"end":{"line":78,"column":5}},"40":{"start":{"line":79,"column":14},"end":{"line":79,"column":25}},"41":{"start":{"line":80,"column":4},"end":{"line":80,"column":42}},"42":{"start":{"line":81,"column":4},"end":{"line":81,"column":58}},"43":{"start":{"line":85,"column":0},"end":{"line":110,"column":3}},"44":{"start":{"line":86,"column":19},"end":{"line":86,"column":48}},"45":{"start":{"line":87,"column":15},"end":{"line":89,"column":3}},"46":{"start":{"line":88,"column":4},"end":{"line":88,"column":31}},"47":{"start":{"line":90,"column":2},"end":{"line":95,"column":5}},"48":{"start":{"line":91,"column":14},"end":{"line":91,"column":45}},"49":{"start":{"line":92,"column":14},"end":{"line":92,"column":23}},"50":{"start":{"line":93,"column":4},"end":{"line":93,"column":38}},"51":{"start":{"line":94,"column":4},"end":{"line":94,"column":35}},"52":{"start":{"line":97,"column":2},"end":{"line":101,"column":5}},"53":{"start":{"line":98,"column":14},"end":{"line":98,"column":47}},"54":{"start":{"line":99,"column":14},"end":{"line":99,"column":23}},"55":{"start":{"line":100,"column":4},"end":{"line":100,"column":36}},"56":{"start":{"line":103,"column":2},"end":{"line":108,"column":5}},"57":{"start":{"line":104,"column":14},"end":{"line":104,"column":59}},"58":{"start":{"line":105,"column":14},"end":{"line":105,"column":23}},"59":{"start":{"line":106,"column":4},"end":{"line":106,"column":35}},"60":{"start":{"line":107,"column":4},"end":{"line":107,"column":55}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":28},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":40},"end":{"line":40,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":23},"end":{"line":6,"column":24}},"loc":{"start":{"line":6,"column":79},"end":{"line":14,"column":3}},"line":6},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":57},"end":{"line":16,"column":58}},"loc":{"start":{"line":16,"column":69},"end":{"line":21,"column":3}},"line":16},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":69},"end":{"line":23,"column":70}},"loc":{"start":{"line":23,"column":81},"end":{"line":27,"column":3}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":29,"column":92},"end":{"line":29,"column":93}},"loc":{"start":{"line":29,"column":104},"end":{"line":33,"column":3}},"line":29},"5":{"name":"(anonymous_5)","decl":{"start":{"line":35,"column":57},"end":{"line":35,"column":58}},"loc":{"start":{"line":35,"column":69},"end":{"line":39,"column":3}},"line":35},"6":{"name":"(anonymous_6)","decl":{"start":{"line":42,"column":36},"end":{"line":42,"column":37}},"loc":{"start":{"line":42,"column":48},"end":{"line":83,"column":1}},"line":42},"7":{"name":"(anonymous_7)","decl":{"start":{"line":44,"column":15},"end":{"line":44,"column":16}},"loc":{"start":{"line":44,"column":55},"end":{"line":46,"column":3}},"line":44},"8":{"name":"(anonymous_8)","decl":{"start":{"line":47,"column":42},"end":{"line":47,"column":43}},"loc":{"start":{"line":47,"column":54},"end":{"line":56,"column":3}},"line":47},"9":{"name":"(anonymous_9)","decl":{"start":{"line":58,"column":35},"end":{"line":58,"column":36}},"loc":{"start":{"line":58,"column":47},"end":{"line":71,"column":3}},"line":58},"10":{"name":"(anonymous_10)","decl":{"start":{"line":73,"column":49},"end":{"line":73,"column":50}},"loc":{"start":{"line":73,"column":61},"end":{"line":82,"column":3}},"line":73},"11":{"name":"(anonymous_11)","decl":{"start":{"line":85,"column":36},"end":{"line":85,"column":37}},"loc":{"start":{"line":85,"column":48},"end":{"line":110,"column":1}},"line":85},"12":{"name":"(anonymous_12)","decl":{"start":{"line":87,"column":15},"end":{"line":87,"column":16}},"loc":{"start":{"line":87,"column":40},"end":{"line":89,"column":3}},"line":87},"13":{"name":"(anonymous_13)","decl":{"start":{"line":90,"column":39},"end":{"line":90,"column":40}},"loc":{"start":{"line":90,"column":51},"end":{"line":95,"column":3}},"line":90},"14":{"name":"(anonymous_14)","decl":{"start":{"line":97,"column":41},"end":{"line":97,"column":42}},"loc":{"start":{"line":97,"column":53},"end":{"line":101,"column":3}},"line":97},"15":{"name":"(anonymous_15)","decl":{"start":{"line":103,"column":35},"end":{"line":103,"column":36}},"loc":{"start":{"line":103,"column":47},"end":{"line":108,"column":3}},"line":103}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"b":{}},"/Users/kxiang/work/projects/csv2json/src/util.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/util.ts","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":39}},"1":{"start":{"line":3,"column":17},"end":{"line":5,"column":24}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":20}},"3":{"start":{"line":7,"column":2},"end":{"line":7,"column":16}},"4":{"start":{"line":11,"column":17},"end":{"line":13,"column":19}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":16}},"6":{"start":{"line":18,"column":21},"end":{"line":18,"column":23}},"7":{"start":{"line":19,"column":2},"end":{"line":23,"column":3}},"8":{"start":{"line":20,"column":4},"end":{"line":22,"column":5}},"9":{"start":{"line":21,"column":6},"end":{"line":21,"column":23}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":13}}},"fnMap":{"0":{"name":"bufFromString","decl":{"start":{"line":1,"column":16},"end":{"line":1,"column":29}},"loc":{"start":{"line":1,"column":51},"end":{"line":8,"column":1}},"line":1},"1":{"name":"emptyBuffer","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":27}},"loc":{"start":{"line":10,"column":37},"end":{"line":15,"column":1}},"line":10},"2":{"name":"filterArray","decl":{"start":{"line":17,"column":16},"end":{"line":17,"column":27}},"loc":{"start":{"line":17,"column":65},"end":{"line":25,"column":1}},"line":17}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":17},"end":{"line":5,"column":24}},"type":"cond-expr","locations":[{"start":{"line":4,"column":6},"end":{"line":4,"column":32}},{"start":{"line":5,"column":6},"end":{"line":5,"column":24}}],"line":3},"1":{"loc":{"start":{"line":11,"column":17},"end":{"line":13,"column":19}},"type":"cond-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":27}},{"start":{"line":13,"column":6},"end":{"line":13,"column":19}}],"line":11},"2":{"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":20,"column":4},"end":{"line":22,"column":5}},{"start":{"line":20,"column":4},"end":{"line":22,"column":5}}],"line":20}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}}} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/0b5b534d8fdda9c9e8b53fce635f391b.json b/node_modules/csvtojson/.nyc_output/0b5b534d8fdda9c9e8b53fce635f391b.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/0b5b534d8fdda9c9e8b53fce635f391b.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/0b82538911259cd760273af57e1b568e.json b/node_modules/csvtojson/.nyc_output/0b82538911259cd760273af57e1b568e.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/0b82538911259cd760273af57e1b568e.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/1fca5d8f4e8d0d7070af41ac05926b53.json b/node_modules/csvtojson/.nyc_output/1fca5d8f4e8d0d7070af41ac05926b53.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/1fca5d8f4e8d0d7070af41ac05926b53.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/28300bac0b62bba7556e850269888b3a.json b/node_modules/csvtojson/.nyc_output/28300bac0b62bba7556e850269888b3a.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/28300bac0b62bba7556e850269888b3a.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/290a14ffd14b612104d733748fcb00ea.json b/node_modules/csvtojson/.nyc_output/290a14ffd14b612104d733748fcb00ea.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/290a14ffd14b612104d733748fcb00ea.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/2d0a0489ff0595b8e4e6adccf81060c8.json b/node_modules/csvtojson/.nyc_output/2d0a0489ff0595b8e4e6adccf81060c8.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/2d0a0489ff0595b8e4e6adccf81060c8.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/3285cdcafb8fcaecfa2fd1db8f6d35c1.json b/node_modules/csvtojson/.nyc_output/3285cdcafb8fcaecfa2fd1db8f6d35c1.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/3285cdcafb8fcaecfa2fd1db8f6d35c1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/353a08632aa428048df9d67f46b2a943.json b/node_modules/csvtojson/.nyc_output/353a08632aa428048df9d67f46b2a943.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/353a08632aa428048df9d67f46b2a943.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/372af79153a72baeaaee8fac2c00326e.json b/node_modules/csvtojson/.nyc_output/372af79153a72baeaaee8fac2c00326e.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/372af79153a72baeaaee8fac2c00326e.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/3c338e25b082cae5697e985e98a01fe0.json b/node_modules/csvtojson/.nyc_output/3c338e25b082cae5697e985e98a01fe0.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/3c338e25b082cae5697e985e98a01fe0.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/3f4b44285d46037be38e2a3fb692ca90.json b/node_modules/csvtojson/.nyc_output/3f4b44285d46037be38e2a3fb692ca90.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/3f4b44285d46037be38e2a3fb692ca90.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/408532dd749511a552d2171e6dd846f9.json b/node_modules/csvtojson/.nyc_output/408532dd749511a552d2171e6dd846f9.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/408532dd749511a552d2171e6dd846f9.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/427f91d355efe544f3c08bef54b0cba4.json b/node_modules/csvtojson/.nyc_output/427f91d355efe544f3c08bef54b0cba4.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/427f91d355efe544f3c08bef54b0cba4.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/5295987c062fb22dfb962addac01e463.json b/node_modules/csvtojson/.nyc_output/5295987c062fb22dfb962addac01e463.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/5295987c062fb22dfb962addac01e463.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/548df513a8d4bb28c35f0142c19e88da.json b/node_modules/csvtojson/.nyc_output/548df513a8d4bb28c35f0142c19e88da.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/548df513a8d4bb28c35f0142c19e88da.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/5aa3d5a9e40c7b393bcc5741ab892901.json b/node_modules/csvtojson/.nyc_output/5aa3d5a9e40c7b393bcc5741ab892901.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/5aa3d5a9e40c7b393bcc5741ab892901.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/5be35f8b3b5266ff2eae0d4a535f9472.json b/node_modules/csvtojson/.nyc_output/5be35f8b3b5266ff2eae0d4a535f9472.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/5be35f8b3b5266ff2eae0d4a535f9472.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/5e4760ecbfae5fa02da0dfc78b080df1.json b/node_modules/csvtojson/.nyc_output/5e4760ecbfae5fa02da0dfc78b080df1.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/5e4760ecbfae5fa02da0dfc78b080df1.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/5ecfa6bb23b282fe433bacd19be3c301.json b/node_modules/csvtojson/.nyc_output/5ecfa6bb23b282fe433bacd19be3c301.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/5ecfa6bb23b282fe433bacd19be3c301.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/619b06b7be8e214e8fb326e4f336a7be.json b/node_modules/csvtojson/.nyc_output/619b06b7be8e214e8fb326e4f336a7be.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/619b06b7be8e214e8fb326e4f336a7be.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/6ebc3edd99eabbc335501c2ab5302ffd.json b/node_modules/csvtojson/.nyc_output/6ebc3edd99eabbc335501c2ab5302ffd.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/6ebc3edd99eabbc335501c2ab5302ffd.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/74d45bc2be4d60ae2bc0793cbb6bffcd.json b/node_modules/csvtojson/.nyc_output/74d45bc2be4d60ae2bc0793cbb6bffcd.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/74d45bc2be4d60ae2bc0793cbb6bffcd.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/763b2880a165693362fce56b1ac899e3.json b/node_modules/csvtojson/.nyc_output/763b2880a165693362fce56b1ac899e3.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/763b2880a165693362fce56b1ac899e3.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/764c64567872f5beaff5721b469b15c8.json b/node_modules/csvtojson/.nyc_output/764c64567872f5beaff5721b469b15c8.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/764c64567872f5beaff5721b469b15c8.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/8324a746e7efbf67009c3427165fe910.json b/node_modules/csvtojson/.nyc_output/8324a746e7efbf67009c3427165fe910.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/8324a746e7efbf67009c3427165fe910.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/8f11bb580569edc78e9ac43a4e77ebf7.json b/node_modules/csvtojson/.nyc_output/8f11bb580569edc78e9ac43a4e77ebf7.json new file mode 100644 index 0000000..81555bf --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/8f11bb580569edc78e9ac43a4e77ebf7.json @@ -0,0 +1 @@ +{"/Users/kxiang/work/projects/csv2json/src/CSVError.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/CSVError.test.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":0},"end":{"line":6,"column":3}},"2":{"start":{"line":4,"column":4},"end":{"line":5,"column":7}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":21},"end":{"line":3,"column":22}},"loc":{"start":{"line":3,"column":33},"end":{"line":6,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":28},"end":{"line":4,"column":29}},"loc":{"start":{"line":4,"column":40},"end":{"line":5,"column":5}},"line":4}},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"bb3b8fae4e8410dbffef9cf1b6b5a26687ce9cb2","contentHash":"bfbd59de5208213ad5fa21b05b5bacda_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/fileline.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/fileline.test.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":38}},"2":{"start":{"line":4,"column":18},"end":{"line":4,"column":40}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":30}},"4":{"start":{"line":6,"column":0},"end":{"line":15,"column":3}},"5":{"start":{"line":7,"column":4},"end":{"line":14,"column":7}},"6":{"start":{"line":8,"column":19},"end":{"line":8,"column":46}},"7":{"start":{"line":9,"column":19},"end":{"line":9,"column":32}},"8":{"start":{"line":10,"column":21},"end":{"line":10,"column":70}},"9":{"start":{"line":11,"column":8},"end":{"line":11,"column":45}},"10":{"start":{"line":12,"column":8},"end":{"line":12,"column":45}},"11":{"start":{"line":13,"column":8},"end":{"line":13,"column":47}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":30},"end":{"line":6,"column":31}},"loc":{"start":{"line":6,"column":42},"end":{"line":15,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":49},"end":{"line":7,"column":50}},"loc":{"start":{"line":7,"column":61},"end":{"line":14,"column":5}},"line":7}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1},"f":{"0":1,"1":1},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"c5a090241934cb33b93748e3b968e992fab6c197","contentHash":"75ab221453465e220537ec7e95c0a663_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/fileline.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/fileline.ts","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"1":{"start":{"line":3,"column":4},"end":{"line":3,"column":62}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"3":{"start":{"line":6,"column":15},"end":{"line":6,"column":51}},"4":{"start":{"line":15,"column":14},"end":{"line":15,"column":43}},"5":{"start":{"line":16,"column":16},"end":{"line":16,"column":31}},"6":{"start":{"line":17,"column":18},"end":{"line":17,"column":35}},"7":{"start":{"line":18,"column":4},"end":{"line":18,"column":46}},"8":{"start":{"line":20,"column":0},"end":{"line":20,"column":38}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":56},"end":{"line":2,"column":57}},"loc":{"start":{"line":2,"column":71},"end":{"line":4,"column":1}},"line":2},"1":{"name":"stringToLines","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":22}},"loc":{"start":{"line":14,"column":36},"end":{"line":19,"column":1}},"line":14}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":23},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":51}},{"start":{"line":2,"column":56},"end":{"line":4,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":11},"end":{"line":3,"column":61}},"type":"cond-expr","locations":[{"start":{"line":3,"column":37},"end":{"line":3,"column":40}},{"start":{"line":3,"column":43},"end":{"line":3,"column":61}}],"line":3},"2":{"loc":{"start":{"line":3,"column":12},"end":{"line":3,"column":33}},"type":"binary-expr","locations":[{"start":{"line":3,"column":12},"end":{"line":3,"column":15}},{"start":{"line":3,"column":19},"end":{"line":3,"column":33}}],"line":3},"3":{"loc":{"start":{"line":17,"column":18},"end":{"line":17,"column":35}},"type":"binary-expr","locations":[{"start":{"line":17,"column":18},"end":{"line":17,"column":29}},{"start":{"line":17,"column":33},"end":{"line":17,"column":35}}],"line":17}},"s":{"0":1,"1":1,"2":1,"3":1,"4":171,"5":171,"6":171,"7":171,"8":1},"f":{"0":1,"1":171},"b":{"0":[1,1,1],"1":[1,0],"2":[1,1],"3":[171,50]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"d0e8d877dda3cb0f0ad6b8dcac0e2337f6a97705","contentHash":"4bec653a7a79ee450c41ea622d6edb1c_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/getEol.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/getEol.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":5,"column":4},"end":{"line":22,"column":5}},"2":{"start":{"line":6,"column":8},"end":{"line":21,"column":9}},"3":{"start":{"line":7,"column":12},"end":{"line":20,"column":13}},"4":{"start":{"line":8,"column":16},"end":{"line":15,"column":17}},"5":{"start":{"line":9,"column":20},"end":{"line":9,"column":39}},"6":{"start":{"line":10,"column":20},"end":{"line":10,"column":26}},"7":{"start":{"line":12,"column":21},"end":{"line":15,"column":17}},"8":{"start":{"line":13,"column":20},"end":{"line":13,"column":37}},"9":{"start":{"line":14,"column":20},"end":{"line":14,"column":26}},"10":{"start":{"line":17,"column":17},"end":{"line":20,"column":13}},"11":{"start":{"line":18,"column":16},"end":{"line":18,"column":33}},"12":{"start":{"line":19,"column":16},"end":{"line":19,"column":22}},"13":{"start":{"line":23,"column":4},"end":{"line":23,"column":29}},"14":{"start":{"line":25,"column":0},"end":{"line":25,"column":28}}},"fnMap":{"0":{"name":"default_1","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":18}},"loc":{"start":{"line":4,"column":32},"end":{"line":24,"column":1}},"line":4}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":5,"column":4},"end":{"line":22,"column":5}},{"start":{"line":5,"column":4},"end":{"line":22,"column":5}}],"line":5},"1":{"loc":{"start":{"line":5,"column":8},"end":{"line":5,"column":26}},"type":"binary-expr","locations":[{"start":{"line":5,"column":8},"end":{"line":5,"column":18}},{"start":{"line":5,"column":22},"end":{"line":5,"column":26}}],"line":5},"2":{"loc":{"start":{"line":7,"column":12},"end":{"line":20,"column":13}},"type":"if","locations":[{"start":{"line":7,"column":12},"end":{"line":20,"column":13}},{"start":{"line":7,"column":12},"end":{"line":20,"column":13}}],"line":7},"3":{"loc":{"start":{"line":8,"column":16},"end":{"line":15,"column":17}},"type":"if","locations":[{"start":{"line":8,"column":16},"end":{"line":15,"column":17}},{"start":{"line":8,"column":16},"end":{"line":15,"column":17}}],"line":8},"4":{"loc":{"start":{"line":12,"column":21},"end":{"line":15,"column":17}},"type":"if","locations":[{"start":{"line":12,"column":21},"end":{"line":15,"column":17}},{"start":{"line":12,"column":21},"end":{"line":15,"column":17}}],"line":12},"5":{"loc":{"start":{"line":17,"column":17},"end":{"line":20,"column":13}},"type":"if","locations":[{"start":{"line":17,"column":17},"end":{"line":20,"column":13}},{"start":{"line":17,"column":17},"end":{"line":20,"column":13}}],"line":17},"6":{"loc":{"start":{"line":23,"column":11},"end":{"line":23,"column":28}},"type":"binary-expr","locations":[{"start":{"line":23,"column":11},"end":{"line":23,"column":20}},{"start":{"line":23,"column":24},"end":{"line":23,"column":28}}],"line":23}},"s":{"0":1,"1":314,"2":158,"3":114571,"4":8,"5":3,"6":3,"7":5,"8":1,"9":1,"10":114563,"11":71,"12":71,"13":314,"14":1},"f":{"0":314},"b":{"0":[158,156],"1":[314,158],"2":[8,114563],"3":[3,5],"4":[1,4],"5":[71,114492],"6":[314,83]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"64dd704409a826511d4b887fc0ecb0f1d6dfd1bd","contentHash":"48a01acd76eb02c250e69d2e1af6d76e_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/Converter.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/Converter.ts","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"1":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"2":{"start":{"line":4,"column":65},"end":{"line":4,"column":81}},"3":{"start":{"line":5,"column":26},"end":{"line":5,"column":80}},"4":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"5":{"start":{"line":5,"column":68},"end":{"line":5,"column":80}},"6":{"start":{"line":6,"column":4},"end":{"line":10,"column":6}},"7":{"start":{"line":7,"column":8},"end":{"line":7,"column":28}},"8":{"start":{"line":8,"column":24},"end":{"line":8,"column":45}},"9":{"start":{"line":9,"column":8},"end":{"line":9,"column":93}},"10":{"start":{"line":12,"column":22},"end":{"line":14,"column":1}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":62}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":62}},"13":{"start":{"line":16,"column":15},"end":{"line":16,"column":32}},"14":{"start":{"line":17,"column":19},"end":{"line":17,"column":42}},"15":{"start":{"line":18,"column":21},"end":{"line":18,"column":46}},"16":{"start":{"line":19,"column":17},"end":{"line":19,"column":53}},"17":{"start":{"line":20,"column":20},"end":{"line":20,"column":44}},"18":{"start":{"line":21,"column":23},"end":{"line":21,"column":50}},"19":{"start":{"line":22,"column":15},"end":{"line":22,"column":34}},"20":{"start":{"line":23,"column":31},"end":{"line":190,"column":21}},"21":{"start":{"line":24,"column":4},"end":{"line":24,"column":33}},"22":{"start":{"line":26,"column":8},"end":{"line":26,"column":49}},"23":{"start":{"line":26,"column":34},"end":{"line":26,"column":47}},"24":{"start":{"line":27,"column":20},"end":{"line":27,"column":54}},"25":{"start":{"line":28,"column":8},"end":{"line":28,"column":32}},"26":{"start":{"line":29,"column":8},"end":{"line":29,"column":55}},"27":{"start":{"line":30,"column":8},"end":{"line":30,"column":63}},"28":{"start":{"line":31,"column":8},"end":{"line":31,"column":50}},"29":{"start":{"line":32,"column":8},"end":{"line":37,"column":9}},"30":{"start":{"line":33,"column":12},"end":{"line":33,"column":69}},"31":{"start":{"line":36,"column":12},"end":{"line":36,"column":73}},"32":{"start":{"line":38,"column":8},"end":{"line":44,"column":11}},"33":{"start":{"line":40,"column":12},"end":{"line":43,"column":18}},"34":{"start":{"line":41,"column":16},"end":{"line":41,"column":47}},"35":{"start":{"line":42,"column":16},"end":{"line":42,"column":40}},"36":{"start":{"line":45,"column":8},"end":{"line":47,"column":11}},"37":{"start":{"line":46,"column":12},"end":{"line":46,"column":38}},"38":{"start":{"line":48,"column":8},"end":{"line":48,"column":21}},"39":{"start":{"line":50,"column":4},"end":{"line":53,"column":6}},"40":{"start":{"line":51,"column":8},"end":{"line":51,"column":48}},"41":{"start":{"line":52,"column":8},"end":{"line":52,"column":20}},"42":{"start":{"line":54,"column":4},"end":{"line":57,"column":6}},"43":{"start":{"line":55,"column":8},"end":{"line":55,"column":50}},"44":{"start":{"line":56,"column":8},"end":{"line":56,"column":20}},"45":{"start":{"line":58,"column":4},"end":{"line":65,"column":6}},"46":{"start":{"line":59,"column":8},"end":{"line":63,"column":10}},"47":{"start":{"line":64,"column":8},"end":{"line":64,"column":20}},"48":{"start":{"line":66,"column":4},"end":{"line":85,"column":6}},"49":{"start":{"line":67,"column":20},"end":{"line":67,"column":24}},"50":{"start":{"line":68,"column":17},"end":{"line":68,"column":30}},"51":{"start":{"line":75,"column":8},"end":{"line":83,"column":11}},"52":{"start":{"line":76,"column":12},"end":{"line":82,"column":13}},"53":{"start":{"line":77,"column":25},"end":{"line":77,"column":63}},"54":{"start":{"line":78,"column":16},"end":{"line":78,"column":31}},"55":{"start":{"line":81,"column":16},"end":{"line":81,"column":128}},"56":{"start":{"line":84,"column":8},"end":{"line":84,"column":20}},"57":{"start":{"line":86,"column":4},"end":{"line":89,"column":6}},"58":{"start":{"line":87,"column":8},"end":{"line":87,"column":30}},"59":{"start":{"line":88,"column":8},"end":{"line":88,"column":20}},"60":{"start":{"line":90,"column":4},"end":{"line":105,"column":6}},"61":{"start":{"line":91,"column":18},"end":{"line":91,"column":38}},"62":{"start":{"line":92,"column":19},"end":{"line":92,"column":42}},"63":{"start":{"line":93,"column":18},"end":{"line":93,"column":19}},"64":{"start":{"line":94,"column":8},"end":{"line":103,"column":10}},"65":{"start":{"line":95,"column":12},"end":{"line":102,"column":13}},"66":{"start":{"line":96,"column":16},"end":{"line":96,"column":32}},"67":{"start":{"line":99,"column":26},"end":{"line":99,"column":53}},"68":{"start":{"line":100,"column":16},"end":{"line":100,"column":31}},"69":{"start":{"line":101,"column":16},"end":{"line":101,"column":28}},"70":{"start":{"line":104,"column":8},"end":{"line":104,"column":37}},"71":{"start":{"line":106,"column":4},"end":{"line":128,"column":6}},"72":{"start":{"line":107,"column":20},"end":{"line":107,"column":24}},"73":{"start":{"line":108,"column":8},"end":{"line":127,"column":11}},"74":{"start":{"line":109,"column":12},"end":{"line":126,"column":14}},"75":{"start":{"line":111,"column":20},"end":{"line":116,"column":21}},"76":{"start":{"line":112,"column":24},"end":{"line":112,"column":52}},"77":{"start":{"line":115,"column":24},"end":{"line":115,"column":39}},"78":{"start":{"line":119,"column":20},"end":{"line":124,"column":21}},"79":{"start":{"line":120,"column":24},"end":{"line":120,"column":49}},"80":{"start":{"line":123,"column":24},"end":{"line":123,"column":36}},"81":{"start":{"line":129,"column":4},"end":{"line":135,"column":7}},"82":{"start":{"line":131,"column":12},"end":{"line":131,"column":31}},"83":{"start":{"line":136,"column":4},"end":{"line":142,"column":7}},"84":{"start":{"line":138,"column":12},"end":{"line":138,"column":32}},"85":{"start":{"line":143,"column":4},"end":{"line":161,"column":6}},"86":{"start":{"line":144,"column":20},"end":{"line":144,"column":24}},"87":{"start":{"line":145,"column":8},"end":{"line":160,"column":11}},"88":{"start":{"line":147,"column":12},"end":{"line":150,"column":13}},"89":{"start":{"line":148,"column":16},"end":{"line":148,"column":45}},"90":{"start":{"line":149,"column":16},"end":{"line":149,"column":58}},"91":{"start":{"line":153,"column":12},"end":{"line":153,"column":34}},"92":{"start":{"line":154,"column":12},"end":{"line":154,"column":17}},"93":{"start":{"line":156,"column":12},"end":{"line":156,"column":42}},"94":{"start":{"line":157,"column":12},"end":{"line":157,"column":40}},"95":{"start":{"line":158,"column":12},"end":{"line":158,"column":39}},"96":{"start":{"line":159,"column":12},"end":{"line":159,"column":17}},"97":{"start":{"line":162,"column":4},"end":{"line":176,"column":6}},"98":{"start":{"line":163,"column":20},"end":{"line":163,"column":24}},"99":{"start":{"line":164,"column":8},"end":{"line":175,"column":11}},"100":{"start":{"line":166,"column":12},"end":{"line":168,"column":13}},"101":{"start":{"line":167,"column":16},"end":{"line":167,"column":56}},"102":{"start":{"line":171,"column":12},"end":{"line":171,"column":33}},"103":{"start":{"line":173,"column":12},"end":{"line":173,"column":37}},"104":{"start":{"line":174,"column":12},"end":{"line":174,"column":17}},"105":{"start":{"line":177,"column":4},"end":{"line":181,"column":6}},"106":{"start":{"line":178,"column":8},"end":{"line":178,"column":33}},"107":{"start":{"line":179,"column":8},"end":{"line":179,"column":26}},"108":{"start":{"line":180,"column":8},"end":{"line":180,"column":13}},"109":{"start":{"line":182,"column":4},"end":{"line":188,"column":7}},"110":{"start":{"line":184,"column":12},"end":{"line":184,"column":49}},"111":{"start":{"line":189,"column":4},"end":{"line":189,"column":21}},"112":{"start":{"line":191,"column":0},"end":{"line":191,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":45},"end":{"line":2,"column":46}},"loc":{"start":{"line":2,"column":57},"end":{"line":11,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":47},"end":{"line":4,"column":48}},"loc":{"start":{"line":4,"column":63},"end":{"line":4,"column":83}},"line":4},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":8},"end":{"line":5,"column":9}},"loc":{"start":{"line":5,"column":24},"end":{"line":5,"column":82}},"line":5},"3":{"name":"(anonymous_3)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":12}},"loc":{"start":{"line":6,"column":27},"end":{"line":10,"column":5}},"line":6},"4":{"name":"__","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":22},"end":{"line":8,"column":47}},"line":8},"5":{"name":"(anonymous_5)","decl":{"start":{"line":12,"column":56},"end":{"line":12,"column":57}},"loc":{"start":{"line":12,"column":71},"end":{"line":14,"column":1}},"line":12},"6":{"name":"(anonymous_6)","decl":{"start":{"line":23,"column":31},"end":{"line":23,"column":32}},"loc":{"start":{"line":23,"column":49},"end":{"line":190,"column":1}},"line":23},"7":{"name":"Converter","decl":{"start":{"line":25,"column":13},"end":{"line":25,"column":22}},"loc":{"start":{"line":25,"column":39},"end":{"line":49,"column":5}},"line":25},"8":{"name":"(anonymous_8)","decl":{"start":{"line":38,"column":28},"end":{"line":38,"column":29}},"loc":{"start":{"line":38,"column":43},"end":{"line":44,"column":9}},"line":38},"9":{"name":"(anonymous_9)","decl":{"start":{"line":40,"column":23},"end":{"line":40,"column":24}},"loc":{"start":{"line":40,"column":35},"end":{"line":43,"column":13}},"line":40},"10":{"name":"(anonymous_10)","decl":{"start":{"line":45,"column":27},"end":{"line":45,"column":28}},"loc":{"start":{"line":45,"column":39},"end":{"line":47,"column":9}},"line":45},"11":{"name":"(anonymous_11)","decl":{"start":{"line":50,"column":37},"end":{"line":50,"column":38}},"loc":{"start":{"line":50,"column":58},"end":{"line":53,"column":5}},"line":50},"12":{"name":"(anonymous_12)","decl":{"start":{"line":54,"column":38},"end":{"line":54,"column":39}},"loc":{"start":{"line":54,"column":60},"end":{"line":57,"column":5}},"line":54},"13":{"name":"(anonymous_13)","decl":{"start":{"line":58,"column":36},"end":{"line":58,"column":37}},"loc":{"start":{"line":58,"column":76},"end":{"line":65,"column":5}},"line":58},"14":{"name":"(anonymous_14)","decl":{"start":{"line":66,"column":35},"end":{"line":66,"column":36}},"loc":{"start":{"line":66,"column":64},"end":{"line":85,"column":5}},"line":66},"15":{"name":"(anonymous_15)","decl":{"start":{"line":75,"column":28},"end":{"line":75,"column":29}},"loc":{"start":{"line":75,"column":45},"end":{"line":83,"column":9}},"line":75},"16":{"name":"(anonymous_16)","decl":{"start":{"line":86,"column":37},"end":{"line":86,"column":38}},"loc":{"start":{"line":86,"column":59},"end":{"line":89,"column":5}},"line":86},"17":{"name":"(anonymous_17)","decl":{"start":{"line":90,"column":37},"end":{"line":90,"column":38}},"loc":{"start":{"line":90,"column":58},"end":{"line":105,"column":5}},"line":90},"18":{"name":"(anonymous_18)","decl":{"start":{"line":94,"column":21},"end":{"line":94,"column":22}},"loc":{"start":{"line":94,"column":37},"end":{"line":103,"column":9}},"line":94},"19":{"name":"(anonymous_19)","decl":{"start":{"line":106,"column":31},"end":{"line":106,"column":32}},"loc":{"start":{"line":106,"column":66},"end":{"line":128,"column":5}},"line":106},"20":{"name":"(anonymous_20)","decl":{"start":{"line":108,"column":38},"end":{"line":108,"column":39}},"loc":{"start":{"line":108,"column":65},"end":{"line":127,"column":9}},"line":108},"21":{"name":"(anonymous_21)","decl":{"start":{"line":110,"column":29},"end":{"line":110,"column":30}},"loc":{"start":{"line":110,"column":46},"end":{"line":117,"column":17}},"line":110},"22":{"name":"(anonymous_22)","decl":{"start":{"line":118,"column":28},"end":{"line":118,"column":29}},"loc":{"start":{"line":118,"column":43},"end":{"line":125,"column":17}},"line":118},"23":{"name":"(anonymous_23)","decl":{"start":{"line":130,"column":13},"end":{"line":130,"column":14}},"loc":{"start":{"line":130,"column":25},"end":{"line":132,"column":9}},"line":130},"24":{"name":"(anonymous_24)","decl":{"start":{"line":137,"column":13},"end":{"line":137,"column":14}},"loc":{"start":{"line":137,"column":25},"end":{"line":139,"column":9}},"line":137},"25":{"name":"(anonymous_25)","decl":{"start":{"line":143,"column":37},"end":{"line":143,"column":38}},"loc":{"start":{"line":143,"column":68},"end":{"line":161,"column":5}},"line":143},"26":{"name":"(anonymous_26)","decl":{"start":{"line":146,"column":18},"end":{"line":146,"column":19}},"loc":{"start":{"line":146,"column":36},"end":{"line":151,"column":9}},"line":146},"27":{"name":"(anonymous_27)","decl":{"start":{"line":152,"column":18},"end":{"line":152,"column":19}},"loc":{"start":{"line":152,"column":30},"end":{"line":155,"column":9}},"line":152},"28":{"name":"(anonymous_28)","decl":{"start":{"line":155,"column":11},"end":{"line":155,"column":12}},"loc":{"start":{"line":155,"column":28},"end":{"line":160,"column":9}},"line":155},"29":{"name":"(anonymous_29)","decl":{"start":{"line":162,"column":33},"end":{"line":162,"column":34}},"loc":{"start":{"line":162,"column":47},"end":{"line":176,"column":5}},"line":162},"30":{"name":"(anonymous_30)","decl":{"start":{"line":165,"column":18},"end":{"line":165,"column":19}},"loc":{"start":{"line":165,"column":34},"end":{"line":169,"column":9}},"line":165},"31":{"name":"(anonymous_31)","decl":{"start":{"line":170,"column":18},"end":{"line":170,"column":19}},"loc":{"start":{"line":170,"column":30},"end":{"line":172,"column":9}},"line":170},"32":{"name":"(anonymous_32)","decl":{"start":{"line":172,"column":11},"end":{"line":172,"column":12}},"loc":{"start":{"line":172,"column":26},"end":{"line":175,"column":9}},"line":172},"33":{"name":"(anonymous_33)","decl":{"start":{"line":177,"column":37},"end":{"line":177,"column":38}},"loc":{"start":{"line":177,"column":51},"end":{"line":181,"column":5}},"line":177},"34":{"name":"(anonymous_34)","decl":{"start":{"line":183,"column":13},"end":{"line":183,"column":14}},"loc":{"start":{"line":183,"column":25},"end":{"line":185,"column":9}},"line":183}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":21}},{"start":{"line":2,"column":25},"end":{"line":2,"column":39}},{"start":{"line":2,"column":44},"end":{"line":11,"column":4}}],"line":2},"1":{"loc":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"type":"binary-expr","locations":[{"start":{"line":3,"column":24},"end":{"line":3,"column":45}},{"start":{"line":4,"column":9},"end":{"line":4,"column":43}},{"start":{"line":4,"column":47},"end":{"line":4,"column":83}},{"start":{"line":5,"column":8},"end":{"line":5,"column":82}}],"line":3},"2":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"type":"if","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},{"start":{"line":5,"column":43},"end":{"line":5,"column":80}}],"line":5},"3":{"loc":{"start":{"line":9,"column":22},"end":{"line":9,"column":92}},"type":"cond-expr","locations":[{"start":{"line":9,"column":35},"end":{"line":9,"column":51}},{"start":{"line":9,"column":55},"end":{"line":9,"column":91}}],"line":9},"4":{"loc":{"start":{"line":12,"column":22},"end":{"line":14,"column":1}},"type":"binary-expr","locations":[{"start":{"line":12,"column":23},"end":{"line":12,"column":27}},{"start":{"line":12,"column":31},"end":{"line":12,"column":51}},{"start":{"line":12,"column":56},"end":{"line":14,"column":1}}],"line":12},"5":{"loc":{"start":{"line":13,"column":11},"end":{"line":13,"column":61}},"type":"cond-expr","locations":[{"start":{"line":13,"column":37},"end":{"line":13,"column":40}},{"start":{"line":13,"column":43},"end":{"line":13,"column":61}}],"line":13},"6":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":15}},{"start":{"line":13,"column":19},"end":{"line":13,"column":33}}],"line":13},"7":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":49}},"type":"if","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":49}},{"start":{"line":26,"column":8},"end":{"line":26,"column":49}}],"line":26},"8":{"loc":{"start":{"line":27,"column":20},"end":{"line":27,"column":54}},"type":"binary-expr","locations":[{"start":{"line":27,"column":20},"end":{"line":27,"column":46}},{"start":{"line":27,"column":50},"end":{"line":27,"column":54}}],"line":27},"9":{"loc":{"start":{"line":32,"column":8},"end":{"line":37,"column":9}},"type":"if","locations":[{"start":{"line":32,"column":8},"end":{"line":37,"column":9}},{"start":{"line":32,"column":8},"end":{"line":37,"column":9}}],"line":32},"10":{"loc":{"start":{"line":76,"column":12},"end":{"line":82,"column":13}},"type":"if","locations":[{"start":{"line":76,"column":12},"end":{"line":82,"column":13}},{"start":{"line":76,"column":12},"end":{"line":82,"column":13}}],"line":76},"11":{"loc":{"start":{"line":95,"column":12},"end":{"line":102,"column":13}},"type":"if","locations":[{"start":{"line":95,"column":12},"end":{"line":102,"column":13}},{"start":{"line":95,"column":12},"end":{"line":102,"column":13}}],"line":95},"12":{"loc":{"start":{"line":111,"column":20},"end":{"line":116,"column":21}},"type":"if","locations":[{"start":{"line":111,"column":20},"end":{"line":116,"column":21}},{"start":{"line":111,"column":20},"end":{"line":116,"column":21}}],"line":111},"13":{"loc":{"start":{"line":119,"column":20},"end":{"line":124,"column":21}},"type":"if","locations":[{"start":{"line":119,"column":20},"end":{"line":124,"column":21}},{"start":{"line":119,"column":20},"end":{"line":124,"column":21}}],"line":119},"14":{"loc":{"start":{"line":147,"column":12},"end":{"line":150,"column":13}},"type":"if","locations":[{"start":{"line":147,"column":12},"end":{"line":150,"column":13}},{"start":{"line":147,"column":12},"end":{"line":150,"column":13}}],"line":147},"15":{"loc":{"start":{"line":166,"column":12},"end":{"line":168,"column":13}},"type":"if","locations":[{"start":{"line":166,"column":12},"end":{"line":168,"column":13}},{"start":{"line":166,"column":12},"end":{"line":168,"column":13}}],"line":166}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":120,"23":116,"24":120,"25":120,"26":120,"27":120,"28":120,"29":120,"30":37,"31":83,"32":120,"33":9,"34":9,"35":9,"36":120,"37":113,"38":120,"39":1,"40":3,"41":3,"42":1,"43":2,"44":2,"45":1,"46":34,"47":34,"48":1,"49":8,"50":8,"51":8,"52":8,"53":7,"54":7,"55":1,"56":8,"57":1,"58":46,"59":46,"60":1,"61":30,"62":30,"63":30,"64":30,"65":65,"66":30,"67":35,"68":35,"69":35,"70":30,"71":1,"72":86,"73":86,"74":86,"75":79,"76":78,"77":1,"78":5,"79":4,"80":1,"81":1,"82":166228,"83":1,"84":442655,"85":1,"86":217,"87":217,"88":215,"89":81,"90":81,"91":215,"92":215,"93":2,"94":2,"95":2,"96":2,"97":1,"98":110,"99":110,"100":104,"101":66,"102":104,"103":5,"104":5,"105":1,"106":104,"107":104,"108":104,"109":1,"110":1,"111":1,"112":1},"f":{"0":1,"1":0,"2":0,"3":1,"4":1,"5":1,"6":1,"7":120,"8":9,"9":9,"10":113,"11":3,"12":2,"13":34,"14":8,"15":8,"16":46,"17":30,"18":65,"19":86,"20":86,"21":79,"22":5,"23":166228,"24":442655,"25":217,"26":215,"27":215,"28":2,"29":110,"30":104,"31":104,"32":5,"33":104,"34":1},"b":{"0":[1,1,1],"1":[1,0,0,0],"2":[0,0],"3":[0,1],"4":[1,1,1],"5":[0,1],"6":[1,1],"7":[116,4],"8":[120,120],"9":[37,83],"10":[7,1],"11":[30,35],"12":[78,1],"13":[4,1],"14":[81,134],"15":[66,38]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"d4e26f706e7d084ee09223d5044cdc2cb0321038","contentHash":"244015e920c1a2dd2e79dee0eb1aa367_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/Parameters.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/Parameters.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":4,"column":23},"end":{"line":23,"column":5}},"2":{"start":{"line":24,"column":4},"end":{"line":26,"column":5}},"3":{"start":{"line":25,"column":8},"end":{"line":25,"column":20}},"4":{"start":{"line":27,"column":4},"end":{"line":36,"column":5}},"5":{"start":{"line":28,"column":8},"end":{"line":35,"column":9}},"6":{"start":{"line":29,"column":12},"end":{"line":34,"column":13}},"7":{"start":{"line":30,"column":16},"end":{"line":30,"column":59}},"8":{"start":{"line":33,"column":16},"end":{"line":33,"column":48}},"9":{"start":{"line":37,"column":4},"end":{"line":37,"column":24}},"10":{"start":{"line":39,"column":0},"end":{"line":39,"column":34}}},"fnMap":{"0":{"name":"mergeParams","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":29},"end":{"line":38,"column":1}},"line":3}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":4},"end":{"line":26,"column":5}},"type":"if","locations":[{"start":{"line":24,"column":4},"end":{"line":26,"column":5}},{"start":{"line":24,"column":4},"end":{"line":26,"column":5}}],"line":24},"1":{"loc":{"start":{"line":28,"column":8},"end":{"line":35,"column":9}},"type":"if","locations":[{"start":{"line":28,"column":8},"end":{"line":35,"column":9}},{"start":{"line":28,"column":8},"end":{"line":35,"column":9}}],"line":28},"2":{"loc":{"start":{"line":29,"column":12},"end":{"line":34,"column":13}},"type":"if","locations":[{"start":{"line":29,"column":12},"end":{"line":34,"column":13}},{"start":{"line":29,"column":12},"end":{"line":34,"column":13}}],"line":29}},"s":{"0":1,"1":157,"2":157,"3":30,"4":157,"5":791,"6":791,"7":14,"8":777,"9":157,"10":1},"f":{"0":157},"b":{"0":[30,127],"1":[791,0],"2":[14,777]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"9b421e973580e43cd2e1924e824c22ad111dd0b3","contentHash":"b5a8b5f857e5c89a5823cff27f0d3fa6_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/ParseRuntime.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/ParseRuntime.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":4,"column":17},"end":{"line":4,"column":37}},"2":{"start":{"line":5,"column":14},"end":{"line":22,"column":5}},"3":{"start":{"line":23,"column":4},"end":{"line":25,"column":5}},"4":{"start":{"line":24,"column":8},"end":{"line":24,"column":43}},"5":{"start":{"line":26,"column":4},"end":{"line":28,"column":5}},"6":{"start":{"line":27,"column":8},"end":{"line":27,"column":44}},"7":{"start":{"line":29,"column":4},"end":{"line":29,"column":15}},"8":{"start":{"line":31,"column":0},"end":{"line":31,"column":44}}},"fnMap":{"0":{"name":"initParseRuntime","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":25}},"loc":{"start":{"line":3,"column":37},"end":{"line":30,"column":1}},"line":3}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":4},"end":{"line":25,"column":5}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":25,"column":5}},{"start":{"line":23,"column":4},"end":{"line":25,"column":5}}],"line":23},"1":{"loc":{"start":{"line":26,"column":4},"end":{"line":28,"column":5}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":28,"column":5}},{"start":{"line":26,"column":4},"end":{"line":28,"column":5}}],"line":26}},"s":{"0":1,"1":120,"2":120,"3":120,"4":3,"5":120,"6":7,"7":120,"8":1},"f":{"0":120},"b":{"0":[3,117],"1":[7,113]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"fbfac2d35f03bb15cb25aa5533a3f1596a08ccea","contentHash":"fe2bb2edf007944d040fb584d28e84a3_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/ProcessFork.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/ProcessFork.ts","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"1":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"2":{"start":{"line":4,"column":65},"end":{"line":4,"column":81}},"3":{"start":{"line":5,"column":26},"end":{"line":5,"column":80}},"4":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"5":{"start":{"line":5,"column":68},"end":{"line":5,"column":80}},"6":{"start":{"line":6,"column":4},"end":{"line":10,"column":6}},"7":{"start":{"line":7,"column":8},"end":{"line":7,"column":28}},"8":{"start":{"line":8,"column":24},"end":{"line":8,"column":45}},"9":{"start":{"line":9,"column":8},"end":{"line":9,"column":93}},"10":{"start":{"line":12,"column":22},"end":{"line":14,"column":1}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":62}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":62}},"13":{"start":{"line":16,"column":18},"end":{"line":16,"column":40}},"14":{"start":{"line":17,"column":17},"end":{"line":17,"column":53}},"15":{"start":{"line":18,"column":19},"end":{"line":18,"column":42}},"16":{"start":{"line":19,"column":17},"end":{"line":19,"column":55}},"17":{"start":{"line":20,"column":35},"end":{"line":141,"column":24}},"18":{"start":{"line":21,"column":4},"end":{"line":21,"column":37}},"19":{"start":{"line":23,"column":20},"end":{"line":23,"column":56}},"20":{"start":{"line":24,"column":8},"end":{"line":24,"column":36}},"21":{"start":{"line":25,"column":8},"end":{"line":25,"column":29}},"22":{"start":{"line":26,"column":8},"end":{"line":26,"column":29}},"23":{"start":{"line":27,"column":8},"end":{"line":27,"column":29}},"24":{"start":{"line":28,"column":8},"end":{"line":28,"column":33}},"25":{"start":{"line":29,"column":8},"end":{"line":31,"column":11}},"26":{"start":{"line":32,"column":8},"end":{"line":32,"column":27}},"27":{"start":{"line":33,"column":8},"end":{"line":33,"column":21}},"28":{"start":{"line":35,"column":4},"end":{"line":43,"column":6}},"29":{"start":{"line":36,"column":20},"end":{"line":36,"column":24}},"30":{"start":{"line":37,"column":8},"end":{"line":42,"column":11}},"31":{"start":{"line":39,"column":12},"end":{"line":39,"column":36}},"32":{"start":{"line":40,"column":12},"end":{"line":40,"column":33}},"33":{"start":{"line":41,"column":12},"end":{"line":41,"column":43}},"34":{"start":{"line":44,"column":4},"end":{"line":47,"column":6}},"35":{"start":{"line":45,"column":8},"end":{"line":45,"column":33}},"36":{"start":{"line":46,"column":8},"end":{"line":46,"column":44}},"37":{"start":{"line":48,"column":4},"end":{"line":63,"column":6}},"38":{"start":{"line":49,"column":20},"end":{"line":49,"column":51}},"39":{"start":{"line":50,"column":8},"end":{"line":55,"column":9}},"40":{"start":{"line":51,"column":12},"end":{"line":54,"column":14}},"41":{"start":{"line":56,"column":8},"end":{"line":61,"column":9}},"42":{"start":{"line":57,"column":12},"end":{"line":60,"column":14}},"43":{"start":{"line":62,"column":8},"end":{"line":62,"column":21}},"44":{"start":{"line":64,"column":4},"end":{"line":97,"column":6}},"45":{"start":{"line":65,"column":20},"end":{"line":65,"column":24}},"46":{"start":{"line":66,"column":8},"end":{"line":69,"column":11}},"47":{"start":{"line":70,"column":8},"end":{"line":87,"column":11}},"48":{"start":{"line":71,"column":12},"end":{"line":86,"column":13}},"49":{"start":{"line":72,"column":16},"end":{"line":72,"column":36}},"50":{"start":{"line":74,"column":17},"end":{"line":86,"column":13}},"51":{"start":{"line":75,"column":16},"end":{"line":77,"column":17}},"52":{"start":{"line":76,"column":20},"end":{"line":76,"column":59}},"53":{"start":{"line":79,"column":17},"end":{"line":86,"column":13}},"54":{"start":{"line":80,"column":16},"end":{"line":82,"column":17}},"55":{"start":{"line":81,"column":20},"end":{"line":81,"column":62}},"56":{"start":{"line":84,"column":17},"end":{"line":86,"column":13}},"57":{"start":{"line":85,"column":16},"end":{"line":85,"column":36}},"58":{"start":{"line":88,"column":8},"end":{"line":92,"column":11}},"59":{"start":{"line":90,"column":22},"end":{"line":90,"column":37}},"60":{"start":{"line":91,"column":12},"end":{"line":91,"column":33}},"61":{"start":{"line":93,"column":8},"end":{"line":96,"column":11}},"62":{"start":{"line":95,"column":12},"end":{"line":95,"column":100}},"63":{"start":{"line":98,"column":4},"end":{"line":104,"column":6}},"64":{"start":{"line":100,"column":8},"end":{"line":102,"column":9}},"65":{"start":{"line":101,"column":12},"end":{"line":101,"column":38}},"66":{"start":{"line":103,"column":8},"end":{"line":103,"column":28}},"67":{"start":{"line":105,"column":4},"end":{"line":127,"column":6}},"68":{"start":{"line":106,"column":18},"end":{"line":106,"column":39}},"69":{"start":{"line":107,"column":19},"end":{"line":107,"column":34}},"70":{"start":{"line":108,"column":22},"end":{"line":108,"column":23}},"71":{"start":{"line":109,"column":22},"end":{"line":109,"column":43}},"72":{"start":{"line":110,"column":8},"end":{"line":115,"column":9}},"73":{"start":{"line":111,"column":12},"end":{"line":111,"column":46}},"74":{"start":{"line":114,"column":12},"end":{"line":114,"column":32}},"75":{"start":{"line":116,"column":8},"end":{"line":126,"column":9}},"76":{"start":{"line":117,"column":23},"end":{"line":117,"column":41}},"77":{"start":{"line":118,"column":12},"end":{"line":120,"column":13}},"78":{"start":{"line":119,"column":16},"end":{"line":119,"column":25}},"79":{"start":{"line":121,"column":12},"end":{"line":123,"column":13}},"80":{"start":{"line":122,"column":16},"end":{"line":122,"column":40}},"81":{"start":{"line":124,"column":12},"end":{"line":124,"column":38}},"82":{"start":{"line":125,"column":12},"end":{"line":125,"column":22}},"83":{"start":{"line":128,"column":4},"end":{"line":139,"column":6}},"84":{"start":{"line":129,"column":20},"end":{"line":129,"column":24}},"85":{"start":{"line":130,"column":8},"end":{"line":138,"column":11}},"86":{"start":{"line":132,"column":12},"end":{"line":132,"column":33}},"87":{"start":{"line":134,"column":12},"end":{"line":137,"column":15}},"88":{"start":{"line":136,"column":16},"end":{"line":136,"column":36}},"89":{"start":{"line":140,"column":4},"end":{"line":140,"column":25}},"90":{"start":{"line":142,"column":0},"end":{"line":142,"column":38}},"91":{"start":{"line":143,"column":0},"end":{"line":143,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":45},"end":{"line":2,"column":46}},"loc":{"start":{"line":2,"column":57},"end":{"line":11,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":47},"end":{"line":4,"column":48}},"loc":{"start":{"line":4,"column":63},"end":{"line":4,"column":83}},"line":4},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":8},"end":{"line":5,"column":9}},"loc":{"start":{"line":5,"column":24},"end":{"line":5,"column":82}},"line":5},"3":{"name":"(anonymous_3)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":12}},"loc":{"start":{"line":6,"column":27},"end":{"line":10,"column":5}},"line":6},"4":{"name":"__","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":22},"end":{"line":8,"column":47}},"line":8},"5":{"name":"(anonymous_5)","decl":{"start":{"line":12,"column":56},"end":{"line":12,"column":57}},"loc":{"start":{"line":12,"column":71},"end":{"line":14,"column":1}},"line":12},"6":{"name":"(anonymous_6)","decl":{"start":{"line":20,"column":35},"end":{"line":20,"column":36}},"loc":{"start":{"line":20,"column":53},"end":{"line":141,"column":1}},"line":20},"7":{"name":"ProcessorFork","decl":{"start":{"line":22,"column":13},"end":{"line":22,"column":26}},"loc":{"start":{"line":22,"column":38},"end":{"line":34,"column":5}},"line":22},"8":{"name":"(anonymous_8)","decl":{"start":{"line":35,"column":36},"end":{"line":35,"column":37}},"loc":{"start":{"line":35,"column":48},"end":{"line":43,"column":5}},"line":35},"9":{"name":"(anonymous_9)","decl":{"start":{"line":37,"column":38},"end":{"line":37,"column":39}},"loc":{"start":{"line":37,"column":65},"end":{"line":42,"column":9}},"line":37},"10":{"name":"(anonymous_10)","decl":{"start":{"line":44,"column":38},"end":{"line":44,"column":39}},"loc":{"start":{"line":44,"column":50},"end":{"line":47,"column":5}},"line":44},"11":{"name":"(anonymous_11)","decl":{"start":{"line":48,"column":43},"end":{"line":48,"column":44}},"loc":{"start":{"line":48,"column":60},"end":{"line":63,"column":5}},"line":48},"12":{"name":"(anonymous_12)","decl":{"start":{"line":64,"column":41},"end":{"line":64,"column":42}},"loc":{"start":{"line":64,"column":53},"end":{"line":97,"column":5}},"line":64},"13":{"name":"(anonymous_13)","decl":{"start":{"line":70,"column":40},"end":{"line":70,"column":41}},"loc":{"start":{"line":70,"column":55},"end":{"line":87,"column":9}},"line":70},"14":{"name":"(anonymous_14)","decl":{"start":{"line":88,"column":44},"end":{"line":88,"column":45}},"loc":{"start":{"line":88,"column":60},"end":{"line":92,"column":9}},"line":88},"15":{"name":"(anonymous_15)","decl":{"start":{"line":93,"column":44},"end":{"line":93,"column":45}},"loc":{"start":{"line":93,"column":60},"end":{"line":96,"column":9}},"line":93},"16":{"name":"(anonymous_16)","decl":{"start":{"line":98,"column":42},"end":{"line":98,"column":43}},"loc":{"start":{"line":98,"column":54},"end":{"line":104,"column":5}},"line":98},"17":{"name":"(anonymous_17)","decl":{"start":{"line":105,"column":40},"end":{"line":105,"column":41}},"loc":{"start":{"line":105,"column":56},"end":{"line":127,"column":5}},"line":105},"18":{"name":"(anonymous_18)","decl":{"start":{"line":128,"column":38},"end":{"line":128,"column":39}},"loc":{"start":{"line":128,"column":55},"end":{"line":139,"column":5}},"line":128},"19":{"name":"(anonymous_19)","decl":{"start":{"line":130,"column":38},"end":{"line":130,"column":39}},"loc":{"start":{"line":130,"column":65},"end":{"line":138,"column":9}},"line":130},"20":{"name":"(anonymous_20)","decl":{"start":{"line":134,"column":50},"end":{"line":134,"column":51}},"loc":{"start":{"line":134,"column":62},"end":{"line":137,"column":13}},"line":134}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":21}},{"start":{"line":2,"column":25},"end":{"line":2,"column":39}},{"start":{"line":2,"column":44},"end":{"line":11,"column":4}}],"line":2},"1":{"loc":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"type":"binary-expr","locations":[{"start":{"line":3,"column":24},"end":{"line":3,"column":45}},{"start":{"line":4,"column":9},"end":{"line":4,"column":43}},{"start":{"line":4,"column":47},"end":{"line":4,"column":83}},{"start":{"line":5,"column":8},"end":{"line":5,"column":82}}],"line":3},"2":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"type":"if","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},{"start":{"line":5,"column":43},"end":{"line":5,"column":80}}],"line":5},"3":{"loc":{"start":{"line":9,"column":22},"end":{"line":9,"column":92}},"type":"cond-expr","locations":[{"start":{"line":9,"column":35},"end":{"line":9,"column":51}},{"start":{"line":9,"column":55},"end":{"line":9,"column":91}}],"line":9},"4":{"loc":{"start":{"line":12,"column":22},"end":{"line":14,"column":1}},"type":"binary-expr","locations":[{"start":{"line":12,"column":23},"end":{"line":12,"column":27}},{"start":{"line":12,"column":31},"end":{"line":12,"column":51}},{"start":{"line":12,"column":56},"end":{"line":14,"column":1}}],"line":12},"5":{"loc":{"start":{"line":13,"column":11},"end":{"line":13,"column":61}},"type":"cond-expr","locations":[{"start":{"line":13,"column":37},"end":{"line":13,"column":40}},{"start":{"line":13,"column":43},"end":{"line":13,"column":61}}],"line":13},"6":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":15}},{"start":{"line":13,"column":19},"end":{"line":13,"column":33}}],"line":13},"7":{"loc":{"start":{"line":23,"column":20},"end":{"line":23,"column":56}},"type":"binary-expr","locations":[{"start":{"line":23,"column":20},"end":{"line":23,"column":48}},{"start":{"line":23,"column":52},"end":{"line":23,"column":56}}],"line":23},"8":{"loc":{"start":{"line":50,"column":8},"end":{"line":55,"column":9}},"type":"if","locations":[{"start":{"line":50,"column":8},"end":{"line":55,"column":9}},{"start":{"line":50,"column":8},"end":{"line":55,"column":9}}],"line":50},"9":{"loc":{"start":{"line":56,"column":8},"end":{"line":61,"column":9}},"type":"if","locations":[{"start":{"line":56,"column":8},"end":{"line":61,"column":9}},{"start":{"line":56,"column":8},"end":{"line":61,"column":9}}],"line":56},"10":{"loc":{"start":{"line":71,"column":12},"end":{"line":86,"column":13}},"type":"if","locations":[{"start":{"line":71,"column":12},"end":{"line":86,"column":13}},{"start":{"line":71,"column":12},"end":{"line":86,"column":13}}],"line":71},"11":{"loc":{"start":{"line":74,"column":17},"end":{"line":86,"column":13}},"type":"if","locations":[{"start":{"line":74,"column":17},"end":{"line":86,"column":13}},{"start":{"line":74,"column":17},"end":{"line":86,"column":13}}],"line":74},"12":{"loc":{"start":{"line":75,"column":16},"end":{"line":77,"column":17}},"type":"if","locations":[{"start":{"line":75,"column":16},"end":{"line":77,"column":17}},{"start":{"line":75,"column":16},"end":{"line":77,"column":17}}],"line":75},"13":{"loc":{"start":{"line":79,"column":17},"end":{"line":86,"column":13}},"type":"if","locations":[{"start":{"line":79,"column":17},"end":{"line":86,"column":13}},{"start":{"line":79,"column":17},"end":{"line":86,"column":13}}],"line":79},"14":{"loc":{"start":{"line":80,"column":16},"end":{"line":82,"column":17}},"type":"if","locations":[{"start":{"line":80,"column":16},"end":{"line":82,"column":17}},{"start":{"line":80,"column":16},"end":{"line":82,"column":17}}],"line":80},"15":{"loc":{"start":{"line":84,"column":17},"end":{"line":86,"column":13}},"type":"if","locations":[{"start":{"line":84,"column":17},"end":{"line":86,"column":13}},{"start":{"line":84,"column":17},"end":{"line":86,"column":13}}],"line":84},"16":{"loc":{"start":{"line":100,"column":8},"end":{"line":102,"column":9}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":102,"column":9}},{"start":{"line":100,"column":8},"end":{"line":102,"column":9}}],"line":100},"17":{"loc":{"start":{"line":110,"column":8},"end":{"line":115,"column":9}},"type":"if","locations":[{"start":{"line":110,"column":8},"end":{"line":115,"column":9}},{"start":{"line":110,"column":8},"end":{"line":115,"column":9}}],"line":110},"18":{"loc":{"start":{"line":111,"column":29},"end":{"line":111,"column":45}},"type":"binary-expr","locations":[{"start":{"line":111,"column":29},"end":{"line":111,"column":39}},{"start":{"line":111,"column":43},"end":{"line":111,"column":45}}],"line":111},"19":{"loc":{"start":{"line":117,"column":23},"end":{"line":117,"column":41}},"type":"binary-expr","locations":[{"start":{"line":117,"column":23},"end":{"line":117,"column":35}},{"start":{"line":117,"column":39},"end":{"line":117,"column":41}}],"line":117},"20":{"loc":{"start":{"line":118,"column":12},"end":{"line":120,"column":13}},"type":"if","locations":[{"start":{"line":118,"column":12},"end":{"line":120,"column":13}},{"start":{"line":118,"column":12},"end":{"line":120,"column":13}}],"line":118},"21":{"loc":{"start":{"line":121,"column":12},"end":{"line":123,"column":13}},"type":"if","locations":[{"start":{"line":121,"column":12},"end":{"line":123,"column":13}},{"start":{"line":121,"column":12},"end":{"line":123,"column":13}}],"line":121}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":1,"7":1,"8":1,"9":1,"10":1,"11":2,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":37,"20":37,"21":37,"22":37,"23":37,"24":37,"25":37,"26":37,"27":37,"28":1,"29":37,"30":37,"31":37,"32":37,"33":37,"34":1,"35":37,"36":37,"37":1,"38":37,"39":37,"40":1,"41":37,"42":3,"43":37,"44":1,"45":37,"46":37,"47":37,"48":145,"49":37,"50":108,"51":36,"52":2,"53":72,"54":36,"55":4,"56":36,"57":36,"58":37,"59":2886,"60":2886,"61":37,"62":1,"63":1,"64":121,"65":121,"66":121,"67":1,"68":2886,"69":2886,"70":2886,"71":2886,"72":2886,"73":3,"74":2883,"75":2886,"76":13554,"77":13554,"78":2883,"79":10671,"80":10671,"81":10671,"82":10671,"83":1,"84":85,"85":85,"86":85,"87":85,"88":85,"89":1,"90":1,"91":1},"f":{"0":1,"1":0,"2":0,"3":1,"4":1,"5":2,"6":1,"7":37,"8":37,"9":37,"10":37,"11":37,"12":37,"13":145,"14":2886,"15":1,"16":121,"17":2886,"18":85,"19":85,"20":85},"b":{"0":[1,1,1],"1":[1,0,0,0],"2":[0,0],"3":[0,1],"4":[1,1,1],"5":[1,1],"6":[2,2],"7":[37,37],"8":[1,36],"9":[3,34],"10":[37,108],"11":[36,72],"12":[2,34],"13":[36,36],"14":[4,32],"15":[36,0],"16":[121,0],"17":[3,2883],"18":[3,0],"19":[13554,2883],"20":[2883,10671],"21":[10671,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"eca31a7f39047392da82b6a0bea47a5523425e77","contentHash":"d334fec5a41b720c26a601da212a0ae7_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/Processor.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/Processor.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":31},"end":{"line":10,"column":3}},"2":{"start":{"line":5,"column":8},"end":{"line":5,"column":35}},"3":{"start":{"line":6,"column":8},"end":{"line":6,"column":43}},"4":{"start":{"line":7,"column":8},"end":{"line":7,"column":46}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":21}},"6":{"start":{"line":11,"column":0},"end":{"line":11,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":31},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":43},"end":{"line":10,"column":1}},"line":3},"1":{"name":"Processor","decl":{"start":{"line":4,"column":13},"end":{"line":4,"column":22}},"loc":{"start":{"line":4,"column":34},"end":{"line":8,"column":5}},"line":4}},"branchMap":{},"s":{"0":1,"1":1,"2":123,"3":123,"4":123,"5":1,"6":1},"f":{"0":1,"1":123},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"0099918b94b284b131c37ff00af9c98bbfc41856","contentHash":"62fdab4fce9e0cd2383b86b3fb486c1c_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/CSVError.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/CSVError.ts","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"1":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"2":{"start":{"line":4,"column":65},"end":{"line":4,"column":81}},"3":{"start":{"line":5,"column":26},"end":{"line":5,"column":80}},"4":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"5":{"start":{"line":5,"column":68},"end":{"line":5,"column":80}},"6":{"start":{"line":6,"column":4},"end":{"line":10,"column":6}},"7":{"start":{"line":7,"column":8},"end":{"line":7,"column":28}},"8":{"start":{"line":8,"column":24},"end":{"line":8,"column":45}},"9":{"start":{"line":9,"column":8},"end":{"line":9,"column":93}},"10":{"start":{"line":12,"column":0},"end":{"line":12,"column":62}},"11":{"start":{"line":13,"column":11},"end":{"line":13,"column":26}},"12":{"start":{"line":14,"column":30},"end":{"line":41,"column":8}},"13":{"start":{"line":15,"column":4},"end":{"line":15,"column":32}},"14":{"start":{"line":17,"column":20},"end":{"line":17,"column":129}},"15":{"start":{"line":18,"column":8},"end":{"line":18,"column":24}},"16":{"start":{"line":19,"column":8},"end":{"line":19,"column":26}},"17":{"start":{"line":20,"column":8},"end":{"line":20,"column":28}},"18":{"start":{"line":21,"column":8},"end":{"line":21,"column":39}},"19":{"start":{"line":22,"column":8},"end":{"line":22,"column":21}},"20":{"start":{"line":24,"column":4},"end":{"line":26,"column":6}},"21":{"start":{"line":25,"column":8},"end":{"line":25,"column":63}},"22":{"start":{"line":27,"column":4},"end":{"line":29,"column":6}},"23":{"start":{"line":28,"column":8},"end":{"line":28,"column":60}},"24":{"start":{"line":30,"column":4},"end":{"line":32,"column":6}},"25":{"start":{"line":31,"column":8},"end":{"line":31,"column":58}},"26":{"start":{"line":33,"column":4},"end":{"line":39,"column":6}},"27":{"start":{"line":34,"column":8},"end":{"line":38,"column":10}},"28":{"start":{"line":40,"column":4},"end":{"line":40,"column":20}},"29":{"start":{"line":42,"column":0},"end":{"line":42,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":45},"end":{"line":2,"column":46}},"loc":{"start":{"line":2,"column":57},"end":{"line":11,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":47},"end":{"line":4,"column":48}},"loc":{"start":{"line":4,"column":63},"end":{"line":4,"column":83}},"line":4},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":8},"end":{"line":5,"column":9}},"loc":{"start":{"line":5,"column":24},"end":{"line":5,"column":82}},"line":5},"3":{"name":"(anonymous_3)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":12}},"loc":{"start":{"line":6,"column":27},"end":{"line":10,"column":5}},"line":6},"4":{"name":"__","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":22},"end":{"line":8,"column":47}},"line":8},"5":{"name":"(anonymous_5)","decl":{"start":{"line":14,"column":30},"end":{"line":14,"column":31}},"loc":{"start":{"line":14,"column":48},"end":{"line":41,"column":1}},"line":14},"6":{"name":"CSVError","decl":{"start":{"line":16,"column":13},"end":{"line":16,"column":21}},"loc":{"start":{"line":16,"column":40},"end":{"line":23,"column":5}},"line":16},"7":{"name":"(anonymous_7)","decl":{"start":{"line":24,"column":33},"end":{"line":24,"column":34}},"loc":{"start":{"line":24,"column":57},"end":{"line":26,"column":5}},"line":24},"8":{"name":"(anonymous_8)","decl":{"start":{"line":27,"column":30},"end":{"line":27,"column":31}},"loc":{"start":{"line":27,"column":54},"end":{"line":29,"column":5}},"line":27},"9":{"name":"(anonymous_9)","decl":{"start":{"line":30,"column":24},"end":{"line":30,"column":25}},"loc":{"start":{"line":30,"column":39},"end":{"line":32,"column":5}},"line":30},"10":{"name":"(anonymous_10)","decl":{"start":{"line":33,"column":32},"end":{"line":33,"column":33}},"loc":{"start":{"line":33,"column":44},"end":{"line":39,"column":5}},"line":33}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":21}},{"start":{"line":2,"column":25},"end":{"line":2,"column":39}},{"start":{"line":2,"column":44},"end":{"line":11,"column":4}}],"line":2},"1":{"loc":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"type":"binary-expr","locations":[{"start":{"line":3,"column":24},"end":{"line":3,"column":45}},{"start":{"line":4,"column":9},"end":{"line":4,"column":43}},{"start":{"line":4,"column":47},"end":{"line":4,"column":83}},{"start":{"line":5,"column":8},"end":{"line":5,"column":82}}],"line":3},"2":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"type":"if","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},{"start":{"line":5,"column":43},"end":{"line":5,"column":80}}],"line":5},"3":{"loc":{"start":{"line":9,"column":22},"end":{"line":9,"column":92}},"type":"cond-expr","locations":[{"start":{"line":9,"column":35},"end":{"line":9,"column":51}},{"start":{"line":9,"column":55},"end":{"line":9,"column":91}}],"line":9},"4":{"loc":{"start":{"line":17,"column":20},"end":{"line":17,"column":129}},"type":"binary-expr","locations":[{"start":{"line":17,"column":20},"end":{"line":17,"column":121}},{"start":{"line":17,"column":125},"end":{"line":17,"column":129}}],"line":17},"5":{"loc":{"start":{"line":17,"column":89},"end":{"line":17,"column":119}},"type":"cond-expr","locations":[{"start":{"line":17,"column":97},"end":{"line":17,"column":114}},{"start":{"line":17,"column":117},"end":{"line":17,"column":119}}],"line":17}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":8,"15":8,"16":8,"17":8,"18":8,"19":8,"20":1,"21":2,"22":1,"23":5,"24":1,"25":1,"26":1,"27":0,"28":1,"29":1},"f":{"0":1,"1":0,"2":0,"3":1,"4":1,"5":1,"6":8,"7":2,"8":5,"9":1,"10":0},"b":{"0":[1,1,1],"1":[1,0,0,0],"2":[0,0],"3":[0,1],"4":[8,0],"5":[6,2]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"b01710b079aec5405ddd368b89e30e1c078e761c","contentHash":"fdabd56f284bbcdce7a38d4cf68b00c3_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/ProcessorLocal.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/ProcessorLocal.ts","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"1":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"2":{"start":{"line":4,"column":65},"end":{"line":4,"column":81}},"3":{"start":{"line":5,"column":26},"end":{"line":5,"column":80}},"4":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"5":{"start":{"line":5,"column":68},"end":{"line":5,"column":80}},"6":{"start":{"line":6,"column":4},"end":{"line":10,"column":6}},"7":{"start":{"line":7,"column":8},"end":{"line":7,"column":28}},"8":{"start":{"line":8,"column":24},"end":{"line":8,"column":45}},"9":{"start":{"line":9,"column":8},"end":{"line":9,"column":93}},"10":{"start":{"line":12,"column":22},"end":{"line":14,"column":1}},"11":{"start":{"line":13,"column":4},"end":{"line":13,"column":62}},"12":{"start":{"line":15,"column":0},"end":{"line":15,"column":62}},"13":{"start":{"line":16,"column":18},"end":{"line":16,"column":40}},"14":{"start":{"line":17,"column":17},"end":{"line":17,"column":53}},"15":{"start":{"line":18,"column":18},"end":{"line":18,"column":40}},"16":{"start":{"line":19,"column":15},"end":{"line":19,"column":51}},"17":{"start":{"line":20,"column":17},"end":{"line":20,"column":38}},"18":{"start":{"line":21,"column":13},"end":{"line":21,"column":30}},"19":{"start":{"line":22,"column":17},"end":{"line":22,"column":38}},"20":{"start":{"line":23,"column":19},"end":{"line":23,"column":59}},"21":{"start":{"line":24,"column":17},"end":{"line":24,"column":55}},"22":{"start":{"line":25,"column":36},"end":{"line":279,"column":24}},"23":{"start":{"line":26,"column":4},"end":{"line":26,"column":38}},"24":{"start":{"line":28,"column":20},"end":{"line":28,"column":76}},"25":{"start":{"line":29,"column":8},"end":{"line":29,"column":66}},"26":{"start":{"line":30,"column":8},"end":{"line":30,"column":33}},"27":{"start":{"line":31,"column":8},"end":{"line":31,"column":39}},"28":{"start":{"line":32,"column":8},"end":{"line":32,"column":34}},"29":{"start":{"line":33,"column":8},"end":{"line":33,"column":40}},"30":{"start":{"line":34,"column":8},"end":{"line":34,"column":21}},"31":{"start":{"line":36,"column":4},"end":{"line":54,"column":6}},"32":{"start":{"line":37,"column":20},"end":{"line":37,"column":24}},"33":{"start":{"line":38,"column":8},"end":{"line":53,"column":9}},"34":{"start":{"line":39,"column":22},"end":{"line":39,"column":48}},"35":{"start":{"line":40,"column":12},"end":{"line":40,"column":51}},"36":{"start":{"line":41,"column":12},"end":{"line":49,"column":15}},"37":{"start":{"line":43,"column":16},"end":{"line":48,"column":17}},"38":{"start":{"line":44,"column":20},"end":{"line":44,"column":160}},"39":{"start":{"line":47,"column":20},"end":{"line":47,"column":59}},"40":{"start":{"line":52,"column":12},"end":{"line":52,"column":50}},"41":{"start":{"line":55,"column":4},"end":{"line":57,"column":6}},"42":{"start":{"line":56,"column":8},"end":{"line":56,"column":44}},"43":{"start":{"line":58,"column":4},"end":{"line":67,"column":7}},"44":{"start":{"line":60,"column":12},"end":{"line":62,"column":13}},"45":{"start":{"line":61,"column":16},"end":{"line":61,"column":79}},"46":{"start":{"line":63,"column":12},"end":{"line":63,"column":37}},"47":{"start":{"line":68,"column":4},"end":{"line":77,"column":7}},"48":{"start":{"line":70,"column":12},"end":{"line":72,"column":13}},"49":{"start":{"line":71,"column":16},"end":{"line":71,"column":83}},"50":{"start":{"line":73,"column":12},"end":{"line":73,"column":38}},"51":{"start":{"line":78,"column":4},"end":{"line":105,"column":6}},"52":{"start":{"line":79,"column":20},"end":{"line":79,"column":24}},"53":{"start":{"line":80,"column":8},"end":{"line":80,"column":58}},"54":{"start":{"line":80,"column":37},"end":{"line":80,"column":56}},"55":{"start":{"line":82,"column":8},"end":{"line":87,"column":9}},"56":{"start":{"line":83,"column":12},"end":{"line":83,"column":41}},"57":{"start":{"line":86,"column":12},"end":{"line":86,"column":84}},"58":{"start":{"line":88,"column":8},"end":{"line":104,"column":11}},"59":{"start":{"line":90,"column":12},"end":{"line":95,"column":13}},"60":{"start":{"line":91,"column":16},"end":{"line":91,"column":63}},"61":{"start":{"line":94,"column":16},"end":{"line":94,"column":33}},"62":{"start":{"line":98,"column":12},"end":{"line":103,"column":13}},"63":{"start":{"line":99,"column":16},"end":{"line":99,"column":57}},"64":{"start":{"line":102,"column":16},"end":{"line":102,"column":54}},"65":{"start":{"line":106,"column":4},"end":{"line":150,"column":6}},"66":{"start":{"line":107,"column":20},"end":{"line":107,"column":24}},"67":{"start":{"line":108,"column":21},"end":{"line":108,"column":32}},"68":{"start":{"line":109,"column":22},"end":{"line":109,"column":34}},"69":{"start":{"line":110,"column":8},"end":{"line":112,"column":9}},"70":{"start":{"line":111,"column":12},"end":{"line":111,"column":43}},"71":{"start":{"line":113,"column":8},"end":{"line":116,"column":9}},"72":{"start":{"line":114,"column":12},"end":{"line":114,"column":52}},"73":{"start":{"line":115,"column":12},"end":{"line":115,"column":35}},"74":{"start":{"line":118,"column":8},"end":{"line":120,"column":9}},"75":{"start":{"line":119,"column":12},"end":{"line":119,"column":33}},"76":{"start":{"line":121,"column":33},"end":{"line":121,"column":71}},"77":{"start":{"line":122,"column":8},"end":{"line":128,"column":9}},"78":{"start":{"line":123,"column":12},"end":{"line":123,"column":82}},"79":{"start":{"line":126,"column":12},"end":{"line":126,"column":70}},"80":{"start":{"line":127,"column":12},"end":{"line":127,"column":44}},"81":{"start":{"line":129,"column":8},"end":{"line":149,"column":9}},"82":{"start":{"line":130,"column":23},"end":{"line":130,"column":29}},"83":{"start":{"line":131,"column":12},"end":{"line":136,"column":13}},"84":{"start":{"line":132,"column":16},"end":{"line":132,"column":69}},"85":{"start":{"line":135,"column":16},"end":{"line":135,"column":76}},"86":{"start":{"line":137,"column":12},"end":{"line":145,"column":15}},"87":{"start":{"line":138,"column":16},"end":{"line":144,"column":17}},"88":{"start":{"line":140,"column":20},"end":{"line":140,"column":60}},"89":{"start":{"line":143,"column":20},"end":{"line":143,"column":55}},"90":{"start":{"line":148,"column":12},"end":{"line":148,"column":50}},"91":{"start":{"line":151,"column":4},"end":{"line":194,"column":6}},"92":{"start":{"line":152,"column":8},"end":{"line":185,"column":9}},"93":{"start":{"line":153,"column":12},"end":{"line":158,"column":13}},"94":{"start":{"line":154,"column":16},"end":{"line":154,"column":59}},"95":{"start":{"line":157,"column":16},"end":{"line":157,"column":42}},"96":{"start":{"line":161,"column":23},"end":{"line":161,"column":25}},"97":{"start":{"line":162,"column":28},"end":{"line":162,"column":30}},"98":{"start":{"line":163,"column":12},"end":{"line":174,"column":13}},"99":{"start":{"line":164,"column":27},"end":{"line":164,"column":47}},"100":{"start":{"line":165,"column":26},"end":{"line":165,"column":51}},"101":{"start":{"line":166,"column":16},"end":{"line":173,"column":17}},"102":{"start":{"line":167,"column":20},"end":{"line":167,"column":42}},"103":{"start":{"line":168,"column":20},"end":{"line":168,"column":30}},"104":{"start":{"line":169,"column":20},"end":{"line":169,"column":26}},"105":{"start":{"line":172,"column":20},"end":{"line":172,"column":71}},"106":{"start":{"line":175,"column":12},"end":{"line":175,"column":60}},"107":{"start":{"line":176,"column":12},"end":{"line":178,"column":13}},"108":{"start":{"line":177,"column":16},"end":{"line":177,"column":26}},"109":{"start":{"line":179,"column":12},"end":{"line":184,"column":13}},"110":{"start":{"line":180,"column":16},"end":{"line":180,"column":59}},"111":{"start":{"line":183,"column":16},"end":{"line":183,"column":49}},"112":{"start":{"line":186,"column":8},"end":{"line":188,"column":9}},"113":{"start":{"line":187,"column":12},"end":{"line":187,"column":32}},"114":{"start":{"line":189,"column":8},"end":{"line":192,"column":9}},"115":{"start":{"line":190,"column":12},"end":{"line":190,"column":64}},"116":{"start":{"line":191,"column":12},"end":{"line":191,"column":36}},"117":{"start":{"line":193,"column":8},"end":{"line":193,"column":42}},"118":{"start":{"line":195,"column":4},"end":{"line":235,"column":6}},"119":{"start":{"line":196,"column":8},"end":{"line":196,"column":42}},"120":{"start":{"line":197,"column":8},"end":{"line":234,"column":9}},"121":{"start":{"line":198,"column":26},"end":{"line":198,"column":46}},"122":{"start":{"line":199,"column":12},"end":{"line":232,"column":13}},"123":{"start":{"line":200,"column":16},"end":{"line":220,"column":17}},"124":{"start":{"line":201,"column":20},"end":{"line":211,"column":21}},"125":{"start":{"line":202,"column":24},"end":{"line":207,"column":25}},"126":{"start":{"line":203,"column":28},"end":{"line":203,"column":65}},"127":{"start":{"line":206,"column":28},"end":{"line":206,"column":37}},"128":{"start":{"line":210,"column":24},"end":{"line":210,"column":61}},"129":{"start":{"line":213,"column":21},"end":{"line":220,"column":17}},"130":{"start":{"line":214,"column":20},"end":{"line":216,"column":21}},"131":{"start":{"line":215,"column":24},"end":{"line":215,"column":61}},"132":{"start":{"line":219,"column":20},"end":{"line":219,"column":57}},"133":{"start":{"line":233,"column":12},"end":{"line":233,"column":106}},"134":{"start":{"line":236,"column":4},"end":{"line":254,"column":6}},"135":{"start":{"line":237,"column":8},"end":{"line":249,"column":9}},"136":{"start":{"line":238,"column":12},"end":{"line":238,"column":25}},"137":{"start":{"line":241,"column":25},"end":{"line":241,"column":61}},"138":{"start":{"line":242,"column":12},"end":{"line":242,"column":70}},"139":{"start":{"line":243,"column":12},"end":{"line":248,"column":13}},"140":{"start":{"line":244,"column":16},"end":{"line":244,"column":40}},"141":{"start":{"line":247,"column":16},"end":{"line":247,"column":78}},"142":{"start":{"line":255,"column":4},"end":{"line":264,"column":6}},"143":{"start":{"line":256,"column":8},"end":{"line":263,"column":9}},"144":{"start":{"line":257,"column":12},"end":{"line":262,"column":13}},"145":{"start":{"line":258,"column":16},"end":{"line":258,"column":94}},"146":{"start":{"line":261,"column":16},"end":{"line":261,"column":49}},"147":{"start":{"line":265,"column":4},"end":{"line":277,"column":6}},"148":{"start":{"line":266,"column":20},"end":{"line":266,"column":24}},"149":{"start":{"line":267,"column":8},"end":{"line":276,"column":11}},"150":{"start":{"line":268,"column":12},"end":{"line":275,"column":15}},"151":{"start":{"line":269,"column":16},"end":{"line":274,"column":17}},"152":{"start":{"line":270,"column":20},"end":{"line":270,"column":32}},"153":{"start":{"line":273,"column":20},"end":{"line":273,"column":35}},"154":{"start":{"line":278,"column":4},"end":{"line":278,"column":26}},"155":{"start":{"line":280,"column":0},"end":{"line":280,"column":40}},"156":{"start":{"line":282,"column":4},"end":{"line":308,"column":5}},"157":{"start":{"line":283,"column":8},"end":{"line":283,"column":13}},"158":{"start":{"line":286,"column":8},"end":{"line":307,"column":9}},"159":{"start":{"line":287,"column":23},"end":{"line":287,"column":36}},"160":{"start":{"line":288,"column":22},"end":{"line":288,"column":86}},"161":{"start":{"line":289,"column":12},"end":{"line":289,"column":21}},"162":{"start":{"line":290,"column":12},"end":{"line":303,"column":13}},"163":{"start":{"line":291,"column":16},"end":{"line":294,"column":19}},"164":{"start":{"line":292,"column":20},"end":{"line":292,"column":46}},"165":{"start":{"line":293,"column":20},"end":{"line":293,"column":64}},"166":{"start":{"line":297,"column":16},"end":{"line":297,"column":40}},"167":{"start":{"line":298,"column":16},"end":{"line":301,"column":17}},"168":{"start":{"line":299,"column":20},"end":{"line":299,"column":110}},"169":{"start":{"line":300,"column":20},"end":{"line":300,"column":29}},"170":{"start":{"line":302,"column":16},"end":{"line":302,"column":21}},"171":{"start":{"line":306,"column":12},"end":{"line":306,"column":17}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":45},"end":{"line":2,"column":46}},"loc":{"start":{"line":2,"column":57},"end":{"line":11,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":47},"end":{"line":4,"column":48}},"loc":{"start":{"line":4,"column":63},"end":{"line":4,"column":83}},"line":4},"2":{"name":"(anonymous_2)","decl":{"start":{"line":5,"column":8},"end":{"line":5,"column":9}},"loc":{"start":{"line":5,"column":24},"end":{"line":5,"column":82}},"line":5},"3":{"name":"(anonymous_3)","decl":{"start":{"line":6,"column":11},"end":{"line":6,"column":12}},"loc":{"start":{"line":6,"column":27},"end":{"line":10,"column":5}},"line":6},"4":{"name":"__","decl":{"start":{"line":8,"column":17},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":22},"end":{"line":8,"column":47}},"line":8},"5":{"name":"(anonymous_5)","decl":{"start":{"line":12,"column":56},"end":{"line":12,"column":57}},"loc":{"start":{"line":12,"column":71},"end":{"line":14,"column":1}},"line":12},"6":{"name":"(anonymous_6)","decl":{"start":{"line":25,"column":36},"end":{"line":25,"column":37}},"loc":{"start":{"line":25,"column":54},"end":{"line":279,"column":1}},"line":25},"7":{"name":"ProcessorLocal","decl":{"start":{"line":27,"column":13},"end":{"line":27,"column":27}},"loc":{"start":{"line":27,"column":30},"end":{"line":35,"column":5}},"line":27},"8":{"name":"(anonymous_8)","decl":{"start":{"line":36,"column":37},"end":{"line":36,"column":38}},"loc":{"start":{"line":36,"column":49},"end":{"line":54,"column":5}},"line":36},"9":{"name":"(anonymous_9)","decl":{"start":{"line":42,"column":22},"end":{"line":42,"column":23}},"loc":{"start":{"line":42,"column":37},"end":{"line":49,"column":13}},"line":42},"10":{"name":"(anonymous_10)","decl":{"start":{"line":55,"column":39},"end":{"line":55,"column":40}},"loc":{"start":{"line":55,"column":51},"end":{"line":57,"column":5}},"line":55},"11":{"name":"(anonymous_11)","decl":{"start":{"line":59,"column":13},"end":{"line":59,"column":14}},"loc":{"start":{"line":59,"column":25},"end":{"line":64,"column":9}},"line":59},"12":{"name":"(anonymous_12)","decl":{"start":{"line":69,"column":13},"end":{"line":69,"column":14}},"loc":{"start":{"line":69,"column":25},"end":{"line":74,"column":9}},"line":69},"13":{"name":"(anonymous_13)","decl":{"start":{"line":78,"column":39},"end":{"line":78,"column":40}},"loc":{"start":{"line":78,"column":68},"end":{"line":105,"column":5}},"line":78},"14":{"name":"(anonymous_14)","decl":{"start":{"line":89,"column":18},"end":{"line":89,"column":19}},"loc":{"start":{"line":89,"column":30},"end":{"line":96,"column":9}},"line":89},"15":{"name":"(anonymous_15)","decl":{"start":{"line":97,"column":18},"end":{"line":97,"column":19}},"loc":{"start":{"line":97,"column":33},"end":{"line":104,"column":9}},"line":97},"16":{"name":"(anonymous_16)","decl":{"start":{"line":106,"column":42},"end":{"line":106,"column":43}},"loc":{"start":{"line":106,"column":69},"end":{"line":150,"column":5}},"line":106},"17":{"name":"(anonymous_17)","decl":{"start":{"line":137,"column":29},"end":{"line":137,"column":30}},"loc":{"start":{"line":137,"column":46},"end":{"line":145,"column":13}},"line":137},"18":{"name":"(anonymous_18)","decl":{"start":{"line":151,"column":51},"end":{"line":151,"column":52}},"loc":{"start":{"line":151,"column":68},"end":{"line":194,"column":5}},"line":151},"19":{"name":"(anonymous_19)","decl":{"start":{"line":195,"column":44},"end":{"line":195,"column":45}},"loc":{"start":{"line":195,"column":56},"end":{"line":235,"column":5}},"line":195},"20":{"name":"(anonymous_20)","decl":{"start":{"line":236,"column":46},"end":{"line":236,"column":47}},"loc":{"start":{"line":236,"column":63},"end":{"line":254,"column":5}},"line":236},"21":{"name":"(anonymous_21)","decl":{"start":{"line":255,"column":46},"end":{"line":255,"column":47}},"loc":{"start":{"line":255,"column":61},"end":{"line":264,"column":5}},"line":255},"22":{"name":"(anonymous_22)","decl":{"start":{"line":265,"column":46},"end":{"line":265,"column":47}},"loc":{"start":{"line":265,"column":63},"end":{"line":277,"column":5}},"line":265},"23":{"name":"(anonymous_23)","decl":{"start":{"line":267,"column":38},"end":{"line":267,"column":39}},"loc":{"start":{"line":267,"column":65},"end":{"line":276,"column":9}},"line":267},"24":{"name":"(anonymous_24)","decl":{"start":{"line":268,"column":53},"end":{"line":268,"column":54}},"loc":{"start":{"line":268,"column":68},"end":{"line":275,"column":13}},"line":268},"25":{"name":"processLineHook","decl":{"start":{"line":281,"column":9},"end":{"line":281,"column":24}},"loc":{"start":{"line":281,"column":53},"end":{"line":309,"column":1}},"line":281},"26":{"name":"(anonymous_26)","decl":{"start":{"line":291,"column":25},"end":{"line":291,"column":26}},"loc":{"start":{"line":291,"column":42},"end":{"line":294,"column":17}},"line":291}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":16},"end":{"line":11,"column":4}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":21}},{"start":{"line":2,"column":25},"end":{"line":2,"column":39}},{"start":{"line":2,"column":44},"end":{"line":11,"column":4}}],"line":2},"1":{"loc":{"start":{"line":3,"column":24},"end":{"line":5,"column":82}},"type":"binary-expr","locations":[{"start":{"line":3,"column":24},"end":{"line":3,"column":45}},{"start":{"line":4,"column":9},"end":{"line":4,"column":43}},{"start":{"line":4,"column":47},"end":{"line":4,"column":83}},{"start":{"line":5,"column":8},"end":{"line":5,"column":82}}],"line":3},"2":{"loc":{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},"type":"if","locations":[{"start":{"line":5,"column":43},"end":{"line":5,"column":80}},{"start":{"line":5,"column":43},"end":{"line":5,"column":80}}],"line":5},"3":{"loc":{"start":{"line":9,"column":22},"end":{"line":9,"column":92}},"type":"cond-expr","locations":[{"start":{"line":9,"column":35},"end":{"line":9,"column":51}},{"start":{"line":9,"column":55},"end":{"line":9,"column":91}}],"line":9},"4":{"loc":{"start":{"line":12,"column":22},"end":{"line":14,"column":1}},"type":"binary-expr","locations":[{"start":{"line":12,"column":23},"end":{"line":12,"column":27}},{"start":{"line":12,"column":31},"end":{"line":12,"column":51}},{"start":{"line":12,"column":56},"end":{"line":14,"column":1}}],"line":12},"5":{"loc":{"start":{"line":13,"column":11},"end":{"line":13,"column":61}},"type":"cond-expr","locations":[{"start":{"line":13,"column":37},"end":{"line":13,"column":40}},{"start":{"line":13,"column":43},"end":{"line":13,"column":61}}],"line":13},"6":{"loc":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"type":"binary-expr","locations":[{"start":{"line":13,"column":12},"end":{"line":13,"column":15}},{"start":{"line":13,"column":19},"end":{"line":13,"column":33}}],"line":13},"7":{"loc":{"start":{"line":28,"column":20},"end":{"line":28,"column":76}},"type":"binary-expr","locations":[{"start":{"line":28,"column":20},"end":{"line":28,"column":35}},{"start":{"line":28,"column":39},"end":{"line":28,"column":68}},{"start":{"line":28,"column":72},"end":{"line":28,"column":76}}],"line":28},"8":{"loc":{"start":{"line":38,"column":8},"end":{"line":53,"column":9}},"type":"if","locations":[{"start":{"line":38,"column":8},"end":{"line":53,"column":9}},{"start":{"line":38,"column":8},"end":{"line":53,"column":9}}],"line":38},"9":{"loc":{"start":{"line":38,"column":12},"end":{"line":38,"column":79}},"type":"binary-expr","locations":[{"start":{"line":38,"column":12},"end":{"line":38,"column":38}},{"start":{"line":38,"column":42},"end":{"line":38,"column":79}}],"line":38},"10":{"loc":{"start":{"line":43,"column":16},"end":{"line":48,"column":17}},"type":"if","locations":[{"start":{"line":43,"column":16},"end":{"line":48,"column":17}},{"start":{"line":43,"column":16},"end":{"line":48,"column":17}}],"line":43},"11":{"loc":{"start":{"line":43,"column":20},"end":{"line":43,"column":89}},"type":"binary-expr","locations":[{"start":{"line":43,"column":20},"end":{"line":43,"column":47}},{"start":{"line":43,"column":51},"end":{"line":43,"column":89}}],"line":43},"12":{"loc":{"start":{"line":60,"column":12},"end":{"line":62,"column":13}},"type":"if","locations":[{"start":{"line":60,"column":12},"end":{"line":62,"column":13}},{"start":{"line":60,"column":12},"end":{"line":62,"column":13}}],"line":60},"13":{"loc":{"start":{"line":70,"column":12},"end":{"line":72,"column":13}},"type":"if","locations":[{"start":{"line":70,"column":12},"end":{"line":72,"column":13}},{"start":{"line":70,"column":12},"end":{"line":72,"column":13}}],"line":70},"14":{"loc":{"start":{"line":80,"column":8},"end":{"line":80,"column":58}},"type":"if","locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":58}},{"start":{"line":80,"column":8},"end":{"line":80,"column":58}}],"line":80},"15":{"loc":{"start":{"line":82,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":82,"column":8},"end":{"line":87,"column":9}},{"start":{"line":82,"column":8},"end":{"line":87,"column":9}}],"line":82},"16":{"loc":{"start":{"line":90,"column":12},"end":{"line":95,"column":13}},"type":"if","locations":[{"start":{"line":90,"column":12},"end":{"line":95,"column":13}},{"start":{"line":90,"column":12},"end":{"line":95,"column":13}}],"line":90},"17":{"loc":{"start":{"line":98,"column":12},"end":{"line":103,"column":13}},"type":"if","locations":[{"start":{"line":98,"column":12},"end":{"line":103,"column":13}},{"start":{"line":98,"column":12},"end":{"line":103,"column":13}}],"line":98},"18":{"loc":{"start":{"line":98,"column":16},"end":{"line":98,"column":37}},"type":"binary-expr","locations":[{"start":{"line":98,"column":16},"end":{"line":98,"column":19}},{"start":{"line":98,"column":23},"end":{"line":98,"column":37}}],"line":98},"19":{"loc":{"start":{"line":110,"column":8},"end":{"line":112,"column":9}},"type":"if","locations":[{"start":{"line":110,"column":8},"end":{"line":112,"column":9}},{"start":{"line":110,"column":8},"end":{"line":112,"column":9}}],"line":110},"20":{"loc":{"start":{"line":113,"column":8},"end":{"line":116,"column":9}},"type":"if","locations":[{"start":{"line":113,"column":8},"end":{"line":116,"column":9}},{"start":{"line":113,"column":8},"end":{"line":116,"column":9}}],"line":113},"21":{"loc":{"start":{"line":113,"column":12},"end":{"line":113,"column":63}},"type":"binary-expr","locations":[{"start":{"line":113,"column":12},"end":{"line":113,"column":28}},{"start":{"line":113,"column":32},"end":{"line":113,"column":48}},{"start":{"line":113,"column":52},"end":{"line":113,"column":63}}],"line":113},"22":{"loc":{"start":{"line":118,"column":8},"end":{"line":120,"column":9}},"type":"if","locations":[{"start":{"line":118,"column":8},"end":{"line":120,"column":9}},{"start":{"line":118,"column":8},"end":{"line":120,"column":9}}],"line":118},"23":{"loc":{"start":{"line":118,"column":12},"end":{"line":118,"column":50}},"type":"binary-expr","locations":[{"start":{"line":118,"column":12},"end":{"line":118,"column":30}},{"start":{"line":118,"column":34},"end":{"line":118,"column":50}}],"line":118},"24":{"loc":{"start":{"line":122,"column":8},"end":{"line":128,"column":9}},"type":"if","locations":[{"start":{"line":122,"column":8},"end":{"line":128,"column":9}},{"start":{"line":122,"column":8},"end":{"line":128,"column":9}}],"line":122},"25":{"loc":{"start":{"line":129,"column":8},"end":{"line":149,"column":9}},"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":149,"column":9}},{"start":{"line":129,"column":8},"end":{"line":149,"column":9}}],"line":129},"26":{"loc":{"start":{"line":131,"column":12},"end":{"line":136,"column":13}},"type":"if","locations":[{"start":{"line":131,"column":12},"end":{"line":136,"column":13}},{"start":{"line":131,"column":12},"end":{"line":136,"column":13}}],"line":131},"27":{"loc":{"start":{"line":138,"column":16},"end":{"line":144,"column":17}},"type":"if","locations":[{"start":{"line":138,"column":16},"end":{"line":144,"column":17}},{"start":{"line":138,"column":16},"end":{"line":144,"column":17}}],"line":138},"28":{"loc":{"start":{"line":138,"column":20},"end":{"line":139,"column":45}},"type":"binary-expr","locations":[{"start":{"line":138,"column":20},"end":{"line":138,"column":36}},{"start":{"line":139,"column":23},"end":{"line":139,"column":45}}],"line":138},"29":{"loc":{"start":{"line":152,"column":8},"end":{"line":185,"column":9}},"type":"if","locations":[{"start":{"line":152,"column":8},"end":{"line":185,"column":9}},{"start":{"line":152,"column":8},"end":{"line":185,"column":9}}],"line":152},"30":{"loc":{"start":{"line":153,"column":12},"end":{"line":158,"column":13}},"type":"if","locations":[{"start":{"line":153,"column":12},"end":{"line":158,"column":13}},{"start":{"line":153,"column":12},"end":{"line":158,"column":13}}],"line":153},"31":{"loc":{"start":{"line":166,"column":16},"end":{"line":173,"column":17}},"type":"if","locations":[{"start":{"line":166,"column":16},"end":{"line":173,"column":17}},{"start":{"line":166,"column":16},"end":{"line":173,"column":17}}],"line":166},"32":{"loc":{"start":{"line":176,"column":12},"end":{"line":178,"column":13}},"type":"if","locations":[{"start":{"line":176,"column":12},"end":{"line":178,"column":13}},{"start":{"line":176,"column":12},"end":{"line":178,"column":13}}],"line":176},"33":{"loc":{"start":{"line":179,"column":12},"end":{"line":184,"column":13}},"type":"if","locations":[{"start":{"line":179,"column":12},"end":{"line":184,"column":13}},{"start":{"line":179,"column":12},"end":{"line":184,"column":13}}],"line":179},"34":{"loc":{"start":{"line":186,"column":8},"end":{"line":188,"column":9}},"type":"if","locations":[{"start":{"line":186,"column":8},"end":{"line":188,"column":9}},{"start":{"line":186,"column":8},"end":{"line":188,"column":9}}],"line":186},"35":{"loc":{"start":{"line":186,"column":12},"end":{"line":186,"column":89}},"type":"binary-expr","locations":[{"start":{"line":186,"column":12},"end":{"line":186,"column":48}},{"start":{"line":186,"column":52},"end":{"line":186,"column":89}}],"line":186},"36":{"loc":{"start":{"line":189,"column":8},"end":{"line":192,"column":9}},"type":"if","locations":[{"start":{"line":189,"column":8},"end":{"line":192,"column":9}},{"start":{"line":189,"column":8},"end":{"line":192,"column":9}}],"line":189},"37":{"loc":{"start":{"line":189,"column":12},"end":{"line":189,"column":50}},"type":"binary-expr","locations":[{"start":{"line":189,"column":12},"end":{"line":189,"column":29}},{"start":{"line":189,"column":33},"end":{"line":189,"column":50}}],"line":189},"38":{"loc":{"start":{"line":197,"column":8},"end":{"line":234,"column":9}},"type":"if","locations":[{"start":{"line":197,"column":8},"end":{"line":234,"column":9}},{"start":{"line":197,"column":8},"end":{"line":234,"column":9}}],"line":197},"39":{"loc":{"start":{"line":200,"column":16},"end":{"line":220,"column":17}},"type":"if","locations":[{"start":{"line":200,"column":16},"end":{"line":220,"column":17}},{"start":{"line":200,"column":16},"end":{"line":220,"column":17}}],"line":200},"40":{"loc":{"start":{"line":201,"column":20},"end":{"line":211,"column":21}},"type":"if","locations":[{"start":{"line":201,"column":20},"end":{"line":211,"column":21}},{"start":{"line":201,"column":20},"end":{"line":211,"column":21}}],"line":201},"41":{"loc":{"start":{"line":202,"column":24},"end":{"line":207,"column":25}},"type":"if","locations":[{"start":{"line":202,"column":24},"end":{"line":207,"column":25}},{"start":{"line":202,"column":24},"end":{"line":207,"column":25}}],"line":202},"42":{"loc":{"start":{"line":202,"column":28},"end":{"line":202,"column":101}},"type":"binary-expr","locations":[{"start":{"line":202,"column":28},"end":{"line":202,"column":54}},{"start":{"line":202,"column":58},"end":{"line":202,"column":101}}],"line":202},"43":{"loc":{"start":{"line":213,"column":21},"end":{"line":220,"column":17}},"type":"if","locations":[{"start":{"line":213,"column":21},"end":{"line":220,"column":17}},{"start":{"line":213,"column":21},"end":{"line":220,"column":17}}],"line":213},"44":{"loc":{"start":{"line":214,"column":20},"end":{"line":216,"column":21}},"type":"if","locations":[{"start":{"line":214,"column":20},"end":{"line":216,"column":21}},{"start":{"line":214,"column":20},"end":{"line":216,"column":21}}],"line":214},"45":{"loc":{"start":{"line":237,"column":8},"end":{"line":249,"column":9}},"type":"if","locations":[{"start":{"line":237,"column":8},"end":{"line":249,"column":9}},{"start":{"line":237,"column":8},"end":{"line":249,"column":9}}],"line":237},"46":{"loc":{"start":{"line":243,"column":12},"end":{"line":248,"column":13}},"type":"if","locations":[{"start":{"line":243,"column":12},"end":{"line":248,"column":13}},{"start":{"line":243,"column":12},"end":{"line":248,"column":13}}],"line":243},"47":{"loc":{"start":{"line":256,"column":8},"end":{"line":263,"column":9}},"type":"if","locations":[{"start":{"line":256,"column":8},"end":{"line":263,"column":9}},{"start":{"line":256,"column":8},"end":{"line":263,"column":9}}],"line":256},"48":{"loc":{"start":{"line":257,"column":12},"end":{"line":262,"column":13}},"type":"if","locations":[{"start":{"line":257,"column":12},"end":{"line":262,"column":13}},{"start":{"line":257,"column":12},"end":{"line":262,"column":13}}],"line":257},"49":{"loc":{"start":{"line":269,"column":16},"end":{"line":274,"column":17}},"type":"if","locations":[{"start":{"line":269,"column":16},"end":{"line":274,"column":17}},{"start":{"line":269,"column":16},"end":{"line":274,"column":17}}],"line":269},"50":{"loc":{"start":{"line":282,"column":4},"end":{"line":308,"column":5}},"type":"if","locations":[{"start":{"line":282,"column":4},"end":{"line":308,"column":5}},{"start":{"line":282,"column":4},"end":{"line":308,"column":5}}],"line":282},"51":{"loc":{"start":{"line":286,"column":8},"end":{"line":307,"column":9}},"type":"if","locations":[{"start":{"line":286,"column":8},"end":{"line":307,"column":9}},{"start":{"line":286,"column":8},"end":{"line":307,"column":9}}],"line":286},"52":{"loc":{"start":{"line":290,"column":12},"end":{"line":303,"column":13}},"type":"if","locations":[{"start":{"line":290,"column":12},"end":{"line":303,"column":13}},{"start":{"line":290,"column":12},"end":{"line":303,"column":13}}],"line":290},"53":{"loc":{"start":{"line":290,"column":16},"end":{"line":290,"column":31}},"type":"binary-expr","locations":[{"start":{"line":290,"column":16},"end":{"line":290,"column":19}},{"start":{"line":290,"column":23},"end":{"line":290,"column":31}}],"line":290}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":1,"7":1,"8":1,"9":1,"10":1,"11":4,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":86,"25":86,"26":86,"27":86,"28":86,"29":86,"30":86,"31":1,"32":73,"33":73,"34":36,"35":36,"36":36,"37":36,"38":5,"39":31,"40":37,"41":1,"42":76,"43":1,"44":170,"45":76,"46":170,"47":1,"48":75,"49":75,"50":75,"51":1,"52":171,"53":171,"54":135,"55":171,"56":36,"57":135,"58":171,"59":171,"60":5,"61":166,"62":171,"63":170,"64":1,"65":1,"66":170,"67":170,"68":170,"69":170,"70":113,"71":170,"72":2,"73":2,"74":170,"75":1,"76":170,"77":170,"78":134,"79":36,"80":36,"81":170,"82":122,"83":122,"84":3,"85":119,"86":122,"87":122,"88":76,"89":46,"90":48,"91":1,"92":76,"93":8,"94":4,"95":4,"96":68,"97":68,"98":68,"99":68,"100":68,"101":68,"102":67,"103":67,"104":67,"105":1,"106":68,"107":68,"108":1,"109":67,"110":2,"111":65,"112":75,"113":5,"114":75,"115":4,"116":4,"117":75,"118":1,"119":5,"120":5,"121":5,"122":5,"123":25,"124":8,"125":3,"126":1,"127":2,"128":5,"129":17,"130":17,"131":6,"132":0,"133":5,"134":1,"135":121,"136":1,"137":120,"138":120,"139":120,"140":2,"141":118,"142":1,"143":322,"144":322,"145":154,"146":168,"147":1,"148":3,"149":3,"150":3,"151":3,"152":0,"153":3,"154":1,"155":1,"156":5,"157":2,"158":3,"159":3,"160":3,"161":3,"162":3,"163":2,"164":2,"165":2,"166":1,"167":1,"168":1,"169":1,"170":1,"171":0},"f":{"0":1,"1":0,"2":0,"3":1,"4":1,"5":4,"6":1,"7":86,"8":73,"9":36,"10":76,"11":170,"12":75,"13":171,"14":171,"15":171,"16":170,"17":122,"18":76,"19":5,"20":121,"21":322,"22":3,"23":3,"24":3,"25":5,"26":2},"b":{"0":[1,1,1],"1":[1,0,0,0],"2":[0,0],"3":[0,1],"4":[1,1,1],"5":[3,1],"6":[4,4],"7":[86,86,86],"8":[36,37],"9":[73,72],"10":[5,31],"11":[36,36],"12":[76,94],"13":[75,0],"14":[135,36],"15":[36,135],"16":[5,166],"17":[170,1],"18":[171,170],"19":[113,57],"20":[2,168],"21":[170,4,2],"22":[1,169],"23":[170,1],"24":[134,36],"25":[122,48],"26":[3,119],"27":[76,46],"28":[122,81],"29":[8,68],"30":[4,4],"31":[67,1],"32":[1,67],"33":[2,65],"34":[5,70],"35":[75,73],"36":[4,71],"37":[75,4],"38":[5,0],"39":[8,17],"40":[3,5],"41":[1,2],"42":[3,2],"43":[17,0],"44":[6,11],"45":[1,120],"46":[2,118],"47":[322,0],"48":[154,168],"49":[0,3],"50":[2,3],"51":[3,0],"52":[2,1],"53":[3,3]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"f4a9eb6e941986f534bc14577f52c636e5324317","contentHash":"95da72e46ceb081c3cdd7a0ec14c4fd9_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/dataClean.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/dataClean.ts","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"1":{"start":{"line":3,"column":4},"end":{"line":3,"column":62}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"3":{"start":{"line":6,"column":18},"end":{"line":6,"column":55}},"4":{"start":{"line":14,"column":20},"end":{"line":14,"column":51}},"5":{"start":{"line":15,"column":4},"end":{"line":15,"column":38}},"6":{"start":{"line":16,"column":25},"end":{"line":16,"column":76}},"7":{"start":{"line":17,"column":4},"end":{"line":22,"column":5}},"8":{"start":{"line":18,"column":8},"end":{"line":18,"column":51}},"9":{"start":{"line":21,"column":8},"end":{"line":21,"column":30}},"10":{"start":{"line":24,"column":0},"end":{"line":24,"column":34}},"11":{"start":{"line":29,"column":4},"end":{"line":34,"column":5}},"12":{"start":{"line":30,"column":8},"end":{"line":30,"column":61}},"13":{"start":{"line":33,"column":8},"end":{"line":33,"column":21}},"14":{"start":{"line":40,"column":14},"end":{"line":40,"column":30}},"15":{"start":{"line":48,"column":4},"end":{"line":53,"column":5}},"16":{"start":{"line":49,"column":8},"end":{"line":51,"column":9}},"17":{"start":{"line":50,"column":12},"end":{"line":50,"column":18}},"18":{"start":{"line":52,"column":8},"end":{"line":52,"column":14}},"19":{"start":{"line":54,"column":4},"end":{"line":70,"column":5}},"20":{"start":{"line":55,"column":8},"end":{"line":55,"column":53}},"21":{"start":{"line":56,"column":8},"end":{"line":56,"column":39}},"22":{"start":{"line":69,"column":8},"end":{"line":69,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":56},"end":{"line":2,"column":57}},"loc":{"start":{"line":2,"column":71},"end":{"line":4,"column":1}},"line":2},"1":{"name":"prepareData","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":37},"end":{"line":23,"column":1}},"line":13},"2":{"name":"concatLeftChunk","decl":{"start":{"line":28,"column":9},"end":{"line":28,"column":24}},"loc":{"start":{"line":28,"column":41},"end":{"line":35,"column":1}},"line":28},"3":{"name":"cleanUtf8Split","decl":{"start":{"line":39,"column":9},"end":{"line":39,"column":23}},"loc":{"start":{"line":39,"column":40},"end":{"line":71,"column":1}},"line":39}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":23},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":51}},{"start":{"line":2,"column":56},"end":{"line":4,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":11},"end":{"line":3,"column":61}},"type":"cond-expr","locations":[{"start":{"line":3,"column":37},"end":{"line":3,"column":40}},{"start":{"line":3,"column":43},"end":{"line":3,"column":61}}],"line":3},"2":{"loc":{"start":{"line":3,"column":12},"end":{"line":3,"column":33}},"type":"binary-expr","locations":[{"start":{"line":3,"column":12},"end":{"line":3,"column":15}},{"start":{"line":3,"column":19},"end":{"line":3,"column":33}}],"line":3},"3":{"loc":{"start":{"line":17,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":22,"column":5}},{"start":{"line":17,"column":4},"end":{"line":22,"column":5}}],"line":17},"4":{"loc":{"start":{"line":29,"column":4},"end":{"line":34,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":34,"column":5}},{"start":{"line":29,"column":4},"end":{"line":34,"column":5}}],"line":29},"5":{"loc":{"start":{"line":29,"column":8},"end":{"line":29,"column":65}},"type":"binary-expr","locations":[{"start":{"line":29,"column":8},"end":{"line":29,"column":29}},{"start":{"line":29,"column":33},"end":{"line":29,"column":65}}],"line":29},"6":{"loc":{"start":{"line":48,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":53,"column":5}},{"start":{"line":48,"column":4},"end":{"line":53,"column":5}}],"line":48},"7":{"loc":{"start":{"line":54,"column":4},"end":{"line":70,"column":5}},"type":"if","locations":[{"start":{"line":54,"column":4},"end":{"line":70,"column":5}},{"start":{"line":54,"column":4},"end":{"line":70,"column":5}}],"line":54}},"s":{"0":1,"1":1,"2":1,"3":1,"4":135,"5":135,"6":135,"7":135,"8":121,"9":14,"10":1,"11":135,"12":56,"13":79,"14":135,"15":135,"16":2,"17":0,"18":2,"19":135,"20":2,"21":2,"22":133},"f":{"0":1,"1":135,"2":135,"3":135},"b":{"0":[1,1,1],"1":[0,1],"2":[1,1],"3":[121,14],"4":[56,79],"5":[135,58],"6":[2,133],"7":[2,133]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"bf4dfc19c2766510feed388a8341352360e1abd4","contentHash":"ae405e63b3df5a84c083dd00fdc7a598_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/util.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/util.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":4,"column":17},"end":{"line":4,"column":39}},"2":{"start":{"line":5,"column":17},"end":{"line":7,"column":28}},"3":{"start":{"line":8,"column":4},"end":{"line":8,"column":22}},"4":{"start":{"line":9,"column":4},"end":{"line":9,"column":18}},"5":{"start":{"line":11,"column":0},"end":{"line":11,"column":38}},"6":{"start":{"line":13,"column":17},"end":{"line":15,"column":23}},"7":{"start":{"line":16,"column":4},"end":{"line":16,"column":18}},"8":{"start":{"line":18,"column":0},"end":{"line":18,"column":34}},"9":{"start":{"line":20,"column":14},"end":{"line":20,"column":16}},"10":{"start":{"line":21,"column":4},"end":{"line":25,"column":5}},"11":{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},"12":{"start":{"line":23,"column":12},"end":{"line":23,"column":29}},"13":{"start":{"line":26,"column":4},"end":{"line":26,"column":15}},"14":{"start":{"line":28,"column":0},"end":{"line":28,"column":34}}},"fnMap":{"0":{"name":"bufFromString","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":22}},"loc":{"start":{"line":3,"column":28},"end":{"line":10,"column":1}},"line":3},"1":{"name":"emptyBuffer","decl":{"start":{"line":12,"column":9},"end":{"line":12,"column":20}},"loc":{"start":{"line":12,"column":23},"end":{"line":17,"column":1}},"line":12},"2":{"name":"filterArray","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":20}},"loc":{"start":{"line":19,"column":34},"end":{"line":27,"column":1}},"line":19}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":17},"end":{"line":7,"column":28}},"type":"cond-expr","locations":[{"start":{"line":6,"column":10},"end":{"line":6,"column":36}},{"start":{"line":7,"column":10},"end":{"line":7,"column":28}}],"line":5},"1":{"loc":{"start":{"line":13,"column":17},"end":{"line":15,"column":23}},"type":"cond-expr","locations":[{"start":{"line":14,"column":10},"end":{"line":14,"column":31}},{"start":{"line":15,"column":10},"end":{"line":15,"column":23}}],"line":13},"2":{"loc":{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},"type":"if","locations":[{"start":{"line":22,"column":8},"end":{"line":24,"column":9}},{"start":{"line":22,"column":8},"end":{"line":24,"column":9}}],"line":22}},"s":{"0":1,"1":322,"2":322,"3":322,"4":322,"5":1,"6":0,"7":0,"8":1,"9":25,"10":25,"11":127,"12":56,"13":25,"14":1},"f":{"0":322,"1":0,"2":25},"b":{"0":[322,0],"1":[0,0],"2":[56,71]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"593af791006f845d99bb21577e96db025807af2e","contentHash":"fe3e34ce3269ea09d2db1b85caa34510_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/rowSplit.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/rowSplit.ts","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"1":{"start":{"line":3,"column":4},"end":{"line":3,"column":62}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"3":{"start":{"line":6,"column":15},"end":{"line":6,"column":51}},"4":{"start":{"line":7,"column":13},"end":{"line":7,"column":30}},"5":{"start":{"line":8,"column":23},"end":{"line":8,"column":49}},"6":{"start":{"line":9,"column":30},"end":{"line":193,"column":3}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":25}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":31}},"9":{"start":{"line":13,"column":8},"end":{"line":13,"column":38}},"10":{"start":{"line":14,"column":8},"end":{"line":14,"column":44}},"11":{"start":{"line":15,"column":8},"end":{"line":15,"column":43}},"12":{"start":{"line":16,"column":8},"end":{"line":16,"column":41}},"13":{"start":{"line":17,"column":8},"end":{"line":17,"column":45}},"14":{"start":{"line":19,"column":4},"end":{"line":28,"column":7}},"15":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"16":{"start":{"line":22,"column":16},"end":{"line":22,"column":86}},"17":{"start":{"line":24,"column":12},"end":{"line":24,"column":43}},"18":{"start":{"line":29,"column":4},"end":{"line":56,"column":6}},"19":{"start":{"line":30,"column":8},"end":{"line":32,"column":9}},"20":{"start":{"line":31,"column":12},"end":{"line":31,"column":47}},"21":{"start":{"line":33,"column":20},"end":{"line":33,"column":30}},"22":{"start":{"line":34,"column":19},"end":{"line":34,"column":28}},"23":{"start":{"line":35,"column":21},"end":{"line":35,"column":32}},"24":{"start":{"line":36,"column":8},"end":{"line":38,"column":9}},"25":{"start":{"line":37,"column":12},"end":{"line":37,"column":75}},"26":{"start":{"line":39,"column":8},"end":{"line":42,"column":9}},"27":{"start":{"line":40,"column":12},"end":{"line":40,"column":74}},"28":{"start":{"line":41,"column":12},"end":{"line":41,"column":41}},"29":{"start":{"line":43,"column":24},"end":{"line":43,"column":56}},"30":{"start":{"line":44,"column":21},"end":{"line":44,"column":46}},"31":{"start":{"line":45,"column":8},"end":{"line":55,"column":9}},"32":{"start":{"line":46,"column":12},"end":{"line":50,"column":13}},"33":{"start":{"line":47,"column":16},"end":{"line":49,"column":17}},"34":{"start":{"line":48,"column":20},"end":{"line":48,"column":49}},"35":{"start":{"line":51,"column":12},"end":{"line":51,"column":51}},"36":{"start":{"line":54,"column":12},"end":{"line":54,"column":65}},"37":{"start":{"line":57,"column":4},"end":{"line":111,"column":6}},"38":{"start":{"line":58,"column":18},"end":{"line":58,"column":20}},"39":{"start":{"line":59,"column":22},"end":{"line":59,"column":27}},"40":{"start":{"line":60,"column":24},"end":{"line":60,"column":26}},"41":{"start":{"line":61,"column":8},"end":{"line":106,"column":9}},"42":{"start":{"line":62,"column":20},"end":{"line":62,"column":29}},"43":{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},"44":{"start":{"line":64,"column":16},"end":{"line":64,"column":33}},"45":{"start":{"line":66,"column":22},"end":{"line":66,"column":30}},"46":{"start":{"line":67,"column":12},"end":{"line":105,"column":13}},"47":{"start":{"line":68,"column":16},"end":{"line":88,"column":17}},"48":{"start":{"line":69,"column":20},"end":{"line":69,"column":36}},"49":{"start":{"line":70,"column":20},"end":{"line":80,"column":21}},"50":{"start":{"line":71,"column":24},"end":{"line":71,"column":65}},"51":{"start":{"line":72,"column":24},"end":{"line":72,"column":48}},"52":{"start":{"line":73,"column":24},"end":{"line":73,"column":36}},"53":{"start":{"line":74,"column":24},"end":{"line":74,"column":33}},"54":{"start":{"line":77,"column":24},"end":{"line":77,"column":39}},"55":{"start":{"line":78,"column":24},"end":{"line":78,"column":39}},"56":{"start":{"line":79,"column":24},"end":{"line":79,"column":33}},"57":{"start":{"line":83,"column":20},"end":{"line":85,"column":21}},"58":{"start":{"line":84,"column":24},"end":{"line":84,"column":42}},"59":{"start":{"line":86,"column":20},"end":{"line":86,"column":32}},"60":{"start":{"line":87,"column":20},"end":{"line":87,"column":29}},"61":{"start":{"line":91,"column":16},"end":{"line":104,"column":17}},"62":{"start":{"line":92,"column":20},"end":{"line":92,"column":36}},"63":{"start":{"line":93,"column":20},"end":{"line":93,"column":45}},"64":{"start":{"line":94,"column":20},"end":{"line":94,"column":47}},"65":{"start":{"line":95,"column":20},"end":{"line":95,"column":60}},"66":{"start":{"line":96,"column":20},"end":{"line":98,"column":21}},"67":{"start":{"line":97,"column":24},"end":{"line":97,"column":58}},"68":{"start":{"line":99,"column":20},"end":{"line":99,"column":40}},"69":{"start":{"line":100,"column":20},"end":{"line":100,"column":35}},"70":{"start":{"line":103,"column":20},"end":{"line":103,"column":47}},"71":{"start":{"line":110,"column":8},"end":{"line":110,"column":48}},"72":{"start":{"line":112,"column":4},"end":{"line":133,"column":6}},"73":{"start":{"line":114,"column":8},"end":{"line":122,"column":9}},"74":{"start":{"line":115,"column":12},"end":{"line":115,"column":39}},"75":{"start":{"line":117,"column":13},"end":{"line":122,"column":9}},"76":{"start":{"line":118,"column":12},"end":{"line":118,"column":53}},"77":{"start":{"line":121,"column":12},"end":{"line":121,"column":50}},"78":{"start":{"line":123,"column":20},"end":{"line":123,"column":21}},"79":{"start":{"line":124,"column":18},"end":{"line":124,"column":21}},"80":{"start":{"line":125,"column":8},"end":{"line":131,"column":11}},"81":{"start":{"line":126,"column":29},"end":{"line":126,"column":57}},"82":{"start":{"line":127,"column":12},"end":{"line":130,"column":13}},"83":{"start":{"line":128,"column":16},"end":{"line":128,"column":28}},"84":{"start":{"line":129,"column":16},"end":{"line":129,"column":35}},"85":{"start":{"line":132,"column":8},"end":{"line":132,"column":19}},"86":{"start":{"line":134,"column":4},"end":{"line":139,"column":6}},"87":{"start":{"line":135,"column":20},"end":{"line":135,"column":30}},"88":{"start":{"line":136,"column":21},"end":{"line":136,"column":32}},"89":{"start":{"line":137,"column":8},"end":{"line":138,"column":73}},"90":{"start":{"line":140,"column":4},"end":{"line":153,"column":6}},"91":{"start":{"line":141,"column":20},"end":{"line":141,"column":30}},"92":{"start":{"line":142,"column":21},"end":{"line":142,"column":32}},"93":{"start":{"line":143,"column":8},"end":{"line":145,"column":9}},"94":{"start":{"line":144,"column":12},"end":{"line":144,"column":34}},"95":{"start":{"line":146,"column":20},"end":{"line":146,"column":21}},"96":{"start":{"line":147,"column":18},"end":{"line":147,"column":32}},"97":{"start":{"line":148,"column":8},"end":{"line":151,"column":9}},"98":{"start":{"line":149,"column":12},"end":{"line":149,"column":18}},"99":{"start":{"line":150,"column":12},"end":{"line":150,"column":20}},"100":{"start":{"line":152,"column":8},"end":{"line":152,"column":31}},"101":{"start":{"line":162,"column":4},"end":{"line":170,"column":6}},"102":{"start":{"line":163,"column":18},"end":{"line":163,"column":56}},"103":{"start":{"line":164,"column":8},"end":{"line":166,"column":9}},"104":{"start":{"line":165,"column":12},"end":{"line":165,"column":93}},"105":{"start":{"line":167,"column":21},"end":{"line":167,"column":43}},"106":{"start":{"line":169,"column":8},"end":{"line":169,"column":51}},"107":{"start":{"line":171,"column":4},"end":{"line":191,"column":6}},"108":{"start":{"line":172,"column":23},"end":{"line":172,"column":25}},"109":{"start":{"line":173,"column":19},"end":{"line":173,"column":21}},"110":{"start":{"line":174,"column":8},"end":{"line":189,"column":9}},"111":{"start":{"line":175,"column":23},"end":{"line":175,"column":43}},"112":{"start":{"line":176,"column":22},"end":{"line":176,"column":38}},"113":{"start":{"line":177,"column":12},"end":{"line":188,"column":13}},"114":{"start":{"line":178,"column":16},"end":{"line":183,"column":17}},"115":{"start":{"line":179,"column":20},"end":{"line":179,"column":105}},"116":{"start":{"line":182,"column":20},"end":{"line":182,"column":45}},"117":{"start":{"line":184,"column":16},"end":{"line":184,"column":26}},"118":{"start":{"line":187,"column":16},"end":{"line":187,"column":87}},"119":{"start":{"line":190,"column":8},"end":{"line":190,"column":54}},"120":{"start":{"line":192,"column":4},"end":{"line":192,"column":20}},"121":{"start":{"line":194,"column":0},"end":{"line":194,"column":28}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":56},"end":{"line":2,"column":57}},"loc":{"start":{"line":2,"column":71},"end":{"line":4,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":30},"end":{"line":9,"column":31}},"loc":{"start":{"line":9,"column":42},"end":{"line":193,"column":1}},"line":9},"2":{"name":"RowSplit","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":21}},"loc":{"start":{"line":10,"column":28},"end":{"line":18,"column":5}},"line":10},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":13},"end":{"line":20,"column":14}},"loc":{"start":{"line":20,"column":25},"end":{"line":25,"column":9}},"line":20},"4":{"name":"(anonymous_4)","decl":{"start":{"line":29,"column":31},"end":{"line":29,"column":32}},"loc":{"start":{"line":29,"column":51},"end":{"line":56,"column":5}},"line":29},"5":{"name":"(anonymous_5)","decl":{"start":{"line":57,"column":34},"end":{"line":57,"column":35}},"loc":{"start":{"line":57,"column":76},"end":{"line":111,"column":5}},"line":57},"6":{"name":"(anonymous_6)","decl":{"start":{"line":112,"column":38},"end":{"line":112,"column":39}},"loc":{"start":{"line":112,"column":58},"end":{"line":133,"column":5}},"line":112},"7":{"name":"(anonymous_7)","decl":{"start":{"line":125,"column":24},"end":{"line":125,"column":25}},"loc":{"start":{"line":125,"column":41},"end":{"line":131,"column":9}},"line":125},"8":{"name":"(anonymous_8)","decl":{"start":{"line":134,"column":37},"end":{"line":134,"column":38}},"loc":{"start":{"line":134,"column":52},"end":{"line":139,"column":5}},"line":134},"9":{"name":"(anonymous_9)","decl":{"start":{"line":140,"column":38},"end":{"line":140,"column":39}},"loc":{"start":{"line":140,"column":53},"end":{"line":153,"column":5}},"line":140},"10":{"name":"(anonymous_10)","decl":{"start":{"line":162,"column":37},"end":{"line":162,"column":38}},"loc":{"start":{"line":162,"column":56},"end":{"line":170,"column":5}},"line":162},"11":{"name":"(anonymous_11)","decl":{"start":{"line":171,"column":41},"end":{"line":171,"column":42}},"loc":{"start":{"line":171,"column":58},"end":{"line":191,"column":5}},"line":171}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":23},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":51}},{"start":{"line":2,"column":56},"end":{"line":4,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":11},"end":{"line":3,"column":61}},"type":"cond-expr","locations":[{"start":{"line":3,"column":37},"end":{"line":3,"column":40}},{"start":{"line":3,"column":43},"end":{"line":3,"column":61}}],"line":3},"2":{"loc":{"start":{"line":3,"column":12},"end":{"line":3,"column":33}},"type":"binary-expr","locations":[{"start":{"line":3,"column":12},"end":{"line":3,"column":15}},{"start":{"line":3,"column":19},"end":{"line":3,"column":33}}],"line":3},"3":{"loc":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"type":"if","locations":[{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},{"start":{"line":21,"column":12},"end":{"line":23,"column":13}}],"line":21},"4":{"loc":{"start":{"line":30,"column":8},"end":{"line":32,"column":9}},"type":"if","locations":[{"start":{"line":30,"column":8},"end":{"line":32,"column":9}},{"start":{"line":30,"column":8},"end":{"line":32,"column":9}}],"line":30},"5":{"loc":{"start":{"line":36,"column":8},"end":{"line":38,"column":9}},"type":"if","locations":[{"start":{"line":36,"column":8},"end":{"line":38,"column":9}},{"start":{"line":36,"column":8},"end":{"line":38,"column":9}}],"line":36},"6":{"loc":{"start":{"line":36,"column":12},"end":{"line":36,"column":122}},"type":"binary-expr","locations":[{"start":{"line":36,"column":12},"end":{"line":36,"column":61}},{"start":{"line":36,"column":65},"end":{"line":36,"column":122}}],"line":36},"7":{"loc":{"start":{"line":39,"column":8},"end":{"line":42,"column":9}},"type":"if","locations":[{"start":{"line":39,"column":8},"end":{"line":42,"column":9}},{"start":{"line":39,"column":8},"end":{"line":42,"column":9}}],"line":39},"8":{"loc":{"start":{"line":39,"column":12},"end":{"line":39,"column":60}},"type":"binary-expr","locations":[{"start":{"line":39,"column":12},"end":{"line":39,"column":34}},{"start":{"line":39,"column":38},"end":{"line":39,"column":60}}],"line":39},"9":{"loc":{"start":{"line":45,"column":8},"end":{"line":55,"column":9}},"type":"if","locations":[{"start":{"line":45,"column":8},"end":{"line":55,"column":9}},{"start":{"line":45,"column":8},"end":{"line":55,"column":9}}],"line":45},"10":{"loc":{"start":{"line":46,"column":12},"end":{"line":50,"column":13}},"type":"if","locations":[{"start":{"line":46,"column":12},"end":{"line":50,"column":13}},{"start":{"line":46,"column":12},"end":{"line":50,"column":13}}],"line":46},"11":{"loc":{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},{"start":{"line":63,"column":12},"end":{"line":65,"column":13}}],"line":63},"12":{"loc":{"start":{"line":63,"column":16},"end":{"line":63,"column":32}},"type":"binary-expr","locations":[{"start":{"line":63,"column":16},"end":{"line":63,"column":24}},{"start":{"line":63,"column":28},"end":{"line":63,"column":32}}],"line":63},"13":{"loc":{"start":{"line":67,"column":12},"end":{"line":105,"column":13}},"type":"if","locations":[{"start":{"line":67,"column":12},"end":{"line":105,"column":13}},{"start":{"line":67,"column":12},"end":{"line":105,"column":13}}],"line":67},"14":{"loc":{"start":{"line":68,"column":16},"end":{"line":88,"column":17}},"type":"if","locations":[{"start":{"line":68,"column":16},"end":{"line":88,"column":17}},{"start":{"line":68,"column":16},"end":{"line":88,"column":17}}],"line":68},"15":{"loc":{"start":{"line":70,"column":20},"end":{"line":80,"column":21}},"type":"if","locations":[{"start":{"line":70,"column":20},"end":{"line":80,"column":21}},{"start":{"line":70,"column":20},"end":{"line":80,"column":21}}],"line":70},"16":{"loc":{"start":{"line":83,"column":20},"end":{"line":85,"column":21}},"type":"if","locations":[{"start":{"line":83,"column":20},"end":{"line":85,"column":21}},{"start":{"line":83,"column":20},"end":{"line":85,"column":21}}],"line":83},"17":{"loc":{"start":{"line":91,"column":16},"end":{"line":104,"column":17}},"type":"if","locations":[{"start":{"line":91,"column":16},"end":{"line":104,"column":17}},{"start":{"line":91,"column":16},"end":{"line":104,"column":17}}],"line":91},"18":{"loc":{"start":{"line":96,"column":20},"end":{"line":98,"column":21}},"type":"if","locations":[{"start":{"line":96,"column":20},"end":{"line":98,"column":21}},{"start":{"line":96,"column":20},"end":{"line":98,"column":21}}],"line":96},"19":{"loc":{"start":{"line":114,"column":8},"end":{"line":122,"column":9}},"type":"if","locations":[{"start":{"line":114,"column":8},"end":{"line":122,"column":9}},{"start":{"line":114,"column":8},"end":{"line":122,"column":9}}],"line":114},"20":{"loc":{"start":{"line":117,"column":13},"end":{"line":122,"column":9}},"type":"if","locations":[{"start":{"line":117,"column":13},"end":{"line":122,"column":9}},{"start":{"line":117,"column":13},"end":{"line":122,"column":9}}],"line":117},"21":{"loc":{"start":{"line":127,"column":12},"end":{"line":130,"column":13}},"type":"if","locations":[{"start":{"line":127,"column":12},"end":{"line":130,"column":13}},{"start":{"line":127,"column":12},"end":{"line":130,"column":13}}],"line":127},"22":{"loc":{"start":{"line":137,"column":15},"end":{"line":138,"column":72}},"type":"binary-expr","locations":[{"start":{"line":137,"column":15},"end":{"line":137,"column":31}},{"start":{"line":137,"column":36},"end":{"line":137,"column":52}},{"start":{"line":138,"column":12},"end":{"line":138,"column":29}},{"start":{"line":138,"column":34},"end":{"line":138,"column":50}},{"start":{"line":138,"column":54},"end":{"line":138,"column":70}}],"line":137},"23":{"loc":{"start":{"line":143,"column":8},"end":{"line":145,"column":9}},"type":"if","locations":[{"start":{"line":143,"column":8},"end":{"line":145,"column":9}},{"start":{"line":143,"column":8},"end":{"line":145,"column":9}}],"line":143},"24":{"loc":{"start":{"line":148,"column":15},"end":{"line":148,"column":56}},"type":"binary-expr","locations":[{"start":{"line":148,"column":15},"end":{"line":148,"column":33}},{"start":{"line":148,"column":37},"end":{"line":148,"column":56}}],"line":148},"25":{"loc":{"start":{"line":164,"column":8},"end":{"line":166,"column":9}},"type":"if","locations":[{"start":{"line":164,"column":8},"end":{"line":166,"column":9}},{"start":{"line":164,"column":8},"end":{"line":166,"column":9}}],"line":164},"26":{"loc":{"start":{"line":177,"column":12},"end":{"line":188,"column":13}},"type":"if","locations":[{"start":{"line":177,"column":12},"end":{"line":188,"column":13}},{"start":{"line":177,"column":12},"end":{"line":188,"column":13}}],"line":177},"27":{"loc":{"start":{"line":177,"column":16},"end":{"line":177,"column":67}},"type":"binary-expr","locations":[{"start":{"line":177,"column":16},"end":{"line":177,"column":26}},{"start":{"line":177,"column":30},"end":{"line":177,"column":67}}],"line":177},"28":{"loc":{"start":{"line":178,"column":16},"end":{"line":183,"column":17}},"type":"if","locations":[{"start":{"line":178,"column":16},"end":{"line":183,"column":17}},{"start":{"line":178,"column":16},"end":{"line":183,"column":17}}],"line":178},"29":{"loc":{"start":{"line":187,"column":31},"end":{"line":187,"column":85}},"type":"binary-expr","locations":[{"start":{"line":187,"column":31},"end":{"line":187,"column":77}},{"start":{"line":187,"column":81},"end":{"line":187,"column":85}}],"line":187}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":88,"8":88,"9":88,"10":88,"11":88,"12":88,"13":88,"14":1,"15":32226,"16":78,"17":32226,"18":1,"19":32234,"20":8,"21":32226,"22":32226,"23":32226,"24":32226,"25":4,"26":32226,"27":2,"28":2,"29":32226,"30":32226,"31":32226,"32":3,"33":3,"34":9,"35":3,"36":32223,"37":1,"38":32223,"39":32223,"40":32223,"41":32223,"42":66882,"43":66882,"44":66715,"45":66882,"46":66882,"47":66733,"48":173,"49":173,"50":113,"51":113,"52":113,"53":113,"54":60,"55":60,"56":60,"57":66560,"58":66548,"59":66560,"60":66560,"61":149,"62":26,"63":26,"64":26,"65":26,"66":26,"67":26,"68":26,"69":26,"70":123,"71":32223,"72":1,"73":8,"74":6,"75":2,"76":1,"77":1,"78":7,"79":7,"80":7,"81":33,"82":33,"83":13,"84":13,"85":7,"86":1,"87":66733,"88":66733,"89":66733,"90":1,"91":322,"92":322,"93":322,"94":316,"95":322,"96":322,"97":322,"98":223,"99":223,"100":322,"101":1,"102":139,"103":139,"104":26,"105":139,"106":139,"107":1,"108":123,"109":123,"110":123,"111":32163,"112":32163,"113":32163,"114":32134,"115":20,"116":32114,"117":32134,"118":29,"119":123,"120":1,"121":1},"f":{"0":1,"1":1,"2":88,"3":32226,"4":32234,"5":32223,"6":8,"7":33,"8":66733,"9":322,"10":139,"11":123},"b":{"0":[1,1,1],"1":[1,0],"2":[1,1],"3":[78,32148],"4":[8,32226],"5":[4,32222],"6":[32226,32226],"7":[2,32224],"8":[32226,10],"9":[3,32223],"10":[3,0],"11":[66715,167],"12":[66882,66733],"13":[66733,149],"14":[173,66560],"15":[113,60],"16":[66548,12],"17":[26,123],"18":[26,0],"19":[6,2],"20":[1,1],"21":[13,20],"22":[66733,182,13,13,11],"23":[316,6],"24":[545,323],"25":[26,113],"26":[32134,29],"27":[32163,32],"28":[20,32114],"29":[29,0]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"512fbda8738dffbde48b6299fc2d6b1bc024ec42","contentHash":"d281261fc0fb3df34db8450f9a805f85_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/lineToJson.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/lineToJson.ts","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"1":{"start":{"line":3,"column":4},"end":{"line":3,"column":62}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"3":{"start":{"line":6,"column":17},"end":{"line":6,"column":55}},"4":{"start":{"line":7,"column":12},"end":{"line":7,"column":50}},"5":{"start":{"line":8,"column":13},"end":{"line":8,"column":55}},"6":{"start":{"line":10,"column":14},"end":{"line":10,"column":16}},"7":{"start":{"line":11,"column":4},"end":{"line":16,"column":5}},"8":{"start":{"line":12,"column":16},"end":{"line":12,"column":47}},"9":{"start":{"line":13,"column":8},"end":{"line":15,"column":9}},"10":{"start":{"line":14,"column":12},"end":{"line":14,"column":24}},"11":{"start":{"line":17,"column":4},"end":{"line":17,"column":15}},"12":{"start":{"line":19,"column":0},"end":{"line":19,"column":28}},"13":{"start":{"line":22,"column":4},"end":{"line":24,"column":5}},"14":{"start":{"line":23,"column":8},"end":{"line":23,"column":97}},"15":{"start":{"line":25,"column":18},"end":{"line":25,"column":49}},"16":{"start":{"line":26,"column":20},"end":{"line":26,"column":56}},"17":{"start":{"line":27,"column":4},"end":{"line":32,"column":5}},"18":{"start":{"line":28,"column":8},"end":{"line":28,"column":25}},"19":{"start":{"line":31,"column":8},"end":{"line":31,"column":20}},"20":{"start":{"line":35,"column":19},"end":{"line":35,"column":24}},"21":{"start":{"line":36,"column":20},"end":{"line":36,"column":22}},"22":{"start":{"line":37,"column":4},"end":{"line":67,"column":5}},"23":{"start":{"line":38,"column":19},"end":{"line":38,"column":25}},"24":{"start":{"line":39,"column":8},"end":{"line":41,"column":9}},"25":{"start":{"line":40,"column":12},"end":{"line":40,"column":21}},"26":{"start":{"line":42,"column":8},"end":{"line":42,"column":24}},"27":{"start":{"line":43,"column":19},"end":{"line":43,"column":29}},"28":{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},"29":{"start":{"line":45,"column":12},"end":{"line":45,"column":50}},"30":{"start":{"line":47,"column":23},"end":{"line":47,"column":49}},"31":{"start":{"line":48,"column":8},"end":{"line":66,"column":9}},"32":{"start":{"line":49,"column":26},"end":{"line":49,"column":65}},"33":{"start":{"line":50,"column":12},"end":{"line":52,"column":13}},"34":{"start":{"line":51,"column":16},"end":{"line":51,"column":59}},"35":{"start":{"line":59,"column":12},"end":{"line":62,"column":13}},"36":{"start":{"line":60,"column":34},"end":{"line":60,"column":64}},"37":{"start":{"line":61,"column":16},"end":{"line":61,"column":41}},"38":{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},"39":{"start":{"line":64,"column":16},"end":{"line":64,"column":56}},"40":{"start":{"line":68,"column":4},"end":{"line":73,"column":5}},"41":{"start":{"line":69,"column":8},"end":{"line":69,"column":25}},"42":{"start":{"line":72,"column":8},"end":{"line":72,"column":20}},"43":{"start":{"line":75,"column":18},"end":{"line":79,"column":1}},"44":{"start":{"line":81,"column":4},"end":{"line":108,"column":5}},"45":{"start":{"line":82,"column":8},"end":{"line":82,"column":47}},"46":{"start":{"line":85,"column":19},"end":{"line":85,"column":50}},"47":{"start":{"line":86,"column":8},"end":{"line":88,"column":9}},"48":{"start":{"line":87,"column":12},"end":{"line":87,"column":58}},"49":{"start":{"line":89,"column":8},"end":{"line":91,"column":9}},"50":{"start":{"line":90,"column":12},"end":{"line":90,"column":47}},"51":{"start":{"line":92,"column":8},"end":{"line":107,"column":9}},"52":{"start":{"line":93,"column":12},"end":{"line":93,"column":45}},"53":{"start":{"line":94,"column":30},"end":{"line":94,"column":47}},"54":{"start":{"line":95,"column":12},"end":{"line":100,"column":13}},"55":{"start":{"line":96,"column":16},"end":{"line":96,"column":69}},"56":{"start":{"line":99,"column":16},"end":{"line":99,"column":62}},"57":{"start":{"line":102,"column":13},"end":{"line":107,"column":9}},"58":{"start":{"line":103,"column":12},"end":{"line":103,"column":58}},"59":{"start":{"line":106,"column":12},"end":{"line":106,"column":58}},"60":{"start":{"line":111,"column":4},"end":{"line":128,"column":5}},"61":{"start":{"line":112,"column":8},"end":{"line":127,"column":9}},"62":{"start":{"line":113,"column":12},"end":{"line":113,"column":70}},"63":{"start":{"line":116,"column":12},"end":{"line":126,"column":13}},"64":{"start":{"line":117,"column":16},"end":{"line":122,"column":17}},"65":{"start":{"line":118,"column":20},"end":{"line":118,"column":78}},"66":{"start":{"line":121,"column":20},"end":{"line":121,"column":78}},"67":{"start":{"line":125,"column":16},"end":{"line":125,"column":74}},"68":{"start":{"line":129,"column":4},"end":{"line":129,"column":74}},"69":{"start":{"line":133,"column":4},"end":{"line":133,"column":29}},"70":{"start":{"line":136,"column":4},"end":{"line":136,"column":43}},"71":{"start":{"line":139,"column":4},"end":{"line":153,"column":5}},"72":{"start":{"line":140,"column":8},"end":{"line":140,"column":53}},"73":{"start":{"line":142,"column":9},"end":{"line":153,"column":5}},"74":{"start":{"line":143,"column":8},"end":{"line":143,"column":66}},"75":{"start":{"line":145,"column":9},"end":{"line":153,"column":5}},"76":{"start":{"line":146,"column":8},"end":{"line":146,"column":66}},"77":{"start":{"line":148,"column":9},"end":{"line":153,"column":5}},"78":{"start":{"line":149,"column":8},"end":{"line":149,"column":67}},"79":{"start":{"line":152,"column":8},"end":{"line":152,"column":66}},"80":{"start":{"line":156,"column":14},"end":{"line":156,"column":30}},"81":{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},"82":{"start":{"line":158,"column":8},"end":{"line":158,"column":20}},"83":{"start":{"line":160,"column":4},"end":{"line":160,"column":15}},"84":{"start":{"line":163,"column":4},"end":{"line":163,"column":27}},"85":{"start":{"line":166,"column":17},"end":{"line":166,"column":28}},"86":{"start":{"line":167,"column":4},"end":{"line":169,"column":5}},"87":{"start":{"line":168,"column":8},"end":{"line":168,"column":32}},"88":{"start":{"line":170,"column":4},"end":{"line":181,"column":5}},"89":{"start":{"line":171,"column":8},"end":{"line":171,"column":32}},"90":{"start":{"line":173,"column":9},"end":{"line":181,"column":5}},"91":{"start":{"line":174,"column":8},"end":{"line":174,"column":33}},"92":{"start":{"line":176,"column":9},"end":{"line":181,"column":5}},"93":{"start":{"line":177,"column":8},"end":{"line":177,"column":30}},"94":{"start":{"line":180,"column":8},"end":{"line":180,"column":32}},"95":{"start":{"line":184,"column":17},"end":{"line":184,"column":28}},"96":{"start":{"line":185,"column":4},"end":{"line":190,"column":5}},"97":{"start":{"line":186,"column":8},"end":{"line":186,"column":21}},"98":{"start":{"line":189,"column":8},"end":{"line":189,"column":20}},"99":{"start":{"line":193,"column":4},"end":{"line":198,"column":5}},"100":{"start":{"line":194,"column":8},"end":{"line":194,"column":32}},"101":{"start":{"line":197,"column":8},"end":{"line":197,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":56},"end":{"line":2,"column":57}},"loc":{"start":{"line":2,"column":71},"end":{"line":4,"column":1}},"line":2},"1":{"name":"default_1","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":18}},"loc":{"start":{"line":9,"column":34},"end":{"line":18,"column":1}},"line":9},"2":{"name":"processRow","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":19}},"loc":{"start":{"line":21,"column":38},"end":{"line":33,"column":1}},"line":21},"3":{"name":"convertRowToJson","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":25}},"loc":{"start":{"line":34,"column":46},"end":{"line":74,"column":1}},"line":34},"4":{"name":"(anonymous_4)","decl":{"start":{"line":78,"column":12},"end":{"line":78,"column":13}},"loc":{"start":{"line":78,"column":24},"end":{"line":78,"column":27}},"line":78},"5":{"name":"getConvFunc","decl":{"start":{"line":80,"column":9},"end":{"line":80,"column":20}},"loc":{"start":{"line":80,"column":36},"end":{"line":109,"column":1}},"line":80},"6":{"name":"setPath","decl":{"start":{"line":110,"column":9},"end":{"line":110,"column":16}},"loc":{"start":{"line":110,"column":57},"end":{"line":131,"column":1}},"line":110},"7":{"name":"flatSetter","decl":{"start":{"line":132,"column":9},"end":{"line":132,"column":19}},"loc":{"start":{"line":132,"column":45},"end":{"line":134,"column":1}},"line":132},"8":{"name":"jsonSetter","decl":{"start":{"line":135,"column":9},"end":{"line":135,"column":19}},"loc":{"start":{"line":135,"column":45},"end":{"line":137,"column":1}},"line":135},"9":{"name":"checkType","decl":{"start":{"line":138,"column":9},"end":{"line":138,"column":18}},"loc":{"start":{"line":138,"column":46},"end":{"line":154,"column":1}},"line":138},"10":{"name":"numberType","decl":{"start":{"line":155,"column":9},"end":{"line":155,"column":19}},"loc":{"start":{"line":155,"column":26},"end":{"line":161,"column":1}},"line":155},"11":{"name":"stringType","decl":{"start":{"line":162,"column":9},"end":{"line":162,"column":19}},"loc":{"start":{"line":162,"column":26},"end":{"line":164,"column":1}},"line":162},"12":{"name":"dynamicType","decl":{"start":{"line":165,"column":9},"end":{"line":165,"column":20}},"loc":{"start":{"line":165,"column":27},"end":{"line":182,"column":1}},"line":165},"13":{"name":"booleanType","decl":{"start":{"line":183,"column":9},"end":{"line":183,"column":20}},"loc":{"start":{"line":183,"column":27},"end":{"line":191,"column":1}},"line":183},"14":{"name":"jsonType","decl":{"start":{"line":192,"column":9},"end":{"line":192,"column":17}},"loc":{"start":{"line":192,"column":24},"end":{"line":199,"column":1}},"line":192}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":23},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":51}},{"start":{"line":2,"column":56},"end":{"line":4,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":11},"end":{"line":3,"column":61}},"type":"cond-expr","locations":[{"start":{"line":3,"column":37},"end":{"line":3,"column":40}},{"start":{"line":3,"column":43},"end":{"line":3,"column":61}}],"line":3},"2":{"loc":{"start":{"line":3,"column":12},"end":{"line":3,"column":33}},"type":"binary-expr","locations":[{"start":{"line":3,"column":12},"end":{"line":3,"column":15}},{"start":{"line":3,"column":19},"end":{"line":3,"column":33}}],"line":3},"3":{"loc":{"start":{"line":13,"column":8},"end":{"line":15,"column":9}},"type":"if","locations":[{"start":{"line":13,"column":8},"end":{"line":15,"column":9}},{"start":{"line":13,"column":8},"end":{"line":15,"column":9}}],"line":13},"4":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":5}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":5}},{"start":{"line":22,"column":4},"end":{"line":24,"column":5}}],"line":22},"5":{"loc":{"start":{"line":22,"column":8},"end":{"line":22,"column":115}},"type":"binary-expr","locations":[{"start":{"line":22,"column":8},"end":{"line":22,"column":35}},{"start":{"line":22,"column":39},"end":{"line":22,"column":64}},{"start":{"line":22,"column":68},"end":{"line":22,"column":115}}],"line":22},"6":{"loc":{"start":{"line":25,"column":18},"end":{"line":25,"column":49}},"type":"binary-expr","locations":[{"start":{"line":25,"column":18},"end":{"line":25,"column":43}},{"start":{"line":25,"column":47},"end":{"line":25,"column":49}}],"line":25},"7":{"loc":{"start":{"line":27,"column":4},"end":{"line":32,"column":5}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":32,"column":5}},{"start":{"line":27,"column":4},"end":{"line":32,"column":5}}],"line":27},"8":{"loc":{"start":{"line":39,"column":8},"end":{"line":41,"column":9}},"type":"if","locations":[{"start":{"line":39,"column":8},"end":{"line":41,"column":9}},{"start":{"line":39,"column":8},"end":{"line":41,"column":9}}],"line":39},"9":{"loc":{"start":{"line":39,"column":12},"end":{"line":39,"column":54}},"type":"binary-expr","locations":[{"start":{"line":39,"column":12},"end":{"line":39,"column":39}},{"start":{"line":39,"column":43},"end":{"line":39,"column":54}}],"line":39},"10":{"loc":{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},"type":"if","locations":[{"start":{"line":44,"column":8},"end":{"line":46,"column":9}},{"start":{"line":44,"column":8},"end":{"line":46,"column":9}}],"line":44},"11":{"loc":{"start":{"line":44,"column":12},"end":{"line":44,"column":32}},"type":"binary-expr","locations":[{"start":{"line":44,"column":12},"end":{"line":44,"column":17}},{"start":{"line":44,"column":21},"end":{"line":44,"column":32}}],"line":44},"12":{"loc":{"start":{"line":48,"column":8},"end":{"line":66,"column":9}},"type":"if","locations":[{"start":{"line":48,"column":8},"end":{"line":66,"column":9}},{"start":{"line":48,"column":8},"end":{"line":66,"column":9}}],"line":48},"13":{"loc":{"start":{"line":50,"column":12},"end":{"line":52,"column":13}},"type":"if","locations":[{"start":{"line":50,"column":12},"end":{"line":52,"column":13}},{"start":{"line":50,"column":12},"end":{"line":52,"column":13}}],"line":50},"14":{"loc":{"start":{"line":59,"column":12},"end":{"line":62,"column":13}},"type":"if","locations":[{"start":{"line":59,"column":12},"end":{"line":62,"column":13}},{"start":{"line":59,"column":12},"end":{"line":62,"column":13}}],"line":59},"15":{"loc":{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},"type":"if","locations":[{"start":{"line":63,"column":12},"end":{"line":65,"column":13}},{"start":{"line":63,"column":12},"end":{"line":65,"column":13}}],"line":63},"16":{"loc":{"start":{"line":68,"column":4},"end":{"line":73,"column":5}},"type":"if","locations":[{"start":{"line":68,"column":4},"end":{"line":73,"column":5}},{"start":{"line":68,"column":4},"end":{"line":73,"column":5}}],"line":68},"17":{"loc":{"start":{"line":81,"column":4},"end":{"line":108,"column":5}},"type":"if","locations":[{"start":{"line":81,"column":4},"end":{"line":108,"column":5}},{"start":{"line":81,"column":4},"end":{"line":108,"column":5}}],"line":81},"18":{"loc":{"start":{"line":86,"column":8},"end":{"line":88,"column":9}},"type":"if","locations":[{"start":{"line":86,"column":8},"end":{"line":88,"column":9}},{"start":{"line":86,"column":8},"end":{"line":88,"column":9}}],"line":86},"19":{"loc":{"start":{"line":89,"column":8},"end":{"line":91,"column":9}},"type":"if","locations":[{"start":{"line":89,"column":8},"end":{"line":91,"column":9}},{"start":{"line":89,"column":8},"end":{"line":91,"column":9}}],"line":89},"20":{"loc":{"start":{"line":90,"column":19},"end":{"line":90,"column":46}},"type":"binary-expr","locations":[{"start":{"line":90,"column":19},"end":{"line":90,"column":34}},{"start":{"line":90,"column":38},"end":{"line":90,"column":46}}],"line":90},"21":{"loc":{"start":{"line":92,"column":8},"end":{"line":107,"column":9}},"type":"if","locations":[{"start":{"line":92,"column":8},"end":{"line":107,"column":9}},{"start":{"line":92,"column":8},"end":{"line":107,"column":9}}],"line":92},"22":{"loc":{"start":{"line":95,"column":12},"end":{"line":100,"column":13}},"type":"if","locations":[{"start":{"line":95,"column":12},"end":{"line":100,"column":13}},{"start":{"line":95,"column":12},"end":{"line":100,"column":13}}],"line":95},"23":{"loc":{"start":{"line":102,"column":13},"end":{"line":107,"column":9}},"type":"if","locations":[{"start":{"line":102,"column":13},"end":{"line":107,"column":9}},{"start":{"line":102,"column":13},"end":{"line":107,"column":9}}],"line":102},"24":{"loc":{"start":{"line":111,"column":4},"end":{"line":128,"column":5}},"type":"if","locations":[{"start":{"line":111,"column":4},"end":{"line":128,"column":5}},{"start":{"line":111,"column":4},"end":{"line":128,"column":5}}],"line":111},"25":{"loc":{"start":{"line":112,"column":8},"end":{"line":127,"column":9}},"type":"if","locations":[{"start":{"line":112,"column":8},"end":{"line":127,"column":9}},{"start":{"line":112,"column":8},"end":{"line":127,"column":9}}],"line":112},"26":{"loc":{"start":{"line":116,"column":12},"end":{"line":126,"column":13}},"type":"if","locations":[{"start":{"line":116,"column":12},"end":{"line":126,"column":13}},{"start":{"line":116,"column":12},"end":{"line":126,"column":13}}],"line":116},"27":{"loc":{"start":{"line":117,"column":16},"end":{"line":122,"column":17}},"type":"if","locations":[{"start":{"line":117,"column":16},"end":{"line":122,"column":17}},{"start":{"line":117,"column":16},"end":{"line":122,"column":17}}],"line":117},"28":{"loc":{"start":{"line":117,"column":20},"end":{"line":117,"column":91}},"type":"binary-expr","locations":[{"start":{"line":117,"column":20},"end":{"line":117,"column":51}},{"start":{"line":117,"column":55},"end":{"line":117,"column":91}}],"line":117},"29":{"loc":{"start":{"line":139,"column":4},"end":{"line":153,"column":5}},"type":"if","locations":[{"start":{"line":139,"column":4},"end":{"line":153,"column":5}},{"start":{"line":139,"column":4},"end":{"line":153,"column":5}}],"line":139},"30":{"loc":{"start":{"line":142,"column":9},"end":{"line":153,"column":5}},"type":"if","locations":[{"start":{"line":142,"column":9},"end":{"line":153,"column":5}},{"start":{"line":142,"column":9},"end":{"line":153,"column":5}}],"line":142},"31":{"loc":{"start":{"line":145,"column":9},"end":{"line":153,"column":5}},"type":"if","locations":[{"start":{"line":145,"column":9},"end":{"line":153,"column":5}},{"start":{"line":145,"column":9},"end":{"line":153,"column":5}}],"line":145},"32":{"loc":{"start":{"line":148,"column":9},"end":{"line":153,"column":5}},"type":"if","locations":[{"start":{"line":148,"column":9},"end":{"line":153,"column":5}},{"start":{"line":148,"column":9},"end":{"line":153,"column":5}}],"line":148},"33":{"loc":{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},"type":"if","locations":[{"start":{"line":157,"column":4},"end":{"line":159,"column":5}},{"start":{"line":157,"column":4},"end":{"line":159,"column":5}}],"line":157},"34":{"loc":{"start":{"line":167,"column":4},"end":{"line":169,"column":5}},"type":"if","locations":[{"start":{"line":167,"column":4},"end":{"line":169,"column":5}},{"start":{"line":167,"column":4},"end":{"line":169,"column":5}}],"line":167},"35":{"loc":{"start":{"line":170,"column":4},"end":{"line":181,"column":5}},"type":"if","locations":[{"start":{"line":170,"column":4},"end":{"line":181,"column":5}},{"start":{"line":170,"column":4},"end":{"line":181,"column":5}}],"line":170},"36":{"loc":{"start":{"line":173,"column":9},"end":{"line":181,"column":5}},"type":"if","locations":[{"start":{"line":173,"column":9},"end":{"line":181,"column":5}},{"start":{"line":173,"column":9},"end":{"line":181,"column":5}}],"line":173},"37":{"loc":{"start":{"line":173,"column":13},"end":{"line":173,"column":126}},"type":"binary-expr","locations":[{"start":{"line":173,"column":13},"end":{"line":173,"column":32}},{"start":{"line":173,"column":36},"end":{"line":173,"column":68}},{"start":{"line":173,"column":72},"end":{"line":173,"column":91}},{"start":{"line":173,"column":95},"end":{"line":173,"column":126}}],"line":173},"38":{"loc":{"start":{"line":176,"column":9},"end":{"line":181,"column":5}},"type":"if","locations":[{"start":{"line":176,"column":9},"end":{"line":181,"column":5}},{"start":{"line":176,"column":9},"end":{"line":181,"column":5}}],"line":176},"39":{"loc":{"start":{"line":176,"column":13},"end":{"line":176,"column":125}},"type":"binary-expr","locations":[{"start":{"line":176,"column":13},"end":{"line":176,"column":30}},{"start":{"line":176,"column":34},"end":{"line":176,"column":67}},{"start":{"line":176,"column":71},"end":{"line":176,"column":88}},{"start":{"line":176,"column":92},"end":{"line":176,"column":125}}],"line":176},"40":{"loc":{"start":{"line":185,"column":4},"end":{"line":190,"column":5}},"type":"if","locations":[{"start":{"line":185,"column":4},"end":{"line":190,"column":5}},{"start":{"line":185,"column":4},"end":{"line":190,"column":5}}],"line":185},"41":{"loc":{"start":{"line":185,"column":8},"end":{"line":185,"column":63}},"type":"binary-expr","locations":[{"start":{"line":185,"column":8},"end":{"line":185,"column":27}},{"start":{"line":185,"column":31},"end":{"line":185,"column":63}}],"line":185}},"s":{"0":1,"1":2,"2":1,"3":1,"4":1,"5":1,"6":118,"7":118,"8":32118,"9":32116,"10":32107,"11":116,"12":1,"13":32118,"14":2,"15":32116,"16":32116,"17":32116,"18":32107,"19":9,"20":32116,"21":32116,"22":32116,"23":65845,"24":65845,"25":7,"26":65838,"27":65838,"28":65838,"29":51,"30":65838,"31":65838,"32":10,"33":10,"34":8,"35":65828,"36":75,"37":75,"38":65828,"39":65828,"40":32116,"41":32107,"42":9,"43":1,"44":65838,"45":65275,"46":563,"47":563,"48":556,"49":7,"50":1,"51":7,"52":6,"53":6,"54":6,"55":6,"56":0,"57":1,"58":1,"59":0,"60":65836,"61":562,"62":3,"63":559,"64":103,"65":1,"66":102,"67":456,"68":65836,"69":65047,"70":789,"71":75,"72":9,"73":66,"74":0,"75":66,"76":0,"77":66,"78":66,"79":0,"80":15,"81":15,"82":1,"83":14,"84":58,"85":75,"86":75,"87":13,"88":62,"89":13,"90":49,"91":4,"92":45,"93":5,"94":40,"95":4,"96":4,"97":2,"98":2,"99":5,"100":5,"101":0},"f":{"0":2,"1":118,"2":32118,"3":32116,"4":2,"5":65838,"6":65836,"7":65047,"8":789,"9":75,"10":15,"11":58,"12":75,"13":4,"14":5},"b":{"0":[1,1,1],"1":[1,1],"2":[2,2],"3":[32107,9],"4":[2,32116],"5":[32118,5,5],"6":[32116,0],"7":[32107,9],"8":[7,65838],"9":[65845,18],"10":[51,65787],"11":[65838,65787],"12":[10,65828],"13":[8,2],"14":[75,65753],"15":[65828,0],"16":[32107,9],"17":[65275,563],"18":[556,7],"19":[1,6],"20":[1,1],"21":[6,1],"22":[6,0],"23":[1,0],"24":[562,65274],"25":[3,559],"26":[103,456],"27":[1,102],"28":[103,1],"29":[9,66],"30":[0,66],"31":[0,66],"32":[66,0],"33":[1,14],"34":[13,62],"35":[13,49],"36":[4,45],"37":[49,8,47,7],"38":[5,40],"39":[45,3,42,2],"40":[2,2],"41":[4,2]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"1b2047d3f118d3c03718e37ead2609bb87d923e0","contentHash":"8f3455fcd70f9377c2168fb62ac76e47_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/Result.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/Result.ts","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"1":{"start":{"line":3,"column":4},"end":{"line":3,"column":62}},"2":{"start":{"line":5,"column":0},"end":{"line":5,"column":62}},"3":{"start":{"line":6,"column":17},"end":{"line":6,"column":53}},"4":{"start":{"line":7,"column":28},"end":{"line":83,"column":3}},"5":{"start":{"line":9,"column":8},"end":{"line":9,"column":35}},"6":{"start":{"line":10,"column":8},"end":{"line":10,"column":30}},"7":{"start":{"line":12,"column":4},"end":{"line":18,"column":7}},"8":{"start":{"line":14,"column":12},"end":{"line":14,"column":136}},"9":{"start":{"line":19,"column":4},"end":{"line":28,"column":7}},"10":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"11":{"start":{"line":22,"column":16},"end":{"line":22,"column":138}},"12":{"start":{"line":24,"column":12},"end":{"line":24,"column":44}},"13":{"start":{"line":29,"column":4},"end":{"line":35,"column":7}},"14":{"start":{"line":31,"column":12},"end":{"line":31,"column":54}},"15":{"start":{"line":36,"column":4},"end":{"line":57,"column":6}},"16":{"start":{"line":37,"column":20},"end":{"line":37,"column":24}},"17":{"start":{"line":38,"column":23},"end":{"line":38,"column":67}},"18":{"start":{"line":40,"column":8},"end":{"line":56,"column":11}},"19":{"start":{"line":41,"column":12},"end":{"line":55,"column":13}},"20":{"start":{"line":42,"column":16},"end":{"line":50,"column":19}},"21":{"start":{"line":43,"column":20},"end":{"line":49,"column":21}},"22":{"start":{"line":44,"column":24},"end":{"line":44,"column":36}},"23":{"start":{"line":47,"column":24},"end":{"line":47,"column":61}},"24":{"start":{"line":48,"column":24},"end":{"line":48,"column":34}},"25":{"start":{"line":53,"column":16},"end":{"line":53,"column":53}},"26":{"start":{"line":54,"column":16},"end":{"line":54,"column":26}},"27":{"start":{"line":58,"column":4},"end":{"line":63,"column":6}},"28":{"start":{"line":59,"column":8},"end":{"line":61,"column":9}},"29":{"start":{"line":60,"column":12},"end":{"line":60,"column":62}},"30":{"start":{"line":62,"column":8},"end":{"line":62,"column":69}},"31":{"start":{"line":64,"column":4},"end":{"line":71,"column":6}},"32":{"start":{"line":65,"column":8},"end":{"line":67,"column":9}},"33":{"start":{"line":66,"column":12},"end":{"line":66,"column":63}},"34":{"start":{"line":68,"column":8},"end":{"line":70,"column":9}},"35":{"start":{"line":69,"column":12},"end":{"line":69,"column":61}},"36":{"start":{"line":72,"column":4},"end":{"line":81,"column":6}},"37":{"start":{"line":73,"column":8},"end":{"line":77,"column":9}},"38":{"start":{"line":74,"column":12},"end":{"line":76,"column":13}},"39":{"start":{"line":75,"column":16},"end":{"line":75,"column":79}},"40":{"start":{"line":78,"column":8},"end":{"line":80,"column":9}},"41":{"start":{"line":79,"column":12},"end":{"line":79,"column":64}},"42":{"start":{"line":82,"column":4},"end":{"line":82,"column":18}},"43":{"start":{"line":84,"column":0},"end":{"line":84,"column":24}},"44":{"start":{"line":86,"column":4},"end":{"line":133,"column":5}},"45":{"start":{"line":87,"column":8},"end":{"line":87,"column":13}},"46":{"start":{"line":90,"column":8},"end":{"line":132,"column":9}},"47":{"start":{"line":91,"column":25},"end":{"line":91,"column":59}},"48":{"start":{"line":92,"column":29},"end":{"line":92,"column":42}},"49":{"start":{"line":93,"column":22},"end":{"line":93,"column":85}},"50":{"start":{"line":94,"column":12},"end":{"line":94,"column":21}},"51":{"start":{"line":96,"column":12},"end":{"line":115,"column":13}},"52":{"start":{"line":97,"column":16},"end":{"line":99,"column":23}},"53":{"start":{"line":98,"column":20},"end":{"line":98,"column":102}},"54":{"start":{"line":103,"column":16},"end":{"line":105,"column":17}},"55":{"start":{"line":104,"column":20},"end":{"line":104,"column":53}},"56":{"start":{"line":106,"column":16},"end":{"line":113,"column":17}},"57":{"start":{"line":107,"column":31},"end":{"line":107,"column":44}},"58":{"start":{"line":108,"column":20},"end":{"line":108,"column":78}},"59":{"start":{"line":109,"column":20},"end":{"line":109,"column":29}},"60":{"start":{"line":110,"column":20},"end":{"line":112,"column":21}},"61":{"start":{"line":111,"column":24},"end":{"line":111,"column":51}},"62":{"start":{"line":114,"column":16},"end":{"line":114,"column":21}},"63":{"start":{"line":125,"column":12},"end":{"line":130,"column":13}},"64":{"start":{"line":126,"column":16},"end":{"line":129,"column":17}},"65":{"start":{"line":127,"column":31},"end":{"line":127,"column":46}},"66":{"start":{"line":128,"column":20},"end":{"line":128,"column":47}},"67":{"start":{"line":131,"column":12},"end":{"line":131,"column":17}},"68":{"start":{"line":136,"column":4},"end":{"line":138,"column":5}},"69":{"start":{"line":137,"column":8},"end":{"line":137,"column":34}},"70":{"start":{"line":139,"column":4},"end":{"line":139,"column":67}},"71":{"start":{"line":142,"column":4},"end":{"line":147,"column":5}},"72":{"start":{"line":143,"column":8},"end":{"line":143,"column":54}},"73":{"start":{"line":146,"column":8},"end":{"line":146,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":56},"end":{"line":2,"column":57}},"loc":{"start":{"line":2,"column":71},"end":{"line":4,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":28},"end":{"line":7,"column":29}},"loc":{"start":{"line":7,"column":40},"end":{"line":83,"column":1}},"line":7},"2":{"name":"Result","decl":{"start":{"line":8,"column":13},"end":{"line":8,"column":19}},"loc":{"start":{"line":8,"column":31},"end":{"line":11,"column":5}},"line":8},"3":{"name":"(anonymous_3)","decl":{"start":{"line":13,"column":13},"end":{"line":13,"column":14}},"loc":{"start":{"line":13,"column":25},"end":{"line":15,"column":9}},"line":13},"4":{"name":"(anonymous_4)","decl":{"start":{"line":20,"column":13},"end":{"line":20,"column":14}},"loc":{"start":{"line":20,"column":25},"end":{"line":25,"column":9}},"line":20},"5":{"name":"(anonymous_5)","decl":{"start":{"line":30,"column":13},"end":{"line":30,"column":14}},"loc":{"start":{"line":30,"column":25},"end":{"line":32,"column":9}},"line":30},"6":{"name":"(anonymous_6)","decl":{"start":{"line":36,"column":37},"end":{"line":36,"column":38}},"loc":{"start":{"line":36,"column":60},"end":{"line":57,"column":5}},"line":36},"7":{"name":"(anonymous_7)","decl":{"start":{"line":40,"column":38},"end":{"line":40,"column":39}},"loc":{"start":{"line":40,"column":65},"end":{"line":56,"column":9}},"line":40},"8":{"name":"(anonymous_8)","decl":{"start":{"line":42,"column":93},"end":{"line":42,"column":94}},"loc":{"start":{"line":42,"column":108},"end":{"line":50,"column":17}},"line":42},"9":{"name":"(anonymous_9)","decl":{"start":{"line":58,"column":41},"end":{"line":58,"column":42}},"loc":{"start":{"line":58,"column":58},"end":{"line":63,"column":5}},"line":58},"10":{"name":"(anonymous_10)","decl":{"start":{"line":64,"column":36},"end":{"line":64,"column":37}},"loc":{"start":{"line":64,"column":51},"end":{"line":71,"column":5}},"line":64},"11":{"name":"(anonymous_11)","decl":{"start":{"line":72,"column":34},"end":{"line":72,"column":35}},"loc":{"start":{"line":72,"column":46},"end":{"line":81,"column":5}},"line":72},"12":{"name":"processLineByLine","decl":{"start":{"line":85,"column":9},"end":{"line":85,"column":26}},"loc":{"start":{"line":85,"column":72},"end":{"line":134,"column":1}},"line":85},"13":{"name":"(anonymous_13)","decl":{"start":{"line":97,"column":25},"end":{"line":97,"column":26}},"loc":{"start":{"line":97,"column":37},"end":{"line":99,"column":17}},"line":97},"14":{"name":"processRecursive","decl":{"start":{"line":135,"column":9},"end":{"line":135,"column":25}},"loc":{"start":{"line":135,"column":82},"end":{"line":140,"column":1}},"line":135},"15":{"name":"pushDownstream","decl":{"start":{"line":141,"column":9},"end":{"line":141,"column":23}},"loc":{"start":{"line":141,"column":35},"end":{"line":148,"column":1}},"line":141}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":22},"end":{"line":4,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":23},"end":{"line":2,"column":27}},{"start":{"line":2,"column":31},"end":{"line":2,"column":51}},{"start":{"line":2,"column":56},"end":{"line":4,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":11},"end":{"line":3,"column":61}},"type":"cond-expr","locations":[{"start":{"line":3,"column":37},"end":{"line":3,"column":40}},{"start":{"line":3,"column":43},"end":{"line":3,"column":61}}],"line":3},"2":{"loc":{"start":{"line":3,"column":12},"end":{"line":3,"column":33}},"type":"binary-expr","locations":[{"start":{"line":3,"column":12},"end":{"line":3,"column":15}},{"start":{"line":3,"column":19},"end":{"line":3,"column":33}}],"line":3},"3":{"loc":{"start":{"line":14,"column":19},"end":{"line":14,"column":135}},"type":"binary-expr","locations":[{"start":{"line":14,"column":19},"end":{"line":14,"column":58}},{"start":{"line":14,"column":62},"end":{"line":14,"column":108}},{"start":{"line":14,"column":112},"end":{"line":14,"column":135}}],"line":14},"4":{"loc":{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},"type":"if","locations":[{"start":{"line":21,"column":12},"end":{"line":23,"column":13}},{"start":{"line":21,"column":12},"end":{"line":23,"column":13}}],"line":21},"5":{"loc":{"start":{"line":22,"column":43},"end":{"line":22,"column":137}},"type":"binary-expr","locations":[{"start":{"line":22,"column":43},"end":{"line":22,"column":86}},{"start":{"line":22,"column":90},"end":{"line":22,"column":137}}],"line":22},"6":{"loc":{"start":{"line":41,"column":12},"end":{"line":55,"column":13}},"type":"if","locations":[{"start":{"line":41,"column":12},"end":{"line":55,"column":13}},{"start":{"line":41,"column":12},"end":{"line":55,"column":13}}],"line":41},"7":{"loc":{"start":{"line":43,"column":20},"end":{"line":49,"column":21}},"type":"if","locations":[{"start":{"line":43,"column":20},"end":{"line":49,"column":21}},{"start":{"line":43,"column":20},"end":{"line":49,"column":21}}],"line":43},"8":{"loc":{"start":{"line":59,"column":8},"end":{"line":61,"column":9}},"type":"if","locations":[{"start":{"line":59,"column":8},"end":{"line":61,"column":9}},{"start":{"line":59,"column":8},"end":{"line":61,"column":9}}],"line":59},"9":{"loc":{"start":{"line":65,"column":8},"end":{"line":67,"column":9}},"type":"if","locations":[{"start":{"line":65,"column":8},"end":{"line":67,"column":9}},{"start":{"line":65,"column":8},"end":{"line":67,"column":9}}],"line":65},"10":{"loc":{"start":{"line":65,"column":12},"end":{"line":65,"column":98}},"type":"binary-expr","locations":[{"start":{"line":65,"column":12},"end":{"line":65,"column":49}},{"start":{"line":65,"column":53},"end":{"line":65,"column":98}}],"line":65},"11":{"loc":{"start":{"line":68,"column":8},"end":{"line":70,"column":9}},"type":"if","locations":[{"start":{"line":68,"column":8},"end":{"line":70,"column":9}},{"start":{"line":68,"column":8},"end":{"line":70,"column":9}}],"line":68},"12":{"loc":{"start":{"line":68,"column":12},"end":{"line":68,"column":91}},"type":"binary-expr","locations":[{"start":{"line":68,"column":12},"end":{"line":68,"column":44}},{"start":{"line":68,"column":48},"end":{"line":68,"column":91}}],"line":68},"13":{"loc":{"start":{"line":73,"column":8},"end":{"line":77,"column":9}},"type":"if","locations":[{"start":{"line":73,"column":8},"end":{"line":77,"column":9}},{"start":{"line":73,"column":8},"end":{"line":77,"column":9}}],"line":73},"14":{"loc":{"start":{"line":74,"column":12},"end":{"line":76,"column":13}},"type":"if","locations":[{"start":{"line":74,"column":12},"end":{"line":76,"column":13}},{"start":{"line":74,"column":12},"end":{"line":76,"column":13}}],"line":74},"15":{"loc":{"start":{"line":74,"column":16},"end":{"line":74,"column":96}},"type":"binary-expr","locations":[{"start":{"line":74,"column":16},"end":{"line":74,"column":48}},{"start":{"line":74,"column":52},"end":{"line":74,"column":96}}],"line":74},"16":{"loc":{"start":{"line":78,"column":8},"end":{"line":80,"column":9}},"type":"if","locations":[{"start":{"line":78,"column":8},"end":{"line":80,"column":9}},{"start":{"line":78,"column":8},"end":{"line":80,"column":9}}],"line":78},"17":{"loc":{"start":{"line":78,"column":12},"end":{"line":78,"column":102}},"type":"binary-expr","locations":[{"start":{"line":78,"column":12},"end":{"line":78,"column":49}},{"start":{"line":78,"column":53},"end":{"line":78,"column":102}}],"line":78},"18":{"loc":{"start":{"line":86,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":86,"column":4},"end":{"line":133,"column":5}},{"start":{"line":86,"column":4},"end":{"line":133,"column":5}}],"line":86},"19":{"loc":{"start":{"line":90,"column":8},"end":{"line":132,"column":9}},"type":"if","locations":[{"start":{"line":90,"column":8},"end":{"line":132,"column":9}},{"start":{"line":90,"column":8},"end":{"line":132,"column":9}}],"line":90},"20":{"loc":{"start":{"line":90,"column":12},"end":{"line":90,"column":77}},"type":"binary-expr","locations":[{"start":{"line":90,"column":12},"end":{"line":90,"column":39}},{"start":{"line":90,"column":43},"end":{"line":90,"column":77}}],"line":90},"21":{"loc":{"start":{"line":96,"column":12},"end":{"line":115,"column":13}},"type":"if","locations":[{"start":{"line":96,"column":12},"end":{"line":115,"column":13}},{"start":{"line":96,"column":12},"end":{"line":115,"column":13}}],"line":96},"22":{"loc":{"start":{"line":96,"column":16},"end":{"line":96,"column":31}},"type":"binary-expr","locations":[{"start":{"line":96,"column":16},"end":{"line":96,"column":19}},{"start":{"line":96,"column":23},"end":{"line":96,"column":31}}],"line":96},"23":{"loc":{"start":{"line":103,"column":16},"end":{"line":105,"column":17}},"type":"if","locations":[{"start":{"line":103,"column":16},"end":{"line":105,"column":17}},{"start":{"line":103,"column":16},"end":{"line":105,"column":17}}],"line":103},"24":{"loc":{"start":{"line":110,"column":20},"end":{"line":112,"column":21}},"type":"if","locations":[{"start":{"line":110,"column":20},"end":{"line":112,"column":21}},{"start":{"line":110,"column":20},"end":{"line":112,"column":21}}],"line":110},"25":{"loc":{"start":{"line":125,"column":12},"end":{"line":130,"column":13}},"type":"if","locations":[{"start":{"line":125,"column":12},"end":{"line":130,"column":13}},{"start":{"line":125,"column":12},"end":{"line":130,"column":13}}],"line":125},"26":{"loc":{"start":{"line":136,"column":4},"end":{"line":138,"column":5}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":138,"column":5}},{"start":{"line":136,"column":4},"end":{"line":138,"column":5}}],"line":136},"27":{"loc":{"start":{"line":142,"column":4},"end":{"line":147,"column":5}},"type":"if","locations":[{"start":{"line":142,"column":4},"end":{"line":147,"column":5}},{"start":{"line":142,"column":4},"end":{"line":147,"column":5}}],"line":142},"28":{"loc":{"start":{"line":142,"column":8},"end":{"line":142,"column":59}},"type":"binary-expr","locations":[{"start":{"line":142,"column":8},"end":{"line":142,"column":31}},{"start":{"line":142,"column":35},"end":{"line":142,"column":59}}],"line":142}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":120,"6":120,"7":1,"8":147,"9":1,"10":158,"11":106,"12":158,"13":1,"14":251,"15":1,"16":147,"17":147,"18":147,"19":147,"20":54,"21":54,"22":0,"23":54,"24":54,"25":93,"26":93,"27":1,"28":147,"29":114,"30":147,"31":1,"32":9,"33":0,"34":9,"35":5,"36":1,"37":104,"38":79,"39":79,"40":104,"41":0,"42":1,"43":1,"44":58,"45":3,"46":55,"47":44,"48":44,"49":44,"50":44,"51":44,"52":4,"53":4,"54":40,"55":1,"56":40,"57":15896,"58":15896,"59":15896,"60":15896,"61":1,"62":40,"63":11,"64":11,"65":15874,"66":15874,"67":11,"68":4,"69":0,"70":4,"71":15876,"72":10584,"73":5292},"f":{"0":1,"1":1,"2":120,"3":147,"4":158,"5":251,"6":147,"7":147,"8":54,"9":147,"10":9,"11":104,"12":58,"13":4,"14":4,"15":15876},"b":{"0":[1,1,1],"1":[0,1],"2":[1,1],"3":[147,43,104],"4":[106,52],"5":[106,100],"6":[54,93],"7":[0,54],"8":[114,33],"9":[0,9],"10":[9,1],"11":[5,4],"12":[9,5],"13":[79,25],"14":[79,0],"15":[79,79],"16":[0,104],"17":[104,33],"18":[3,55],"19":[44,11],"20":[55,44],"21":[4,40],"22":[44,4],"23":[1,39],"24":[1,15895],"25":[11,0],"26":[0,4],"27":[10584,5292],"28":[15876,15876]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"f4b933d67dbdf80a14c29f466e77a461a6333f3a","contentHash":"0ab4086099b159c1b531eab9996d8296_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/ProcessorLocal.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/ProcessorLocal.test.ts","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":9,"column":1}},"1":{"start":{"line":3,"column":4},"end":{"line":8,"column":7}},"2":{"start":{"line":4,"column":36},"end":{"line":4,"column":97}},"3":{"start":{"line":4,"column":42},"end":{"line":4,"column":70}},"4":{"start":{"line":4,"column":85},"end":{"line":4,"column":95}},"5":{"start":{"line":5,"column":35},"end":{"line":5,"column":100}},"6":{"start":{"line":5,"column":41},"end":{"line":5,"column":73}},"7":{"start":{"line":5,"column":88},"end":{"line":5,"column":98}},"8":{"start":{"line":6,"column":32},"end":{"line":6,"column":149}},"9":{"start":{"line":6,"column":97},"end":{"line":6,"column":119}},"10":{"start":{"line":7,"column":8},"end":{"line":7,"column":78}},"11":{"start":{"line":10,"column":18},"end":{"line":36,"column":1}},"12":{"start":{"line":11,"column":12},"end":{"line":11,"column":104}},"13":{"start":{"line":11,"column":43},"end":{"line":11,"column":68}},"14":{"start":{"line":11,"column":57},"end":{"line":11,"column":68}},"15":{"start":{"line":11,"column":69},"end":{"line":11,"column":81}},"16":{"start":{"line":12,"column":4},"end":{"line":12,"column":157}},"17":{"start":{"line":12,"column":138},"end":{"line":12,"column":150}},"18":{"start":{"line":13,"column":23},"end":{"line":13,"column":68}},"19":{"start":{"line":13,"column":45},"end":{"line":13,"column":65}},"20":{"start":{"line":15,"column":8},"end":{"line":15,"column":70}},"21":{"start":{"line":15,"column":15},"end":{"line":15,"column":70}},"22":{"start":{"line":16,"column":8},"end":{"line":33,"column":66}},"23":{"start":{"line":16,"column":18},"end":{"line":33,"column":66}},"24":{"start":{"line":17,"column":12},"end":{"line":17,"column":127}},"25":{"start":{"line":17,"column":118},"end":{"line":17,"column":127}},"26":{"start":{"line":18,"column":12},"end":{"line":18,"column":44}},"27":{"start":{"line":18,"column":26},"end":{"line":18,"column":44}},"28":{"start":{"line":19,"column":12},"end":{"line":31,"column":13}},"29":{"start":{"line":20,"column":32},"end":{"line":20,"column":39}},"30":{"start":{"line":20,"column":40},"end":{"line":20,"column":46}},"31":{"start":{"line":21,"column":24},"end":{"line":21,"column":34}},"32":{"start":{"line":21,"column":35},"end":{"line":21,"column":72}},"33":{"start":{"line":22,"column":24},"end":{"line":22,"column":34}},"34":{"start":{"line":22,"column":35},"end":{"line":22,"column":45}},"35":{"start":{"line":22,"column":46},"end":{"line":22,"column":55}},"36":{"start":{"line":22,"column":56},"end":{"line":22,"column":65}},"37":{"start":{"line":23,"column":24},"end":{"line":23,"column":41}},"38":{"start":{"line":23,"column":42},"end":{"line":23,"column":55}},"39":{"start":{"line":23,"column":56},"end":{"line":23,"column":65}},"40":{"start":{"line":25,"column":20},"end":{"line":25,"column":128}},"41":{"start":{"line":25,"column":110},"end":{"line":25,"column":116}},"42":{"start":{"line":25,"column":117},"end":{"line":25,"column":126}},"43":{"start":{"line":26,"column":20},"end":{"line":26,"column":106}},"44":{"start":{"line":26,"column":81},"end":{"line":26,"column":97}},"45":{"start":{"line":26,"column":98},"end":{"line":26,"column":104}},"46":{"start":{"line":27,"column":20},"end":{"line":27,"column":89}},"47":{"start":{"line":27,"column":57},"end":{"line":27,"column":72}},"48":{"start":{"line":27,"column":73},"end":{"line":27,"column":80}},"49":{"start":{"line":27,"column":81},"end":{"line":27,"column":87}},"50":{"start":{"line":28,"column":20},"end":{"line":28,"column":87}},"51":{"start":{"line":28,"column":47},"end":{"line":28,"column":62}},"52":{"start":{"line":28,"column":63},"end":{"line":28,"column":78}},"53":{"start":{"line":28,"column":79},"end":{"line":28,"column":85}},"54":{"start":{"line":29,"column":20},"end":{"line":29,"column":42}},"55":{"start":{"line":29,"column":30},"end":{"line":29,"column":42}},"56":{"start":{"line":30,"column":20},"end":{"line":30,"column":33}},"57":{"start":{"line":30,"column":34},"end":{"line":30,"column":43}},"58":{"start":{"line":32,"column":12},"end":{"line":32,"column":39}},"59":{"start":{"line":33,"column":22},"end":{"line":33,"column":34}},"60":{"start":{"line":33,"column":35},"end":{"line":33,"column":41}},"61":{"start":{"line":33,"column":54},"end":{"line":33,"column":64}},"62":{"start":{"line":34,"column":8},"end":{"line":34,"column":35}},"63":{"start":{"line":34,"column":23},"end":{"line":34,"column":35}},"64":{"start":{"line":34,"column":36},"end":{"line":34,"column":89}},"65":{"start":{"line":37,"column":22},"end":{"line":39,"column":1}},"66":{"start":{"line":38,"column":4},"end":{"line":38,"column":62}},"67":{"start":{"line":40,"column":0},"end":{"line":40,"column":62}},"68":{"start":{"line":41,"column":23},"end":{"line":41,"column":50}},"69":{"start":{"line":42,"column":18},"end":{"line":42,"column":40}},"70":{"start":{"line":43,"column":11},"end":{"line":43,"column":24}},"71":{"start":{"line":44,"column":13},"end":{"line":44,"column":45}},"72":{"start":{"line":45,"column":15},"end":{"line":45,"column":49}},"73":{"start":{"line":46,"column":14},"end":{"line":46,"column":61}},"74":{"start":{"line":47,"column":0},"end":{"line":98,"column":3}},"75":{"start":{"line":48,"column":4},"end":{"line":68,"column":7}},"76":{"start":{"line":49,"column":8},"end":{"line":67,"column":11}},"77":{"start":{"line":51,"column":12},"end":{"line":66,"column":15}},"78":{"start":{"line":52,"column":16},"end":{"line":65,"column":17}},"79":{"start":{"line":54,"column":24},"end":{"line":54,"column":101}},"80":{"start":{"line":55,"column":24},"end":{"line":55,"column":78}},"81":{"start":{"line":56,"column":24},"end":{"line":56,"column":70}},"82":{"start":{"line":58,"column":24},"end":{"line":58,"column":42}},"83":{"start":{"line":59,"column":24},"end":{"line":59,"column":61}},"84":{"start":{"line":60,"column":24},"end":{"line":60,"column":41}},"85":{"start":{"line":61,"column":24},"end":{"line":61,"column":83}},"86":{"start":{"line":62,"column":24},"end":{"line":62,"column":80}},"87":{"start":{"line":63,"column":24},"end":{"line":63,"column":97}},"88":{"start":{"line":64,"column":24},"end":{"line":64,"column":46}},"89":{"start":{"line":69,"column":4},"end":{"line":85,"column":7}},"90":{"start":{"line":70,"column":8},"end":{"line":84,"column":11}},"91":{"start":{"line":72,"column":12},"end":{"line":83,"column":15}},"92":{"start":{"line":73,"column":16},"end":{"line":82,"column":17}},"93":{"start":{"line":75,"column":24},"end":{"line":75,"column":119}},"94":{"start":{"line":76,"column":24},"end":{"line":76,"column":78}},"95":{"start":{"line":77,"column":24},"end":{"line":77,"column":70}},"96":{"start":{"line":79,"column":24},"end":{"line":79,"column":42}},"97":{"start":{"line":80,"column":24},"end":{"line":80,"column":61}},"98":{"start":{"line":81,"column":24},"end":{"line":81,"column":46}},"99":{"start":{"line":86,"column":4},"end":{"line":97,"column":7}},"100":{"start":{"line":87,"column":19},"end":{"line":87,"column":46}},"101":{"start":{"line":88,"column":8},"end":{"line":90,"column":11}},"102":{"start":{"line":89,"column":12},"end":{"line":89,"column":22}},"103":{"start":{"line":91,"column":24},"end":{"line":91,"column":65}},"104":{"start":{"line":92,"column":19},"end":{"line":92,"column":65}},"105":{"start":{"line":93,"column":8},"end":{"line":96,"column":11}},"106":{"start":{"line":95,"column":12},"end":{"line":95,"column":51}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":44},"end":{"line":2,"column":45}},"loc":{"start":{"line":2,"column":89},"end":{"line":9,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":3,"column":36},"end":{"line":3,"column":37}},"loc":{"start":{"line":3,"column":63},"end":{"line":8,"column":5}},"line":3},"2":{"name":"fulfilled","decl":{"start":{"line":4,"column":17},"end":{"line":4,"column":26}},"loc":{"start":{"line":4,"column":34},"end":{"line":4,"column":99}},"line":4},"3":{"name":"rejected","decl":{"start":{"line":5,"column":17},"end":{"line":5,"column":25}},"loc":{"start":{"line":5,"column":33},"end":{"line":5,"column":102}},"line":5},"4":{"name":"step","decl":{"start":{"line":6,"column":17},"end":{"line":6,"column":21}},"loc":{"start":{"line":6,"column":30},"end":{"line":6,"column":151}},"line":6},"5":{"name":"(anonymous_5)","decl":{"start":{"line":6,"column":76},"end":{"line":6,"column":77}},"loc":{"start":{"line":6,"column":95},"end":{"line":6,"column":121}},"line":6},"6":{"name":"(anonymous_6)","decl":{"start":{"line":10,"column":48},"end":{"line":10,"column":49}},"loc":{"start":{"line":10,"column":73},"end":{"line":36,"column":1}},"line":10},"7":{"name":"(anonymous_7)","decl":{"start":{"line":11,"column":30},"end":{"line":11,"column":31}},"loc":{"start":{"line":11,"column":41},"end":{"line":11,"column":83}},"line":11},"8":{"name":"(anonymous_8)","decl":{"start":{"line":12,"column":125},"end":{"line":12,"column":126}},"loc":{"start":{"line":12,"column":136},"end":{"line":12,"column":152}},"line":12},"9":{"name":"verb","decl":{"start":{"line":13,"column":13},"end":{"line":13,"column":17}},"loc":{"start":{"line":13,"column":21},"end":{"line":13,"column":70}},"line":13},"10":{"name":"(anonymous_10)","decl":{"start":{"line":13,"column":30},"end":{"line":13,"column":31}},"loc":{"start":{"line":13,"column":43},"end":{"line":13,"column":67}},"line":13},"11":{"name":"step","decl":{"start":{"line":14,"column":13},"end":{"line":14,"column":17}},"loc":{"start":{"line":14,"column":22},"end":{"line":35,"column":5}},"line":14},"12":{"name":"(anonymous_12)","decl":{"start":{"line":37,"column":56},"end":{"line":37,"column":57}},"loc":{"start":{"line":37,"column":71},"end":{"line":39,"column":1}},"line":37},"13":{"name":"(anonymous_13)","decl":{"start":{"line":47,"column":25},"end":{"line":47,"column":26}},"loc":{"start":{"line":47,"column":37},"end":{"line":98,"column":1}},"line":47},"14":{"name":"(anonymous_14)","decl":{"start":{"line":48,"column":52},"end":{"line":48,"column":53}},"loc":{"start":{"line":48,"column":64},"end":{"line":68,"column":5}},"line":48},"15":{"name":"(anonymous_15)","decl":{"start":{"line":49,"column":47},"end":{"line":49,"column":48}},"loc":{"start":{"line":49,"column":59},"end":{"line":67,"column":9}},"line":49},"16":{"name":"(anonymous_16)","decl":{"start":{"line":51,"column":37},"end":{"line":51,"column":38}},"loc":{"start":{"line":51,"column":51},"end":{"line":66,"column":13}},"line":51},"17":{"name":"(anonymous_17)","decl":{"start":{"line":69,"column":56},"end":{"line":69,"column":57}},"loc":{"start":{"line":69,"column":68},"end":{"line":85,"column":5}},"line":69},"18":{"name":"(anonymous_18)","decl":{"start":{"line":70,"column":47},"end":{"line":70,"column":48}},"loc":{"start":{"line":70,"column":59},"end":{"line":84,"column":9}},"line":70},"19":{"name":"(anonymous_19)","decl":{"start":{"line":72,"column":37},"end":{"line":72,"column":38}},"loc":{"start":{"line":72,"column":51},"end":{"line":83,"column":13}},"line":72},"20":{"name":"(anonymous_20)","decl":{"start":{"line":86,"column":67},"end":{"line":86,"column":68}},"loc":{"start":{"line":86,"column":79},"end":{"line":97,"column":5}},"line":86},"21":{"name":"(anonymous_21)","decl":{"start":{"line":88,"column":24},"end":{"line":88,"column":25}},"loc":{"start":{"line":88,"column":39},"end":{"line":90,"column":9}},"line":88},"22":{"name":"(anonymous_22)","decl":{"start":{"line":94,"column":18},"end":{"line":94,"column":19}},"loc":{"start":{"line":94,"column":34},"end":{"line":96,"column":9}},"line":94}},"branchMap":{"0":{"loc":{"start":{"line":2,"column":16},"end":{"line":9,"column":1}},"type":"binary-expr","locations":[{"start":{"line":2,"column":17},"end":{"line":2,"column":21}},{"start":{"line":2,"column":25},"end":{"line":2,"column":39}},{"start":{"line":2,"column":44},"end":{"line":9,"column":1}}],"line":2},"1":{"loc":{"start":{"line":3,"column":16},"end":{"line":3,"column":34}},"type":"binary-expr","locations":[{"start":{"line":3,"column":16},"end":{"line":3,"column":17}},{"start":{"line":3,"column":22},"end":{"line":3,"column":33}}],"line":3},"2":{"loc":{"start":{"line":6,"column":32},"end":{"line":6,"column":148}},"type":"cond-expr","locations":[{"start":{"line":6,"column":46},"end":{"line":6,"column":67}},{"start":{"line":6,"column":70},"end":{"line":6,"column":148}}],"line":6},"3":{"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":67}},"type":"binary-expr","locations":[{"start":{"line":7,"column":51},"end":{"line":7,"column":61}},{"start":{"line":7,"column":65},"end":{"line":7,"column":67}}],"line":7},"4":{"loc":{"start":{"line":10,"column":18},"end":{"line":36,"column":1}},"type":"binary-expr","locations":[{"start":{"line":10,"column":19},"end":{"line":10,"column":23}},{"start":{"line":10,"column":27},"end":{"line":10,"column":43}},{"start":{"line":10,"column":48},"end":{"line":36,"column":1}}],"line":10},"5":{"loc":{"start":{"line":11,"column":43},"end":{"line":11,"column":68}},"type":"if","locations":[{"start":{"line":11,"column":43},"end":{"line":11,"column":68}},{"start":{"line":11,"column":43},"end":{"line":11,"column":68}}],"line":11},"6":{"loc":{"start":{"line":12,"column":71},"end":{"line":12,"column":153}},"type":"binary-expr","locations":[{"start":{"line":12,"column":71},"end":{"line":12,"column":99}},{"start":{"line":12,"column":104},"end":{"line":12,"column":152}}],"line":12},"7":{"loc":{"start":{"line":15,"column":8},"end":{"line":15,"column":70}},"type":"if","locations":[{"start":{"line":15,"column":8},"end":{"line":15,"column":70}},{"start":{"line":15,"column":8},"end":{"line":15,"column":70}}],"line":15},"8":{"loc":{"start":{"line":17,"column":12},"end":{"line":17,"column":127}},"type":"if","locations":[{"start":{"line":17,"column":12},"end":{"line":17,"column":127}},{"start":{"line":17,"column":12},"end":{"line":17,"column":127}}],"line":17},"9":{"loc":{"start":{"line":17,"column":23},"end":{"line":17,"column":116}},"type":"binary-expr","locations":[{"start":{"line":17,"column":23},"end":{"line":17,"column":24}},{"start":{"line":17,"column":29},"end":{"line":17,"column":83}},{"start":{"line":17,"column":88},"end":{"line":17,"column":116}}],"line":17},"10":{"loc":{"start":{"line":17,"column":35},"end":{"line":17,"column":82}},"type":"cond-expr","locations":[{"start":{"line":17,"column":47},"end":{"line":17,"column":55}},{"start":{"line":17,"column":58},"end":{"line":17,"column":82}}],"line":17},"11":{"loc":{"start":{"line":17,"column":58},"end":{"line":17,"column":82}},"type":"cond-expr","locations":[{"start":{"line":17,"column":66},"end":{"line":17,"column":73}},{"start":{"line":17,"column":76},"end":{"line":17,"column":82}}],"line":17},"12":{"loc":{"start":{"line":18,"column":12},"end":{"line":18,"column":44}},"type":"if","locations":[{"start":{"line":18,"column":12},"end":{"line":18,"column":44}},{"start":{"line":18,"column":12},"end":{"line":18,"column":44}}],"line":18},"13":{"loc":{"start":{"line":19,"column":12},"end":{"line":31,"column":13}},"type":"switch","locations":[{"start":{"line":20,"column":16},"end":{"line":20,"column":23}},{"start":{"line":20,"column":24},"end":{"line":20,"column":46}},{"start":{"line":21,"column":16},"end":{"line":21,"column":72}},{"start":{"line":22,"column":16},"end":{"line":22,"column":65}},{"start":{"line":23,"column":16},"end":{"line":23,"column":65}},{"start":{"line":24,"column":16},"end":{"line":30,"column":43}}],"line":19},"14":{"loc":{"start":{"line":25,"column":20},"end":{"line":25,"column":128}},"type":"if","locations":[{"start":{"line":25,"column":20},"end":{"line":25,"column":128}},{"start":{"line":25,"column":20},"end":{"line":25,"column":128}}],"line":25},"15":{"loc":{"start":{"line":25,"column":24},"end":{"line":25,"column":106}},"type":"binary-expr","locations":[{"start":{"line":25,"column":24},"end":{"line":25,"column":74}},{"start":{"line":25,"column":79},"end":{"line":25,"column":90}},{"start":{"line":25,"column":94},"end":{"line":25,"column":105}}],"line":25},"16":{"loc":{"start":{"line":25,"column":42},"end":{"line":25,"column":73}},"type":"binary-expr","locations":[{"start":{"line":25,"column":42},"end":{"line":25,"column":54}},{"start":{"line":25,"column":58},"end":{"line":25,"column":73}}],"line":25},"17":{"loc":{"start":{"line":26,"column":20},"end":{"line":26,"column":106}},"type":"if","locations":[{"start":{"line":26,"column":20},"end":{"line":26,"column":106}},{"start":{"line":26,"column":20},"end":{"line":26,"column":106}}],"line":26},"18":{"loc":{"start":{"line":26,"column":24},"end":{"line":26,"column":77}},"type":"binary-expr","locations":[{"start":{"line":26,"column":24},"end":{"line":26,"column":35}},{"start":{"line":26,"column":40},"end":{"line":26,"column":42}},{"start":{"line":26,"column":47},"end":{"line":26,"column":59}},{"start":{"line":26,"column":63},"end":{"line":26,"column":75}}],"line":26},"19":{"loc":{"start":{"line":27,"column":20},"end":{"line":27,"column":89}},"type":"if","locations":[{"start":{"line":27,"column":20},"end":{"line":27,"column":89}},{"start":{"line":27,"column":20},"end":{"line":27,"column":89}}],"line":27},"20":{"loc":{"start":{"line":27,"column":24},"end":{"line":27,"column":53}},"type":"binary-expr","locations":[{"start":{"line":27,"column":24},"end":{"line":27,"column":35}},{"start":{"line":27,"column":39},"end":{"line":27,"column":53}}],"line":27},"21":{"loc":{"start":{"line":28,"column":20},"end":{"line":28,"column":87}},"type":"if","locations":[{"start":{"line":28,"column":20},"end":{"line":28,"column":87}},{"start":{"line":28,"column":20},"end":{"line":28,"column":87}}],"line":28},"22":{"loc":{"start":{"line":28,"column":24},"end":{"line":28,"column":43}},"type":"binary-expr","locations":[{"start":{"line":28,"column":24},"end":{"line":28,"column":25}},{"start":{"line":28,"column":29},"end":{"line":28,"column":43}}],"line":28},"23":{"loc":{"start":{"line":29,"column":20},"end":{"line":29,"column":42}},"type":"if","locations":[{"start":{"line":29,"column":20},"end":{"line":29,"column":42}},{"start":{"line":29,"column":20},"end":{"line":29,"column":42}}],"line":29},"24":{"loc":{"start":{"line":34,"column":8},"end":{"line":34,"column":35}},"type":"if","locations":[{"start":{"line":34,"column":8},"end":{"line":34,"column":35}},{"start":{"line":34,"column":8},"end":{"line":34,"column":35}}],"line":34},"25":{"loc":{"start":{"line":34,"column":52},"end":{"line":34,"column":74}},"type":"cond-expr","locations":[{"start":{"line":34,"column":60},"end":{"line":34,"column":65}},{"start":{"line":34,"column":68},"end":{"line":34,"column":74}}],"line":34},"26":{"loc":{"start":{"line":37,"column":22},"end":{"line":39,"column":1}},"type":"binary-expr","locations":[{"start":{"line":37,"column":23},"end":{"line":37,"column":27}},{"start":{"line":37,"column":31},"end":{"line":37,"column":51}},{"start":{"line":37,"column":56},"end":{"line":39,"column":1}}],"line":37},"27":{"loc":{"start":{"line":38,"column":11},"end":{"line":38,"column":61}},"type":"cond-expr","locations":[{"start":{"line":38,"column":37},"end":{"line":38,"column":40}},{"start":{"line":38,"column":43},"end":{"line":38,"column":61}}],"line":38},"28":{"loc":{"start":{"line":38,"column":12},"end":{"line":38,"column":33}},"type":"binary-expr","locations":[{"start":{"line":38,"column":12},"end":{"line":38,"column":15}},{"start":{"line":38,"column":19},"end":{"line":38,"column":33}}],"line":38},"29":{"loc":{"start":{"line":52,"column":16},"end":{"line":65,"column":17}},"type":"switch","locations":[{"start":{"line":53,"column":20},"end":{"line":56,"column":70}},{"start":{"line":57,"column":20},"end":{"line":64,"column":46}}],"line":52},"30":{"loc":{"start":{"line":73,"column":16},"end":{"line":82,"column":17}},"type":"switch","locations":[{"start":{"line":74,"column":20},"end":{"line":77,"column":70}},{"start":{"line":78,"column":20},"end":{"line":81,"column":46}}],"line":73}},"s":{"0":1,"1":2,"2":2,"3":2,"4":0,"5":0,"6":0,"7":0,"8":4,"9":2,"10":2,"11":1,"12":2,"13":2,"14":0,"15":2,"16":2,"17":0,"18":6,"19":4,"20":4,"21":0,"22":4,"23":8,"24":8,"25":0,"26":8,"27":0,"28":8,"29":4,"30":4,"31":2,"32":2,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":2,"41":2,"42":2,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":4,"59":0,"60":0,"61":8,"62":2,"63":0,"64":2,"65":1,"66":2,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":2,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":2,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"f":{"0":2,"1":2,"2":2,"3":0,"4":4,"5":2,"6":2,"7":2,"8":0,"9":6,"10":4,"11":4,"12":2,"13":1,"14":1,"15":1,"16":2,"17":1,"18":1,"19":2,"20":1,"21":1,"22":1},"b":{"0":[1,1,1],"1":[2,2],"2":[2,2],"3":[2,2],"4":[1,1,1],"5":[0,2],"6":[2,2],"7":[0,4],"8":[0,8],"9":[8,0,0],"10":[0,0],"11":[0,0],"12":[0,8],"13":[4,4,2,0,0,2],"14":[2,0],"15":[2,2,2],"16":[2,0],"17":[0,0],"18":[0,0,0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,2],"25":[2,0],"26":[1,1,1],"27":[0,2],"28":[2,2],"29":[1,1],"30":[1,1]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"fc6427432e48e2c4fd91a7990ebfc938b33bc3a5","contentHash":"f7991a78a098fb234277eb92b5019d45_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/rowSplit.test.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/rowSplit.test.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":62}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":38}},"2":{"start":{"line":4,"column":18},"end":{"line":4,"column":40}},"3":{"start":{"line":5,"column":13},"end":{"line":5,"column":30}},"4":{"start":{"line":6,"column":0},"end":{"line":37,"column":3}},"5":{"start":{"line":7,"column":23},"end":{"line":15,"column":5}},"6":{"start":{"line":8,"column":8},"end":{"line":14,"column":16}},"7":{"start":{"line":16,"column":4},"end":{"line":21,"column":7}},"8":{"start":{"line":17,"column":24},"end":{"line":17,"column":27}},"9":{"start":{"line":18,"column":21},"end":{"line":18,"column":28}},"10":{"start":{"line":19,"column":32},"end":{"line":19,"column":72}},"11":{"start":{"line":20,"column":8},"end":{"line":20,"column":51}},"12":{"start":{"line":22,"column":4},"end":{"line":26,"column":7}},"13":{"start":{"line":23,"column":21},"end":{"line":23,"column":28}},"14":{"start":{"line":24,"column":32},"end":{"line":24,"column":75}},"15":{"start":{"line":25,"column":8},"end":{"line":25,"column":42}},"16":{"start":{"line":27,"column":4},"end":{"line":31,"column":7}},"17":{"start":{"line":28,"column":21},"end":{"line":28,"column":26}},"18":{"start":{"line":29,"column":32},"end":{"line":29,"column":75}},"19":{"start":{"line":30,"column":8},"end":{"line":30,"column":42}},"20":{"start":{"line":32,"column":4},"end":{"line":36,"column":7}},"21":{"start":{"line":33,"column":21},"end":{"line":33,"column":28}},"22":{"start":{"line":34,"column":32},"end":{"line":34,"column":84}},"23":{"start":{"line":35,"column":8},"end":{"line":35,"column":42}},"24":{"start":{"line":38,"column":0},"end":{"line":77,"column":3}},"25":{"start":{"line":39,"column":19},"end":{"line":39,"column":71}},"26":{"start":{"line":40,"column":15},"end":{"line":42,"column":5}},"27":{"start":{"line":41,"column":8},"end":{"line":41,"column":47}},"28":{"start":{"line":43,"column":4},"end":{"line":52,"column":7}},"29":{"start":{"line":44,"column":20},"end":{"line":48,"column":9}},"30":{"start":{"line":49,"column":18},"end":{"line":49,"column":29}},"31":{"start":{"line":50,"column":8},"end":{"line":50,"column":46}},"32":{"start":{"line":51,"column":8},"end":{"line":51,"column":38}},"33":{"start":{"line":53,"column":4},"end":{"line":66,"column":7}},"34":{"start":{"line":54,"column":20},"end":{"line":59,"column":9}},"35":{"start":{"line":60,"column":18},"end":{"line":60,"column":29}},"36":{"start":{"line":61,"column":8},"end":{"line":61,"column":46}},"37":{"start":{"line":62,"column":8},"end":{"line":62,"column":50}},"38":{"start":{"line":63,"column":8},"end":{"line":63,"column":53}},"39":{"start":{"line":64,"column":8},"end":{"line":64,"column":50}},"40":{"start":{"line":65,"column":8},"end":{"line":65,"column":38}},"41":{"start":{"line":67,"column":4},"end":{"line":76,"column":7}},"42":{"start":{"line":68,"column":20},"end":{"line":72,"column":9}},"43":{"start":{"line":73,"column":18},"end":{"line":73,"column":29}},"44":{"start":{"line":74,"column":8},"end":{"line":74,"column":46}},"45":{"start":{"line":75,"column":8},"end":{"line":75,"column":62}},"46":{"start":{"line":78,"column":0},"end":{"line":100,"column":3}},"47":{"start":{"line":79,"column":19},"end":{"line":79,"column":71}},"48":{"start":{"line":80,"column":15},"end":{"line":82,"column":5}},"49":{"start":{"line":81,"column":8},"end":{"line":81,"column":35}},"50":{"start":{"line":83,"column":4},"end":{"line":88,"column":7}},"51":{"start":{"line":84,"column":18},"end":{"line":84,"column":49}},"52":{"start":{"line":85,"column":18},"end":{"line":85,"column":27}},"53":{"start":{"line":86,"column":8},"end":{"line":86,"column":42}},"54":{"start":{"line":87,"column":8},"end":{"line":87,"column":39}},"55":{"start":{"line":89,"column":4},"end":{"line":93,"column":7}},"56":{"start":{"line":90,"column":18},"end":{"line":90,"column":51}},"57":{"start":{"line":91,"column":18},"end":{"line":91,"column":27}},"58":{"start":{"line":92,"column":8},"end":{"line":92,"column":40}},"59":{"start":{"line":94,"column":4},"end":{"line":99,"column":7}},"60":{"start":{"line":95,"column":18},"end":{"line":95,"column":63}},"61":{"start":{"line":96,"column":18},"end":{"line":96,"column":27}},"62":{"start":{"line":97,"column":8},"end":{"line":97,"column":39}},"63":{"start":{"line":98,"column":8},"end":{"line":98,"column":59}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":28},"end":{"line":6,"column":29}},"loc":{"start":{"line":6,"column":40},"end":{"line":37,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":23},"end":{"line":7,"column":24}},"loc":{"start":{"line":7,"column":43},"end":{"line":15,"column":5}},"line":7},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":59},"end":{"line":16,"column":60}},"loc":{"start":{"line":16,"column":71},"end":{"line":21,"column":5}},"line":16},"3":{"name":"(anonymous_3)","decl":{"start":{"line":22,"column":71},"end":{"line":22,"column":72}},"loc":{"start":{"line":22,"column":83},"end":{"line":26,"column":5}},"line":22},"4":{"name":"(anonymous_4)","decl":{"start":{"line":27,"column":94},"end":{"line":27,"column":95}},"loc":{"start":{"line":27,"column":106},"end":{"line":31,"column":5}},"line":27},"5":{"name":"(anonymous_5)","decl":{"start":{"line":32,"column":59},"end":{"line":32,"column":60}},"loc":{"start":{"line":32,"column":71},"end":{"line":36,"column":5}},"line":32},"6":{"name":"(anonymous_6)","decl":{"start":{"line":38,"column":36},"end":{"line":38,"column":37}},"loc":{"start":{"line":38,"column":48},"end":{"line":77,"column":1}},"line":38},"7":{"name":"(anonymous_7)","decl":{"start":{"line":40,"column":15},"end":{"line":40,"column":16}},"loc":{"start":{"line":40,"column":32},"end":{"line":42,"column":5}},"line":40},"8":{"name":"(anonymous_8)","decl":{"start":{"line":43,"column":44},"end":{"line":43,"column":45}},"loc":{"start":{"line":43,"column":56},"end":{"line":52,"column":5}},"line":43},"9":{"name":"(anonymous_9)","decl":{"start":{"line":53,"column":37},"end":{"line":53,"column":38}},"loc":{"start":{"line":53,"column":49},"end":{"line":66,"column":5}},"line":53},"10":{"name":"(anonymous_10)","decl":{"start":{"line":67,"column":51},"end":{"line":67,"column":52}},"loc":{"start":{"line":67,"column":63},"end":{"line":76,"column":5}},"line":67},"11":{"name":"(anonymous_11)","decl":{"start":{"line":78,"column":36},"end":{"line":78,"column":37}},"loc":{"start":{"line":78,"column":48},"end":{"line":100,"column":1}},"line":78},"12":{"name":"(anonymous_12)","decl":{"start":{"line":80,"column":15},"end":{"line":80,"column":16}},"loc":{"start":{"line":80,"column":30},"end":{"line":82,"column":5}},"line":80},"13":{"name":"(anonymous_13)","decl":{"start":{"line":83,"column":41},"end":{"line":83,"column":42}},"loc":{"start":{"line":83,"column":53},"end":{"line":88,"column":5}},"line":83},"14":{"name":"(anonymous_14)","decl":{"start":{"line":89,"column":43},"end":{"line":89,"column":44}},"loc":{"start":{"line":89,"column":55},"end":{"line":93,"column":5}},"line":89},"15":{"name":"(anonymous_15)","decl":{"start":{"line":94,"column":37},"end":{"line":94,"column":38}},"loc":{"start":{"line":94,"column":49},"end":{"line":99,"column":5}},"line":94}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":4,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":3,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":3,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1},"f":{"0":1,"1":4,"2":1,"3":1,"4":1,"5":1,"6":1,"7":3,"8":1,"9":1,"10":1,"11":1,"12":3,"13":1,"14":1,"15":1},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"3180e967375c01b6e15076e5f192dd193444daf6","contentHash":"c506e6fbe082dee4fb8556ebf1dc7b75_11.7.3"},"/Users/kxiang/work/projects/csv2json/src/index.ts":{"path":"/Users/kxiang/work/projects/csv2json/src/index.ts","statementMap":{"0":{"start":{"line":2,"column":18},"end":{"line":2,"column":40}},"1":{"start":{"line":3,"column":13},"end":{"line":5,"column":1}},"2":{"start":{"line":4,"column":4},"end":{"line":4,"column":53}},"3":{"start":{"line":6,"column":0},"end":{"line":6,"column":44}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":24}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":13},"end":{"line":3,"column":14}},"loc":{"start":{"line":3,"column":39},"end":{"line":5,"column":1}},"line":3}},"branchMap":{},"s":{"0":1,"1":1,"2":35,"3":1,"4":1},"f":{"0":35},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"6d4d22d9140746f9fba1f430287dda46307a5382","contentHash":"aa7fbac5ea924bbd365e861084d8442a_11.7.3"}} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/934df09d48f9ab6d63432230cb8317bb.json b/node_modules/csvtojson/.nyc_output/934df09d48f9ab6d63432230cb8317bb.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/934df09d48f9ab6d63432230cb8317bb.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/95f40fd8e3124bf5095029ef2d7b2992.json b/node_modules/csvtojson/.nyc_output/95f40fd8e3124bf5095029ef2d7b2992.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/95f40fd8e3124bf5095029ef2d7b2992.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/a314d83b6e7be2c677c93ea6fbcdbdbc.json b/node_modules/csvtojson/.nyc_output/a314d83b6e7be2c677c93ea6fbcdbdbc.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/a314d83b6e7be2c677c93ea6fbcdbdbc.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/ac79bb4f8b5a2c44b47ba0e0ff1981b8.json b/node_modules/csvtojson/.nyc_output/ac79bb4f8b5a2c44b47ba0e0ff1981b8.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/ac79bb4f8b5a2c44b47ba0e0ff1981b8.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/b5b5ac11f64a1197639ab87ddf790f3f.json b/node_modules/csvtojson/.nyc_output/b5b5ac11f64a1197639ab87ddf790f3f.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/b5b5ac11f64a1197639ab87ddf790f3f.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/c444d3abd00b76b655d8c52d1d6d9a18.json b/node_modules/csvtojson/.nyc_output/c444d3abd00b76b655d8c52d1d6d9a18.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/c444d3abd00b76b655d8c52d1d6d9a18.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/d69c8a3cb089743a1c6fe6af1b55dcaf.json b/node_modules/csvtojson/.nyc_output/d69c8a3cb089743a1c6fe6af1b55dcaf.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/d69c8a3cb089743a1c6fe6af1b55dcaf.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/d9ab5ea23a578236eda29d6fb5d81a89.json b/node_modules/csvtojson/.nyc_output/d9ab5ea23a578236eda29d6fb5d81a89.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/d9ab5ea23a578236eda29d6fb5d81a89.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/ddbb6c792d436c4896dca99a6889d310.json b/node_modules/csvtojson/.nyc_output/ddbb6c792d436c4896dca99a6889d310.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/ddbb6c792d436c4896dca99a6889d310.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/e30b290de441d813f69836edb7b6bf69.json b/node_modules/csvtojson/.nyc_output/e30b290de441d813f69836edb7b6bf69.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/e30b290de441d813f69836edb7b6bf69.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/e6b880f5dcf4799d52e940c12d2c0fc8.json b/node_modules/csvtojson/.nyc_output/e6b880f5dcf4799d52e940c12d2c0fc8.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/e6b880f5dcf4799d52e940c12d2c0fc8.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/f5bf0478c1625678749178bdb2e5098d.json b/node_modules/csvtojson/.nyc_output/f5bf0478c1625678749178bdb2e5098d.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/f5bf0478c1625678749178bdb2e5098d.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.nyc_output/f6e47582bba1716e24a1e52d01da6e9c.json b/node_modules/csvtojson/.nyc_output/f6e47582bba1716e24a1e52d01da6e9c.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/node_modules/csvtojson/.nyc_output/f6e47582bba1716e24a1e52d01da6e9c.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/node_modules/csvtojson/.travis.yml b/node_modules/csvtojson/.travis.yml new file mode 100644 index 0000000..35bed36 --- /dev/null +++ b/node_modules/csvtojson/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +node_js: + - "10" + - "8" + - "6" +after_success: 'npm run coveralls' +script: "npm run travis" \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/09978396b133849a0d0f83c9c100b167a1060208a0fdf57d39dc695ae209e0c9.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/09978396b133849a0d0f83c9c100b167a1060208a0fdf57d39dc695ae209e0c9.js new file mode 100644 index 0000000..fd2e531 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/09978396b133849a0d0f83c9c100b167a1060208a0fdf57d39dc695ae209e0c9.js @@ -0,0 +1,212 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var CSVError_1 = __importDefault(require("./CSVError")); +var set_1 = __importDefault(require("lodash/set")); +var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/; +function default_1(csvRows, conv) { + var res = []; + for (var i = 0, len = csvRows.length; i < len; i++) { + var r = processRow(csvRows[i], conv, i); + if (r) { + res.push(r); + } + } + return res; +} +exports.default = default_1; +; +function processRow(row, conv, index) { + if (conv.parseParam.checkColumn && conv.parseRuntime.headers && row.length !== conv.parseRuntime.headers.length) { + throw (CSVError_1.default.column_mismatched(conv.parseRuntime.parsedLineNumber + index)); + } + var headRow = conv.parseRuntime.headers || []; + var resultRow = convertRowToJson(row, headRow, conv); + if (resultRow) { + return resultRow; + } + else { + return null; + } +} +function convertRowToJson(row, headRow, conv) { + var hasValue = false; + var resultRow = {}; + for (var i = 0, len = row.length; i < len; i++) { + var item = row[i]; + if (conv.parseParam.ignoreEmpty && item === '') { + continue; + } + hasValue = true; + var head = headRow[i]; + if (!head || head === "") { + head = headRow[i] = "field" + (i + 1); + } + var convFunc = getConvFunc(head, i, conv); + if (convFunc) { + var convRes = convFunc(item, head, resultRow, row, i); + if (convRes !== undefined) { + setPath(resultRow, head, convRes, conv, i); + } + } + else { + // var flag = getFlag(head, i, param); + // if (flag === 'omit') { + // continue; + // } + if (conv.parseParam.checkType) { + var convertFunc = checkType(item, head, i, conv); + item = convertFunc(item); + } + if (item !== undefined) { + setPath(resultRow, head, item, conv, i); + } + } + } + if (hasValue) { + return resultRow; + } + else { + return null; + } +} +var builtInConv = { + "string": stringType, + "number": numberType, + "omit": function () { } +}; +function getConvFunc(head, i, conv) { + if (conv.parseRuntime.columnConv[i] !== undefined) { + return conv.parseRuntime.columnConv[i]; + } + else { + var flag = conv.parseParam.colParser[head]; + if (flag === undefined) { + return conv.parseRuntime.columnConv[i] = null; + } + if (typeof flag === "object") { + flag = flag.cellParser || "string"; + } + if (typeof flag === "string") { + flag = flag.trim().toLowerCase(); + var builtInFunc = builtInConv[flag]; + if (builtInFunc) { + return conv.parseRuntime.columnConv[i] = builtInFunc; + } + else { + return conv.parseRuntime.columnConv[i] = null; + } + } + else if (typeof flag === "function") { + return conv.parseRuntime.columnConv[i] = flag; + } + else { + return conv.parseRuntime.columnConv[i] = null; + } + } +} +function setPath(resultJson, head, value, conv, headIdx) { + if (!conv.parseRuntime.columnValueSetter[headIdx]) { + if (conv.parseParam.flatKeys) { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + else { + if (head.indexOf(".") > -1) { + var headArr = head.split("."); + var jsonHead = true; + while (headArr.length > 0) { + var headCom = headArr.shift(); + if (headCom.length === 0) { + jsonHead = false; + break; + } + } + if (!jsonHead || conv.parseParam.colParser[head] && conv.parseParam.colParser[head].flat) { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + else { + conv.parseRuntime.columnValueSetter[headIdx] = jsonSetter; + } + } + else { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + } + } + if (conv.parseParam.nullObject === true && value === "null") { + value = null; + } + conv.parseRuntime.columnValueSetter[headIdx](resultJson, head, value); + // flatSetter(resultJson, head, value); +} +function flatSetter(resultJson, head, value) { + resultJson[head] = value; +} +function jsonSetter(resultJson, head, value) { + set_1.default(resultJson, head, value); +} +function checkType(item, head, headIdx, conv) { + if (conv.parseRuntime.headerType[headIdx]) { + return conv.parseRuntime.headerType[headIdx]; + } + else if (head.indexOf('number#!') > -1) { + return conv.parseRuntime.headerType[headIdx] = numberType; + } + else if (head.indexOf('string#!') > -1) { + return conv.parseRuntime.headerType[headIdx] = stringType; + } + else if (conv.parseParam.checkType) { + return conv.parseRuntime.headerType[headIdx] = dynamicType; + } + else { + return conv.parseRuntime.headerType[headIdx] = stringType; + } +} +function numberType(item) { + var rtn = parseFloat(item); + if (isNaN(rtn)) { + return item; + } + return rtn; +} +function stringType(item) { + return item.toString(); +} +function dynamicType(item) { + var trimed = item.trim(); + if (trimed === "") { + return stringType(item); + } + if (numReg.test(trimed)) { + return numberType(item); + } + else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") { + return booleanType(item); + } + else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") { + return jsonType(item); + } + else { + return stringType(item); + } +} +function booleanType(item) { + var trimed = item.trim(); + if (trimed.length === 5 && trimed.toLowerCase() === "false") { + return false; + } + else { + return true; + } +} +function jsonType(item) { + try { + return JSON.parse(item); + } + catch (e) { + return item; + } +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9saW5lVG9Kc29uLnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL2xpbmVUb0pzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx3REFBa0M7QUFFbEMsbURBQTZCO0FBRzdCLElBQUksTUFBTSxHQUFHLDBDQUEwQyxDQUFDO0FBRXhELG1CQUF5QixPQUFtQixFQUFFLElBQWU7SUFDM0QsSUFBTSxHQUFHLEdBQWlCLEVBQUUsQ0FBQztJQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2xELElBQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxFQUFFO1lBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNiO0tBQ0Y7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFURCw0QkFTQztBQUFBLENBQUM7QUFLRixvQkFBb0IsR0FBYSxFQUFFLElBQWUsRUFBRSxLQUFLO0lBRXZELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDL0csTUFBTSxDQUFDLGtCQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFBO0tBQy9FO0lBRUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hELElBQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsSUFBSSxTQUFTLEVBQUU7UUFDYixPQUFPLFNBQVMsQ0FBQztLQUNsQjtTQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7S0FDYjtBQUNILENBQUM7QUFFRCwwQkFBMEIsR0FBYSxFQUFFLE9BQWlCLEVBQUUsSUFBZTtJQUN6RSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsSUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksSUFBSSxLQUFLLEVBQUUsRUFBRTtZQUM5QyxTQUFTO1NBQ1Y7UUFDRCxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRWhCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUN6QixPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7YUFBTTtZQUNMLHNDQUFzQztZQUN0Qyx5QkFBeUI7WUFDekIsY0FBYztZQUNkLElBQUk7WUFDSixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO2dCQUM3QixJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUI7WUFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEM7U0FDRjtLQUNGO0lBQ0QsSUFBSSxRQUFRLEVBQUU7UUFDWixPQUFPLFNBQVMsQ0FBQztLQUNsQjtTQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7S0FDYjtBQUNILENBQUM7QUFFRCxJQUFNLFdBQVcsR0FBa0M7SUFDakQsUUFBUSxFQUFFLFVBQVU7SUFDcEIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLGNBQWMsQ0FBQztDQUN4QixDQUFBO0FBQ0QscUJBQXFCLElBQVksRUFBRSxDQUFTLEVBQUUsSUFBZTtJQUMzRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUNqRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hDO1NBQU07UUFDTCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDL0M7UUFDRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM1QixJQUFJLEdBQUksSUFBb0IsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDNUIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7YUFDdEQ7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDL0M7U0FDRjthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQy9DO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMvQztLQUNGO0FBQ0gsQ0FBQztBQUNELGlCQUFpQixVQUFlLEVBQUUsSUFBWSxFQUFFLEtBQVUsRUFBRSxJQUFlLEVBQUMsT0FBYztJQUN4RixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNqRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDO1NBQzNEO2FBQU07WUFFTCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7Z0JBQzFCLElBQU0sT0FBTyxHQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksUUFBUSxHQUFDLElBQUksQ0FBQztnQkFDbEIsT0FBTSxPQUFPLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztvQkFDckIsSUFBTSxPQUFPLEdBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUM5QixJQUFJLE9BQVEsQ0FBQyxNQUFNLEtBQUcsQ0FBQyxFQUFDO3dCQUN0QixRQUFRLEdBQUMsS0FBSyxDQUFDO3dCQUNmLE1BQU07cUJBQ1A7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQWlCLENBQUMsSUFBSSxFQUFFO29CQUN6RyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQztpQkFDM0Q7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUM7aUJBQzNEO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUM7YUFDM0Q7U0FDRjtLQUNGO0lBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsS0FBSSxJQUFJLElBQUksS0FBSyxLQUFJLE1BQU0sRUFBQztRQUN4RCxLQUFLLEdBQUMsSUFBSSxDQUFDO0tBQ1o7SUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsdUNBQXVDO0FBRXpDLENBQUM7QUFDRCxvQkFBb0IsVUFBZSxFQUFFLElBQVksRUFBRSxLQUFVO0lBQzNELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDM0IsQ0FBQztBQUNELG9CQUFvQixVQUFlLEVBQUUsSUFBWSxFQUFFLEtBQVU7SUFDM0QsYUFBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUdELG1CQUFtQixJQUFZLEVBQUUsSUFBWSxFQUFFLE9BQWUsRUFBRSxJQUFlO0lBQzdFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM5QztTQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQztLQUMzRDtTQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQztLQUMzRDtTQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDcEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUM7S0FDNUQ7U0FBTTtRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDO0tBQzNEO0FBQ0gsQ0FBQztBQUVELG9CQUFvQixJQUFJO0lBQ3RCLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNkLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxvQkFBb0IsSUFBWTtJQUM5QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN6QixDQUFDO0FBRUQscUJBQXFCLElBQUk7SUFDdkIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLElBQUksTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUNqQixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN6QjtJQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN2QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN6QjtTQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxFQUFFO1FBQzVILE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzFCO1NBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUMzSCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN2QjtTQUFNO1FBQ0wsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7QUFDSCxDQUFDO0FBRUQscUJBQXFCLElBQUk7SUFDdkIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sRUFBRTtRQUMzRCxPQUFPLEtBQUssQ0FBQztLQUNkO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELGtCQUFrQixJQUFJO0lBQ3BCLElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7SUFBQyxPQUFPLENBQUMsRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSBcIi4vQ29udmVydGVyXCI7XG5pbXBvcnQgQ1NWRXJyb3IgZnJvbSBcIi4vQ1NWRXJyb3JcIjtcbmltcG9ydCB7IENlbGxQYXJzZXIsIENvbHVtblBhcmFtIH0gZnJvbSBcIi4vUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHNldCBmcm9tIFwibG9kYXNoL3NldFwiO1xuaW1wb3J0IHsgUGFyc2VSdW50aW1lIH0gZnJvbSBcIi4vUGFyc2VSdW50aW1lXCI7XG5cbnZhciBudW1SZWcgPSAvXlstK10/WzAtOV0qXFwuP1swLTldKyhbZUVdWy0rXT9bMC05XSspPyQvO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY3N2Um93czogc3RyaW5nW11bXSwgY29udjogQ29udmVydGVyKTogSlNPTlJlc3VsdFtdIHtcbiAgY29uc3QgcmVzOiBKU09OUmVzdWx0W10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNzdlJvd3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCByID0gcHJvY2Vzc1Jvdyhjc3ZSb3dzW2ldLCBjb252LCBpKTtcbiAgICBpZiAocikge1xuICAgICAgcmVzLnB1c2gocik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuZXhwb3J0IHR5cGUgSlNPTlJlc3VsdCA9IHtcbiAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSb3cocm93OiBzdHJpbmdbXSwgY29udjogQ29udmVydGVyLCBpbmRleCk6IEpTT05SZXN1bHQgfCBudWxsIHtcblxuICBpZiAoY29udi5wYXJzZVBhcmFtLmNoZWNrQ29sdW1uICYmIGNvbnYucGFyc2VSdW50aW1lLmhlYWRlcnMgJiYgcm93Lmxlbmd0aCAhPT0gY29udi5wYXJzZVJ1bnRpbWUuaGVhZGVycy5sZW5ndGgpIHtcbiAgICB0aHJvdyAoQ1NWRXJyb3IuY29sdW1uX21pc21hdGNoZWQoY29udi5wYXJzZVJ1bnRpbWUucGFyc2VkTGluZU51bWJlciArIGluZGV4KSlcbiAgfVxuXG4gIGNvbnN0IGhlYWRSb3cgPSBjb252LnBhcnNlUnVudGltZS5oZWFkZXJzIHx8IFtdO1xuICBjb25zdCByZXN1bHRSb3cgPSBjb252ZXJ0Um93VG9Kc29uKHJvdywgaGVhZFJvdywgY29udik7XG4gIGlmIChyZXN1bHRSb3cpIHtcbiAgICByZXR1cm4gcmVzdWx0Um93O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRSb3dUb0pzb24ocm93OiBzdHJpbmdbXSwgaGVhZFJvdzogc3RyaW5nW10sIGNvbnY6IENvbnZlcnRlcik6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsIHtcbiAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7XG4gIGNvbnN0IHJlc3VsdFJvdyA9IHt9O1xuICBcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJvdy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGxldCBpdGVtID0gcm93W2ldO1xuXG4gICAgaWYgKGNvbnYucGFyc2VQYXJhbS5pZ25vcmVFbXB0eSAmJiBpdGVtID09PSAnJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgIGxldCBoZWFkID0gaGVhZFJvd1tpXTtcbiAgICBpZiAoIWhlYWQgfHwgaGVhZCA9PT0gXCJcIikge1xuICAgICAgaGVhZCA9IGhlYWRSb3dbaV0gPSBcImZpZWxkXCIgKyAoaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBjb252RnVuYyA9IGdldENvbnZGdW5jKGhlYWQsIGksIGNvbnYpO1xuICAgIGlmIChjb252RnVuYykge1xuICAgICAgY29uc3QgY29udlJlcyA9IGNvbnZGdW5jKGl0ZW0sIGhlYWQsIHJlc3VsdFJvdywgcm93LCBpKTtcbiAgICAgIGlmIChjb252UmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0UGF0aChyZXN1bHRSb3csIGhlYWQsIGNvbnZSZXMsIGNvbnYsaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHZhciBmbGFnID0gZ2V0RmxhZyhoZWFkLCBpLCBwYXJhbSk7XG4gICAgICAvLyBpZiAoZmxhZyA9PT0gJ29taXQnKSB7XG4gICAgICAvLyAgIGNvbnRpbnVlO1xuICAgICAgLy8gfVxuICAgICAgaWYgKGNvbnYucGFyc2VQYXJhbS5jaGVja1R5cGUpIHtcbiAgICAgICAgY29uc3QgY29udmVydEZ1bmMgPSBjaGVja1R5cGUoaXRlbSwgaGVhZCwgaSwgY29udik7XG4gICAgICAgIGl0ZW0gPSBjb252ZXJ0RnVuYyhpdGVtKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2V0UGF0aChyZXN1bHRSb3csIGhlYWQsIGl0ZW0sIGNvbnYsaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChoYXNWYWx1ZSkge1xuICAgIHJldHVybiByZXN1bHRSb3c7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY29uc3QgYnVpbHRJbkNvbnY6IHsgW2tleTogc3RyaW5nXTogQ2VsbFBhcnNlciB9ID0ge1xuICBcInN0cmluZ1wiOiBzdHJpbmdUeXBlLFxuICBcIm51bWJlclwiOiBudW1iZXJUeXBlLFxuICBcIm9taXRcIjogZnVuY3Rpb24gKCkgeyB9XG59XG5mdW5jdGlvbiBnZXRDb252RnVuYyhoZWFkOiBzdHJpbmcsIGk6IG51bWJlciwgY29udjogQ29udmVydGVyKTogQ2VsbFBhcnNlciB8IG51bGwge1xuICBpZiAoY29udi5wYXJzZVJ1bnRpbWUuY29sdW1uQ29udltpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvbnYucGFyc2VSdW50aW1lLmNvbHVtbkNvbnZbaV07XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZsYWcgPSBjb252LnBhcnNlUGFyYW0uY29sUGFyc2VyW2hlYWRdO1xuICAgIGlmIChmbGFnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb252LnBhcnNlUnVudGltZS5jb2x1bW5Db252W2ldID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmbGFnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmbGFnID0gKGZsYWcgYXMgQ29sdW1uUGFyYW0pLmNlbGxQYXJzZXIgfHwgXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmbGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBmbGFnID0gZmxhZy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGJ1aWx0SW5GdW5jID0gYnVpbHRJbkNvbnZbZmxhZ107XG4gICAgICBpZiAoYnVpbHRJbkZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGNvbnYucGFyc2VSdW50aW1lLmNvbHVtbkNvbnZbaV0gPSBidWlsdEluRnVuYztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb252LnBhcnNlUnVudGltZS5jb2x1bW5Db252W2ldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmbGFnID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBjb252LnBhcnNlUnVudGltZS5jb2x1bW5Db252W2ldID0gZmxhZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbnYucGFyc2VSdW50aW1lLmNvbHVtbkNvbnZbaV0gPSBudWxsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0UGF0aChyZXN1bHRKc29uOiBhbnksIGhlYWQ6IHN0cmluZywgdmFsdWU6IGFueSwgY29udjogQ29udmVydGVyLGhlYWRJZHg6bnVtYmVyKSB7XG4gIGlmICghY29udi5wYXJzZVJ1bnRpbWUuY29sdW1uVmFsdWVTZXR0ZXJbaGVhZElkeF0pIHtcbiAgICBpZiAoY29udi5wYXJzZVBhcmFtLmZsYXRLZXlzKSB7XG4gICAgICBjb252LnBhcnNlUnVudGltZS5jb2x1bW5WYWx1ZVNldHRlcltoZWFkSWR4XSA9IGZsYXRTZXR0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIFxuICAgICAgaWYgKGhlYWQuaW5kZXhPZihcIi5cIikgPiAtMSkge1xuICAgICAgICBjb25zdCBoZWFkQXJyPWhlYWQuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQganNvbkhlYWQ9dHJ1ZTtcbiAgICAgICAgd2hpbGUoaGVhZEFyci5sZW5ndGg+MCl7XG4gICAgICAgICAgY29uc3QgaGVhZENvbT1oZWFkQXJyLnNoaWZ0KCk7XG4gICAgICAgICAgaWYgKGhlYWRDb20hLmxlbmd0aD09PTApe1xuICAgICAgICAgICAganNvbkhlYWQ9ZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFqc29uSGVhZCB8fCBjb252LnBhcnNlUGFyYW0uY29sUGFyc2VyW2hlYWRdICYmIChjb252LnBhcnNlUGFyYW0uY29sUGFyc2VyW2hlYWRdIGFzIENvbHVtblBhcmFtKS5mbGF0KSB7XG4gICAgICAgICAgY29udi5wYXJzZVJ1bnRpbWUuY29sdW1uVmFsdWVTZXR0ZXJbaGVhZElkeF0gPSBmbGF0U2V0dGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnYucGFyc2VSdW50aW1lLmNvbHVtblZhbHVlU2V0dGVyW2hlYWRJZHhdID0ganNvblNldHRlcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udi5wYXJzZVJ1bnRpbWUuY29sdW1uVmFsdWVTZXR0ZXJbaGVhZElkeF0gPSBmbGF0U2V0dGVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY29udi5wYXJzZVBhcmFtLm51bGxPYmplY3QgPT09dHJ1ZSAmJiB2YWx1ZSA9PT1cIm51bGxcIil7XG4gICAgdmFsdWU9bnVsbDtcbiAgfVxuICBjb252LnBhcnNlUnVudGltZS5jb2x1bW5WYWx1ZVNldHRlcltoZWFkSWR4XShyZXN1bHRKc29uLCBoZWFkLCB2YWx1ZSk7XG4gIC8vIGZsYXRTZXR0ZXIocmVzdWx0SnNvbiwgaGVhZCwgdmFsdWUpO1xuXG59XG5mdW5jdGlvbiBmbGF0U2V0dGVyKHJlc3VsdEpzb246IGFueSwgaGVhZDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJlc3VsdEpzb25baGVhZF0gPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGpzb25TZXR0ZXIocmVzdWx0SnNvbjogYW55LCBoZWFkOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgc2V0KHJlc3VsdEpzb24sIGhlYWQsIHZhbHVlKTtcbn1cblxuXG5mdW5jdGlvbiBjaGVja1R5cGUoaXRlbTogc3RyaW5nLCBoZWFkOiBzdHJpbmcsIGhlYWRJZHg6IG51bWJlciwgY29udjogQ29udmVydGVyKTogRnVuY3Rpb24ge1xuICBpZiAoY29udi5wYXJzZVJ1bnRpbWUuaGVhZGVyVHlwZVtoZWFkSWR4XSkge1xuICAgIHJldHVybiBjb252LnBhcnNlUnVudGltZS5oZWFkZXJUeXBlW2hlYWRJZHhdO1xuICB9IGVsc2UgaWYgKGhlYWQuaW5kZXhPZignbnVtYmVyIyEnKSA+IC0xKSB7XG4gICAgcmV0dXJuIGNvbnYucGFyc2VSdW50aW1lLmhlYWRlclR5cGVbaGVhZElkeF0gPSBudW1iZXJUeXBlO1xuICB9IGVsc2UgaWYgKGhlYWQuaW5kZXhPZignc3RyaW5nIyEnKSA+IC0xKSB7XG4gICAgcmV0dXJuIGNvbnYucGFyc2VSdW50aW1lLmhlYWRlclR5cGVbaGVhZElkeF0gPSBzdHJpbmdUeXBlO1xuICB9IGVsc2UgaWYgKGNvbnYucGFyc2VQYXJhbS5jaGVja1R5cGUpIHtcbiAgICByZXR1cm4gY29udi5wYXJzZVJ1bnRpbWUuaGVhZGVyVHlwZVtoZWFkSWR4XSA9IGR5bmFtaWNUeXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb252LnBhcnNlUnVudGltZS5oZWFkZXJUeXBlW2hlYWRJZHhdID0gc3RyaW5nVHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBudW1iZXJUeXBlKGl0ZW0pIHtcbiAgdmFyIHJ0biA9IHBhcnNlRmxvYXQoaXRlbSk7XG4gIGlmIChpc05hTihydG4pKSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcmV0dXJuIHJ0bjtcbn1cblxuZnVuY3Rpb24gc3RyaW5nVHlwZShpdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBkeW5hbWljVHlwZShpdGVtKSB7XG4gIHZhciB0cmltZWQgPSBpdGVtLnRyaW0oKTtcbiAgaWYgKHRyaW1lZCA9PT0gXCJcIikge1xuICAgIHJldHVybiBzdHJpbmdUeXBlKGl0ZW0pO1xuICB9XG4gIGlmIChudW1SZWcudGVzdCh0cmltZWQpKSB7XG4gICAgcmV0dXJuIG51bWJlclR5cGUoaXRlbSk7XG4gIH0gZWxzZSBpZiAodHJpbWVkLmxlbmd0aCA9PT0gNSAmJiB0cmltZWQudG9Mb3dlckNhc2UoKSA9PT0gXCJmYWxzZVwiIHx8IHRyaW1lZC5sZW5ndGggPT09IDQgJiYgdHJpbWVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiKSB7XG4gICAgcmV0dXJuIGJvb2xlYW5UeXBlKGl0ZW0pO1xuICB9IGVsc2UgaWYgKHRyaW1lZFswXSA9PT0gXCJ7XCIgJiYgdHJpbWVkW3RyaW1lZC5sZW5ndGggLSAxXSA9PT0gXCJ9XCIgfHwgdHJpbWVkWzBdID09PSBcIltcIiAmJiB0cmltZWRbdHJpbWVkLmxlbmd0aCAtIDFdID09PSBcIl1cIikge1xuICAgIHJldHVybiBqc29uVHlwZShpdGVtKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyaW5nVHlwZShpdGVtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBib29sZWFuVHlwZShpdGVtKSB7XG4gIHZhciB0cmltZWQgPSBpdGVtLnRyaW0oKTtcbiAgaWYgKHRyaW1lZC5sZW5ndGggPT09IDUgJiYgdHJpbWVkLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBqc29uVHlwZShpdGVtKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoaXRlbSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/146467813f9eee2e9487539f1b661828a2caaa54a764fc152183ad640d1d66be.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/146467813f9eee2e9487539f1b661828a2caaa54a764fc152183ad640d1d66be.js new file mode 100644 index 0000000..f83f888 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/146467813f9eee2e9487539f1b661828a2caaa54a764fc152183ad640d1d66be.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function initParseRuntime(converter) { + var params = converter.parseParam; + var rtn = { + needProcessIgnoreColumn: false, + needProcessIncludeColumn: false, + selectedColumns: undefined, + ended: false, + hasError: false, + error: undefined, + delimiter: converter.parseParam.delimiter, + eol: converter.parseParam.eol, + columnConv: [], + headerType: [], + headerTitle: [], + headerFlag: [], + headers: undefined, + started: false, + parsedLineNumber: 0, + columnValueSetter: [], + }; + if (params.ignoreColumns) { + rtn.needProcessIgnoreColumn = true; + } + if (params.includeColumns) { + rtn.needProcessIncludeColumn = true; + } + return rtn; +} +exports.initParseRuntime = initParseRuntime; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9QYXJzZVJ1bnRpbWUudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvUGFyc2VSdW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOERBLDBCQUFpQyxTQUFvQjtJQUNuRCxJQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQ3BDLElBQU0sR0FBRyxHQUFpQjtRQUN4Qix1QkFBdUIsRUFBRSxLQUFLO1FBQzlCLHdCQUF3QixFQUFFLEtBQUs7UUFDL0IsZUFBZSxFQUFFLFNBQVM7UUFDMUIsS0FBSyxFQUFFLEtBQUs7UUFDWixRQUFRLEVBQUUsS0FBSztRQUNmLEtBQUssRUFBRSxTQUFTO1FBQ2hCLFNBQVMsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVM7UUFDekMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRztRQUM3QixVQUFVLEVBQUUsRUFBRTtRQUNkLFVBQVUsRUFBRSxFQUFFO1FBQ2QsV0FBVyxFQUFFLEVBQUU7UUFDZixVQUFVLEVBQUUsRUFBRTtRQUNkLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuQixpQkFBaUIsRUFBRSxFQUFFO0tBQ3RCLENBQUE7SUFDRCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7UUFDeEIsR0FBRyxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQztLQUNwQztJQUNELElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRTtRQUN6QixHQUFHLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBM0JELDRDQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENTVlBhcnNlUGFyYW0sIENlbGxQYXJzZXIgfSBmcm9tIFwiLi9QYXJhbWV0ZXJzXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXIsIFByZVJhd0RhdGFDYWxsYmFjaywgUHJlRmlsZUxpbmVDYWxsYmFjayB9IGZyb20gXCIuL0NvbnZlcnRlclwiO1xuaW1wb3J0IHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBDU1ZFcnJvciBmcm9tIFwiLi9DU1ZFcnJvclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlUnVudGltZSB7XG4gIC8qKlxuICAgKiBJZiBuZWVkIGNvbnZlcnQgaWdub3JlQ29sdW1uIGZyb20gY29sdW1uIG5hbWUoc3RyaW5nKSB0byBjb2x1bW4gaW5kZXggKG51bWJlcikuIFBhcnNlciBuZWVkcyBjb2x1bW4gaW5kZXguXG4gICAqL1xuICBuZWVkUHJvY2Vzc0lnbm9yZUNvbHVtbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIElmIG5lZWQgY29udmVydCBpbmNsdWRlQ29sdW1uIGZyb20gY29sdW1uIG5hbWUoc3RyaW5nKSB0byBjb2x1bW4gaW5kZXggKG51bWJlcikuIFBhcnNlciBuZWVkcyBjb2x1bW4gaW5kZXguXG4gICAqL1xuICBuZWVkUHJvY2Vzc0luY2x1ZGVDb2x1bW46IGJvb2xlYW47XG4gIC8qKlxuICAgKiB0aGUgaW5kZXhlcyBvZiBjb2x1bW5zIHRvIHJlc2VydmUsIHVuZGVmaW5lZCBtZWFucyByZXNlcnZlIGFsbCwgW10gbWVhbnMgaGlkZSBhbGxcbiAgICovXG4gIHNlbGVjdGVkQ29sdW1ucz86IG51bWJlcltdO1xuICBlbmRlZDogYm9vbGVhbjtcbiAgaGFzRXJyb3I6IGJvb2xlYW47XG4gIGVycm9yPzogRXJyb3I7XG4gIC8qKlxuICAgKiBJbmZlcnJlZCBkZWxpbWl0ZXJcbiAgICovXG4gIGRlbGltaXRlcjogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBJbmZlcnJlZCBlb2xcbiAgICovXG4gIGVvbD86IHN0cmluZztcbiAgLyoqXG4gICAqIENvbnZlcnRlciBmdW5jdGlvbiBmb3IgYSBjb2x1bW4uIFBvcHVsYXRlZCBhdCBydW50aW1lLlxuICAgKi9cbiAgY29sdW1uQ29udjogKENlbGxQYXJzZXIgfCBudWxsKVtdLFxuICBoZWFkZXJUeXBlOiBhbnlbXSxcbiAgaGVhZGVyVGl0bGU6IHN0cmluZ1tdLFxuICBoZWFkZXJGbGFnOiBhbnlbXSxcbiAgLyoqXG4gICAqIEluZmVycmVkIGhlYWRlcnNcbiAgICovXG4gIGhlYWRlcnM/OiBhbnlbXSxcbiAgY3N2TGluZUJ1ZmZlcj86IEJ1ZmZlcixcbiAgXG4gIC8qKlxuICAgKiBhZnRlciBmaXJzdCBjaHVuayBvZiBkYXRhIGJlaW5nIHByb2Nlc3NlZCBhbmQgZW1pdHRlZCwgc3RhcnRlZCB3aWxsIGJlY29tZSB0cnVlLlxuICAgKi9cbiAgc3RhcnRlZDogYm9vbGVhbixcbiAgcHJlUmF3RGF0YUhvb2s/OiBQcmVSYXdEYXRhQ2FsbGJhY2ssXG4gIHByZUZpbGVMaW5lSG9vaz86IFByZUZpbGVMaW5lQ2FsbGJhY2ssXG4gIHBhcnNlZExpbmVOdW1iZXI6IG51bWJlcixcblxuICBjb2x1bW5WYWx1ZVNldHRlcjogRnVuY3Rpb25bXTtcbiAgc3Vic2NyaWJlPzoge1xuICAgIG9uTmV4dD86IChkYXRhOiBhbnksIGxpbmVOdW1iZXI6bnVtYmVyKSA9PiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD47XG4gICAgb25FcnJvcj86IChlcnI6IENTVkVycm9yKSA9PiB2b2lkO1xuICAgIG9uQ29tcGxldGVkPzogKCkgPT4gdm9pZDtcbiAgfTtcbiAgdGhlbj86IHtcbiAgICBvbmZ1bGZpbGxlZDogKHZhbHVlOiBhbnlbXSkgPT4gYW55O1xuICAgIG9ucmVqZWN0ZWQ6IChlcnI6IEVycm9yKSA9PiBhbnk7XG4gIH1cblxufVxuZXhwb3J0IGZ1bmN0aW9uIGluaXRQYXJzZVJ1bnRpbWUoY29udmVydGVyOiBDb252ZXJ0ZXIpOiBQYXJzZVJ1bnRpbWUge1xuICBjb25zdCBwYXJhbXMgPSBjb252ZXJ0ZXIucGFyc2VQYXJhbTtcbiAgY29uc3QgcnRuOiBQYXJzZVJ1bnRpbWUgPSB7XG4gICAgbmVlZFByb2Nlc3NJZ25vcmVDb2x1bW46IGZhbHNlLFxuICAgIG5lZWRQcm9jZXNzSW5jbHVkZUNvbHVtbjogZmFsc2UsXG4gICAgc2VsZWN0ZWRDb2x1bW5zOiB1bmRlZmluZWQsXG4gICAgZW5kZWQ6IGZhbHNlLFxuICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgIGRlbGltaXRlcjogY29udmVydGVyLnBhcnNlUGFyYW0uZGVsaW1pdGVyLFxuICAgIGVvbDogY29udmVydGVyLnBhcnNlUGFyYW0uZW9sLFxuICAgIGNvbHVtbkNvbnY6IFtdLFxuICAgIGhlYWRlclR5cGU6IFtdLFxuICAgIGhlYWRlclRpdGxlOiBbXSxcbiAgICBoZWFkZXJGbGFnOiBbXSxcbiAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgc3RhcnRlZDogZmFsc2UsXG4gICAgcGFyc2VkTGluZU51bWJlcjogMCxcbiAgICBjb2x1bW5WYWx1ZVNldHRlcjogW10sXG4gIH1cbiAgaWYgKHBhcmFtcy5pZ25vcmVDb2x1bW5zKSB7XG4gICAgcnRuLm5lZWRQcm9jZXNzSWdub3JlQ29sdW1uID0gdHJ1ZTtcbiAgfVxuICBpZiAocGFyYW1zLmluY2x1ZGVDb2x1bW5zKSB7XG4gICAgcnRuLm5lZWRQcm9jZXNzSW5jbHVkZUNvbHVtbiA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHJ0bjtcbn0iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/204d44a3b08589411788351f533b2a96e89ab84d86142a1bc9b7767bb5601d6d.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/204d44a3b08589411788351f533b2a96e89ab84d86142a1bc9b7767bb5601d6d.js new file mode 100644 index 0000000..bc41cab --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/204d44a3b08589411788351f533b2a96e89ab84d86142a1bc9b7767bb5601d6d.js @@ -0,0 +1,522 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var Converter_1 = require("../src/Converter"); +var src_1 = __importDefault(require("../src")); +var assert = require("assert"); +var fs = require("fs"); +var sandbox = require('sinon').sandbox.create(); +describe("testCSVConverter2", function () { + afterEach(function () { + sandbox.restore(); + }); + it("should convert from large csv string", function (done) { + var csvStr = fs.readFileSync(__dirname + "/data/large-csv-sample.csv", "utf8"); + var conv = new Converter_1.Converter({}); + conv.fromString(csvStr).then(function (res) { + assert(res.length === 5290); + done(); + }); + }); + it("should set eol", function (done) { + var rs = fs.createReadStream(__dirname + "/data/large-csv-sample.csv"); + var conv = new Converter_1.Converter({ + eol: "\n" + }); + var count = 0; + conv.subscribe(function (resultJson, index) { + count++; + assert(resultJson); + // assert(row.length === 2); + assert(index >= 0); + }); + conv.on("error", function () { + console.log(arguments); + }); + conv.then(function (result) { + assert(result); + assert(count === 5290); + done(); + }); + rs.pipe(conv); + }); + it("should convert tsv String", function (done) { + var tsv = __dirname + "/data/dataTsv"; + var csvStr = fs.readFileSync(tsv, "utf8"); + var conv = new Converter_1.Converter({ + delimiter: "\t", + "checkType": false + }); + conv.fromString(csvStr).then(function (res) { + assert(res); + assert.equal(res.length, 200); + done(); + }); + }); + it("should allow customised header with nohead csv string.", function (done) { + var testData = __dirname + "/data/noheadercsv"; + var rs = fs.readFileSync(testData, "utf8"); + var conv = new Converter_1.Converter({ + noheader: true, + headers: ["a", "b", "c", "e", "f", "g"] + }); + conv.fromString(rs).then(function (json) { + assert.equal(json[0].field7, 40); + assert.equal(json[0].a, "CC102-PDMI-001"); + done(); + }); + }); + it("should parse fromFile", function (done) { + var csvFile = __dirname + "/data/large-csv-sample.csv"; + var conv = new Converter_1.Converter({}); + conv.fromFile(csvFile).then(function (res) { + assert.equal(res.length, 5290); + done(); + }); + }); + it("should fromFile should emit error", function (done) { + var csvFile = __dirname + "/data/dataWithUnclosedQuotes"; + var conv = new Converter_1.Converter({}); + conv.fromFile(csvFile).then(function (res) { + done(); + }, function (err) { + assert(err); + done(); + }); + }); + it("should parse no header with dynamic column number", function (done) { + var testData = __dirname + "/data/noheaderWithVaryColumnNum"; + var rs = fs.readFileSync(testData, "utf8"); + var conv = new Converter_1.Converter({ + noheader: true + }); + conv.fromString(rs).then(function (json) { + assert.equal(json.length, 2); + assert.equal(json[1].field4, 7); + done(); + }); + }); + it("should parse tabsv data with dynamic columns", function (done) { + var testData = __dirname + "/data/tabsv"; + var rs = fs.readFileSync(testData, "utf8"); + var conv = new Converter_1.Converter({ + delimiter: "\t" + }); + conv.fromString(rs).then(function (json) { + assert.equal(json[0].Idevise, ""); + done(); + }); + }); + it("should use first line break as eol", function (done) { + var testData = __dirname + "/data/testEol"; + var conv = new Converter_1.Converter({ + noheader: true + }); + conv.fromFile(testData).then(function (json) { + assert(json); + done(); + }); + }); + it("should detect delimiter", function (done) { + var testData = __dirname + "/data/dataWithAutoDelimiter"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter({ delimiter: "auto" }); + conv.then(function (res) { + assert.equal(res[0].col1, "Mini. Sectt:hisar S.O"); + assert.equal(res[1].col1, "#Mini. Sectt"); + done(); + }); + rs.pipe(conv); + }); + it("should emit delimiter event", function (done) { + var testData = __dirname + "/data/dataWithAutoDelimiter"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter({ delimiter: "auto" }); + var delimiterCallback = sandbox.spy(function (delimiter) { + assert.equal(delimiter, ":"); + }); + conv.on("delimiter", delimiterCallback); + conv.then(function () { + assert.equal(delimiterCallback.callCount, 1); + done(); + }); + rs.pipe(conv); + }); + it("should emit delimiter event when no header", function (done) { + var testData = __dirname + "/data/dataWithAutoDelimiter"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter({ delimiter: "auto", noheader: true }); + var delimiterCallback = sandbox.spy(function (delimiter) { + assert.equal(delimiter, ":"); + }); + conv.on("delimiter", delimiterCallback); + conv.then(function () { + assert.equal(delimiterCallback.callCount, 1); + done(); + }); + rs.pipe(conv); + }); + // it("should not emit delimiter event when delimiter is specified", function (done) { + // var testData = __dirname + "/data/columnArray"; + // var rs = fs.createReadStream(testData); + // var conv = new Converter(); + // conv.on("delimiter", function (delimiter) { + // assert.fail("delimiter event should not have been emitted"); + // }); + // conv.then(function () { + // done(); + // }); + // rs.pipe(conv); + // }); + it("should stripe out whitespaces if trim is true", function (done) { + var testData = __dirname + "/data/dataWithWhiteSpace"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter({ trim: true }); + conv.then(function (res) { + assert.equal(res[0]["Column 1"], "Column1Row1"); + assert.equal(res[0]["Column 2"], "Column2Row1"); + done(); + }); + rs.pipe(conv); + }); + it("should convert triple quotes correctly", function (done) { + var testData = __dirname + "/data/dataWithTripleQoutes"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter({ trim: true }); + conv.then(function (res) { + assert.equal(res[0].Description, "ac, abs, moon"); + assert.equal(res[1].Model, "Venture \"Extended Edition\""); + assert.equal(res[2].Model, "Venture \"Extended Edition, Very Large\""); + done(); + }); + rs.pipe(conv); + }); + it("should pre process raw data in the line", function (done) { + var testData = __dirname + "/data/quoteTolerant"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter(); + conv.preRawData(function (d) { + return d.replace('THICK', 'THIN'); + }); + conv.then(function (res) { + assert(res[0].Description.indexOf('THIN') > -1); + done(); + }); + rs.pipe(conv); + }); + it("should pre process by line in the line", function (done) { + var testData = __dirname + "/data/quoteTolerant"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter(); + conv.preFileLine(function (line, lineNumber) { + if (lineNumber === 1) { + line = line.replace('THICK', 'THIN'); + } + return line; + }); + conv.then(function (res) { + assert(res[0].Description.indexOf('THIN') > -1); + done(); + }); + rs.pipe(conv); + }); + it("should support object mode", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var conv = new Converter_1.Converter({}, { + objectMode: true + }); + conv.on("data", function (d) { + assert(typeof d === "object"); + }); + conv.then(function (res) { + assert(res); + assert(res.length > 0); + done(); + }); + rs.pipe(conv); + }); + it("should get delimiter automatically if there is no header", function (done) { + var test_converter = new Converter_1.Converter({ + delimiter: 'auto', + headers: ['col1', 'col2'], + noheader: true, + checkColumn: true + }); + var my_data = 'first_val\tsecond_val'; + test_converter.fromString(my_data).then(function (result) { + assert.equal(result.length, 1); + assert.equal(result[0].col1, "first_val"); + assert.equal(result[0].col2, "second_val"); + done(); + }); + }); + it("should process escape chars", function (done) { + var test_converter = new Converter_1.Converter({ + escape: "\\", + checkType: true + }); + var testData = __dirname + "/data/dataWithSlashEscape"; + var rs = fs.createReadStream(testData); + test_converter.then(function (res) { + assert.equal(res[0].raw.hello, "world"); + assert.equal(res[0].raw.test, true); + done(); + }); + rs.pipe(test_converter); + }); + it("should output ndjson format", function (done) { + var conv = new Converter_1.Converter(); + conv.fromString("a,b,c\n1,2,3\n4,5,6") + .on("data", function (d) { + d = d.toString(); + assert.equal(d[d.length - 1], "\n"); + }) + .on("done", done); + }); + it("should parse from stream", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + src_1.default() + .fromStream(rs) + .then(function (res) { + assert(res); + done(); + }); + }); + it("should set output as csv", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var numOfRow = 0; + src_1.default({ output: "csv" }) + .fromStream(rs) + .subscribe(function (row, idx) { + numOfRow++; + assert(row); + assert(idx >= 0); + }) + .on("done", function (error) { + assert(!error); + assert.equal(2, numOfRow); + assert(numOfRow !== 0); + done(); + }); + }); + it("should transform with subscribe function", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var numOfRow = 0; + var numOfJson = 0; + src_1.default() + .fromStream(rs) + .subscribe(function (json, idx) { + json.a = "test"; + assert(idx >= 0); + }) + .on("data", function (d) { + var j = JSON.parse(d.toString()); + assert.equal(j.a, "test"); + }) + .on("end", function () { + done(); + }); + }); + it("should parse a complex JSON", function (done) { + var converter = new Converter_1.Converter({ checkType: true }); + var r = fs.createReadStream(__dirname + "/data/complexJSONCSV"); + converter.then(function (res) { + assert(res); + assert(res.length === 2); + assert(res[0].fieldA.title === "Food Factory"); + assert(res[0].fieldA.children.length === 2); + assert(res[0].fieldA.children[0].name === "Oscar"); + assert(res[0].fieldA.children[0].id === 23); + assert(res[0].fieldA.children[1].name === "Tikka"); + assert.equal(res[0].fieldA.children[1].employee.length, 2); + assert(res[0].fieldA.children[1].employee[0].name === "Tim", JSON.stringify(res[0].fieldA.children[1].employee[0])); + assert(res[0].fieldA.address.length === 2); + assert(res[0].fieldA.address[0] === "3 Lame Road"); + assert(res[0].fieldA.address[1] === "Grantstown"); + assert(res[0].description === "A fresh new food factory", res[0].description); + done(); + }); + r.pipe(converter); + }); + it("should allow flatKey to change parse behaviour", function (done) { + var conv = new Converter_1.Converter({ + flatKeys: true + }); + conv.fromString("a.b,b.d,c.a\n1,2,3\n4,5,6").subscribe(function (d) { + assert(d["a.b"]); + assert(d["b.d"]); + assert(d["c.a"]); + }) + .on("done", done); + }); + it("should allow flat mods to change parse behaviour", function (done) { + var conv = new Converter_1.Converter({ + colParser: { + "a.b": { + flat: true + } + } + }); + conv.fromString("a.b,b.d,c.a\n1,2,3\n4,5,6").subscribe(function (d) { + assert(d["a.b"]); + }) + .on("done", done); + }); + it("should process long header", function (done) { + var testData = __dirname + "/data/longHeader"; + var rs = fs.createReadStream(testData, { highWaterMark: 100 }); + var numOfRow = 0; + var numOfJson = 0; + src_1.default({}, { highWaterMark: 100 }) + .fromStream(rs) + .subscribe(function (res, idx) { + numOfJson++; + assert.equal(res.Date, '8/26/16'); + assert(idx >= 0); + }) + .on("done", function () { + assert(numOfJson === 1); + done(); + }); + }); + it("should parse #139", function (done) { + var rs = fs.createReadStream(__dirname + "/data/data#139"); + src_1.default() + .fromStream(rs) + .then(function (res) { + assert.equal(res[1].field3, "9001009395 9001009990"); + done(); + }); + }); + it("should ignore column", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); + var headerEmitted = false; + src_1.default({ + ignoreColumns: /TIMESTAMP/ + }) + .fromStream(rs) + .on("header", function (header) { + assert.equal(header.indexOf("TIMESTAMP"), -1); + assert.equal(header.indexOf("UPDATE"), 0); + if (headerEmitted) { + throw ("header event should only happen once"); + } + headerEmitted = true; + }) + // .on("csv", function (row, idx) { + // if (!headerEmitted) { + // throw ("header should be emitted before any data events"); + // } + // assert(idx >= 0); + // if (idx === 1) { + // assert.equal(row[0], "n"); + // } + // }) + .subscribe(function (j, idx) { + assert(!j.TIMESTAMP); + assert(idx >= 0); + }) + .on("done", function () { + assert(headerEmitted); + done(); + }); + }); + it("should keep space around comma in csv", function () { + var str = "\"Name\",\"Number\"\n \"John , space\", 1234\n \"Mr. , space\", 4321\n "; + return src_1.default().fromString(str) + .then(function (data) { + assert.equal(data[0].Name, "John , space"); + assert.equal(data[1].Name, "Mr. , space"); + }); + }); + it("should include column", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); + src_1.default({ + includeColumns: /TIMESTAMP/ + }) + .fromStream(rs) + .on("header", function (header) { + assert.equal(header.indexOf("TIMESTAMP"), 0); + assert.equal(header.indexOf("UPDATE"), -1); + assert.equal(header.length, 1); + }) + .subscribe(function (j, idx) { + assert(idx >= 0); + if (idx === 1) { + assert.equal(j.TIMESTAMP, "abc, def, ccc"); + } + assert(!j.UID); + assert(!j['BYTES SENT']); + }) + .on("done", function () { + done(); + }); + }); + it("should allow headers and include columns to be given as reference to the same var", function (done) { + var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); + var headers = [ + 'first', + 'second', + 'third', + ]; + var expected = headers; + src_1.default({ + headers: headers, + includeColumns: /(first|second|third)/, + }) + .fromStream(rs) + .on("header", function (header) { + expected.forEach(function (value, index) { + assert.equal(header.indexOf(value), index); + }); + }) + .subscribe(function (j, idx) { + assert(idx >= 0); + assert.equal(expected.length, Object.keys(j).length); + expected.forEach(function (attribute) { + assert(j.hasOwnProperty(attribute)); + }); + }) + .on("done", function () { + done(); + }); + }); + it("should leave provided params objects unmutated", function () { + var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); + var includeColumns = [ + 'fieldA.title', + 'description', + ]; + return src_1.default({ + includeColumns: /(fieldA\.title|description)/, + }) + .fromStream(rs) + .on("json", function (j, idx) { + assert(idx >= 0); + }) + .on("header", function (header) { + includeColumns.forEach(function (value, index) { + assert.equal(index, header.indexOf(value)); + }); + }); + }); + it("should only call done once", function (done) { + var counter = 0; + src_1.default() + .fromString('"a","b", "c""') + .on('done', function () { + counter++; + }); + setTimeout(function () { + assert.equal(counter, 1); + done(); + }, 100); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdENTVkNvbnZlcnRlcjIudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi90ZXN0L3Rlc3RDU1ZDb252ZXJ0ZXIyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsOENBQTZDO0FBQzdDLCtDQUF5QjtBQUN6QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0IsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDaEQsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLFNBQVMsQ0FBQztRQUNSLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxVQUFVLElBQUk7UUFDdkQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0UsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQ3hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxJQUFJO1FBQ2pDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsNEJBQTRCLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUM7WUFDdkIsR0FBRyxFQUFFLElBQUk7U0FDVixDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsVUFBVSxFQUFFLEtBQUs7WUFDeEMsS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbkIsNEJBQTRCO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTTtZQUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDJCQUEyQixFQUFFLFVBQVUsSUFBSTtRQUM1QyxJQUFJLEdBQUcsR0FBRyxTQUFTLEdBQUcsZUFBZSxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQztZQUN2QixTQUFTLEVBQUUsSUFBSTtZQUNmLFdBQVcsRUFBRSxLQUFLO1NBQ25CLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUN4QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDOUIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLFVBQVUsSUFBSTtRQUN6RSxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxDQUFDO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7U0FDeEMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUMxQyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxJQUFJO1FBQ3hDLElBQUksT0FBTyxHQUFHLFNBQVMsR0FBRyw0QkFBNEIsQ0FBQztRQUN2RCxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ3ZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsVUFBVSxJQUFJO1FBQ3BELElBQUksT0FBTyxHQUFHLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQztRQUN6RCxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFDeEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBRXZDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxFQUFFLFVBQVUsR0FBRztZQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxVQUFVLElBQUk7UUFDcEUsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLGlDQUFpQyxDQUFDO1FBQzdELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQztZQUN2QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSTtZQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxVQUFVLElBQUk7UUFDL0QsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLGFBQWEsQ0FBQztRQUN6QyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUM7WUFDdkIsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJO1lBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUUsVUFBVSxJQUFJO1FBQ3JELElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxlQUFlLENBQUM7UUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxDQUFDO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNiLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUdILEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLElBQUk7UUFDMUMsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLDZCQUE2QixDQUFDO1FBQ3pELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzlDLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQztRQUN6RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsU0FBUztZQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFVBQVUsSUFBSTtRQUM3RCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsNkJBQTZCLENBQUM7UUFDekQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsU0FBUztZQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsc0ZBQXNGO0lBQ3RGLG9EQUFvRDtJQUNwRCw0Q0FBNEM7SUFDNUMsZ0NBQWdDO0lBQ2hDLGdEQUFnRDtJQUNoRCxtRUFBbUU7SUFDbkUsUUFBUTtJQUNSLDRCQUE0QjtJQUM1QixjQUFjO0lBQ2QsUUFBUTtJQUVSLG1CQUFtQjtJQUNuQixNQUFNO0lBRU4sRUFBRSxDQUFDLCtDQUErQyxFQUFFLFVBQVUsSUFBSTtRQUNoRSxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsMEJBQTBCLENBQUM7UUFDdEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ2hELElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLFVBQVUsSUFBSTtRQUN6RCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsNEJBQTRCLENBQUM7UUFDeEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsOEJBQThCLENBQUMsQ0FBQztZQUMzRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUN2RSxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztJQUlILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxVQUFVLElBQUk7UUFDMUQsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLHFCQUFxQixDQUFDO1FBQ2pELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUN6QixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsVUFBVSxJQUFJO1FBQ3pELElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQztRQUNqRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksRUFBRSxVQUFVO1lBQ3pDLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRCQUE0QixFQUFFLFVBQVUsSUFBSTtRQUM3QyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDM0IsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLFVBQVUsSUFBSTtRQUMzRSxJQUFJLGNBQWMsR0FBRyxJQUFJLHFCQUFTLENBQUM7WUFDakMsU0FBUyxFQUFFLE1BQU07WUFDakIsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUN6QixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxHQUFHLHVCQUF1QixDQUFDO1FBQ3RDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTTtZQUN0RCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMzQyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzlDLElBQUksY0FBYyxHQUFHLElBQUkscUJBQVMsQ0FBQztZQUNqQyxNQUFNLEVBQUUsSUFBSTtZQUNaLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRywyQkFBMkIsQ0FBQztRQUN2RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFLFVBQVUsSUFBSTtRQUM5QyxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDO2FBQ25DLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQ3JCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBCQUEwQixFQUFFLFVBQVUsSUFBSTtRQUMzQyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLGFBQUcsRUFBRTthQUNGLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxVQUFVLElBQUk7UUFDM0MsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsYUFBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO2FBQ25CLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxTQUFTLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRztZQUMzQixRQUFRLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDO2FBRUQsRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUs7WUFDekIsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxVQUFVLElBQUk7UUFDM0QsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGFBQUcsRUFBRTthQUNGLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxTQUFTLENBQUMsVUFBVSxJQUFJLEVBQUUsR0FBRztZQUM1QixJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNoQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQ3JCLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxLQUFLLEVBQUU7WUFDVCxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzlDLElBQUksU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUMsQ0FBQztRQUNoRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssY0FBYyxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwSCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxhQUFhLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssMEJBQTBCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlFLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLFVBQVUsSUFBSTtRQUNqRSxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUM7WUFDdkIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNoRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUM7YUFDQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLFVBQVUsSUFBSTtRQUNuRSxJQUFJLElBQUksR0FBRyxJQUFJLHFCQUFTLENBQUM7WUFDdkIsU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsSUFBSTtpQkFDWDthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7WUFDaEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUMsQ0FBQzthQUNDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsVUFBVSxJQUFJO1FBQzdDLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztRQUM5QyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixhQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDO2FBQzVCLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxTQUFTLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRztZQUMzQixTQUFTLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLElBQUk7UUFDcEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNELGFBQUcsRUFBRTthQUNGLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3JELElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRSxVQUFVLElBQUk7UUFDdkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2pFLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMxQixhQUFHLENBQUM7WUFDRixhQUFhLEVBQUUsV0FBVztTQUMzQixDQUFDO2FBQ0MsVUFBVSxDQUFDLEVBQUUsQ0FBQzthQUNkLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxNQUFNO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLGFBQWEsRUFBRTtnQkFDakIsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUE7YUFDL0M7WUFDRCxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztZQUNGLG1DQUFtQztZQUNuQywwQkFBMEI7WUFDMUIsaUVBQWlFO1lBQ2pFLE1BQU07WUFDTixzQkFBc0I7WUFDdEIscUJBQXFCO1lBQ3JCLGlDQUFpQztZQUNqQyxNQUFNO1lBQ04sS0FBSzthQUNKLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25CLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1FBQzFDLElBQU0sR0FBRyxHQUFHLGtGQUdYLENBQUM7UUFDRixPQUFPLGFBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7YUFDekIsSUFBSSxDQUFDLFVBQUMsSUFBSTtZQUNULE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxVQUFVLElBQUk7UUFDeEMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2pFLGFBQUcsQ0FBQztZQUNGLGNBQWMsRUFBRSxXQUFXO1NBQzVCLENBQUM7YUFDQyxVQUFVLENBQUMsRUFBRSxDQUFDO2FBQ2QsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLE1BQU07WUFDNUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUM7YUFDRCxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRztZQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7YUFDNUM7WUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtRQUMxQixDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ1YsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1GQUFtRixFQUFFLFVBQVUsSUFBSTtRQUNwRyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLENBQUM7UUFDakUsSUFBSSxPQUFPLEdBQUc7WUFDWixPQUFPO1lBQ1AsUUFBUTtZQUNSLE9BQU87U0FDUixDQUFDO1FBRUYsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBRXZCLGFBQUcsQ0FBQztZQUNGLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxzQkFBc0I7U0FDdkMsQ0FBQzthQUNDLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsTUFBTTtZQUM1QixRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLEtBQUs7Z0JBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQzthQUNELFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHO1lBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLFNBQVM7Z0JBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ1YsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO1FBQ25ELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUMsQ0FBQztRQUNqRSxJQUFJLGNBQWMsR0FBRztZQUNuQixjQUFjO1lBQ2QsYUFBYTtTQUNkLENBQUM7UUFHRixPQUFPLGFBQUcsQ0FBQztZQUNULGNBQWMsRUFBRSw2QkFBNkI7U0FDOUMsQ0FBQzthQUNDLFVBQVUsQ0FBQyxFQUFFLENBQUM7YUFDZCxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVMsQ0FBQyxFQUFFLEdBQUc7WUFDekIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVMsTUFBTTtZQUMzQixjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxFQUFFLEtBQUs7Z0JBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsVUFBVSxJQUFJO1FBQzdDLElBQUksT0FBTyxHQUFDLENBQUMsQ0FBQztRQUNkLGFBQUcsRUFBRTthQUNKLFVBQVUsQ0FBQyxlQUFlLENBQUM7YUFDM0IsRUFBRSxDQUFDLE1BQU0sRUFBQztZQUNULE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUM7WUFDVCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNULENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tIFwiLi4vc3JjL0NvbnZlcnRlclwiO1xuaW1wb3J0IGNzdiBmcm9tIFwiLi4vc3JjXCI7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKTtcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbnZhciBzYW5kYm94ID0gcmVxdWlyZSgnc2lub24nKS5zYW5kYm94LmNyZWF0ZSgpO1xuZGVzY3JpYmUoXCJ0ZXN0Q1NWQ29udmVydGVyMlwiLCBmdW5jdGlvbiAoKSB7XG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgZnJvbSBsYXJnZSBjc3Ygc3RyaW5nXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIGNzdlN0ciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyBcIi9kYXRhL2xhcmdlLWNzdi1zYW1wbGUuY3N2XCIsIFwidXRmOFwiKTtcbiAgICB2YXIgY29udiA9IG5ldyBDb252ZXJ0ZXIoe1xuICAgIH0pO1xuICAgIGNvbnYuZnJvbVN0cmluZyhjc3ZTdHIpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0KHJlcy5sZW5ndGggPT09IDUyOTApO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBzZXQgZW9sXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbShfX2Rpcm5hbWUgKyBcIi9kYXRhL2xhcmdlLWNzdi1zYW1wbGUuY3N2XCIpO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBlb2w6IFwiXFxuXCJcbiAgICB9KTtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIGNvbnYuc3Vic2NyaWJlKGZ1bmN0aW9uIChyZXN1bHRKc29uLCBpbmRleCkge1xuICAgICAgY291bnQrKztcbiAgICAgIGFzc2VydChyZXN1bHRKc29uKTtcbiAgICAgIC8vIGFzc2VydChyb3cubGVuZ3RoID09PSAyKTtcbiAgICAgIGFzc2VydChpbmRleCA+PSAwKTtcbiAgICB9KTtcbiAgICBjb252Lm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc29sZS5sb2coYXJndW1lbnRzKTtcbiAgICB9KTtcbiAgICBjb252LnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgYXNzZXJ0KHJlc3VsdCk7XG4gICAgICBhc3NlcnQoY291bnQgPT09IDUyOTApO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgdHN2IFN0cmluZ1wiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0c3YgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFUc3ZcIjtcbiAgICB2YXIgY3N2U3RyID0gZnMucmVhZEZpbGVTeW5jKHRzdiwgXCJ1dGY4XCIpO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBkZWxpbWl0ZXI6IFwiXFx0XCIsXG4gICAgICBcImNoZWNrVHlwZVwiOiBmYWxzZVxuICAgIH0pO1xuICAgIGNvbnYuZnJvbVN0cmluZyhjc3ZTdHIpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0KHJlcyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzLmxlbmd0aCwgMjAwKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgYWxsb3cgY3VzdG9taXNlZCBoZWFkZXIgd2l0aCBub2hlYWQgY3N2IHN0cmluZy5cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL25vaGVhZGVyY3N2XCI7XG4gICAgdmFyIHJzID0gZnMucmVhZEZpbGVTeW5jKHRlc3REYXRhLCBcInV0ZjhcIik7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHtcbiAgICAgIG5vaGVhZGVyOiB0cnVlLFxuICAgICAgaGVhZGVyczogW1wiYVwiLCBcImJcIiwgXCJjXCIsIFwiZVwiLCBcImZcIiwgXCJnXCJdXG4gICAgfSk7XG4gICAgY29udi5mcm9tU3RyaW5nKHJzKS50aGVuKGZ1bmN0aW9uIChqc29uKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoanNvblswXS5maWVsZDcsIDQwKTtcbiAgICAgIGFzc2VydC5lcXVhbChqc29uWzBdLmEsIFwiQ0MxMDItUERNSS0wMDFcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlIGZyb21GaWxlXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIGNzdkZpbGUgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2xhcmdlLWNzdi1zYW1wbGUuY3N2XCI7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHtcbiAgICB9KTtcbiAgICBjb252LmZyb21GaWxlKGNzdkZpbGUpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlcy5sZW5ndGgsIDUyOTApO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBmcm9tRmlsZSBzaG91bGQgZW1pdCBlcnJvclwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciBjc3ZGaWxlID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFVuY2xvc2VkUXVvdGVzXCI7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHtcbiAgICB9KTtcbiAgICBjb252LmZyb21GaWxlKGNzdkZpbGUpLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuXG4gICAgICBkb25lKCk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgYXNzZXJ0KGVycik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlIG5vIGhlYWRlciB3aXRoIGR5bmFtaWMgY29sdW1uIG51bWJlclwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvbm9oZWFkZXJXaXRoVmFyeUNvbHVtbk51bVwiO1xuICAgIHZhciBycyA9IGZzLnJlYWRGaWxlU3luYyh0ZXN0RGF0YSwgXCJ1dGY4XCIpO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBub2hlYWRlcjogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnYuZnJvbVN0cmluZyhycykudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgYXNzZXJ0LmVxdWFsKGpzb24ubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydC5lcXVhbChqc29uWzFdLmZpZWxkNCwgNyk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlIHRhYnN2IGRhdGEgd2l0aCBkeW5hbWljIGNvbHVtbnNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL3RhYnN2XCI7XG4gICAgdmFyIHJzID0gZnMucmVhZEZpbGVTeW5jKHRlc3REYXRhLCBcInV0ZjhcIik7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHtcbiAgICAgIGRlbGltaXRlcjogXCJcXHRcIlxuICAgIH0pO1xuICAgIGNvbnYuZnJvbVN0cmluZyhycykudGhlbihmdW5jdGlvbiAoanNvbikge1xuICAgICAgYXNzZXJ0LmVxdWFsKGpzb25bMF0uSWRldmlzZSwgXCJcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHVzZSBmaXJzdCBsaW5lIGJyZWFrIGFzIGVvbFwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdGVzdEVvbFwiO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBub2hlYWRlcjogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnYuZnJvbUZpbGUodGVzdERhdGEpLnRoZW4oZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgIGFzc2VydChqc29uKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cblxuICBpdChcInNob3VsZCBkZXRlY3QgZGVsaW1pdGVyXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aEF1dG9EZWxpbWl0ZXJcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgY29udiA9IG5ldyBDb252ZXJ0ZXIoeyBkZWxpbWl0ZXI6IFwiYXV0b1wiIH0pO1xuICAgIGNvbnYudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzWzBdLmNvbDEsIFwiTWluaS4gU2VjdHQ6aGlzYXIgUy5PXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1sxXS5jb2wxLCBcIiNNaW5pLiBTZWN0dFwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNvbnYpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBlbWl0IGRlbGltaXRlciBldmVudFwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YVdpdGhBdXRvRGVsaW1pdGVyXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHsgZGVsaW1pdGVyOiBcImF1dG9cIiB9KTtcbiAgICB2YXIgZGVsaW1pdGVyQ2FsbGJhY2sgPSBzYW5kYm94LnNweShmdW5jdGlvbiAoZGVsaW1pdGVyKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVsaW1pdGVyLCBcIjpcIik7XG4gICAgfSk7XG4gICAgY29udi5vbihcImRlbGltaXRlclwiLCBkZWxpbWl0ZXJDYWxsYmFjayk7XG4gICAgY29udi50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChkZWxpbWl0ZXJDYWxsYmFjay5jYWxsQ291bnQsIDEpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGVtaXQgZGVsaW1pdGVyIGV2ZW50IHdoZW4gbm8gaGVhZGVyXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aEF1dG9EZWxpbWl0ZXJcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgY29udiA9IG5ldyBDb252ZXJ0ZXIoeyBkZWxpbWl0ZXI6IFwiYXV0b1wiLCBub2hlYWRlcjogdHJ1ZSB9KTtcbiAgICB2YXIgZGVsaW1pdGVyQ2FsbGJhY2sgPSBzYW5kYm94LnNweShmdW5jdGlvbiAoZGVsaW1pdGVyKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVsaW1pdGVyLCBcIjpcIik7XG4gICAgfSk7XG4gICAgY29udi5vbihcImRlbGltaXRlclwiLCBkZWxpbWl0ZXJDYWxsYmFjayk7XG4gICAgY29udi50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChkZWxpbWl0ZXJDYWxsYmFjay5jYWxsQ291bnQsIDEpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xuXG4gIC8vIGl0KFwic2hvdWxkIG5vdCBlbWl0IGRlbGltaXRlciBldmVudCB3aGVuIGRlbGltaXRlciBpcyBzcGVjaWZpZWRcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgLy8gICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2NvbHVtbkFycmF5XCI7XG4gIC8vICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gIC8vICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKCk7XG4gIC8vICAgY29udi5vbihcImRlbGltaXRlclwiLCBmdW5jdGlvbiAoZGVsaW1pdGVyKSB7XG4gIC8vICAgICBhc3NlcnQuZmFpbChcImRlbGltaXRlciBldmVudCBzaG91bGQgbm90IGhhdmUgYmVlbiBlbWl0dGVkXCIpO1xuICAvLyAgIH0pO1xuICAvLyAgIGNvbnYudGhlbihmdW5jdGlvbiAoKSB7XG4gIC8vICAgICBkb25lKCk7XG4gIC8vICAgfSk7XG5cbiAgLy8gICBycy5waXBlKGNvbnYpO1xuICAvLyB9KTtcblxuICBpdChcInNob3VsZCBzdHJpcGUgb3V0IHdoaXRlc3BhY2VzIGlmIHRyaW0gaXMgdHJ1ZVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YVdpdGhXaGl0ZVNwYWNlXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHsgdHJpbTogdHJ1ZSB9KTtcbiAgICBjb252LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1swXVtcIkNvbHVtbiAxXCJdLCBcIkNvbHVtbjFSb3cxXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1swXVtcIkNvbHVtbiAyXCJdLCBcIkNvbHVtbjJSb3cxXCIpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGNvbnZlcnQgdHJpcGxlIHF1b3RlcyBjb3JyZWN0bHlcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoVHJpcGxlUW91dGVzXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHsgdHJpbTogdHJ1ZSB9KTtcbiAgICBjb252LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1swXS5EZXNjcmlwdGlvbiwgXCJhYywgYWJzLCBtb29uXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1sxXS5Nb2RlbCwgXCJWZW50dXJlIFxcXCJFeHRlbmRlZCBFZGl0aW9uXFxcIlwiKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXNbMl0uTW9kZWwsIFwiVmVudHVyZSBcXFwiRXh0ZW5kZWQgRWRpdGlvbiwgVmVyeSBMYXJnZVxcXCJcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgcnMucGlwZShjb252KTtcbiAgfSk7XG5cblxuXG4gIGl0KFwic2hvdWxkIHByZSBwcm9jZXNzIHJhdyBkYXRhIGluIHRoZSBsaW5lXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9xdW90ZVRvbGVyYW50XCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKCk7XG4gICAgY29udi5wcmVSYXdEYXRhKGZ1bmN0aW9uIChkKSB7XG4gICAgICByZXR1cm4gZC5yZXBsYWNlKCdUSElDSycsICdUSElOJyk7XG4gICAgfSk7XG4gICAgY29udi50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGFzc2VydChyZXNbMF0uRGVzY3JpcHRpb24uaW5kZXhPZignVEhJTicpID4gLTEpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHByZSBwcm9jZXNzIGJ5IGxpbmUgaW4gdGhlIGxpbmVcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL3F1b3RlVG9sZXJhbnRcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgY29udiA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICBjb252LnByZUZpbGVMaW5lKGZ1bmN0aW9uIChsaW5lLCBsaW5lTnVtYmVyKSB7XG4gICAgICBpZiAobGluZU51bWJlciA9PT0gMSkge1xuICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdUSElDSycsICdUSElOJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9KTtcblxuICAgIGNvbnYudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICBhc3NlcnQocmVzWzBdLkRlc2NyaXB0aW9uLmluZGV4T2YoJ1RISU4nKSA+IC0xKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNvbnYpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBzdXBwb3J0IG9iamVjdCBtb2RlXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb21wbGV4SlNPTkNTVlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7fSwge1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnYub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkKSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGQgPT09IFwib2JqZWN0XCIpO1xuICAgIH0pO1xuICAgIGNvbnYudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICBhc3NlcnQocmVzKTtcbiAgICAgIGFzc2VydChyZXMubGVuZ3RoID4gMCk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgcnMucGlwZShjb252KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgZ2V0IGRlbGltaXRlciBhdXRvbWF0aWNhbGx5IGlmIHRoZXJlIGlzIG5vIGhlYWRlclwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0X2NvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgZGVsaW1pdGVyOiAnYXV0bycsXG4gICAgICBoZWFkZXJzOiBbJ2NvbDEnLCAnY29sMiddLFxuICAgICAgbm9oZWFkZXI6IHRydWUsXG4gICAgICBjaGVja0NvbHVtbjogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdmFyIG15X2RhdGEgPSAnZmlyc3RfdmFsXFx0c2Vjb25kX3ZhbCc7XG4gICAgdGVzdF9jb252ZXJ0ZXIuZnJvbVN0cmluZyhteV9kYXRhKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRbMF0uY29sMSwgXCJmaXJzdF92YWxcIik7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0WzBdLmNvbDIsIFwic2Vjb25kX3ZhbFwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvY2VzcyBlc2NhcGUgY2hhcnNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdF9jb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKHtcbiAgICAgIGVzY2FwZTogXCJcXFxcXCIsXG4gICAgICBjaGVja1R5cGU6IHRydWVcbiAgICB9KTtcblxuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YVdpdGhTbGFzaEVzY2FwZVwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHRlc3RfY29udmVydGVyLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1swXS5yYXcuaGVsbG8sIFwid29ybGRcIik7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzWzBdLnJhdy50ZXN0LCB0cnVlKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKHRlc3RfY29udmVydGVyKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgb3V0cHV0IG5kanNvbiBmb3JtYXRcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgY29udiA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICBjb252LmZyb21TdHJpbmcoXCJhLGIsY1xcbjEsMiwzXFxuNCw1LDZcIilcbiAgICAgIC5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgZCA9IGQudG9TdHJpbmcoKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbZC5sZW5ndGggLSAxXSwgXCJcXG5cIik7XG4gICAgICB9KVxuICAgICAgLm9uKFwiZG9uZVwiLCBkb25lKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcGFyc2UgZnJvbSBzdHJlYW1cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2NvbXBsZXhKU09OQ1NWXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgY3N2KClcbiAgICAgIC5mcm9tU3RyZWFtKHJzKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBhc3NlcnQocmVzKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHNldCBvdXRwdXQgYXMgY3N2XCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb21wbGV4SlNPTkNTVlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBudW1PZlJvdyA9IDA7XG4gICAgY3N2KHsgb3V0cHV0OiBcImNzdlwiIH0pXG4gICAgICAuZnJvbVN0cmVhbShycylcbiAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKHJvdywgaWR4KSB7XG4gICAgICAgIG51bU9mUm93Kys7XG4gICAgICAgIGFzc2VydChyb3cpO1xuICAgICAgICBhc3NlcnQoaWR4ID49IDApO1xuICAgICAgfSlcblxuICAgICAgLm9uKFwiZG9uZVwiLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgYXNzZXJ0KCFlcnJvcik7XG4gICAgICAgIGFzc2VydC5lcXVhbCgyLCBudW1PZlJvdyk7XG4gICAgICAgIGFzc2VydChudW1PZlJvdyAhPT0gMCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCB0cmFuc2Zvcm0gd2l0aCBzdWJzY3JpYmUgZnVuY3Rpb25cIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2NvbXBsZXhKU09OQ1NWXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIG51bU9mUm93ID0gMDtcbiAgICB2YXIgbnVtT2ZKc29uID0gMDtcbiAgICBjc3YoKVxuICAgICAgLmZyb21TdHJlYW0ocnMpXG4gICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChqc29uLCBpZHgpIHtcbiAgICAgICAganNvbi5hID0gXCJ0ZXN0XCI7XG4gICAgICAgIGFzc2VydChpZHggPj0gMCk7XG4gICAgICB9KVxuICAgICAgLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZCkge1xuICAgICAgICBjb25zdCBqID0gSlNPTi5wYXJzZShkLnRvU3RyaW5nKCkpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoai5hLCBcInRlc3RcIik7XG4gICAgICB9KVxuICAgICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlIGEgY29tcGxleCBKU09OXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIGNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoeyBjaGVja1R5cGU6IHRydWUgfSk7XG4gICAgdmFyIHIgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKF9fZGlybmFtZSArIFwiL2RhdGEvY29tcGxleEpTT05DU1ZcIik7XG4gICAgY29udmVydGVyLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgYXNzZXJ0KHJlcyk7XG4gICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gMik7XG4gICAgICBhc3NlcnQocmVzWzBdLmZpZWxkQS50aXRsZSA9PT0gXCJGb29kIEZhY3RvcnlcIik7XG4gICAgICBhc3NlcnQocmVzWzBdLmZpZWxkQS5jaGlsZHJlbi5sZW5ndGggPT09IDIpO1xuICAgICAgYXNzZXJ0KHJlc1swXS5maWVsZEEuY2hpbGRyZW5bMF0ubmFtZSA9PT0gXCJPc2NhclwiKTtcbiAgICAgIGFzc2VydChyZXNbMF0uZmllbGRBLmNoaWxkcmVuWzBdLmlkID09PSAyMyk7XG4gICAgICBhc3NlcnQocmVzWzBdLmZpZWxkQS5jaGlsZHJlblsxXS5uYW1lID09PSBcIlRpa2thXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1swXS5maWVsZEEuY2hpbGRyZW5bMV0uZW1wbG95ZWUubGVuZ3RoLCAyKTtcbiAgICAgIGFzc2VydChyZXNbMF0uZmllbGRBLmNoaWxkcmVuWzFdLmVtcGxveWVlWzBdLm5hbWUgPT09IFwiVGltXCIsIEpTT04uc3RyaW5naWZ5KHJlc1swXS5maWVsZEEuY2hpbGRyZW5bMV0uZW1wbG95ZWVbMF0pKTtcbiAgICAgIGFzc2VydChyZXNbMF0uZmllbGRBLmFkZHJlc3MubGVuZ3RoID09PSAyKTtcbiAgICAgIGFzc2VydChyZXNbMF0uZmllbGRBLmFkZHJlc3NbMF0gPT09IFwiMyBMYW1lIFJvYWRcIik7XG4gICAgICBhc3NlcnQocmVzWzBdLmZpZWxkQS5hZGRyZXNzWzFdID09PSBcIkdyYW50c3Rvd25cIik7XG4gICAgICBhc3NlcnQocmVzWzBdLmRlc2NyaXB0aW9uID09PSBcIkEgZnJlc2ggbmV3IGZvb2QgZmFjdG9yeVwiLCByZXNbMF0uZGVzY3JpcHRpb24pO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHIucGlwZShjb252ZXJ0ZXIpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBhbGxvdyBmbGF0S2V5IHRvIGNoYW5nZSBwYXJzZSBiZWhhdmlvdXJcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgY29udiA9IG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgZmxhdEtleXM6IHRydWVcbiAgICB9KTtcbiAgICBjb252LmZyb21TdHJpbmcoXCJhLmIsYi5kLGMuYVxcbjEsMiwzXFxuNCw1LDZcIikuc3Vic2NyaWJlKGZ1bmN0aW9uIChkKSB7XG4gICAgICBhc3NlcnQoZFtcImEuYlwiXSk7XG4gICAgICBhc3NlcnQoZFtcImIuZFwiXSk7XG4gICAgICBhc3NlcnQoZFtcImMuYVwiXSk7XG4gICAgfSlcbiAgICAgIC5vbihcImRvbmVcIiwgZG9uZSk7XG4gIH0pO1xuICBpdChcInNob3VsZCBhbGxvdyBmbGF0IG1vZHMgdG8gY2hhbmdlIHBhcnNlIGJlaGF2aW91clwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBjb2xQYXJzZXI6IHtcbiAgICAgICAgXCJhLmJcIjoge1xuICAgICAgICAgIGZsYXQ6IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnYuZnJvbVN0cmluZyhcImEuYixiLmQsYy5hXFxuMSwyLDNcXG40LDUsNlwiKS5zdWJzY3JpYmUoZnVuY3Rpb24gKGQpIHtcbiAgICAgIGFzc2VydChkW1wiYS5iXCJdKTtcbiAgICB9KVxuICAgICAgLm9uKFwiZG9uZVwiLCBkb25lKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvY2VzcyBsb25nIGhlYWRlclwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvbG9uZ0hlYWRlclwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEsIHsgaGlnaFdhdGVyTWFyazogMTAwIH0pO1xuICAgIHZhciBudW1PZlJvdyA9IDA7XG4gICAgdmFyIG51bU9mSnNvbiA9IDA7XG4gICAgY3N2KHt9LCB7IGhpZ2hXYXRlck1hcms6IDEwMCB9KVxuICAgICAgLmZyb21TdHJlYW0ocnMpXG4gICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChyZXMsIGlkeCkge1xuICAgICAgICBudW1PZkpzb24rKztcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHJlcy5EYXRlLCAnOC8yNi8xNicpO1xuICAgICAgICBhc3NlcnQoaWR4ID49IDApO1xuICAgICAgfSlcbiAgICAgIC5vbihcImRvbmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3NlcnQobnVtT2ZKc29uID09PSAxKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlICMxMzlcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YSMxMzlcIik7XG4gICAgY3N2KClcbiAgICAgIC5mcm9tU3RyZWFtKHJzKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBhc3NlcnQuZXF1YWwocmVzWzFdLmZpZWxkMywgXCI5MDAxMDA5Mzk1IDkwMDEwMDk5OTBcIik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBpZ25vcmUgY29sdW1uXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbShfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoUW91dGVzXCIpO1xuICAgIHZhciBoZWFkZXJFbWl0dGVkID0gZmFsc2U7XG4gICAgY3N2KHtcbiAgICAgIGlnbm9yZUNvbHVtbnM6IC9USU1FU1RBTVAvXG4gICAgfSlcbiAgICAgIC5mcm9tU3RyZWFtKHJzKVxuICAgICAgLm9uKFwiaGVhZGVyXCIsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGhlYWRlci5pbmRleE9mKFwiVElNRVNUQU1QXCIpLCAtMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChoZWFkZXIuaW5kZXhPZihcIlVQREFURVwiKSwgMCk7XG4gICAgICAgIGlmIChoZWFkZXJFbWl0dGVkKSB7XG4gICAgICAgICAgdGhyb3cgKFwiaGVhZGVyIGV2ZW50IHNob3VsZCBvbmx5IGhhcHBlbiBvbmNlXCIpXG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVyRW1pdHRlZCA9IHRydWU7XG4gICAgICB9KVxuICAgICAgLy8gLm9uKFwiY3N2XCIsIGZ1bmN0aW9uIChyb3csIGlkeCkge1xuICAgICAgLy8gICBpZiAoIWhlYWRlckVtaXR0ZWQpIHtcbiAgICAgIC8vICAgICB0aHJvdyAoXCJoZWFkZXIgc2hvdWxkIGJlIGVtaXR0ZWQgYmVmb3JlIGFueSBkYXRhIGV2ZW50c1wiKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICBhc3NlcnQoaWR4ID49IDApO1xuICAgICAgLy8gICBpZiAoaWR4ID09PSAxKSB7XG4gICAgICAvLyAgICAgYXNzZXJ0LmVxdWFsKHJvd1swXSwgXCJuXCIpO1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9KVxuICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoaiwgaWR4KSB7XG4gICAgICAgIGFzc2VydCghai5USU1FU1RBTVApO1xuICAgICAgICBhc3NlcnQoaWR4ID49IDApO1xuICAgICAgfSlcbiAgICAgIC5vbihcImRvbmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3NlcnQoaGVhZGVyRW1pdHRlZCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICB9KTtcbiAgaXQoXCJzaG91bGQga2VlcCBzcGFjZSBhcm91bmQgY29tbWEgaW4gY3N2XCIsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzdHIgPSBgXCJOYW1lXCIsXCJOdW1iZXJcIlxuICAgIFwiSm9obiAsIHNwYWNlXCIsIDEyMzRcbiAgICBcIk1yLiAsIHNwYWNlXCIsIDQzMjFcbiAgICBgO1xuICAgIHJldHVybiBjc3YoKS5mcm9tU3RyaW5nKHN0cilcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChkYXRhWzBdLk5hbWUsIFwiSm9obiAsIHNwYWNlXCIpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZGF0YVsxXS5OYW1lLCBcIk1yLiAsIHNwYWNlXCIpO1xuICAgICAgfSlcbiAgfSlcblxuICBpdChcInNob3VsZCBpbmNsdWRlIGNvbHVtblwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFFvdXRlc1wiKTtcbiAgICBjc3Yoe1xuICAgICAgaW5jbHVkZUNvbHVtbnM6IC9USU1FU1RBTVAvXG4gICAgfSlcbiAgICAgIC5mcm9tU3RyZWFtKHJzKVxuICAgICAgLm9uKFwiaGVhZGVyXCIsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGhlYWRlci5pbmRleE9mKFwiVElNRVNUQU1QXCIpLCAwKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGhlYWRlci5pbmRleE9mKFwiVVBEQVRFXCIpLCAtMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChoZWFkZXIubGVuZ3RoLCAxKTtcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChqLCBpZHgpIHtcbiAgICAgICAgYXNzZXJ0KGlkeCA+PSAwKTtcbiAgICAgICAgaWYgKGlkeCA9PT0gMSkge1xuICAgICAgICAgIGFzc2VydC5lcXVhbChqLlRJTUVTVEFNUCwgXCJhYmMsIGRlZiwgY2NjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCghai5VSUQpXG4gICAgICAgIGFzc2VydCghalsnQllURVMgU0VOVCddKVxuICAgICAgfSlcbiAgICAgIC5vbihcImRvbmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgYWxsb3cgaGVhZGVycyBhbmQgaW5jbHVkZSBjb2x1bW5zIHRvIGJlIGdpdmVuIGFzIHJlZmVyZW5jZSB0byB0aGUgc2FtZSB2YXJcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKF9fZGlybmFtZSArIFwiL2RhdGEvY29tcGxleEpTT05DU1ZcIik7XG4gICAgdmFyIGhlYWRlcnMgPSBbXG4gICAgICAnZmlyc3QnLFxuICAgICAgJ3NlY29uZCcsXG4gICAgICAndGhpcmQnLFxuICAgIF07XG5cbiAgICB2YXIgZXhwZWN0ZWQgPSBoZWFkZXJzO1xuXG4gICAgY3N2KHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBpbmNsdWRlQ29sdW1uczogLyhmaXJzdHxzZWNvbmR8dGhpcmQpLyxcbiAgICB9KVxuICAgICAgLmZyb21TdHJlYW0ocnMpXG4gICAgICAub24oXCJoZWFkZXJcIiwgZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgICBleHBlY3RlZC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwoaGVhZGVyLmluZGV4T2YodmFsdWUpLCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKGosIGlkeCkge1xuICAgICAgICBhc3NlcnQoaWR4ID49IDApO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZXhwZWN0ZWQubGVuZ3RoLCBPYmplY3Qua2V5cyhqKS5sZW5ndGgpO1xuICAgICAgICBleHBlY3RlZC5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICBhc3NlcnQoai5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKFwiZG9uZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBsZWF2ZSBwcm92aWRlZCBwYXJhbXMgb2JqZWN0cyB1bm11dGF0ZWRcIiwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbShfX2Rpcm5hbWUgKyBcIi9kYXRhL2NvbXBsZXhKU09OQ1NWXCIpO1xuICAgIHZhciBpbmNsdWRlQ29sdW1ucyA9IFtcbiAgICAgICdmaWVsZEEudGl0bGUnLFxuICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICBdO1xuXG5cbiAgICByZXR1cm4gY3N2KHtcbiAgICAgIGluY2x1ZGVDb2x1bW5zOiAvKGZpZWxkQVxcLnRpdGxlfGRlc2NyaXB0aW9uKS8sXG4gICAgfSlcbiAgICAgIC5mcm9tU3RyZWFtKHJzKVxuICAgICAgLm9uKFwianNvblwiLCBmdW5jdGlvbihqLCBpZHgpIHtcbiAgICAgICAgYXNzZXJ0KGlkeCA+PSAwKTtcbiAgICAgIH0pXG4gICAgICAub24oXCJoZWFkZXJcIiwgZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICAgIGluY2x1ZGVDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICAgIGFzc2VydC5lcXVhbChpbmRleCwgaGVhZGVyLmluZGV4T2YodmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICB9KTtcblxuICBpdChcInNob3VsZCBvbmx5IGNhbGwgZG9uZSBvbmNlXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIGNvdW50ZXI9MDtcbiAgICBjc3YoKVxuICAgIC5mcm9tU3RyaW5nKCdcImFcIixcImJcIiwgXCJjXCJcIicpXG4gICAgLm9uKCdkb25lJyxmdW5jdGlvbigpe1xuICAgICAgY291bnRlcisrO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIGFzc2VydC5lcXVhbChjb3VudGVyLDEpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sMTAwKTtcbiAgfSlcbn0pO1xuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/2137721389d49414201ec34dd66bac032beb92732a7fc3a93a7da308df59074b.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/2137721389d49414201ec34dd66bac032beb92732a7fc3a93a7da308df59074b.js new file mode 100644 index 0000000..93dd036 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/2137721389d49414201ec34dd66bac032beb92732a7fc3a93a7da308df59074b.js @@ -0,0 +1,310 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var Processor_1 = require("./Processor"); +var bluebird_1 = __importDefault(require("bluebird")); +var dataClean_1 = require("./dataClean"); +var getEol_1 = __importDefault(require("./getEol")); +var fileline_1 = require("./fileline"); +var util_1 = require("./util"); +var rowSplit_1 = require("./rowSplit"); +var lineToJson_1 = __importDefault(require("./lineToJson")); +var CSVError_1 = __importDefault(require("./CSVError")); +var ProcessorLocal = /** @class */ (function (_super) { + __extends(ProcessorLocal, _super); + function ProcessorLocal() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rowSplit = new rowSplit_1.RowSplit(_this.converter); + _this.eolEmitted = false; + _this._needEmitEol = undefined; + _this.headEmitted = false; + _this._needEmitHead = undefined; + return _this; + } + ProcessorLocal.prototype.flush = function () { + var _this = this; + if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) { + var buf = this.runtime.csvLineBuffer; + this.runtime.csvLineBuffer = undefined; + return this.process(buf, true) + .then(function (res) { + if (_this.runtime.csvLineBuffer && _this.runtime.csvLineBuffer.length > 0) { + return bluebird_1.default.reject(CSVError_1.default.unclosed_quote(_this.runtime.parsedLineNumber, _this.runtime.csvLineBuffer.toString())); + } + else { + return bluebird_1.default.resolve(res); + } + }); + } + else { + return bluebird_1.default.resolve([]); + } + }; + ProcessorLocal.prototype.destroy = function () { + return bluebird_1.default.resolve(); + }; + Object.defineProperty(ProcessorLocal.prototype, "needEmitEol", { + get: function () { + if (this._needEmitEol === undefined) { + this._needEmitEol = this.converter.listeners("eol").length > 0; + } + return this._needEmitEol; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ProcessorLocal.prototype, "needEmitHead", { + get: function () { + if (this._needEmitHead === undefined) { + this._needEmitHead = this.converter.listeners("header").length > 0; + } + return this._needEmitHead; + }, + enumerable: true, + configurable: true + }); + ProcessorLocal.prototype.process = function (chunk, finalChunk) { + var _this = this; + if (finalChunk === void 0) { finalChunk = false; } + var csvString; + if (finalChunk) { + csvString = chunk.toString(); + } + else { + csvString = dataClean_1.prepareData(chunk, this.converter.parseRuntime); + } + return bluebird_1.default.resolve() + .then(function () { + if (_this.runtime.preRawDataHook) { + return _this.runtime.preRawDataHook(csvString); + } + else { + return csvString; + } + }) + .then(function (csv) { + if (csv && csv.length > 0) { + return _this.processCSV(csv, finalChunk); + } + else { + return bluebird_1.default.resolve([]); + } + }); + }; + ProcessorLocal.prototype.processCSV = function (csv, finalChunk) { + var _this = this; + var params = this.params; + var runtime = this.runtime; + if (!runtime.eol) { + getEol_1.default(csv, runtime); + } + if (this.needEmitEol && !this.eolEmitted && runtime.eol) { + this.converter.emit("eol", runtime.eol); + this.eolEmitted = true; + } + // trim csv file has initial blank lines. + if (params.ignoreEmpty && !runtime.started) { + csv = util_1.trimLeft(csv); + } + var stringToLineResult = fileline_1.stringToLines(csv, runtime); + if (!finalChunk) { + this.prependLeftBuf(util_1.bufFromString(stringToLineResult.partial)); + } + else { + stringToLineResult.lines.push(stringToLineResult.partial); + stringToLineResult.partial = ""; + } + if (stringToLineResult.lines.length > 0) { + var prom = void 0; + if (runtime.preFileLineHook) { + prom = this.runPreLineHook(stringToLineResult.lines); + } + else { + prom = bluebird_1.default.resolve(stringToLineResult.lines); + } + return prom.then(function (lines) { + if (!runtime.started + && !_this.runtime.headers) { + return _this.processDataWithHead(lines); + } + else { + return _this.processCSVBody(lines); + } + }); + } + else { + return bluebird_1.default.resolve([]); + } + }; + ProcessorLocal.prototype.processDataWithHead = function (lines) { + if (this.params.noheader) { + if (this.params.headers) { + this.runtime.headers = this.params.headers; + } + else { + this.runtime.headers = []; + } + } + else { + var left = ""; + var headerRow = []; + while (lines.length) { + var line = left + lines.shift(); + var row = this.rowSplit.parse(line); + if (row.closed) { + headerRow = row.cells; + left = ""; + break; + } + else { + left = line + getEol_1.default(line, this.runtime); + } + } + this.prependLeftBuf(util_1.bufFromString(left)); + if (headerRow.length === 0) { + return []; + } + if (this.params.headers) { + this.runtime.headers = this.params.headers; + } + else { + this.runtime.headers = headerRow; + } + } + if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) { + this.filterHeader(); + } + if (this.needEmitHead && !this.headEmitted) { + this.converter.emit("header", this.runtime.headers); + this.headEmitted = true; + } + return this.processCSVBody(lines); + }; + ProcessorLocal.prototype.filterHeader = function () { + this.runtime.selectedColumns = []; + if (this.runtime.headers) { + var headers = this.runtime.headers; + for (var i = 0; i < headers.length; i++) { + if (this.params.ignoreColumns) { + if (this.params.ignoreColumns.test(headers[i])) { + if (this.params.includeColumns && this.params.includeColumns.test(headers[i])) { + this.runtime.selectedColumns.push(i); + } + else { + continue; + } + } + else { + this.runtime.selectedColumns.push(i); + } + } + else if (this.params.includeColumns) { + if (this.params.includeColumns.test(headers[i])) { + this.runtime.selectedColumns.push(i); + } + } + else { + this.runtime.selectedColumns.push(i); + } + // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){ + // this.runtime.selectedColumns.push(i); + // }else{ + // if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){ + // continue; + // }else{ + // if (this.params.ignoreColumns && !this.params.includeColumns){ + // this.runtime.selectedColumns.push(i); + // } + // } + // } + } + this.runtime.headers = util_1.filterArray(this.runtime.headers, this.runtime.selectedColumns); + } + }; + ProcessorLocal.prototype.processCSVBody = function (lines) { + if (this.params.output === "line") { + return lines; + } + else { + var result = this.rowSplit.parseMultiLines(lines); + this.prependLeftBuf(util_1.bufFromString(result.partial)); + if (this.params.output === "csv") { + return result.rowsCells; + } + else { + return lineToJson_1.default(result.rowsCells, this.converter); + } + } + // var jsonArr = linesToJson(lines.lines, params, this.recordNum); + // this.processResult(jsonArr); + // this.lastIndex += jsonArr.length; + // this.recordNum += jsonArr.length; + }; + ProcessorLocal.prototype.prependLeftBuf = function (buf) { + if (buf) { + if (this.runtime.csvLineBuffer) { + this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]); + } + else { + this.runtime.csvLineBuffer = buf; + } + } + }; + ProcessorLocal.prototype.runPreLineHook = function (lines) { + var _this = this; + return new bluebird_1.default(function (resolve, reject) { + processLineHook(lines, _this.runtime, 0, function (err) { + if (err) { + reject(err); + } + else { + resolve(lines); + } + }); + }); + }; + return ProcessorLocal; +}(Processor_1.Processor)); +exports.ProcessorLocal = ProcessorLocal; +function processLineHook(lines, runtime, offset, cb) { + if (offset >= lines.length) { + cb(); + } + else { + if (runtime.preFileLineHook) { + var line = lines[offset]; + var res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset); + offset++; + if (res && res.then) { + res.then(function (value) { + lines[offset - 1] = value; + processLineHook(lines, runtime, offset, cb); + }); + } + else { + lines[offset - 1] = res; + while (offset < lines.length) { + lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset); + offset++; + } + cb(); + } + } + else { + cb(); + } + } +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9Qcm9jZXNzb3JMb2NhbC50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9Qcm9jZXNzb3JMb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5Q0FBMkQ7QUFDM0Qsc0RBQXlCO0FBQ3pCLHlDQUEwQztBQUMxQyxvREFBOEI7QUFDOUIsdUNBQTJDO0FBQzNDLCtCQUE2RDtBQUM3RCx1Q0FBc0M7QUFDdEMsNERBQXNDO0FBRXRDLHdEQUFrQztBQUlsQztJQUFvQyxrQ0FBUztJQUE3QztRQUFBLHFFQW1PQztRQS9NUyxjQUFRLEdBQWEsSUFBSSxtQkFBUSxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxnQkFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixrQkFBWSxHQUFhLFNBQVMsQ0FBQztRQU9uQyxpQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixtQkFBYSxHQUFhLFNBQVMsQ0FBQzs7SUFxTTlDLENBQUM7SUFsT0MsOEJBQUssR0FBTDtRQUFBLGlCQWVDO1FBZEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZFLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztpQkFDM0IsSUFBSSxDQUFDLFVBQUMsR0FBRztnQkFDUixJQUFJLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3ZFLE9BQU8sa0JBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUE7aUJBQy9HO3FCQUFNO29CQUNMLE9BQU8sa0JBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3ZCO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDTDthQUFNO1lBQ0wsT0FBTyxrQkFBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN0QjtJQUNILENBQUM7SUFDRCxnQ0FBTyxHQUFQO1FBQ0UsT0FBTyxrQkFBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFJRCxzQkFBWSx1Q0FBVzthQUF2QjtZQUNFLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUNoRTtZQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMzQixDQUFDOzs7T0FBQTtJQUdELHNCQUFZLHdDQUFZO2FBQXhCO1lBQ0UsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ3BFO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBRTVCLENBQUM7OztPQUFBO0lBQ0QsZ0NBQU8sR0FBUCxVQUFRLEtBQWEsRUFBRSxVQUFrQjtRQUF6QyxpQkF1QkM7UUF2QnNCLDJCQUFBLEVBQUEsa0JBQWtCO1FBQ3ZDLElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLFVBQVUsRUFBRTtZQUNkLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDOUI7YUFBTTtZQUNMLFNBQVMsR0FBRyx1QkFBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBRTdEO1FBQ0QsT0FBTyxrQkFBQyxDQUFDLE9BQU8sRUFBRTthQUNmLElBQUksQ0FBQztZQUNKLElBQUksS0FBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7Z0JBQy9CLE9BQU8sS0FBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDL0M7aUJBQU07Z0JBQ0wsT0FBTyxTQUFTLENBQUM7YUFDbEI7UUFDSCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsVUFBQyxHQUFHO1lBQ1IsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLE9BQU8sS0FBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDekM7aUJBQU07Z0JBQ0wsT0FBTyxrQkFBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUNPLG1DQUFVLEdBQWxCLFVBQW1CLEdBQVcsRUFBRSxVQUFtQjtRQUFuRCxpQkE0Q0M7UUEzQ0MsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2hCLGdCQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7UUFDRCx5Q0FBeUM7UUFDekMsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUMxQyxHQUFHLEdBQUcsZUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsSUFBTSxrQkFBa0IsR0FBRyx3QkFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBYSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDaEU7YUFBTTtZQUNMLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUQsa0JBQWtCLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztTQUNqQztRQUNELElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxJQUFJLFNBQWEsQ0FBQztZQUN0QixJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3REO2lCQUFNO2dCQUNMLElBQUksR0FBRyxrQkFBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QztZQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFDLEtBQUs7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTzt1QkFDZixDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUN4QjtvQkFDQSxPQUFPLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDeEM7cUJBQU07b0JBQ0wsT0FBTyxLQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNuQztZQUVILENBQUMsQ0FBQyxDQUFBO1NBRUg7YUFBTTtZQUVMLE9BQU8sa0JBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdEI7SUFFSCxDQUFDO0lBQ08sNENBQW1CLEdBQTNCLFVBQTRCLEtBQWU7UUFDekMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUM1QztpQkFBTTtnQkFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7YUFDM0I7U0FDRjthQUFNO1lBQ0wsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2QsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFDO1lBQzdCLE9BQU8sS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDbkIsSUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtvQkFDZCxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDdEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDVixNQUFNO2lCQUNQO3FCQUFNO29CQUNMLElBQUksR0FBRyxJQUFJLEdBQUcsZ0JBQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMxQzthQUNGO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFekMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUNELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQzVDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQzthQUNsQztTQUNGO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7WUFDakYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN6QjtRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ08scUNBQVksR0FBcEI7UUFDRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUN4QixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQzlDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUM3RSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3RDOzZCQUFNOzRCQUNMLFNBQVM7eUJBQ1Y7cUJBQ0Y7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN0QztpQkFDRjtxQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFO29CQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN0QztpQkFDRjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3RDO2dCQUNELGtGQUFrRjtnQkFDbEYsMENBQTBDO2dCQUMxQyxTQUFTO2dCQUNULGtGQUFrRjtnQkFDbEYsZ0JBQWdCO2dCQUNoQixXQUFXO2dCQUNYLHFFQUFxRTtnQkFDckUsOENBQThDO2dCQUM5QyxRQUFRO2dCQUVSLE1BQU07Z0JBQ04sSUFBSTthQUNMO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsa0JBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3hGO0lBRUgsQ0FBQztJQUNPLHVDQUFjLEdBQXRCLFVBQXVCLEtBQWU7UUFDcEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFDakMsT0FBTyxLQUFLLENBQUM7U0FDZDthQUFNO1lBQ0wsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUNoQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsT0FBTyxvQkFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0Y7UUFFRCxrRUFBa0U7UUFDbEUsK0JBQStCO1FBQy9CLG9DQUFvQztRQUNwQyxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVPLHVDQUFjLEdBQXRCLFVBQXVCLEdBQVc7UUFDaEMsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUMvRTtpQkFBTTtnQkFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7YUFDbEM7U0FDRjtJQUVILENBQUM7SUFDTyx1Q0FBYyxHQUF0QixVQUF1QixLQUFlO1FBQXRDLGlCQVVDO1FBVEMsT0FBTyxJQUFJLGtCQUFDLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMzQixlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQUMsR0FBRztnQkFDMUMsSUFBSSxHQUFHLEVBQUU7b0JBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNiO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDaEI7WUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNILHFCQUFDO0FBQUQsQ0FBQyxBQW5PRCxDQUFvQyxxQkFBUyxHQW1PNUM7QUFuT1ksd0NBQWM7QUFxTzNCLHlCQUF5QixLQUFlLEVBQUUsT0FBcUIsRUFBRSxNQUFjLEVBQzdFLEVBQWtCO0lBRWxCLElBQUksTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDMUIsRUFBRSxFQUFFLENBQUM7S0FDTjtTQUFNO1FBQ0wsSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFO1lBQzNCLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQixJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFDN0UsTUFBTSxFQUFFLENBQUM7WUFDVCxJQUFJLEdBQUcsSUFBSyxHQUEyQixDQUFDLElBQUksRUFBRTtnQkFDM0MsR0FBMkIsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLO29CQUN0QyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDMUIsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBYSxDQUFDO2dCQUNsQyxPQUFPLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO29CQUM1QixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBVyxDQUFDO29CQUNwRyxNQUFNLEVBQUUsQ0FBQztpQkFDVjtnQkFDRCxFQUFFLEVBQUUsQ0FBQzthQUNOO1NBQ0Y7YUFBTTtZQUNMLEVBQUUsRUFBRSxDQUFDO1NBQ047S0FDRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9jZXNzb3IsIFByb2Nlc3NMaW5lUmVzdWx0IH0gZnJvbSBcIi4vUHJvY2Vzc29yXCI7XG5pbXBvcnQgUCBmcm9tIFwiYmx1ZWJpcmRcIjtcbmltcG9ydCB7IHByZXBhcmVEYXRhIH0gZnJvbSBcIi4vZGF0YUNsZWFuXCI7XG5pbXBvcnQgZ2V0RW9sIGZyb20gXCIuL2dldEVvbFwiO1xuaW1wb3J0IHsgc3RyaW5nVG9MaW5lcyB9IGZyb20gXCIuL2ZpbGVsaW5lXCI7XG5pbXBvcnQgeyBidWZGcm9tU3RyaW5nLCBmaWx0ZXJBcnJheSx0cmltTGVmdCB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IFJvd1NwbGl0IH0gZnJvbSBcIi4vcm93U3BsaXRcIjtcbmltcG9ydCBsaW5lVG9Kc29uIGZyb20gXCIuL2xpbmVUb0pzb25cIjtcbmltcG9ydCB7IFBhcnNlUnVudGltZSB9IGZyb20gXCIuL1BhcnNlUnVudGltZVwiO1xuaW1wb3J0IENTVkVycm9yIGZyb20gXCIuL0NTVkVycm9yXCI7XG5cblxuXG5leHBvcnQgY2xhc3MgUHJvY2Vzc29yTG9jYWwgZXh0ZW5kcyBQcm9jZXNzb3Ige1xuICBmbHVzaCgpOiBQPFByb2Nlc3NMaW5lUmVzdWx0W10+IHtcbiAgICBpZiAodGhpcy5ydW50aW1lLmNzdkxpbmVCdWZmZXIgJiYgdGhpcy5ydW50aW1lLmNzdkxpbmVCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYnVmID0gdGhpcy5ydW50aW1lLmNzdkxpbmVCdWZmZXI7XG4gICAgICB0aGlzLnJ1bnRpbWUuY3N2TGluZUJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3MoYnVmLCB0cnVlKVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMucnVudGltZS5jc3ZMaW5lQnVmZmVyICYmIHRoaXMucnVudGltZS5jc3ZMaW5lQnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQLnJlamVjdChDU1ZFcnJvci51bmNsb3NlZF9xdW90ZSh0aGlzLnJ1bnRpbWUucGFyc2VkTGluZU51bWJlciwgdGhpcy5ydW50aW1lLmNzdkxpbmVCdWZmZXIudG9TdHJpbmcoKSkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQLnJlc29sdmUocmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQLnJlc29sdmUoW10pO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCk6IFA8dm9pZD4ge1xuICAgIHJldHVybiBQLnJlc29sdmUoKTtcbiAgfVxuICBwcml2YXRlIHJvd1NwbGl0OiBSb3dTcGxpdCA9IG5ldyBSb3dTcGxpdCh0aGlzLmNvbnZlcnRlcik7XG4gIHByaXZhdGUgZW9sRW1pdHRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9uZWVkRW1pdEVvbD86IGJvb2xlYW4gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZ2V0IG5lZWRFbWl0RW9sKCkge1xuICAgIGlmICh0aGlzLl9uZWVkRW1pdEVvbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9uZWVkRW1pdEVvbCA9IHRoaXMuY29udmVydGVyLmxpc3RlbmVycyhcImVvbFwiKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbmVlZEVtaXRFb2w7XG4gIH1cbiAgcHJpdmF0ZSBoZWFkRW1pdHRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9uZWVkRW1pdEhlYWQ/OiBib29sZWFuID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIGdldCBuZWVkRW1pdEhlYWQoKSB7XG4gICAgaWYgKHRoaXMuX25lZWRFbWl0SGVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9uZWVkRW1pdEhlYWQgPSB0aGlzLmNvbnZlcnRlci5saXN0ZW5lcnMoXCJoZWFkZXJcIikubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25lZWRFbWl0SGVhZDtcblxuICB9XG4gIHByb2Nlc3MoY2h1bms6IEJ1ZmZlciwgZmluYWxDaHVuayA9IGZhbHNlKTogUDxQcm9jZXNzTGluZVJlc3VsdFtdPiB7XG4gICAgbGV0IGNzdlN0cmluZzogc3RyaW5nO1xuICAgIGlmIChmaW5hbENodW5rKSB7XG4gICAgICBjc3ZTdHJpbmcgPSBjaHVuay50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjc3ZTdHJpbmcgPSBwcmVwYXJlRGF0YShjaHVuaywgdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lKTtcblxuICAgIH1cbiAgICByZXR1cm4gUC5yZXNvbHZlKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucnVudGltZS5wcmVSYXdEYXRhSG9vaykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWUucHJlUmF3RGF0YUhvb2soY3N2U3RyaW5nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gY3N2U3RyaW5nO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKGNzdikgPT4ge1xuICAgICAgICBpZiAoY3N2ICYmIGNzdi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NTVihjc3YsIGZpbmFsQ2h1bmspO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQLnJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KVxuICB9XG4gIHByaXZhdGUgcHJvY2Vzc0NTVihjc3Y6IHN0cmluZywgZmluYWxDaHVuazogYm9vbGVhbik6IFA8UHJvY2Vzc0xpbmVSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMucGFyYW1zO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnJ1bnRpbWU7XG4gICAgaWYgKCFydW50aW1lLmVvbCkge1xuICAgICAgZ2V0RW9sKGNzdiwgcnVudGltZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm5lZWRFbWl0RW9sICYmICF0aGlzLmVvbEVtaXR0ZWQgJiYgcnVudGltZS5lb2wpIHtcbiAgICAgIHRoaXMuY29udmVydGVyLmVtaXQoXCJlb2xcIiwgcnVudGltZS5lb2wpO1xuICAgICAgdGhpcy5lb2xFbWl0dGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gdHJpbSBjc3YgZmlsZSBoYXMgaW5pdGlhbCBibGFuayBsaW5lcy5cbiAgICBpZiAocGFyYW1zLmlnbm9yZUVtcHR5ICYmICFydW50aW1lLnN0YXJ0ZWQpIHtcbiAgICAgIGNzdiA9IHRyaW1MZWZ0KGNzdik7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ1RvTGluZVJlc3VsdCA9IHN0cmluZ1RvTGluZXMoY3N2LCBydW50aW1lKTtcbiAgICBpZiAoIWZpbmFsQ2h1bmspIHtcbiAgICAgIHRoaXMucHJlcGVuZExlZnRCdWYoYnVmRnJvbVN0cmluZyhzdHJpbmdUb0xpbmVSZXN1bHQucGFydGlhbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJpbmdUb0xpbmVSZXN1bHQubGluZXMucHVzaChzdHJpbmdUb0xpbmVSZXN1bHQucGFydGlhbCk7XG4gICAgICBzdHJpbmdUb0xpbmVSZXN1bHQucGFydGlhbCA9IFwiXCI7XG4gICAgfVxuICAgIGlmIChzdHJpbmdUb0xpbmVSZXN1bHQubGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHByb206IFA8c3RyaW5nW10+O1xuICAgICAgaWYgKHJ1bnRpbWUucHJlRmlsZUxpbmVIb29rKSB7XG4gICAgICAgIHByb20gPSB0aGlzLnJ1blByZUxpbmVIb29rKHN0cmluZ1RvTGluZVJlc3VsdC5saW5lcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9tID0gUC5yZXNvbHZlKHN0cmluZ1RvTGluZVJlc3VsdC5saW5lcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvbS50aGVuKChsaW5lcykgPT4ge1xuICAgICAgICBpZiAoIXJ1bnRpbWUuc3RhcnRlZFxuICAgICAgICAgICYmICF0aGlzLnJ1bnRpbWUuaGVhZGVyc1xuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRGF0YVdpdGhIZWFkKGxpbmVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ1NWQm9keShsaW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgfSlcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIHJldHVybiBQLnJlc29sdmUoW10pO1xuICAgIH1cblxuICB9XG4gIHByaXZhdGUgcHJvY2Vzc0RhdGFXaXRoSGVhZChsaW5lczogc3RyaW5nW10pOiBQcm9jZXNzTGluZVJlc3VsdFtdIHtcbiAgICBpZiAodGhpcy5wYXJhbXMubm9oZWFkZXIpIHtcbiAgICAgIGlmICh0aGlzLnBhcmFtcy5oZWFkZXJzKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5oZWFkZXJzID0gdGhpcy5wYXJhbXMuaGVhZGVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucnVudGltZS5oZWFkZXJzID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBsZWZ0ID0gXCJcIjtcbiAgICAgIGxldCBoZWFkZXJSb3c6IHN0cmluZ1tdID0gW107XG4gICAgICB3aGlsZSAobGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsZWZ0ICsgbGluZXMuc2hpZnQoKTtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5yb3dTcGxpdC5wYXJzZShsaW5lKTtcbiAgICAgICAgaWYgKHJvdy5jbG9zZWQpIHtcbiAgICAgICAgICBoZWFkZXJSb3cgPSByb3cuY2VsbHM7XG4gICAgICAgICAgbGVmdCA9IFwiXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGVmdCA9IGxpbmUgKyBnZXRFb2wobGluZSwgdGhpcy5ydW50aW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcmVwZW5kTGVmdEJ1ZihidWZGcm9tU3RyaW5nKGxlZnQpKTtcblxuICAgICAgaWYgKGhlYWRlclJvdy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGFyYW1zLmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmhlYWRlcnMgPSB0aGlzLnBhcmFtcy5oZWFkZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmhlYWRlcnMgPSBoZWFkZXJSb3c7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLnJ1bnRpbWUubmVlZFByb2Nlc3NJZ25vcmVDb2x1bW4gfHwgdGhpcy5ydW50aW1lLm5lZWRQcm9jZXNzSW5jbHVkZUNvbHVtbikge1xuICAgICAgdGhpcy5maWx0ZXJIZWFkZXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubmVlZEVtaXRIZWFkICYmICF0aGlzLmhlYWRFbWl0dGVkKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlci5lbWl0KFwiaGVhZGVyXCIsIHRoaXMucnVudGltZS5oZWFkZXJzKTtcbiAgICAgIHRoaXMuaGVhZEVtaXR0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzQ1NWQm9keShsaW5lcyk7XG4gIH1cbiAgcHJpdmF0ZSBmaWx0ZXJIZWFkZXIoKSB7XG4gICAgdGhpcy5ydW50aW1lLnNlbGVjdGVkQ29sdW1ucyA9IFtdO1xuICAgIGlmICh0aGlzLnJ1bnRpbWUuaGVhZGVycykge1xuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMucnVudGltZS5oZWFkZXJzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmFtcy5pZ25vcmVDb2x1bW5zKSB7XG4gICAgICAgICAgaWYgKHRoaXMucGFyYW1zLmlnbm9yZUNvbHVtbnMudGVzdChoZWFkZXJzW2ldKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLmluY2x1ZGVDb2x1bW5zICYmIHRoaXMucGFyYW1zLmluY2x1ZGVDb2x1bW5zLnRlc3QoaGVhZGVyc1tpXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5ydW50aW1lLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVudGltZS5zZWxlY3RlZENvbHVtbnMucHVzaChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJhbXMuaW5jbHVkZUNvbHVtbnMpIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXJhbXMuaW5jbHVkZUNvbHVtbnMudGVzdChoZWFkZXJzW2ldKSkge1xuICAgICAgICAgICAgdGhpcy5ydW50aW1lLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJ1bnRpbWUuc2VsZWN0ZWRDb2x1bW5zLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHRoaXMucGFyYW1zLmluY2x1ZGVDb2x1bW5zICYmIHRoaXMucGFyYW1zLmluY2x1ZGVDb2x1bW5zLnRlc3QoaGVhZGVyc1tpXSkpe1xuICAgICAgICAvLyAgIHRoaXMucnVudGltZS5zZWxlY3RlZENvbHVtbnMucHVzaChpKTtcbiAgICAgICAgLy8gfWVsc2V7XG4gICAgICAgIC8vICAgaWYgKHRoaXMucGFyYW1zLmlnbm9yZUNvbHVtbnMgJiYgdGhpcy5wYXJhbXMuaWdub3JlQ29sdW1ucy50ZXN0KGhlYWRlcnNbaV0pKXtcbiAgICAgICAgLy8gICAgIGNvbnRpbnVlO1xuICAgICAgICAvLyAgIH1lbHNle1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMucGFyYW1zLmlnbm9yZUNvbHVtbnMgJiYgIXRoaXMucGFyYW1zLmluY2x1ZGVDb2x1bW5zKXtcbiAgICAgICAgLy8gICAgICAgdGhpcy5ydW50aW1lLnNlbGVjdGVkQ29sdW1ucy5wdXNoKGkpO1xuICAgICAgICAvLyAgICAgfVxuXG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bnRpbWUuaGVhZGVycyA9IGZpbHRlckFycmF5KHRoaXMucnVudGltZS5oZWFkZXJzLCB0aGlzLnJ1bnRpbWUuc2VsZWN0ZWRDb2x1bW5zKTtcbiAgICB9XG5cbiAgfVxuICBwcml2YXRlIHByb2Nlc3NDU1ZCb2R5KGxpbmVzOiBzdHJpbmdbXSk6IFByb2Nlc3NMaW5lUmVzdWx0W10ge1xuICAgIGlmICh0aGlzLnBhcmFtcy5vdXRwdXQgPT09IFwibGluZVwiKSB7XG4gICAgICByZXR1cm4gbGluZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucm93U3BsaXQucGFyc2VNdWx0aUxpbmVzKGxpbmVzKTtcbiAgICAgIHRoaXMucHJlcGVuZExlZnRCdWYoYnVmRnJvbVN0cmluZyhyZXN1bHQucGFydGlhbCkpO1xuICAgICAgaWYgKHRoaXMucGFyYW1zLm91dHB1dCA9PT0gXCJjc3ZcIikge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3NDZWxscztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsaW5lVG9Kc29uKHJlc3VsdC5yb3dzQ2VsbHMsIHRoaXMuY29udmVydGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB2YXIganNvbkFyciA9IGxpbmVzVG9Kc29uKGxpbmVzLmxpbmVzLCBwYXJhbXMsIHRoaXMucmVjb3JkTnVtKTtcbiAgICAvLyB0aGlzLnByb2Nlc3NSZXN1bHQoanNvbkFycik7XG4gICAgLy8gdGhpcy5sYXN0SW5kZXggKz0ganNvbkFyci5sZW5ndGg7XG4gICAgLy8gdGhpcy5yZWNvcmROdW0gKz0ganNvbkFyci5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHByZXBlbmRMZWZ0QnVmKGJ1ZjogQnVmZmVyKSB7XG4gICAgaWYgKGJ1Zikge1xuICAgICAgaWYgKHRoaXMucnVudGltZS5jc3ZMaW5lQnVmZmVyKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5jc3ZMaW5lQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbYnVmLCB0aGlzLnJ1bnRpbWUuY3N2TGluZUJ1ZmZlcl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ydW50aW1lLmNzdkxpbmVCdWZmZXIgPSBidWY7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cbiAgcHJpdmF0ZSBydW5QcmVMaW5lSG9vayhsaW5lczogc3RyaW5nW10pOiBQPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIG5ldyBQKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHByb2Nlc3NMaW5lSG9vayhsaW5lcywgdGhpcy5ydW50aW1lLCAwLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGxpbmVzKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzTGluZUhvb2sobGluZXM6IHN0cmluZ1tdLCBydW50aW1lOiBQYXJzZVJ1bnRpbWUsIG9mZnNldDogbnVtYmVyLFxuICBjYjogKGVycj8pID0+IHZvaWRcbikge1xuICBpZiAob2Zmc2V0ID49IGxpbmVzLmxlbmd0aCkge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHJ1bnRpbWUucHJlRmlsZUxpbmVIb29rKSB7XG4gICAgICBjb25zdCBsaW5lID0gbGluZXNbb2Zmc2V0XTtcbiAgICAgIGNvbnN0IHJlcyA9IHJ1bnRpbWUucHJlRmlsZUxpbmVIb29rKGxpbmUsIHJ1bnRpbWUucGFyc2VkTGluZU51bWJlciArIG9mZnNldCk7XG4gICAgICBvZmZzZXQrKztcbiAgICAgIGlmIChyZXMgJiYgKHJlcyBhcyBQcm9taXNlTGlrZTxzdHJpbmc+KS50aGVuKSB7XG4gICAgICAgIChyZXMgYXMgUHJvbWlzZUxpa2U8c3RyaW5nPikudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICBsaW5lc1tvZmZzZXQgLSAxXSA9IHZhbHVlO1xuICAgICAgICAgIHByb2Nlc3NMaW5lSG9vayhsaW5lcywgcnVudGltZSwgb2Zmc2V0LCBjYik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXNbb2Zmc2V0IC0gMV0gPSByZXMgYXMgc3RyaW5nO1xuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgbGluZXNbb2Zmc2V0XSA9IHJ1bnRpbWUucHJlRmlsZUxpbmVIb29rKGxpbmVzW29mZnNldF0sIHJ1bnRpbWUucGFyc2VkTGluZU51bWJlciArIG9mZnNldCkgYXMgc3RyaW5nO1xuICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICB9XG4gICAgICAgIGNiKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9XG59Il19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/220d4ea980d1b3641219c9c350ef34f7c2da2287e3d58928ceb5b83feb3b528b.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/220d4ea980d1b3641219c9c350ef34f7c2da2287e3d58928ceb5b83feb3b528b.js new file mode 100644 index 0000000..15fd63f --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/220d4ea980d1b3641219c9c350ef34f7c2da2287e3d58928ceb5b83feb3b528b.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function mergeParams(params) { + var defaultParam = { + delimiter: ',', + ignoreColumns: undefined, + includeColumns: undefined, + quote: '"', + trim: true, + checkType: false, + ignoreEmpty: false, + // fork: false, + noheader: false, + headers: undefined, + flatKeys: false, + maxRowLength: 0, + checkColumn: false, + escape: '"', + colParser: {}, + eol: undefined, + alwaysSplitAtEOL: false, + output: "json", + nullObject: false, + downstreamFormat: "line", + needEmitAll: true + }; + if (!params) { + params = {}; + } + for (var key in params) { + if (params.hasOwnProperty(key)) { + if (Array.isArray(params[key])) { + defaultParam[key] = [].concat(params[key]); + } + else { + defaultParam[key] = params[key]; + } + } + } + return defaultParam; +} +exports.mergeParams = mergeParams; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9QYXJhbWV0ZXJzLnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL1BhcmFtZXRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpR0EscUJBQTRCLE1BQStCO0lBQ3pELElBQU0sWUFBWSxHQUFrQjtRQUNsQyxTQUFTLEVBQUUsR0FBRztRQUNkLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLEtBQUssRUFBRSxHQUFHO1FBQ1YsSUFBSSxFQUFFLElBQUk7UUFDVixTQUFTLEVBQUUsS0FBSztRQUNoQixXQUFXLEVBQUUsS0FBSztRQUNsQixlQUFlO1FBQ2YsUUFBUSxFQUFFLEtBQUs7UUFDZixPQUFPLEVBQUUsU0FBUztRQUNsQixRQUFRLEVBQUUsS0FBSztRQUNmLFlBQVksRUFBRSxDQUFDO1FBQ2YsV0FBVyxFQUFFLEtBQUs7UUFDbEIsTUFBTSxFQUFFLEdBQUc7UUFDWCxTQUFTLEVBQUUsRUFBRTtRQUNiLEdBQUcsRUFBRSxTQUFTO1FBQ2QsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QixNQUFNLEVBQUUsTUFBTTtRQUNkLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLGdCQUFnQixFQUFDLE1BQU07UUFDdkIsV0FBVyxFQUFDLElBQUk7S0FDakIsQ0FBQTtJQUNELElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxNQUFNLEdBQUcsRUFBRSxDQUFDO0tBQ2I7SUFDRCxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sRUFBRTtRQUN0QixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDOUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUM5QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM1QztpQkFBTTtnQkFDTCxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7S0FDRjtJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFyQ0Qsa0NBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBDU1ZQYXJzZVBhcmFtIHtcbiAgLyoqXG4gICAqICAgZGVsaW1pdGVyIHVzZWQgZm9yIHNlcGVyYXRpbmcgY29sdW1ucy4gVXNlIFwiYXV0b1wiIGlmIGRlbGltaXRlciBpcyB1bmtub3duIGluIGFkdmFuY2UsIGluIHRoaXMgY2FzZSwgZGVsaW1pdGVyIHdpbGwgYmUgYXV0by1kZXRlY3RlZCAoYnkgYmVzdCBhdHRlbXB0KS4gVXNlIGFuIGFycmF5IHRvIGdpdmUgYSBsaXN0IG9mIHBvdGVudGlhbCBkZWxpbWl0ZXJzIGUuZy4gW1wiLFwiLFwifFwiLFwiJFwiXS4gZGVmYXVsdDogXCIsXCJcbiAgICovXG4gIGRlbGltaXRlcjogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiAgVGhpcyBwYXJhbWV0ZXIgaW5zdHJ1Y3RzIHRoZSBwYXJzZXIgdG8gaWdub3JlIGNvbHVtbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uIEV4YW1wbGU6IC8obmFtZXxhZ2UpLyB3aWxsIGlnbm9yZSBjb2x1bW5zIHdob3NlIGhlYWRlciBjb250YWlucyBcIm5hbWVcIiBvciBcImFnZVwiXG4gICAqL1xuICBpZ25vcmVDb2x1bW5zPzogUmVnRXhwO1xuICAvKipcbiAgICogIFRoaXMgcGFyYW1ldGVyIGluc3RydWN0cyB0aGUgcGFyc2VyIHRvIGluY2x1ZGUgb25seSB0aG9zZSBjb2x1bW5zIGFzIHNwZWNpZmllZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uLiBFeGFtcGxlOiAvKG5hbWV8YWdlKS8gd2lsbCBwYXJzZSBhbmQgaW5jbHVkZSBjb2x1bW5zIHdob3NlIGhlYWRlciBjb250YWlucyBcIm5hbWVcIiBvciBcImFnZVwiXG4gICAqL1xuICBpbmNsdWRlQ29sdW1ucz86IFJlZ0V4cDtcbiAgLyoqXG4gICAqICBJZiBhIGNvbHVtbiBjb250YWlucyBkZWxpbWl0ZXIsIGl0IGlzIGFibGUgdG8gdXNlIHF1b3RlIGNoYXJhY3RlciB0byBzdXJyb3VuZCB0aGUgY29sdW1uIGNvbnRlbnQuIGUuZy4gXCJoZWxsbywgd29ybGRcIiB3b250IGJlIHNwbGl0IGludG8gdHdvIGNvbHVtbnMgd2hpbGUgcGFyc2luZy4gU2V0IHRvIFwib2ZmXCIgd2lsbCBpZ25vcmUgYWxsIHF1b3Rlcy4gZGVmYXVsdDogXCIgKGRvdWJsZSBxdW90ZSlcbiAgICovXG4gIHF1b3RlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiAgSW5kaWNhdGUgaWYgcGFyc2VyIHRyaW0gb2ZmIHNwYWNlcyBzdXJyb3VuZGluZyBjb2x1bW4gY29udGVudC4gZS5nLiBcIiBjb250ZW50IFwiIHdpbGwgYmUgdHJpbW1lZCB0byBcImNvbnRlbnRcIi4gRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgdHJpbTogYm9vbGVhbjtcbiAgLyoqXG4gICAqICBUaGlzIHBhcmFtZXRlciB0dXJucyBvbiBhbmQgb2ZmIHdoZXRoZXIgY2hlY2sgZmllbGQgdHlwZS4gRGVmYXVsdCBpcyBmYWxzZS4gXG4gICAqL1xuICBjaGVja1R5cGU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiAgSWdub3JlIHRoZSBlbXB0eSB2YWx1ZSBpbiBDU1YgY29sdW1ucy4gSWYgYSBjb2x1bW4gdmFsdWUgaXMgbm90IGdpdmVuLCBzZXQgdGhpcyB0byB0cnVlIHRvIHNraXAgdGhlbS4gRGVmYXVsdDogZmFsc2UuXG4gICAqL1xuICBpZ25vcmVFbXB0eTogYm9vbGVhbjtcbiAgLyoqXG4gICAqICBEZWxlZ2F0ZSBwYXJzaW5nIHdvcmsgdG8gYW5vdGhlciBwcm9jZXNzLlxuICAgKi9cbiAgLy8gZm9yazogYm9vbGVhbjtcbiAgLyoqXG4gICAqICBJbmRpY2F0aW5nIGNzdiBkYXRhIGhhcyBubyBoZWFkZXIgcm93IGFuZCBmaXJzdCByb3cgaXMgZGF0YSByb3cuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBub2hlYWRlcjogYm9vbGVhbjtcbiAgLyoqXG4gICAqICBBbiBhcnJheSB0byBzcGVjaWZ5IHRoZSBoZWFkZXJzIG9mIENTViBkYXRhLiBJZiAtLW5vaGVhZGVyIGlzIGZhbHNlLCB0aGlzIHZhbHVlIHdpbGwgb3ZlcnJpZGUgQ1NWIGhlYWRlciByb3cuIERlZmF1bHQ6IG51bGwuIEV4YW1wbGU6IFtcIm15IGZpZWxkXCIsXCJuYW1lXCJdLlxuICAgKi9cbiAgaGVhZGVycz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogIERvbid0IGludGVycHJldCBkb3RzICguKSBhbmQgc3F1YXJlIGJyYWNrZXRzIGluIGhlYWRlciBmaWVsZHMgYXMgbmVzdGVkIG9iamVjdCBvciBhcnJheSBpZGVudGlmaWVycyBhdCBhbGwgKHRyZWF0IHRoZW0gbGlrZSByZWd1bGFyIGNoYXJhY3RlcnMgZm9yIEpTT04gZmllbGQgaWRlbnRpZmllcnMpLiBEZWZhdWx0OiBmYWxzZS5cbiAgICovXG4gIGZsYXRLZXlzOiBib29sZWFuO1xuICAvKipcbiAgICogIHRoZSBtYXggY2hhcmFjdGVyIGEgY3N2IHJvdyBjb3VsZCBoYXZlLiAwIG1lYW5zIGluZmluaXRlLiBJZiBtYXggbnVtYmVyIGV4Y2VlZGVkLCBwYXJzZXIgd2lsbCBlbWl0IFwiZXJyb3JcIiBvZiBcInJvd19leGNlZWRcIi4gaWYgYSBwb3NzaWJseSBjb3JydXB0ZWQgY3N2IGRhdGEgcHJvdmlkZWQsIGdpdmUgaXQgYSBudW1iZXIgbGlrZSA2NTUzNSBzbyB0aGUgcGFyc2VyIHdvbnQgY29uc3VtZSBtZW1vcnkuIGRlZmF1bHQ6IDBcbiAgICovXG4gIG1heFJvd0xlbmd0aDogbnVtYmVyO1xuICAvKipcbiAgICogIHdoZXRoZXIgY2hlY2sgY29sdW1uIG51bWJlciBvZiBhIHJvdyBpcyB0aGUgc2FtZSBhcyBoZWFkZXJzLiBJZiBjb2x1bW4gbnVtYmVyIG1pc21hdGNoZWQgaGVhZGVycyBudW1iZXIsIGFuIGVycm9yIG9mIFwibWlzbWF0Y2hlZF9jb2x1bW5cIiB3aWxsIGJlIGVtaXR0ZWQuLiBkZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAgY2hlY2tDb2x1bW46IGJvb2xlYW47XG4gIC8qKlxuICAgKiAgZXNjYXBlIGNoYXJhY3RlciB1c2VkIGluIHF1b3RlZCBjb2x1bW4uIERlZmF1bHQgaXMgZG91YmxlIHF1b3RlIChcIikgYWNjb3JkaW5nIHRvIFJGQzQxMDguIENoYW5nZSB0byBiYWNrIHNsYXNoIChcXCkgb3Igb3RoZXIgY2hhcnMgZm9yIHlvdXIgb3duIGNhc2UuXG4gICAqL1xuICBlc2NhcGU6IHN0cmluZztcbiAgLyoqXG4gICAqICAgQWxsb3dzIG92ZXJyaWRlIHBhcnNpbmcgbG9naWMgZm9yIGEgc3BlY2lmaWMgY29sdW1uLiBJdCBhY2NlcHRzIGEgSlNPTiBvYmplY3Qgd2l0aCBmaWVsZHMgbGlrZTogaGVhZE5hbWU6IDxTdHJpbmcgfCBGdW5jdGlvbj4gLiBlLmcuIHtmaWVsZDE6J251bWJlcid9IHdpbGwgdXNlIGJ1aWx0LWluIG51bWJlciBwYXJzZXIgdG8gY29udmVydCB2YWx1ZSBvZiB0aGUgZmllbGQxIGNvbHVtbiB0byBudW1iZXIuIEFub3RoZXIgZXhhbXBsZSB7XCJuYW1lXCI6bmFtZVByb2Nlc3NGdW5jfSB3aWxsIHVzZSBzcGVjaWZpZWQgZnVuY3Rpb24gdG8gcGFyc2UgdGhlIHZhbHVlLlxuICAgKi9cbiAgY29sUGFyc2VyOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgQ2VsbFBhcnNlciB8IENvbHVtblBhcmFtXG4gIH07XG4gIC8qKlxuICAgKiAgRW5kIG9mIGxpbmUgY2hhcmFjdGVyLiBJZiBvbWl0dGVkLCBwYXJzZXIgd2lsbCBhdHRlbXB0IHRvIHJldHJpZXZlIGl0IGZyb20gdGhlIGZpcnN0IGNodW5rcyBvZiBDU1YgZGF0YVxuICAgKi9cbiAgZW9sPzogc3RyaW5nO1xuICAvKipcbiAgICogIEFsd2F5cyBpbnRlcnByZXQgZWFjaCBsaW5lIChhcyBkZWZpbmVkIGJ5IGVvbCkgYXMgYSByb3cuIFRoaXMgd2lsbCBwcmV2ZW50IGVvbCBjaGFyYWN0ZXJzIGZyb20gYmVpbmcgdXNlZCB3aXRoaW4gYSByb3cgKGV2ZW4gaW5zaWRlIGEgcXVvdGVkIGZpZWxkKS4gRGVmYXVsdCBpcyBmYWxzZS4gQ2hhbmdlIHRvIHRydWUgaWYgeW91IGFyZSBjb25maWRlbnQgbm8gaW5saW5lIGxpbmUgYnJlYWtzIChsaWtlIGxpbmUgYnJlYWsgaW4gYSBjZWxsIHdoaWNoIGhhcyBtdWx0aSBsaW5lIHRleHQpXG4gICAqL1xuICBhbHdheXNTcGxpdEF0RU9MOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGZvcm1hdCB0byBiZSBjb252ZXJ0ZWQgdG8uIFwianNvblwiIChkZWZhdWx0KSAtLSBjb252ZXJ0IGNzdiB0byBqc29uLiBcImNzdlwiIC0tIGNvbnZlcnQgY3N2IHRvIGNzdiByb3cgYXJyYXkuIFwibGluZVwiIC0tIGNvbnZlcnQgY3N2IHRvIGNzdiBsaW5lIHN0cmluZyBcbiAgICovXG4gIG91dHB1dDogXCJqc29uXCIgfCBcImNzdlwiIHwgXCJsaW5lXCI7XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgc3RyaW5nIFwibnVsbFwiIHRvIG51bGwgb2JqZWN0IGluIEpTT04gb3V0cHV0cy4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIG51bGxPYmplY3Q6Ym9vbGVhbjtcbiAgLyoqXG4gICAqIERlZmluZSB0aGUgZm9ybWF0IHJlcXVpcmVkIGJ5IGRvd25zdHJlYW0gKHRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IHdvcmsgaWYgb2JqZWN0TW9kZSBpcyBvbikuIGBsaW5lYCAtLSBqc29uIGlzIGVtaXR0ZWQgaW4gYSBzaW5nbGUgbGluZSBzZXBhcmF0ZWQgYnkgYSBsaW5lIGJyZWFrZSBsaWtlIFwianNvbjFcXG5qc29uMlwiIC4gYGFycmF5YCAtLSBkb3duc3RyZWFtIHJlcXVpcmVzIGFycmF5IGZvcm1hdCBsaWtlIFwiW2pzb24xLGpzb24yXVwiLiBEZWZhdWx0IGlzIGxpbmUuXG4gICAqL1xuICBkb3duc3RyZWFtRm9ybWF0OiBcImxpbmVcIiB8IFwiYXJyYXlcIjtcbiAgLyoqXG4gICAqIERlZmluZSB3aGV0aGVyIC50aGVuKGNhbGxiYWNrKSByZXR1cm5zIGFsbCBKU09OIGRhdGEgaW4gaXRzIGNhbGxiYWNrLiBEZWZhdWx0IGlzIHRydWUuIENoYW5nZSB0byBmYWxzZSB0byBzYXZlIG1lbW9yeSBpZiBzdWJzY3JpYmluZyBqc29uIGxpbmVzLlxuICAgKi9cbiAgbmVlZEVtaXRBbGw6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIENlbGxQYXJzZXIgPSAoaXRlbTogc3RyaW5nLCBoZWFkOiBzdHJpbmcsIHJlc3VsdFJvdzogYW55LCByb3c6IHN0cmluZ1tdLCBjb2x1bW5JbmRleDogbnVtYmVyKSA9PiBhbnk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uUGFyYW0ge1xuICBmbGF0PzogYm9vbGVhbjtcbiAgY2VsbFBhcnNlcj86IHN0cmluZyB8IENlbGxQYXJzZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBhcmFtcyhwYXJhbXM/OiBQYXJ0aWFsPENTVlBhcnNlUGFyYW0+KTogQ1NWUGFyc2VQYXJhbSB7XG4gIGNvbnN0IGRlZmF1bHRQYXJhbTogQ1NWUGFyc2VQYXJhbSA9IHtcbiAgICBkZWxpbWl0ZXI6ICcsJyxcbiAgICBpZ25vcmVDb2x1bW5zOiB1bmRlZmluZWQsXG4gICAgaW5jbHVkZUNvbHVtbnM6IHVuZGVmaW5lZCxcbiAgICBxdW90ZTogJ1wiJyxcbiAgICB0cmltOiB0cnVlLFxuICAgIGNoZWNrVHlwZTogZmFsc2UsXG4gICAgaWdub3JlRW1wdHk6IGZhbHNlLFxuICAgIC8vIGZvcms6IGZhbHNlLFxuICAgIG5vaGVhZGVyOiBmYWxzZSxcbiAgICBoZWFkZXJzOiB1bmRlZmluZWQsXG4gICAgZmxhdEtleXM6IGZhbHNlLFxuICAgIG1heFJvd0xlbmd0aDogMCxcbiAgICBjaGVja0NvbHVtbjogZmFsc2UsXG4gICAgZXNjYXBlOiAnXCInLFxuICAgIGNvbFBhcnNlcjoge30sXG4gICAgZW9sOiB1bmRlZmluZWQsXG4gICAgYWx3YXlzU3BsaXRBdEVPTDogZmFsc2UsXG4gICAgb3V0cHV0OiBcImpzb25cIixcbiAgICBudWxsT2JqZWN0OiBmYWxzZSxcbiAgICBkb3duc3RyZWFtRm9ybWF0OlwibGluZVwiLFxuICAgIG5lZWRFbWl0QWxsOnRydWVcbiAgfVxuICBpZiAoIXBhcmFtcykge1xuICAgIHBhcmFtcyA9IHt9O1xuICB9XG4gIGZvciAobGV0IGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtc1trZXldKSkge1xuICAgICAgICBkZWZhdWx0UGFyYW1ba2V5XSA9IFtdLmNvbmNhdChwYXJhbXNba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0UGFyYW1ba2V5XSA9IHBhcmFtc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdFBhcmFtO1xufVxuXG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/2a9bafe9fbe95ecf89f636e4ef23cb6f79647e7f5e59dce04654581288e7e3e7.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/2a9bafe9fbe95ecf89f636e4ef23cb6f79647e7f5e59dce04654581288e7e3e7.js new file mode 100644 index 0000000..23abfab --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/2a9bafe9fbe95ecf89f636e4ef23cb6f79647e7f5e59dce04654581288e7e3e7.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Processor = /** @class */ (function () { + function Processor(converter) { + this.converter = converter; + this.params = converter.parseParam; + this.runtime = converter.parseRuntime; + } + return Processor; +}()); +exports.Processor = Processor; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9Qcm9jZXNzb3IudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvUHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUE7SUFHRSxtQkFBc0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDO0lBQ3hDLENBQUM7SUFJSCxnQkFBQztBQUFELENBQUMsQUFWRCxJQVVDO0FBVnFCLDhCQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSBcIi4vQ29udmVydGVyXCI7XG5pbXBvcnQgUCBmcm9tIFwiYmx1ZWJpcmRcIjtcbmltcG9ydCB7IEpTT05SZXN1bHQgfSBmcm9tIFwiLi9saW5lVG9Kc29uXCI7XG5pbXBvcnQgeyBDU1ZQYXJzZVBhcmFtIH0gZnJvbSBcIi4vUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgUGFyc2VSdW50aW1lIH0gZnJvbSBcIi4vUGFyc2VSdW50aW1lXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzb3Ige1xuICBwcm90ZWN0ZWQgcGFyYW1zOiBDU1ZQYXJzZVBhcmFtO1xuICBwcm90ZWN0ZWQgcnVudGltZTogUGFyc2VSdW50aW1lO1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udmVydGVyOiBDb252ZXJ0ZXIpIHtcbiAgICB0aGlzLnBhcmFtcyA9IGNvbnZlcnRlci5wYXJzZVBhcmFtO1xuICAgIHRoaXMucnVudGltZSA9IGNvbnZlcnRlci5wYXJzZVJ1bnRpbWU7XG4gIH1cbiAgYWJzdHJhY3QgcHJvY2VzcyhjaHVuazogQnVmZmVyLGZpbmFsQ2h1bms/OmJvb2xlYW4pOiBQPFByb2Nlc3NMaW5lUmVzdWx0W10+XG4gIGFic3RyYWN0IGRlc3Ryb3koKTpQPHZvaWQ+O1xuICBhYnN0cmFjdCBmbHVzaCgpOiBQPFByb2Nlc3NMaW5lUmVzdWx0W10+O1xufVxuZXhwb3J0IHR5cGUgUHJvY2Vzc0xpbmVSZXN1bHQgPSBzdHJpbmcgfCBzdHJpbmdbXSB8IEpTT05SZXN1bHQ7XG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/35eb90faf3bc35f59e53824803623baabb47d90efcb26810c79a570fed5ad880.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/35eb90faf3bc35f59e53824803623baabb47d90efcb26810c79a570fed5ad880.js new file mode 100644 index 0000000..aec3603 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/35eb90faf3bc35f59e53824803623baabb47d90efcb26810c79a570fed5ad880.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//return first eol found from a data chunk. +function default_1(data, param) { + if (!param.eol && data) { + for (var i = 0, len = data.length; i < len; i++) { + if (data[i] === "\r") { + if (data[i + 1] === "\n") { + param.eol = "\r\n"; + break; + } + else if (data[i + 1]) { + param.eol = "\r"; + break; + } + } + else if (data[i] === "\n") { + param.eol = "\n"; + break; + } + } + } + return param.eol || "\n"; +} +exports.default = default_1; +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9nZXRFb2wudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvZ2V0RW9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsMkNBQTJDO0FBQzNDLG1CQUF5QixJQUFZLEVBQUUsS0FBbUI7SUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO29CQUN4QixLQUFLLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztvQkFDbkIsTUFBTTtpQkFDUDtxQkFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3RCLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO29CQUNqQixNQUFNO2lCQUNQO2FBQ0Y7aUJBQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUMzQixLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztnQkFDakIsTUFBTTthQUNQO1NBQ0Y7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUM7QUFDM0IsQ0FBQztBQWxCRCw0QkFrQkM7QUFBQSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VSdW50aW1lIH0gZnJvbSBcIi4vUGFyc2VSdW50aW1lXCI7XG4vL3JldHVybiBmaXJzdCBlb2wgZm91bmQgZnJvbSBhIGRhdGEgY2h1bmsuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZGF0YTogc3RyaW5nLCBwYXJhbTogUGFyc2VSdW50aW1lKTogc3RyaW5nIHtcbiAgaWYgKCFwYXJhbS5lb2wgJiYgZGF0YSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoZGF0YVtpXSA9PT0gXCJcXHJcIikge1xuICAgICAgICBpZiAoZGF0YVtpICsgMV0gPT09IFwiXFxuXCIpIHtcbiAgICAgICAgICBwYXJhbS5lb2wgPSBcIlxcclxcblwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGFbaSArIDFdKSB7XG4gICAgICAgICAgcGFyYW0uZW9sID0gXCJcXHJcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBcbiAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA9PT0gXCJcXG5cIikge1xuICAgICAgICBwYXJhbS5lb2wgPSBcIlxcblwiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcmFtLmVvbCB8fCBcIlxcblwiO1xufTtcbiJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/5b7b6cc115cc8559849a34561c82531410ecb53ccdbe486e410336329db2fdb4.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/5b7b6cc115cc8559849a34561c82531410ecb53ccdbe486e410336329db2fdb4.js new file mode 100644 index 0000000..7315aa7 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/5b7b6cc115cc8559849a34561c82531410ecb53ccdbe486e410336329db2fdb4.js @@ -0,0 +1,131 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var rowSplit_1 = require("./rowSplit"); +var Converter_1 = require("./Converter"); +var assert = require("assert"); +describe("Test delimiters", function () { + var getDelimiter = function (str, opt) { + return rowSplit_1.RowSplit.prototype["getDelimiter"].call({ + conv: { + parseParam: { + delimiter: opt.delimiter + } + } + }, str); + }; + it("should return the explicitly specified delimiter", function () { + var delimiter = ";"; + var rowStr = "a;b;c"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: ";" }); + assert.equal(returnedDelimiter, delimiter); + }); + it("should return the autodetected delimiter if 'auto' specified", function () { + var rowStr = "a;b;c"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" }); + assert(returnedDelimiter === ";"); + }); + it("should return the ',' delimiter if delimiter cannot be specified, in case of 'auto'", function () { + var rowStr = "abc"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" }); + assert(returnedDelimiter === ","); + }); + it("should accetp an array with potential delimiters", function () { + var rowStr = "a$b$c"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: [",", ";", "$"] }); + assert(returnedDelimiter === '$'); + }); +}); +describe("ParseMultiLine function", function () { + var rowSplit = new rowSplit_1.RowSplit(new Converter_1.Converter()); + var func = function (lines) { + return rowSplit.parseMultiLines(lines); + }; + it("should convert lines to csv lines", function () { + var lines = [ + "a,b,c,d", + "hello,world,csvtojson,abc", + "1,2,3,4" + ]; + var res = func(lines); + assert.equal(res.rowsCells.length, 3); + assert.equal(res.partial, ""); + }); + it("should process line breaks", function () { + var lines = [ + "a,b,c", + '15",hello,"ab', + "cde\"", + "\"b\"\"b\",cc,dd" + ]; + var res = func(lines); + assert.equal(res.rowsCells.length, 3); + assert.equal(res.rowsCells[1][0], "15\""); + assert.equal(res.rowsCells[1][2], "ab\ncde"); + assert.equal(res.rowsCells[2][0], "b\"b"); + assert.equal(res.partial, ""); + }); + it("should return partial if line not closed", function () { + var lines = [ + "a,b,c", + '15",hello,"ab', + "d,e,f" + ]; + var res = func(lines); + assert.equal(res.rowsCells.length, 1); + assert.equal(res.partial, "15\",hello,\"ab\nd,e,f\n"); + }); +}); +describe("RowSplit.parse function", function () { + var rowSplit = new rowSplit_1.RowSplit(new Converter_1.Converter()); + var func = function (str) { + return rowSplit.parse(str); + }; + it("should split complete csv line", function () { + var str = "hello,world,csvtojson,awesome"; + var res = func(str); + assert.equal(res.cells.length, 4); + assert.equal(res.closed, true); + }); + it("should split incomplete csv line", function () { + var str = "hello,world,\"csvtojson,awesome"; + var res = func(str); + assert.equal(res.closed, false); + }); + it("should allow multiple line", function () { + var str = "\"he\"llo\",world,\"csvtojson,a\"\nwesome\""; + var res = func(str); + assert.equal(res.closed, true); + assert.equal(res.cells[2], 'csvtojson,a"\nwesome'); + }); + it("should allow blank quotes", function () { + var data = "a|^^|^b^"; + var rowSplit = new rowSplit_1.RowSplit(new Converter_1.Converter({ + delimiter: '|', + quote: '^', + noheader: true + })); + var res = rowSplit.parse(data); + assert.equal(res.cells[1], ""); + }); + it("should allow blank quotes in quotes", function () { + var data = 'a,"hello,this,"", test"'; + var rowSplit = new rowSplit_1.RowSplit(new Converter_1.Converter({ + noheader: true + })); + var res = rowSplit.parse(data); + assert.equal(res.cells[1], 'hello,this,", test'); + }); + it("should smart detect if an initial quote is only part of value ", function () { + var data = '"Weight" (kg),Error code,"Height" (m)'; + var rowSplit = new rowSplit_1.RowSplit(new Converter_1.Converter({ + noheader: true + })); + var res = rowSplit.parse(data); + assert.equal(res.cells.length, 3); + assert(res.closed); + assert.equal(res.cells[0], '"Weight" (kg)'); + assert.equal(res.cells[1], 'Error code'); + assert.equal(res.cells[2], '"Height" (m)'); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9yb3dTcGxpdC50ZXN0LnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL3Jvd1NwbGl0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBeUU7QUFDekUseUNBQXdDO0FBQ3hDLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVqQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7SUFDMUIsSUFBTSxZQUFZLEdBQUcsVUFBQyxHQUFHLEVBQUUsR0FBcUM7UUFDOUQsT0FBTyxtQkFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDN0MsSUFBSSxFQUFFO2dCQUNKLFVBQVUsRUFBRTtvQkFDVixTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7aUJBQ3pCO2FBQ0Y7U0FDRixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQyxDQUFBO0lBRUQsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1FBQ3JELElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDckIsSUFBSSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw4REFBOEQsRUFBRTtRQUNqRSxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUM7UUFDckIsSUFBSSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLGlCQUFpQixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFGQUFxRixFQUFFO1FBQ3hGLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsaUJBQWlCLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7UUFDckQsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3JCLElBQUksaUJBQWlCLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLHlCQUF5QixFQUFFO0lBQ2xDLElBQU0sUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxJQUFJLHFCQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLElBQU0sSUFBSSxHQUFHLFVBQUMsS0FBZTtRQUMzQixPQUFPLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFBO0lBQ0QsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1FBQ3RDLElBQUksS0FBSyxHQUFHO1lBQ1YsU0FBUztZQUNULDJCQUEyQjtZQUMzQixTQUFTO1NBQ1YsQ0FBQztRQUNGLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRTtRQUMvQixJQUFJLEtBQUssR0FBRztZQUNWLE9BQU87WUFDUCxlQUFlO1lBQ2YsT0FBTztZQUNQLGtCQUFrQjtTQUNuQixDQUFDO1FBQ0YsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFO1FBQzdDLElBQUksS0FBSyxHQUFHO1lBQ1YsT0FBTztZQUNQLGVBQWU7WUFDZixPQUFPO1NBQ1IsQ0FBQztRQUNGLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMseUJBQXlCLEVBQUU7SUFDbEMsSUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUkscUJBQVMsRUFBRSxDQUFDLENBQUM7SUFDL0MsSUFBTSxJQUFJLEdBQUcsVUFBQyxHQUFHO1FBQ2YsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQTtJQUNELEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRTtRQUNuQyxJQUFJLEdBQUcsR0FBRywrQkFBK0IsQ0FBQztRQUMxQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7UUFDckMsSUFBSSxHQUFHLEdBQUcsaUNBQWlDLENBQUM7UUFDNUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0QkFBNEIsRUFBRTtRQUMvQixJQUFJLEdBQUcsR0FBRyw2Q0FBNkMsQ0FBQztRQUN4RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLDJCQUEyQixFQUFFO1FBQzlCLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUV4QixJQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUMsSUFBSSxxQkFBUyxDQUFDO1lBQzFDLFNBQVMsRUFBRSxHQUFHO1lBQ2QsS0FBSyxFQUFFLEdBQUc7WUFDVixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsSUFBTSxJQUFJLEdBQUcseUJBQXlCLENBQUM7UUFFdkMsSUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLElBQUkscUJBQVMsQ0FBQztZQUMxQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRTtRQUNuRSxJQUFNLElBQUksR0FBRyx1Q0FBdUMsQ0FBQztRQUNyRCxJQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUMsSUFBSSxxQkFBUyxDQUFDO1lBQzFDLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUU1QyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm93U3BsaXQsIE11bHRpcGxlUm93UmVzdWx0LCBSb3dTcGxpdFJlc3VsdCB9IGZyb20gXCIuL3Jvd1NwbGl0XCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tIFwiLi9Db252ZXJ0ZXJcIjtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5cbmRlc2NyaWJlKFwiVGVzdCBkZWxpbWl0ZXJzXCIsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZ2V0RGVsaW1pdGVyID0gKHN0ciwgb3B0OiB7IGRlbGltaXRlcjogc3RyaW5nIHwgc3RyaW5nW10gfSk6IHN0cmluZyA9PiB7XG4gICAgcmV0dXJuIFJvd1NwbGl0LnByb3RvdHlwZVtcImdldERlbGltaXRlclwiXS5jYWxsKHtcbiAgICAgIGNvbnY6IHtcbiAgICAgICAgcGFyc2VQYXJhbToge1xuICAgICAgICAgIGRlbGltaXRlcjogb3B0LmRlbGltaXRlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgc3RyKTtcbiAgfVxuXG4gIGl0KFwic2hvdWxkIHJldHVybiB0aGUgZXhwbGljaXRseSBzcGVjaWZpZWQgZGVsaW1pdGVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGVsaW1pdGVyID0gXCI7XCI7XG4gICAgdmFyIHJvd1N0ciA9IFwiYTtiO2NcIjtcbiAgICB2YXIgcmV0dXJuZWREZWxpbWl0ZXIgPSBnZXREZWxpbWl0ZXIocm93U3RyLCB7IGRlbGltaXRlcjogXCI7XCIgfSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJldHVybmVkRGVsaW1pdGVyLCBkZWxpbWl0ZXIpO1xuICB9KTtcblxuICBpdChcInNob3VsZCByZXR1cm4gdGhlIGF1dG9kZXRlY3RlZCBkZWxpbWl0ZXIgaWYgJ2F1dG8nIHNwZWNpZmllZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJvd1N0ciA9IFwiYTtiO2NcIjtcbiAgICB2YXIgcmV0dXJuZWREZWxpbWl0ZXIgPSBnZXREZWxpbWl0ZXIocm93U3RyLCB7IGRlbGltaXRlcjogXCJhdXRvXCIgfSk7XG4gICAgYXNzZXJ0KHJldHVybmVkRGVsaW1pdGVyID09PSBcIjtcIik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHJldHVybiB0aGUgJywnIGRlbGltaXRlciBpZiBkZWxpbWl0ZXIgY2Fubm90IGJlIHNwZWNpZmllZCwgaW4gY2FzZSBvZiAnYXV0bydcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciByb3dTdHIgPSBcImFiY1wiO1xuICAgIHZhciByZXR1cm5lZERlbGltaXRlciA9IGdldERlbGltaXRlcihyb3dTdHIsIHsgZGVsaW1pdGVyOiBcImF1dG9cIiB9KTtcbiAgICBhc3NlcnQocmV0dXJuZWREZWxpbWl0ZXIgPT09IFwiLFwiKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgYWNjZXRwIGFuIGFycmF5IHdpdGggcG90ZW50aWFsIGRlbGltaXRlcnNcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciByb3dTdHIgPSBcImEkYiRjXCI7XG4gICAgdmFyIHJldHVybmVkRGVsaW1pdGVyID0gZ2V0RGVsaW1pdGVyKHJvd1N0ciwgeyBkZWxpbWl0ZXI6IFtcIixcIiwgXCI7XCIsIFwiJFwiXSB9KTtcbiAgICBhc3NlcnQocmV0dXJuZWREZWxpbWl0ZXIgPT09ICckJyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiUGFyc2VNdWx0aUxpbmUgZnVuY3Rpb25cIiwgZnVuY3Rpb24gKCkge1xuICBjb25zdCByb3dTcGxpdCA9IG5ldyBSb3dTcGxpdChuZXcgQ29udmVydGVyKCkpO1xuICBjb25zdCBmdW5jID0gKGxpbmVzOiBzdHJpbmdbXSk6IE11bHRpcGxlUm93UmVzdWx0ID0+IHtcbiAgICByZXR1cm4gcm93U3BsaXQucGFyc2VNdWx0aUxpbmVzKGxpbmVzKTtcbiAgfVxuICBpdChcInNob3VsZCBjb252ZXJ0IGxpbmVzIHRvIGNzdiBsaW5lc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpbmVzID0gW1xuICAgICAgXCJhLGIsYyxkXCIsXG4gICAgICBcImhlbGxvLHdvcmxkLGNzdnRvanNvbixhYmNcIixcbiAgICAgIFwiMSwyLDMsNFwiXG4gICAgXTtcbiAgICB2YXIgcmVzID0gZnVuYyhsaW5lcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5yb3dzQ2VsbHMubGVuZ3RoLCAzKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLnBhcnRpYWwsIFwiXCIpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9jZXNzIGxpbmUgYnJlYWtzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGluZXMgPSBbXG4gICAgICBcImEsYixjXCIsXG4gICAgICAnMTVcIixoZWxsbyxcImFiJyxcbiAgICAgIFwiY2RlXFxcIlwiLFxuICAgICAgXCJcXFwiYlxcXCJcXFwiYlxcXCIsY2MsZGRcIlxuICAgIF07XG4gICAgdmFyIHJlcyA9IGZ1bmMobGluZXMpO1xuICAgIGFzc2VydC5lcXVhbChyZXMucm93c0NlbGxzLmxlbmd0aCwgMyk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5yb3dzQ2VsbHNbMV1bMF0sIFwiMTVcXFwiXCIpO1xuICAgIGFzc2VydC5lcXVhbChyZXMucm93c0NlbGxzWzFdWzJdLCBcImFiXFxuY2RlXCIpO1xuICAgIGFzc2VydC5lcXVhbChyZXMucm93c0NlbGxzWzJdWzBdLCBcImJcXFwiYlwiKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLnBhcnRpYWwsIFwiXCIpO1xuICB9KTtcblxuICBpdChcInNob3VsZCByZXR1cm4gcGFydGlhbCBpZiBsaW5lIG5vdCBjbG9zZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBsaW5lcyA9IFtcbiAgICAgIFwiYSxiLGNcIixcbiAgICAgICcxNVwiLGhlbGxvLFwiYWInLFxuICAgICAgXCJkLGUsZlwiXG4gICAgXTtcbiAgICB2YXIgcmVzID0gZnVuYyhsaW5lcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5yb3dzQ2VsbHMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLnBhcnRpYWwsIFwiMTVcXFwiLGhlbGxvLFxcXCJhYlxcbmQsZSxmXFxuXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJvd1NwbGl0LnBhcnNlIGZ1bmN0aW9uXCIsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgcm93U3BsaXQgPSBuZXcgUm93U3BsaXQobmV3IENvbnZlcnRlcigpKTtcbiAgY29uc3QgZnVuYyA9IChzdHIpOiBSb3dTcGxpdFJlc3VsdCA9PiB7XG4gICAgcmV0dXJuIHJvd1NwbGl0LnBhcnNlKHN0cik7XG4gIH1cbiAgaXQoXCJzaG91bGQgc3BsaXQgY29tcGxldGUgY3N2IGxpbmVcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdHIgPSBcImhlbGxvLHdvcmxkLGNzdnRvanNvbixhd2Vzb21lXCI7XG4gICAgdmFyIHJlcyA9IGZ1bmMoc3RyKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLmNlbGxzLmxlbmd0aCwgNCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5jbG9zZWQsIHRydWUpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBzcGxpdCBpbmNvbXBsZXRlIGNzdiBsaW5lXCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RyID0gXCJoZWxsbyx3b3JsZCxcXFwiY3N2dG9qc29uLGF3ZXNvbWVcIjtcbiAgICB2YXIgcmVzID0gZnVuYyhzdHIpO1xuICAgIGFzc2VydC5lcXVhbChyZXMuY2xvc2VkLCBmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGFsbG93IG11bHRpcGxlIGxpbmVcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdHIgPSBcIlxcXCJoZVxcXCJsbG9cXFwiLHdvcmxkLFxcXCJjc3Z0b2pzb24sYVxcXCJcXG53ZXNvbWVcXFwiXCI7XG4gICAgdmFyIHJlcyA9IGZ1bmMoc3RyKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLmNsb3NlZCwgdHJ1ZSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5jZWxsc1syXSwgJ2NzdnRvanNvbixhXCJcXG53ZXNvbWUnKTtcbiAgfSk7XG4gIGl0KFwic2hvdWxkIGFsbG93IGJsYW5rIHF1b3Rlc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IFwiYXxeXnxeYl5cIjtcblxuICAgIGNvbnN0IHJvd1NwbGl0ID0gbmV3IFJvd1NwbGl0KG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgZGVsaW1pdGVyOiAnfCcsXG4gICAgICBxdW90ZTogJ14nLFxuICAgICAgbm9oZWFkZXI6IHRydWVcbiAgICB9KSk7XG4gICAgY29uc3QgcmVzID0gcm93U3BsaXQucGFyc2UoZGF0YSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5jZWxsc1sxXSwgXCJcIik7XG4gIH0pXG4gIGl0KFwic2hvdWxkIGFsbG93IGJsYW5rIHF1b3RlcyBpbiBxdW90ZXNcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSAnYSxcImhlbGxvLHRoaXMsXCJcIiwgdGVzdFwiJztcblxuICAgIGNvbnN0IHJvd1NwbGl0ID0gbmV3IFJvd1NwbGl0KG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgbm9oZWFkZXI6IHRydWVcbiAgICB9KSk7XG4gICAgY29uc3QgcmVzID0gcm93U3BsaXQucGFyc2UoZGF0YSk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcy5jZWxsc1sxXSwgJ2hlbGxvLHRoaXMsXCIsIHRlc3QnKTtcbiAgfSlcbiAgaXQoXCJzaG91bGQgc21hcnQgZGV0ZWN0IGlmIGFuIGluaXRpYWwgcXVvdGUgaXMgb25seSBwYXJ0IG9mIHZhbHVlIFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9ICdcIldlaWdodFwiIChrZyksRXJyb3IgY29kZSxcIkhlaWdodFwiIChtKSc7XG4gICAgY29uc3Qgcm93U3BsaXQgPSBuZXcgUm93U3BsaXQobmV3IENvbnZlcnRlcih7XG4gICAgICBub2hlYWRlcjogdHJ1ZVxuICAgIH0pKTtcbiAgICBjb25zdCByZXMgPSByb3dTcGxpdC5wYXJzZShkYXRhKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLmNlbGxzLmxlbmd0aCwgMyk7XG4gICAgYXNzZXJ0KHJlcy5jbG9zZWQpO1xuICAgIGFzc2VydC5lcXVhbChyZXMuY2VsbHNbMF0sJ1wiV2VpZ2h0XCIgKGtnKScpO1xuICAgIGFzc2VydC5lcXVhbChyZXMuY2VsbHNbMV0sJ0Vycm9yIGNvZGUnKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzLmNlbGxzWzJdLCdcIkhlaWdodFwiIChtKScpO1xuICAgIFxuICB9KVxufSk7XG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/6c7a4bd504b58ba513336814c6fb1a1baa361e29c2df52092099a5376d037cb9.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/6c7a4bd504b58ba513336814c6fb1a1baa361e29c2df52092099a5376d037cb9.js new file mode 100644 index 0000000..0890a34 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/6c7a4bd504b58ba513336814c6fb1a1baa361e29c2df52092099a5376d037cb9.js @@ -0,0 +1,22 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var getEol_1 = __importDefault(require("./getEol")); +// const getEol = require("./getEol"); +/** + * convert data chunk to file lines array + * @param {string} data data chunk as utf8 string + * @param {object} param Converter param object + * @return {Object} {lines:[line1,line2...],partial:String} + */ +function stringToLines(data, param) { + var eol = getEol_1.default(data, param); + var lines = data.split(eol); + var partial = lines.pop() || ""; + return { lines: lines, partial: partial }; +} +exports.stringToLines = stringToLines; +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9maWxlbGluZS50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9maWxlbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLG9EQUE4QjtBQUM5QixzQ0FBc0M7QUFDdEM7Ozs7O0dBS0c7QUFDSCx1QkFBOEIsSUFBWSxFQUFFLEtBQW1CO0lBQzdELElBQU0sR0FBRyxHQUFHLGdCQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUIsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDNUMsQ0FBQztBQUxELHNDQUtDO0FBQUEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcnNlUnVudGltZSB9IGZyb20gXCIuL1BhcnNlUnVudGltZVwiO1xuaW1wb3J0IGdldEVvbCBmcm9tIFwiLi9nZXRFb2xcIjtcbi8vIGNvbnN0IGdldEVvbCA9IHJlcXVpcmUoXCIuL2dldEVvbFwiKTtcbi8qKlxuICogY29udmVydCBkYXRhIGNodW5rIHRvIGZpbGUgbGluZXMgYXJyYXlcbiAqIEBwYXJhbSAge3N0cmluZ30gZGF0YSAgZGF0YSBjaHVuayBhcyB1dGY4IHN0cmluZ1xuICogQHBhcmFtICB7b2JqZWN0fSBwYXJhbSBDb252ZXJ0ZXIgcGFyYW0gb2JqZWN0XG4gKiBAcmV0dXJuIHtPYmplY3R9ICAge2xpbmVzOltsaW5lMSxsaW5lMi4uLl0scGFydGlhbDpTdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0xpbmVzKGRhdGE6IHN0cmluZywgcGFyYW06IFBhcnNlUnVudGltZSk6IFN0cmluZ1RvTGluZXNSZXN1bHQge1xuICBjb25zdCBlb2wgPSBnZXRFb2woZGF0YSwgcGFyYW0pO1xuICBjb25zdCBsaW5lcyA9IGRhdGEuc3BsaXQoZW9sKTtcbiAgY29uc3QgcGFydGlhbCA9IGxpbmVzLnBvcCgpIHx8IFwiXCI7XG4gIHJldHVybiB7IGxpbmVzOiBsaW5lcywgcGFydGlhbDogcGFydGlhbCB9O1xufTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ1RvTGluZXNSZXN1bHQge1xuICBsaW5lczogRmlsZWxpbmVbXSxcbiAgLyoqXG4gICAqIGxhc3QgbGluZSB3aGljaCBjb3VsZCBiZSBpbmNvbXBsZXRlIGxpbmUuXG4gICAqL1xuICBwYXJ0aWFsOiBzdHJpbmdcbn1cbmV4cG9ydCB0eXBlIEZpbGVsaW5lID0gc3RyaW5nOyJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/83fb32366eeebd3a934318efe8f5c515dd472fccb2f189b66ce7a266fce983f9.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/83fb32366eeebd3a934318efe8f5c515dd472fccb2f189b66ce7a266fce983f9.js new file mode 100644 index 0000000..0cb0f24 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/83fb32366eeebd3a934318efe8f5c515dd472fccb2f189b66ce7a266fce983f9.js @@ -0,0 +1,9 @@ +"use strict"; +var Converter_1 = require("./Converter"); +var helper = function (param, options) { + return new Converter_1.Converter(param, options); +}; +helper["csv"] = helper; +helper["Converter"] = Converter_1.Converter; +module.exports = helper; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9pbmRleC50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEseUNBQXdDO0FBRXhDLElBQU0sTUFBTSxHQUFHLFVBQVUsS0FBOEIsRUFBRSxPQUEwQjtJQUNqRixPQUFPLElBQUkscUJBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFBO0FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2QixNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcscUJBQVMsQ0FBQztBQUNoQyxpQkFBUSxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2Zvcm1PcHRpb25zIH0gZnJvbSBcInN0cmVhbVwiO1xuaW1wb3J0IHsgQ1NWUGFyc2VQYXJhbSB9IGZyb20gXCIuL1BhcmFtZXRlcnNcIjtcbmltcG9ydCB7IENvbnZlcnRlciB9IGZyb20gXCIuL0NvbnZlcnRlclwiO1xuXG5jb25zdCBoZWxwZXIgPSBmdW5jdGlvbiAocGFyYW0/OiBQYXJ0aWFsPENTVlBhcnNlUGFyYW0+LCBvcHRpb25zPzogVHJhbnNmb3JtT3B0aW9ucyk6IENvbnZlcnRlciB7XG4gIHJldHVybiBuZXcgQ29udmVydGVyKHBhcmFtLCBvcHRpb25zKTtcbn1cbmhlbHBlcltcImNzdlwiXSA9IGhlbHBlcjtcbmhlbHBlcltcIkNvbnZlcnRlclwiXSA9IENvbnZlcnRlcjtcbmV4cG9ydCA9aGVscGVyO1xuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/84e674946fa3a10db018321f519e27e33da138d89fb7c3054fa3b5f0085263e2.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/84e674946fa3a10db018321f519e27e33da138d89fb7c3054fa3b5f0085263e2.js new file mode 100644 index 0000000..e6c7418 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/84e674946fa3a10db018321f519e27e33da138d89fb7c3054fa3b5f0085263e2.js @@ -0,0 +1,193 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var stream_1 = require("stream"); +var Parameters_1 = require("./Parameters"); +var ParseRuntime_1 = require("./ParseRuntime"); +var bluebird_1 = __importDefault(require("bluebird")); +// import { ProcessorFork } from "./ProcessFork"; +var ProcessorLocal_1 = require("./ProcessorLocal"); +var Result_1 = require("./Result"); +var Converter = /** @class */ (function (_super) { + __extends(Converter, _super); + function Converter(param, options) { + if (options === void 0) { options = {}; } + var _this = _super.call(this, options) || this; + _this.options = options; + _this.params = Parameters_1.mergeParams(param); + _this.runtime = ParseRuntime_1.initParseRuntime(_this); + _this.result = new Result_1.Result(_this); + // if (this.params.fork) { + // this.processor = new ProcessorFork(this); + // } else { + _this.processor = new ProcessorLocal_1.ProcessorLocal(_this); + // } + _this.once("error", function (err) { + // console.log("BBB"); + //wait for next cycle to emit the errors. + setImmediate(function () { + _this.result.processError(err); + _this.emit("done", err); + }); + }); + _this.once("done", function () { + _this.processor.destroy(); + }); + return _this; + } + Converter.prototype.preRawData = function (onRawData) { + this.runtime.preRawDataHook = onRawData; + return this; + }; + Converter.prototype.preFileLine = function (onFileLine) { + this.runtime.preFileLineHook = onFileLine; + return this; + }; + Converter.prototype.subscribe = function (onNext, onError, onCompleted) { + this.parseRuntime.subscribe = { + onNext: onNext, + onError: onError, + onCompleted: onCompleted + }; + return this; + }; + Converter.prototype.fromFile = function (filePath, options) { + var _this = this; + var fs = require("fs"); + // var rs = null; + // this.wrapCallback(cb, function () { + // if (rs && rs.destroy) { + // rs.destroy(); + // } + // }); + fs.exists(filePath, function (exist) { + if (exist) { + var rs = fs.createReadStream(filePath, options); + rs.pipe(_this); + } + else { + _this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct.")); + } + }); + return this; + }; + Converter.prototype.fromStream = function (readStream) { + readStream.pipe(this); + return this; + }; + Converter.prototype.fromString = function (csvString) { + var csv = csvString.toString(); + var read = new stream_1.Readable(); + var idx = 0; + read._read = function (size) { + if (idx >= csvString.length) { + this.push(null); + } + else { + var str = csvString.substr(idx, size); + this.push(str); + idx += size; + } + }; + return this.fromStream(read); + }; + Converter.prototype.then = function (onfulfilled, onrejected) { + var _this = this; + return new bluebird_1.default(function (resolve, reject) { + _this.parseRuntime.then = { + onfulfilled: function (value) { + if (onfulfilled) { + resolve(onfulfilled(value)); + } + else { + resolve(value); + } + }, + onrejected: function (err) { + if (onrejected) { + resolve(onrejected(err)); + } + else { + reject(err); + } + } + }; + }); + }; + Object.defineProperty(Converter.prototype, "parseParam", { + get: function () { + return this.params; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Converter.prototype, "parseRuntime", { + get: function () { + return this.runtime; + }, + enumerable: true, + configurable: true + }); + Converter.prototype._transform = function (chunk, encoding, cb) { + var _this = this; + this.processor.process(chunk) + .then(function (result) { + // console.log(result); + if (result.length > 0) { + _this.runtime.started = true; + return _this.result.processResult(result); + } + }) + .then(function () { + _this.emit("drained"); + cb(); + }, function (error) { + _this.runtime.hasError = true; + _this.runtime.error = error; + _this.emit("error", error); + cb(); + }); + }; + Converter.prototype._flush = function (cb) { + var _this = this; + this.processor.flush() + .then(function (data) { + if (data.length > 0) { + return _this.result.processResult(data); + } + }) + .then(function () { + _this.processEnd(cb); + }, function (err) { + _this.emit("error", err); + cb(); + }); + }; + Converter.prototype.processEnd = function (cb) { + this.result.endProcess(); + this.emit("done"); + cb(); + }; + Object.defineProperty(Converter.prototype, "parsedLineNumber", { + get: function () { + return this.runtime.parsedLineNumber; + }, + enumerable: true, + configurable: true + }); + return Converter; +}(stream_1.Transform)); +exports.Converter = Converter; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9Db252ZXJ0ZXIudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvQ29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlDQUErRDtBQUMvRCwyQ0FBMEQ7QUFDMUQsK0NBQWdFO0FBQ2hFLHNEQUF5QjtBQU96QixpREFBaUQ7QUFDakQsbURBQWtEO0FBQ2xELG1DQUFrQztBQU1sQztJQUErQiw2QkFBUztJQXVGdEMsbUJBQVksS0FBOEIsRUFBUyxPQUE4QjtRQUE5Qix3QkFBQSxFQUFBLFlBQThCO1FBQWpGLFlBQ0Usa0JBQU0sT0FBTyxDQUFDLFNBdUJmO1FBeEJrRCxhQUFPLEdBQVAsT0FBTyxDQUF1QjtRQUUvRSxLQUFJLENBQUMsTUFBTSxHQUFHLHdCQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsS0FBSSxDQUFDLE9BQU8sR0FBRywrQkFBZ0IsQ0FBQyxLQUFJLENBQUMsQ0FBQztRQUN0QyxLQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQy9CLDBCQUEwQjtRQUMxQiw4Q0FBOEM7UUFDOUMsV0FBVztRQUNYLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSwrQkFBYyxDQUFDLEtBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUk7UUFDSixLQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFDLEdBQVE7WUFDMUIsc0JBQXNCO1lBQ3RCLHlDQUF5QztZQUN6QyxZQUFZLENBQUM7Z0JBQ1gsS0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLEtBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUwsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixLQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxLQUFJLENBQUM7SUFDZCxDQUFDO0lBOUdELDhCQUFVLEdBQVYsVUFBVyxTQUE2QjtRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsK0JBQVcsR0FBWCxVQUFZLFVBQStCO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCw2QkFBUyxHQUFULFVBQ0UsTUFBb0UsRUFDcEUsT0FBaUMsRUFDakMsV0FBd0I7UUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUc7WUFDNUIsTUFBTSxRQUFBO1lBQ04sT0FBTyxTQUFBO1lBQ1AsV0FBVyxhQUFBO1NBQ1osQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELDRCQUFRLEdBQVIsVUFBUyxRQUFnQixFQUFFLE9BQXFEO1FBQWhGLGlCQWlCQztRQWhCQyxJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsaUJBQWlCO1FBQ2pCLHNDQUFzQztRQUN0Qyw0QkFBNEI7UUFDNUIsb0JBQW9CO1FBQ3BCLE1BQU07UUFDTixNQUFNO1FBQ04sRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBQyxLQUFLO1lBQ3hCLElBQUksS0FBSyxFQUFFO2dCQUNULElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xELEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLENBQUM7YUFDZjtpQkFBTTtnQkFDTCxLQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQywrRUFBK0UsQ0FBQyxDQUFDLENBQUM7YUFDaEg7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELDhCQUFVLEdBQVYsVUFBVyxVQUFvQjtRQUM3QixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELDhCQUFVLEdBQVYsVUFBVyxTQUFpQjtRQUMxQixJQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBTSxJQUFJLEdBQUcsSUFBSSxpQkFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLElBQUk7WUFDekIsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQjtpQkFBTTtnQkFDTCxJQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZixHQUFHLElBQUksSUFBSSxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUE7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELHdCQUFJLEdBQUosVUFBeUMsV0FBZ0UsRUFBRSxVQUE4RDtRQUF6SyxpQkFtQkM7UUFsQkMsT0FBTyxJQUFJLGtCQUFDLENBQUMsVUFBQyxPQUFPLEVBQUUsTUFBTTtZQUMzQixLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRztnQkFDdkIsV0FBVyxFQUFFLFVBQUMsS0FBWTtvQkFDeEIsSUFBSSxXQUFXLEVBQUU7d0JBQ2YsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUM3Qjt5QkFBTTt3QkFDTCxPQUFPLENBQUMsS0FBWSxDQUFDLENBQUM7cUJBQ3ZCO2dCQUNILENBQUM7Z0JBQ0QsVUFBVSxFQUFFLFVBQUMsR0FBVTtvQkFDckIsSUFBSSxVQUFVLEVBQUU7d0JBQ2QsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUMxQjt5QkFBTTt3QkFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ2I7Z0JBQ0gsQ0FBQzthQUNGLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxzQkFBVyxpQ0FBVTthQUFyQjtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDOzs7T0FBQTtJQUNELHNCQUFXLG1DQUFZO2FBQXZCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7OztPQUFBO0lBOEJELDhCQUFVLEdBQVYsVUFBVyxLQUFVLEVBQUUsUUFBZ0IsRUFBRSxFQUFZO1FBQXJELGlCQW1CQztRQWxCQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7YUFDMUIsSUFBSSxDQUFDLFVBQUMsTUFBTTtZQUNYLHVCQUF1QjtZQUN2QixJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQixLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBRTVCLE9BQU8sS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDMUM7UUFDSCxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUM7WUFDSixLQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsRUFBRSxDQUFDO1FBQ1AsQ0FBQyxFQUFFLFVBQUMsS0FBSztZQUNQLEtBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUM3QixLQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDM0IsS0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUIsRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRCwwQkFBTSxHQUFOLFVBQU8sRUFBWTtRQUFuQixpQkFjQztRQWJDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO2FBQ25CLElBQUksQ0FBQyxVQUFDLElBQUk7WUFDVCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUVuQixPQUFPLEtBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hDO1FBQ0gsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDO1lBQ0osS0FBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDLEVBQUUsVUFBQyxHQUFHO1lBQ0wsS0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDeEIsRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDTyw4QkFBVSxHQUFsQixVQUFtQixFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQixFQUFFLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFDRCxzQkFBSSx1Q0FBZ0I7YUFBcEI7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDdkMsQ0FBQzs7O09BQUE7SUFDSCxnQkFBQztBQUFELENBQUMsQUEzSkQsQ0FBK0Isa0JBQVMsR0EySnZDO0FBM0pZLDhCQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNmb3JtLCBUcmFuc2Zvcm1PcHRpb25zLCBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IENTVlBhcnNlUGFyYW0sIG1lcmdlUGFyYW1zIH0gZnJvbSBcIi4vUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgUGFyc2VSdW50aW1lLCBpbml0UGFyc2VSdW50aW1lIH0gZnJvbSBcIi4vUGFyc2VSdW50aW1lXCI7XG5pbXBvcnQgUCBmcm9tIFwiYmx1ZWJpcmRcIjtcbmltcG9ydCB7IHN0cmluZ1RvTGluZXMgfSBmcm9tIFwiLi9maWxlbGluZVwiO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSBcImxvZGFzaC9tYXBcIjtcbmltcG9ydCB7IFJvd1NwbGl0LCBSb3dTcGxpdFJlc3VsdCB9IGZyb20gXCIuL3Jvd1NwbGl0XCI7XG5pbXBvcnQgZ2V0RW9sIGZyb20gXCIuL2dldEVvbFwiO1xuaW1wb3J0IGxpbmVUb0pzb24sIHsgSlNPTlJlc3VsdCB9IGZyb20gXCIuL2xpbmVUb0pzb25cIjtcbmltcG9ydCB7IFByb2Nlc3NvciwgUHJvY2Vzc0xpbmVSZXN1bHQgfSBmcm9tIFwiLi9Qcm9jZXNzb3JcIjtcbi8vIGltcG9ydCB7IFByb2Nlc3NvckZvcmsgfSBmcm9tIFwiLi9Qcm9jZXNzRm9ya1wiO1xuaW1wb3J0IHsgUHJvY2Vzc29yTG9jYWwgfSBmcm9tIFwiLi9Qcm9jZXNzb3JMb2NhbFwiO1xuaW1wb3J0IHsgUmVzdWx0IH0gZnJvbSBcIi4vUmVzdWx0XCI7XG5pbXBvcnQgQ1NWRXJyb3IgZnJvbSBcIi4vQ1NWRXJyb3JcIjtcbmltcG9ydCB7IGJ1ZkZyb21TdHJpbmcgfSBmcm9tIFwiLi91dGlsXCI7XG5cblxuXG5leHBvcnQgY2xhc3MgQ29udmVydGVyIGV4dGVuZHMgVHJhbnNmb3JtIGltcGxlbWVudHMgUHJvbWlzZUxpa2U8YW55W10+IHtcbiAgcHJlUmF3RGF0YShvblJhd0RhdGE6IFByZVJhd0RhdGFDYWxsYmFjayk6IENvbnZlcnRlciB7XG4gICAgdGhpcy5ydW50aW1lLnByZVJhd0RhdGFIb29rID0gb25SYXdEYXRhO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHByZUZpbGVMaW5lKG9uRmlsZUxpbmU6IFByZUZpbGVMaW5lQ2FsbGJhY2spOiBDb252ZXJ0ZXIge1xuICAgIHRoaXMucnVudGltZS5wcmVGaWxlTGluZUhvb2sgPSBvbkZpbGVMaW5lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHN1YnNjcmliZShcbiAgICBvbk5leHQ/OiAoZGF0YTogYW55LCBsaW5lTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPixcbiAgICBvbkVycm9yPzogKGVycjogQ1NWRXJyb3IpID0+IHZvaWQsXG4gICAgb25Db21wbGV0ZWQ/OiAoKSA9PiB2b2lkKTogQ29udmVydGVyIHtcbiAgICB0aGlzLnBhcnNlUnVudGltZS5zdWJzY3JpYmUgPSB7XG4gICAgICBvbk5leHQsXG4gICAgICBvbkVycm9yLFxuICAgICAgb25Db21wbGV0ZWRcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZnJvbUZpbGUoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHN0cmluZyB8IENyZWF0ZVJlYWRTdHJlYW1PcHRpb24gfCB1bmRlZmluZWQpOiBDb252ZXJ0ZXIge1xuICAgIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAgIC8vIHZhciBycyA9IG51bGw7XG4gICAgLy8gdGhpcy53cmFwQ2FsbGJhY2soY2IsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyAgIGlmIChycyAmJiBycy5kZXN0cm95KSB7XG4gICAgLy8gICAgIHJzLmRlc3Ryb3koKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcbiAgICBmcy5leGlzdHMoZmlsZVBhdGgsIChleGlzdCkgPT4ge1xuICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgIGNvbnN0IHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCwgb3B0aW9ucyk7XG4gICAgICAgIHJzLnBpcGUodGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKFwiRmlsZSBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIHBhdGggdG8geW91ciBjc3YgaXMgY29ycmVjdC5cIikpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZyb21TdHJlYW0ocmVhZFN0cmVhbTogUmVhZGFibGUpOiBDb252ZXJ0ZXIge1xuICAgIHJlYWRTdHJlYW0ucGlwZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBmcm9tU3RyaW5nKGNzdlN0cmluZzogc3RyaW5nKTogQ29udmVydGVyIHtcbiAgICBjb25zdCBjc3YgPSBjc3ZTdHJpbmcudG9TdHJpbmcoKTtcbiAgICBjb25zdCByZWFkID0gbmV3IFJlYWRhYmxlKCk7XG4gICAgbGV0IGlkeCA9IDA7XG4gICAgcmVhZC5fcmVhZCA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICBpZiAoaWR4ID49IGNzdlN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3RyID0gY3N2U3RyaW5nLnN1YnN0cihpZHgsIHNpemUpO1xuICAgICAgICB0aGlzLnB1c2goc3RyKTtcbiAgICAgICAgaWR4ICs9IHNpemU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZyb21TdHJlYW0ocmVhZCk7XG4gIH1cbiAgdGhlbjxUUmVzdWx0MSA9IGFueVtdLCBUUmVzdWx0MiA9IG5ldmVyPihvbmZ1bGZpbGxlZD86ICh2YWx1ZTogYW55W10pID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+LCBvbnJlamVjdGVkPzogKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPik6IFByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gbmV3IFAoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wYXJzZVJ1bnRpbWUudGhlbiA9IHtcbiAgICAgICAgb25mdWxmaWxsZWQ6ICh2YWx1ZTogYW55W10pID0+IHtcbiAgICAgICAgICBpZiAob25mdWxmaWxsZWQpIHtcbiAgICAgICAgICAgIHJlc29sdmUob25mdWxmaWxsZWQodmFsdWUpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSBhcyBhbnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25yZWplY3RlZDogKGVycjogRXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAob25yZWplY3RlZCkge1xuICAgICAgICAgICAgcmVzb2x2ZShvbnJlamVjdGVkKGVycikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhcnNlUGFyYW0oKTogQ1NWUGFyc2VQYXJhbSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFyc2VSdW50aW1lKCk6IFBhcnNlUnVudGltZSB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZTtcbiAgfVxuICBwcml2YXRlIHBhcmFtczogQ1NWUGFyc2VQYXJhbTtcbiAgcHJpdmF0ZSBydW50aW1lOiBQYXJzZVJ1bnRpbWU7XG4gIHByaXZhdGUgcHJvY2Vzc29yOiBQcm9jZXNzb3I7XG4gIHByaXZhdGUgcmVzdWx0OiBSZXN1bHQ7XG4gIGNvbnN0cnVjdG9yKHBhcmFtPzogUGFydGlhbDxDU1ZQYXJzZVBhcmFtPiwgcHVibGljIG9wdGlvbnM6IFRyYW5zZm9ybU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMucGFyYW1zID0gbWVyZ2VQYXJhbXMocGFyYW0pO1xuICAgIHRoaXMucnVudGltZSA9IGluaXRQYXJzZVJ1bnRpbWUodGhpcyk7XG4gICAgdGhpcy5yZXN1bHQgPSBuZXcgUmVzdWx0KHRoaXMpO1xuICAgIC8vIGlmICh0aGlzLnBhcmFtcy5mb3JrKSB7XG4gICAgLy8gICB0aGlzLnByb2Nlc3NvciA9IG5ldyBQcm9jZXNzb3JGb3JrKHRoaXMpO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgdGhpcy5wcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc29yTG9jYWwodGhpcyk7XG4gICAgLy8gfVxuICAgIHRoaXMub25jZShcImVycm9yXCIsIChlcnI6IGFueSkgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJCQkJcIik7XG4gICAgICAvL3dhaXQgZm9yIG5leHQgY3ljbGUgdG8gZW1pdCB0aGUgZXJyb3JzLlxuICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXN1bHQucHJvY2Vzc0Vycm9yKGVycik7XG4gICAgICAgIHRoaXMuZW1pdChcImRvbmVcIiwgZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gICAgdGhpcy5vbmNlKFwiZG9uZVwiLCAoKSA9PiB7XG4gICAgICB0aGlzLnByb2Nlc3Nvci5kZXN0cm95KCk7XG4gICAgfSlcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIF90cmFuc2Zvcm0oY2h1bms6IGFueSwgZW5jb2Rpbmc6IHN0cmluZywgY2I6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5wcm9jZXNzb3IucHJvY2VzcyhjaHVuaylcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5ydW50aW1lLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0LnByb2Nlc3NSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZHJhaW5lZFwiKTtcbiAgICAgICAgY2IoKTtcbiAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJ1bnRpbWUuaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLnJ1bnRpbWUuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICBjYigpO1xuICAgICAgfSk7XG4gIH1cbiAgX2ZsdXNoKGNiOiBGdW5jdGlvbikge1xuICAgIHRoaXMucHJvY2Vzc29yLmZsdXNoKClcbiAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgIHJldHVybiB0aGlzLnJlc3VsdC5wcm9jZXNzUmVzdWx0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NFbmQoY2IpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICBjYigpO1xuICAgICAgfSlcbiAgfVxuICBwcml2YXRlIHByb2Nlc3NFbmQoY2IpIHtcbiAgICB0aGlzLnJlc3VsdC5lbmRQcm9jZXNzKCk7XG4gICAgdGhpcy5lbWl0KFwiZG9uZVwiKTtcbiAgICBjYigpO1xuICB9XG4gIGdldCBwYXJzZWRMaW5lTnVtYmVyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZS5wYXJzZWRMaW5lTnVtYmVyO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJlYWRTdHJlYW1PcHRpb24ge1xuICBmbGFncz86IHN0cmluZztcbiAgZW5jb2Rpbmc/OiBzdHJpbmc7XG4gIGZkPzogbnVtYmVyO1xuICBtb2RlPzogbnVtYmVyO1xuICBhdXRvQ2xvc2U/OiBib29sZWFuO1xuICBzdGFydD86IG51bWJlcjtcbiAgZW5kPzogbnVtYmVyO1xuICBoaWdoV2F0ZXJNYXJrPzogbnVtYmVyO1xufVxuZXhwb3J0IHR5cGUgQ2FsbEJhY2sgPSAoZXJyOiBFcnJvciwgZGF0YTogQXJyYXk8YW55PikgPT4gdm9pZDtcblxuXG5leHBvcnQgdHlwZSBQcmVGaWxlTGluZUNhbGxiYWNrID0gKGxpbmU6IHN0cmluZywgbGluZU51bWJlcjogbnVtYmVyKSA9PiBzdHJpbmcgfCBQcm9taXNlTGlrZTxzdHJpbmc+O1xuZXhwb3J0IHR5cGUgUHJlUmF3RGF0YUNhbGxiYWNrID0gKGNzdlN0cmluZzogc3RyaW5nKSA9PiBzdHJpbmcgfCBQcm9taXNlTGlrZTxzdHJpbmc+O1xuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/86a61f32a623616f1cdec9f22fc46a34e2f38a490b8b82485bbbf319282a9c64.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/86a61f32a623616f1cdec9f22fc46a34e2f38a490b8b82485bbbf319282a9c64.js new file mode 100644 index 0000000..fe1e925 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/86a61f32a623616f1cdec9f22fc46a34e2f38a490b8b82485bbbf319282a9c64.js @@ -0,0 +1,22 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var Result_1 = require("./Result"); +var Converter_1 = require("./Converter"); +var path_1 = __importDefault(require("path")); +var assert_1 = __importDefault(require("assert")); +var dataDir = path_1.default.join(__dirname, "../test/data/"); +describe("Result", function () { + it("should return need push downstream based on needEmitAll parameter", function () { + var conv = new Converter_1.Converter(); + var res = new Result_1.Result(conv); + assert_1.default.equal(res["needEmitAll"], false); + conv.then(); + assert_1.default.equal(res["needEmitAll"], true); + conv.parseParam.needEmitAll = false; + assert_1.default.equal(res["needEmitAll"], false); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9SZXN1bHQudGVzdC50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9SZXN1bHQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFnQztBQUNoQyx5Q0FBd0M7QUFHeEMsOENBQXdCO0FBQ3hCLGtEQUE0QjtBQUU1QixJQUFNLE9BQU8sR0FBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxlQUFlLENBQUMsQ0FBQztBQUVuRCxRQUFRLENBQUMsUUFBUSxFQUFDO0lBQ2hCLEVBQUUsQ0FBRSxtRUFBbUUsRUFBQztRQUNwRSxJQUFNLElBQUksR0FBQyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMzQixJQUFNLEdBQUcsR0FBQyxJQUFJLGVBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osZ0JBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxHQUFDLEtBQUssQ0FBQztRQUNsQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7QUFFTCxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVzdWx0fSBmcm9tIFwiLi9SZXN1bHRcIjtcbmltcG9ydCB7IENvbnZlcnRlciB9IGZyb20gXCIuL0NvbnZlcnRlclwiO1xuaW1wb3J0IFAgZnJvbSBcImJsdWViaXJkXCI7XG5pbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBKU09OUmVzdWx0IH0gZnJvbSBcIi4vbGluZVRvSnNvblwiO1xuY29uc3QgZGF0YURpcj1wYXRoLmpvaW4oX19kaXJuYW1lLFwiLi4vdGVzdC9kYXRhL1wiKTtcblxuZGVzY3JpYmUoXCJSZXN1bHRcIiwoKT0+e1xuICBpdCAoXCJzaG91bGQgcmV0dXJuIG5lZWQgcHVzaCBkb3duc3RyZWFtIGJhc2VkIG9uIG5lZWRFbWl0QWxsIHBhcmFtZXRlclwiLGZ1bmN0aW9uICgpe1xuICAgICAgY29uc3QgY29udj1uZXcgQ29udmVydGVyKCk7XG4gICAgICBjb25zdCByZXM9bmV3IFJlc3VsdChjb252KTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXNbXCJuZWVkRW1pdEFsbFwiXSxmYWxzZSk7XG4gICAgICBjb252LnRoZW4oKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXNbXCJuZWVkRW1pdEFsbFwiXSx0cnVlKTtcbiAgICAgIGNvbnYucGFyc2VQYXJhbS5uZWVkRW1pdEFsbD1mYWxzZTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXNbXCJuZWVkRW1pdEFsbFwiXSxmYWxzZSk7XG4gIH0pO1xuXG59KVxuXG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/8d3edcece85e84b439b2d726acd2739b703649046edb8805d043fd9d43e23581.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/8d3edcece85e84b439b2d726acd2739b703649046edb8805d043fd9d43e23581.js new file mode 100644 index 0000000..754deb4 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/8d3edcece85e84b439b2d726acd2739b703649046edb8805d043fd9d43e23581.js @@ -0,0 +1,638 @@ +"use strict"; +// import {Converter} from "../src/Converter"; +// import csv from "../src"; +// var assert = require("assert"); +// var fs = require("fs"); +// var sandbox = require("sinon").sandbox.create(); +// var file = __dirname + "/data/testData"; +// var trailCommaData = __dirname + "/data/trailingComma"; +// describe("CSV Convert in Background Process", function () { +// afterEach(function () { +// sandbox.restore(); +// }); +// it("should read from a stream", function (done) { +// var obj = new Converter({ +// fork: true +// }); +// var stream = fs.createReadStream(file); +// obj.then(function (obj) { +// assert.equal(obj.length, 2); +// done(); +// },(err)=>{ +// console.log(err.toString()); +// }); +// stream.pipe(obj); +// }); +// it("should call onNext once a row is parsed.", function (done) { +// var obj = new Converter({fork:true}); +// var stream = fs.createReadStream(file); +// var called = false; +// obj.subscribe(function (resultRow) { +// assert(resultRow); +// called = true; +// }); +// obj.on("done", function () { +// assert(called); +// done(); +// }); +// stream.pipe(obj); +// }); +// it("should emit end_parsed message once it is finished.", function (done) { +// var obj = new Converter({fork:true}); +// obj.then(function (result) { +// assert(result); +// assert(result.length === 2); +// assert(result[0].date); +// assert(result[0].employee); +// assert(result[0].employee.name); +// assert(result[0].employee.age); +// assert(result[0].employee.number); +// assert(result[0].employee.key.length === 2); +// assert(result[0].address.length === 2); +// done(); +// }); +// fs.createReadStream(file).pipe(obj); +// }); +// it("should handle traling comma gracefully", function (done) { +// var stream = fs.createReadStream(trailCommaData); +// var obj = new Converter({fork:true}); +// obj.then(function (result) { +// assert(result); +// assert(result.length > 0); +// done(); +// }); +// stream.pipe(obj); +// }); +// it("should handle comma in column which is surrounded by qoutes", function (done) { +// var testData = __dirname + "/data/dataWithComma"; +// var rs = fs.createReadStream(testData); +// var obj = new Converter({ +// "quote": "#", +// "fork":true +// }); +// obj.then(function (result) { +// assert(result[0].col1 === "\"Mini. Sectt"); +// assert.equal(result[3].col2, "125001,fenvkdsf"); +// // console.log(result); +// done(); +// }); +// rs.pipe(obj); +// }); +// it("should be able to convert a csv to column array data", function (done) { +// var columArrData = __dirname + "/data/columnArray"; +// var rs = fs.createReadStream(columArrData); +// var result:any = {}; +// var csvConverter = new Converter({fork:true}); +// //end_parsed will be emitted once parsing finished +// csvConverter.then(function () { +// assert(result.TIMESTAMP.length === 5); +// done(); +// }); +// //record_parsed will be emitted each time a row has been parsed. +// csvConverter.subscribe(function (resultRow, rowIndex) { +// for (var key in resultRow) { +// if (resultRow.hasOwnProperty(key)) { +// if (!result[key] || !(result[key] instanceof Array)) { +// result[key] = []; +// } +// result[key][rowIndex] = resultRow[key]; +// } +// } +// }); +// rs.pipe(csvConverter); +// }); +// it("should be able to convert csv string directly", function (done) { +// var testData = __dirname + "/data/testData"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// //end_parsed will be emitted once parsing finished +// csvConverter.then(function (jsonObj) { +// assert.equal(jsonObj.length, 2); +// }); +// csvConverter.fromString(data).then(function (jsonObj) { +// assert(jsonObj.length === 2); +// done(); +// }); +// }); +// it("should be able to convert csv string with error", function (done) { +// var testData = __dirname + "/data/dataWithUnclosedQuotes"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// csvConverter.fromString(data).then(undefined, function (err) { +// // console.log(err); +// assert(err); +// assert.equal(err.err, "unclosed_quote"); +// done(); +// }); +// }); +// it("should be able to convert csv string without callback provided", function (done) { +// var testData = __dirname + "/data/testData"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// //end_parsed will be emitted once parsing finished +// csvConverter.then(function (jsonObj) { +// assert(jsonObj.length === 2); +// done(); +// }); +// csvConverter.fromString(data); +// }); +// it("should be able to handle columns with double quotes", function (done) { +// var testData = __dirname + "/data/dataWithQoutes"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// csvConverter.fromString(data).then(function (jsonObj) { +// assert(jsonObj[0].TIMESTAMP === '13954264"22', JSON.stringify(jsonObj[0].TIMESTAMP)); +// assert(jsonObj[1].TIMESTAMP === 'abc, def, ccc', JSON.stringify(jsonObj[1].TIMESTAMP)); +// done(); +// }); +// }); +// it("should be able to handle columns with two double quotes", function (done) { +// var testData = __dirname + "/data/twodoublequotes"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// csvConverter.fromString(data).then(function (jsonObj) { +// assert.equal(jsonObj[0].title, "\""); +// assert.equal(jsonObj[0].data, "xyabcde"); +// assert.equal(jsonObj[0].uuid, "fejal\"eifa"); +// assert.equal(jsonObj[0].fieldA, "bnej\"\"falkfe"); +// assert.equal(jsonObj[0].fieldB, "\"eisjfes\""); +// done(); +// }); +// }); +// it("should handle empty csv file", function (done) { +// var testData = __dirname + "/data/emptyFile"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({fork:true}); +// csvConverter.then(function (jsonObj) { +// assert(jsonObj.length === 0); +// done(); +// }); +// rs.pipe(csvConverter); +// }); +// it("should parse large csv file", function (done) { +// var testData = __dirname + "/data/large-csv-sample.csv"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({fork:true}); +// var count = 0; +// csvConverter.subscribe(function () { +// // console.log(arguments); +// count++; +// }); +// csvConverter.then(function () { +// assert.equal(count, 5290); +// done(); +// }); +// rs.pipe(csvConverter); +// }); +// it("should parse data and covert to specific types", function (done) { +// var testData = __dirname + "/data/dataWithType"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({ +// fork:true, +// checkType: true, +// colParser: { +// "column6": "string", +// "column7": "string" +// } +// }); +// csvConverter.subscribe(function (d) { +// assert(typeof d.column1 === "number"); +// assert(typeof d.column2 === "string"); +// assert.equal(d["colume4"], "someinvaliddate"); +// assert(d.column5.hello === "world"); +// assert(d.column6 === '{"hello":"world"}'); +// assert(d.column7 === "1234"); +// assert(d.column8 === "abcd"); +// assert(d.column9 === true); +// assert(d.column10[0] === 23); +// assert(d.column10[1] === 31); +// assert(d.column11[0].hello === "world"); +// assert(d["name#!"] === false); +// }); +// csvConverter.on("done", function () { +// done(); +// }); +// rs.pipe(csvConverter); +// }); +// it("should turn off field type check", function (done) { +// var testData = __dirname + "/data/dataWithType"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({ +// fork:true, +// checkType: false +// }); +// csvConverter.subscribe(function (d) { +// assert(typeof d.column1 === "string"); +// assert(typeof d.column2 === "string"); +// assert(d["column3"] === "2012-01-01"); +// assert(d["colume4"] === "someinvaliddate"); +// assert(d.column5 === '{"hello":"world"}'); +// assert.equal(d["column6"], '{"hello":"world"}'); +// assert(d["column7"] === "1234"); +// assert(d["column8"] === "abcd"); +// assert(d.column9 === "true"); +// assert(d.column10[0] === "23"); +// assert(d.column10[1] === "31"); +// assert(d["name#!"] === 'false'); +// }); +// csvConverter.then(function () { +// done(); +// }); +// rs.pipe(csvConverter); +// }); +// it("should emit data event correctly", function (done) { +// var testData = __dirname + "/data/large-csv-sample.csv"; +// var csvConverter = new Converter({ +// fork:true +// },{objectMode:true}); +// var count = 0; +// csvConverter.on("data", function (d) { +// count++; +// }); +// csvConverter.on("done", function () { +// assert.equal(csvConverter.parsedLineNumber, 5290); +// done(); +// }); +// var rs = fs.createReadStream(testData); +// rs.pipe(csvConverter); +// }); +// it("should process column with linebreaks", function (done) { +// var testData = __dirname + "/data/lineBreak"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({ +// fork:true, +// checkType: true +// }); +// csvConverter.subscribe(function (d) { +// assert(d.Period === 13); +// assert(d["Apparent age"] === "Unknown"); +// done(); +// }); +// rs.pipe(csvConverter); +// }); +// it("be able to ignore empty columns", function (done) { +// var testData = __dirname + "/data/dataIgnoreEmpty"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(csv({ +// ignoreEmpty: true , +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 3); +// assert(j.col2.length === 2); +// assert(j.col2[1] === "d3"); +// assert(j.col4.col3 === undefined); +// assert(j.col4.col5 === "world"); +// assert(res[1].col1 === "d2"); +// assert(res[2].col1 === "d4"); +// done(); +// }); +// }); +// it("should allow no header", function (done) { +// var testData = __dirname + "/data/noheadercsv"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// noheader: true, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 5); +// assert(j.field1 === "CC102-PDMI-001"); +// assert(j.field2 === "eClass_5.1.3"); +// done(); +// }); +// }); +// it("should allow customised header", function (done) { +// var testData = __dirname + "/data/noheadercsv"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// noheader: true, +// headers: ["a", "b"], +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 5); +// assert(j.a === "CC102-PDMI-001"); +// assert(j.b === "eClass_5.1.3"); +// assert(j.field3 === "10/3/2014"); +// done(); +// }); +// }); +// it("should allow customised header to override existing header", function (done) { +// var testData = __dirname + "/data/complexJSONCSV"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// headers: [], +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 2); +// assert(j.field1 === "Food Factory"); +// assert(j.field2 === "Oscar"); +// done(); +// }); +// }); +// it("should handle when there is an empty string", function (done) { +// var testData = __dirname + "/data/dataWithEmptyString"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// noheader: true, +// headers: ["a", "b", "c"], +// checkType: true, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// // assert(res.length===2); +// assert(j.a === "green"); +// assert(j.b === 40); +// assert.equal(j.c, ""); +// done(); +// }); +// }); +// it("should detect eol correctly when first chunk is smaller than header row length", function (done) { +// var testData = __dirname + "/data/dataNoTrimCRLF"; +// var rs = fs.createReadStream(testData, { highWaterMark: 3 }); +// var st = rs.pipe(new Converter({ +// trim: false, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 2); +// assert(j.name === "joe"); +// assert(j.age === "20"); +// assert.equal(res[1].name, "sam"); +// assert.equal(res[1].age, "30"); +// done(); +// }); +// }); +// it("should detect eol correctly when first chunk ends in middle of CRLF line break", function (done) { +// var testData = __dirname + "/data/dataNoTrimCRLF"; +// var rs = fs.createReadStream(testData, { highWaterMark: 9 }); +// var st = rs.pipe(new Converter({ +// trim: false, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 2); +// assert(j.name === "joe"); +// assert(j.age === "20"); +// assert.equal(res[1].name, "sam"); +// assert.equal(res[1].age, "30"); +// done(); +// }); +// }); +// it("should emit eol event when line ending is detected as CRLF", function (done) { +// var testData = __dirname + "/data/dataNoTrimCRLF"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// fork:true +// })); +// var eolCallback = sandbox.spy(function (eol) { +// assert.equal(eol, "\r\n"); +// }); +// st.on("eol", eolCallback); +// st.then(function () { +// assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); +// done(); +// }) +// }); +// it("should emit eol event when line ending is detected as LF", function (done) { +// var testData = __dirname + "/data/columnArray"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// fork:true +// })); +// var eolCallback = sandbox.spy(function (eol) { +// assert.equal(eol, "\n"); +// }); +// st.on("eol", eolCallback); +// st.then(function () { +// assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); +// done(); +// }) +// }); +// it("should remove the Byte Order Mark (BOM) from input", function (done) { +// var testData = __dirname + "/data/dataNoTrimBOM"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// trim: false, +// fork:true +// })); +// st.then( function (res) { +// var j = res[0]; +// assert(res.length===2); +// assert(j.name === "joe"); +// assert(j.age === "20"); +// done(); +// }); +// }); +// it("should set output as csv", function (done) { +// var testData = __dirname + "/data/complexJSONCSV"; +// var rs = fs.createReadStream(testData); +// var numOfRow = 0; +// csv({ output: "csv",fork:true }) +// .fromStream(rs) +// .subscribe(function (row, idx) { +// numOfRow++; +// assert(row); +// assert(idx >= 0); +// }) +// .on("done", function (error) { +// assert(!error); +// assert.equal(2, numOfRow); +// assert(numOfRow !== 0); +// done(); +// }); +// }); +// it("should process long header", function (done) { +// var testData = __dirname + "/data/longHeader"; +// var rs = fs.createReadStream(testData, { highWaterMark: 100 }); +// var numOfRow = 0; +// var numOfJson = 0; +// csv({fork:true}, { highWaterMark: 100 }) +// .fromStream(rs) +// .subscribe(function (res, idx) { +// numOfJson++; +// assert.equal(res.Date, '8/26/16'); +// assert(idx >= 0); +// }) +// .on("done", function () { +// assert(numOfJson === 1); +// done(); +// }); +// }); +// it("should parse #139", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/data#139"); +// csv({fork:true}) +// .fromStream(rs) +// .then(function (res) { +// assert.equal(res[1].field3, "9001009395 9001009990"); +// done(); +// }); +// }); +// it("should ignore column", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); +// var headerEmitted = false; +// csv({ +// ignoreColumns: /TIMESTAMP/, +// fork:true +// }) +// .fromStream(rs) +// .on("header", function (header) { +// assert.equal(header.indexOf("TIMESTAMP"), -1); +// assert.equal(header.indexOf("UPDATE"), 0); +// if (headerEmitted) { +// throw ("header event should only happen once") +// } +// headerEmitted = true; +// }) +// // .on("csv", function (row, idx) { +// // if (!headerEmitted) { +// // throw ("header should be emitted before any data events"); +// // } +// // assert(idx >= 0); +// // if (idx === 1) { +// // assert.equal(row[0], "n"); +// // } +// // }) +// .subscribe(function (j, idx) { +// // console.log(j); +// assert(!j.TIMESTAMP); +// assert(idx >= 0); +// }) +// .on("done", function (err) { +// assert(!err); +// assert(headerEmitted); +// done(); +// }); +// }); +// it("should include column", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); +// csv({ +// includeColumns: /TIMESTAMP/, +// fork:true +// }) +// .fromStream(rs) +// .on("header", function (header) { +// assert.equal(header.indexOf("TIMESTAMP"), 0); +// assert.equal(header.indexOf("UPDATE"), -1); +// assert.equal(header.length, 1); +// }) +// .subscribe(function (j, idx) { +// assert(idx >= 0); +// if (idx === 1) { +// assert.equal(j.TIMESTAMP, "abc, def, ccc"); +// } +// assert(!j.UID) +// assert(!j['BYTES SENT']) +// }) +// .on("done", function () { +// done(); +// }); +// }); +// it("should allow headers and include columns to be given as reference to the same var", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); +// var headers = [ +// 'first', +// 'second', +// 'third', +// ]; +// var expected = headers; +// csv({ +// headers: headers, +// includeColumns: /(first|second|third)/, +// fork:true +// }) +// .fromStream(rs) +// .on("header", function (header) { +// expected.forEach(function (value, index) { +// assert.equal(header.indexOf(value), index); +// }); +// }) +// .subscribe(function (j, idx) { +// assert(idx >= 0); +// assert.equal(expected.length, Object.keys(j).length); +// expected.forEach(function (attribute) { +// assert(j.hasOwnProperty(attribute)); +// }); +// }) +// .on("done", function () { +// done(); +// }); +// }); +// it("should leave provided params objects unmutated", function() { +// var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); +// var includeColumns = [ +// 'fieldA.title', +// 'description', +// ]; +// return csv({ +// includeColumns: /(fieldA\.title|description)/, +// fork:true +// }) +// .fromStream(rs) +// .on("json", function(j, idx) { +// assert(idx >= 0); +// }) +// .on("header", function(header) { +// includeColumns.forEach(function (value, index) { +// assert.equal(index, header.indexOf(value)); +// }); +// }) +// }); +// it("should accept pipe as quote", function (done) { +// csv({ +// quote: "|", +// output: "csv", +// "fork":true +// }) +// .fromFile(__dirname + "/data/pipeAsQuote") +// .subscribe(function (csv) { +// assert.equal(csv[2], "blahhh, blah"); +// }) +// .on('done', function () { +// done() +// }); +// }) +// it("should allow async subscribe function", () => { +// return csv({ trim: true,fork:true }) +// .fromString(`a,b,c +// 1,2,3 +// 4,5,6`) +// .subscribe((d) => { +// return new Promise((resolve, reject) => { +// setTimeout(() => { +// d.a = 10; +// resolve(); +// }, 20); +// }) +// }) +// .then((d) => { +// assert.equal(d[0].a, 10); +// assert.equal(d[1].a, 10); +// }) +// }) +// it("should omit a column", () => { +// return csv({ +// colParser: { +// "a": "omit" +// }, +// fork:true +// }) +// .fromString(`a,b,c +// 1,2,3 +// fefe,5,6`) +// .then((d) => { +// assert.strictEqual(d[0].a, undefined); +// assert.equal(d[1].a, undefined); +// }) +// }) +// }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdENTVkNvbnZlcnRlci5mb3JrLnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vdGVzdC90ZXN0Q1NWQ29udmVydGVyLmZvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhDQUE4QztBQUM5Qyw0QkFBNEI7QUFDNUIsa0NBQWtDO0FBQ2xDLDBCQUEwQjtBQUMxQixtREFBbUQ7QUFDbkQsMkNBQTJDO0FBQzNDLDBEQUEwRDtBQUMxRCw4REFBOEQ7QUFDOUQsNEJBQTRCO0FBQzVCLHlCQUF5QjtBQUN6QixRQUFRO0FBR1Isc0RBQXNEO0FBQ3RELGdDQUFnQztBQUNoQyxtQkFBbUI7QUFDbkIsVUFBVTtBQUNWLDhDQUE4QztBQUM5QyxnQ0FBZ0M7QUFDaEMscUNBQXFDO0FBQ3JDLGdCQUFnQjtBQUNoQixpQkFBaUI7QUFDakIscUNBQXFDO0FBQ3JDLFVBQVU7QUFDVix3QkFBd0I7QUFDeEIsUUFBUTtBQUVSLHFFQUFxRTtBQUNyRSw0Q0FBNEM7QUFDNUMsOENBQThDO0FBQzlDLDBCQUEwQjtBQUMxQiwyQ0FBMkM7QUFDM0MsMkJBQTJCO0FBQzNCLHVCQUF1QjtBQUN2QixVQUFVO0FBQ1YsbUNBQW1DO0FBQ25DLHdCQUF3QjtBQUN4QixnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLHdCQUF3QjtBQUN4QixRQUFRO0FBRVIsZ0ZBQWdGO0FBQ2hGLDRDQUE0QztBQUM1QyxtQ0FBbUM7QUFDbkMsd0JBQXdCO0FBQ3hCLHFDQUFxQztBQUNyQyxnQ0FBZ0M7QUFDaEMsb0NBQW9DO0FBQ3BDLHlDQUF5QztBQUN6Qyx3Q0FBd0M7QUFDeEMsMkNBQTJDO0FBQzNDLHFEQUFxRDtBQUNyRCxnREFBZ0Q7QUFDaEQsZ0JBQWdCO0FBQ2hCLFVBQVU7QUFDViwyQ0FBMkM7QUFDM0MsUUFBUTtBQUVSLG1FQUFtRTtBQUNuRSx3REFBd0Q7QUFDeEQsNENBQTRDO0FBQzVDLG1DQUFtQztBQUNuQyx3QkFBd0I7QUFDeEIsbUNBQW1DO0FBQ25DLGdCQUFnQjtBQUNoQixVQUFVO0FBQ1Ysd0JBQXdCO0FBQ3hCLFFBQVE7QUFFUix3RkFBd0Y7QUFDeEYsd0RBQXdEO0FBQ3hELDhDQUE4QztBQUM5QyxnQ0FBZ0M7QUFDaEMsc0JBQXNCO0FBQ3RCLG9CQUFvQjtBQUNwQixVQUFVO0FBQ1YsbUNBQW1DO0FBQ25DLG9EQUFvRDtBQUNwRCx5REFBeUQ7QUFDekQsZ0NBQWdDO0FBQ2hDLGdCQUFnQjtBQUNoQixVQUFVO0FBQ1Ysb0JBQW9CO0FBQ3BCLFFBQVE7QUFFUixpRkFBaUY7QUFDakYsMERBQTBEO0FBQzFELGtEQUFrRDtBQUNsRCwyQkFBMkI7QUFDM0IscURBQXFEO0FBQ3JELHlEQUF5RDtBQUN6RCxzQ0FBc0M7QUFDdEMsK0NBQStDO0FBQy9DLGdCQUFnQjtBQUNoQixVQUFVO0FBRVYsdUVBQXVFO0FBQ3ZFLDhEQUE4RDtBQUM5RCxxQ0FBcUM7QUFDckMsK0NBQStDO0FBQy9DLG1FQUFtRTtBQUNuRSxnQ0FBZ0M7QUFDaEMsY0FBYztBQUNkLG9EQUFvRDtBQUNwRCxZQUFZO0FBQ1osVUFBVTtBQUNWLFVBQVU7QUFDViw2QkFBNkI7QUFDN0IsUUFBUTtBQUVSLDBFQUEwRTtBQUMxRSxtREFBbUQ7QUFDbkQsdURBQXVEO0FBQ3ZELHFEQUFxRDtBQUNyRCx5REFBeUQ7QUFDekQsNkNBQTZDO0FBQzdDLHlDQUF5QztBQUN6QyxVQUFVO0FBQ1YsOERBQThEO0FBQzlELHNDQUFzQztBQUN0QyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLFFBQVE7QUFFUiw0RUFBNEU7QUFDNUUsaUVBQWlFO0FBQ2pFLHVEQUF1RDtBQUN2RCxxREFBcUQ7QUFDckQscUVBQXFFO0FBQ3JFLDZCQUE2QjtBQUM3QixxQkFBcUI7QUFDckIsaURBQWlEO0FBQ2pELGdCQUFnQjtBQUNoQixVQUFVO0FBQ1YsUUFBUTtBQUVSLDJGQUEyRjtBQUMzRixtREFBbUQ7QUFDbkQsdURBQXVEO0FBQ3ZELHFEQUFxRDtBQUNyRCx5REFBeUQ7QUFDekQsNkNBQTZDO0FBQzdDLHNDQUFzQztBQUN0QyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLHFDQUFxQztBQUNyQyxRQUFRO0FBRVIsZ0ZBQWdGO0FBQ2hGLHlEQUF5RDtBQUN6RCx1REFBdUQ7QUFDdkQscURBQXFEO0FBQ3JELDhEQUE4RDtBQUM5RCw4RkFBOEY7QUFFOUYsZ0dBQWdHO0FBQ2hHLGdCQUFnQjtBQUNoQixVQUFVO0FBQ1YsUUFBUTtBQUVSLG9GQUFvRjtBQUNwRiwwREFBMEQ7QUFDMUQsdURBQXVEO0FBQ3ZELHFEQUFxRDtBQUNyRCw4REFBOEQ7QUFDOUQsOENBQThDO0FBQzlDLGtEQUFrRDtBQUNsRCxzREFBc0Q7QUFDdEQsMkRBQTJEO0FBQzNELHdEQUF3RDtBQUN4RCxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLFFBQVE7QUFFUix5REFBeUQ7QUFDekQsb0RBQW9EO0FBQ3BELDhDQUE4QztBQUM5QyxxREFBcUQ7QUFDckQsNkNBQTZDO0FBQzdDLHNDQUFzQztBQUN0QyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLDZCQUE2QjtBQUM3QixRQUFRO0FBRVIsd0RBQXdEO0FBQ3hELCtEQUErRDtBQUMvRCw4Q0FBOEM7QUFDOUMscURBQXFEO0FBQ3JELHFCQUFxQjtBQUNyQiwyQ0FBMkM7QUFDM0MsbUNBQW1DO0FBQ25DLGlCQUFpQjtBQUNqQixVQUFVO0FBQ1Ysc0NBQXNDO0FBQ3RDLG1DQUFtQztBQUNuQyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLDZCQUE2QjtBQUM3QixRQUFRO0FBRVIsMkVBQTJFO0FBQzNFLHVEQUF1RDtBQUN2RCw4Q0FBOEM7QUFDOUMseUNBQXlDO0FBQ3pDLG1CQUFtQjtBQUNuQix5QkFBeUI7QUFDekIscUJBQXFCO0FBQ3JCLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFDOUIsVUFBVTtBQUNWLFVBQVU7QUFDViw0Q0FBNEM7QUFDNUMsK0NBQStDO0FBQy9DLCtDQUErQztBQUMvQyx1REFBdUQ7QUFDdkQsNkNBQTZDO0FBQzdDLG1EQUFtRDtBQUNuRCxzQ0FBc0M7QUFDdEMsc0NBQXNDO0FBQ3RDLG9DQUFvQztBQUNwQyxzQ0FBc0M7QUFDdEMsc0NBQXNDO0FBQ3RDLGlEQUFpRDtBQUNqRCx1Q0FBdUM7QUFDdkMsVUFBVTtBQUNWLDRDQUE0QztBQUM1QyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLDZCQUE2QjtBQUM3QixRQUFRO0FBRVIsNkRBQTZEO0FBQzdELHVEQUF1RDtBQUN2RCw4Q0FBOEM7QUFDOUMseUNBQXlDO0FBQ3pDLG1CQUFtQjtBQUNuQix5QkFBeUI7QUFDekIsVUFBVTtBQUNWLDRDQUE0QztBQUM1QywrQ0FBK0M7QUFDL0MsK0NBQStDO0FBQy9DLCtDQUErQztBQUMvQyxvREFBb0Q7QUFDcEQsbURBQW1EO0FBQ25ELHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDekMseUNBQXlDO0FBQ3pDLHNDQUFzQztBQUN0Qyx3Q0FBd0M7QUFDeEMsd0NBQXdDO0FBQ3hDLHlDQUF5QztBQUN6QyxVQUFVO0FBQ1Ysc0NBQXNDO0FBQ3RDLGdCQUFnQjtBQUNoQixVQUFVO0FBQ1YsNkJBQTZCO0FBQzdCLFFBQVE7QUFFUiw2REFBNkQ7QUFDN0QsK0RBQStEO0FBRS9ELHlDQUF5QztBQUN6QyxrQkFBa0I7QUFDbEIsNEJBQTRCO0FBQzVCLHFCQUFxQjtBQUNyQiw2Q0FBNkM7QUFDN0MsaUJBQWlCO0FBQ2pCLFVBQVU7QUFDViw0Q0FBNEM7QUFDNUMsMkRBQTJEO0FBQzNELGdCQUFnQjtBQUNoQixVQUFVO0FBQ1YsOENBQThDO0FBQzlDLDZCQUE2QjtBQUM3QixRQUFRO0FBRVIsa0VBQWtFO0FBQ2xFLG9EQUFvRDtBQUNwRCw4Q0FBOEM7QUFDOUMseUNBQXlDO0FBQ3pDLG1CQUFtQjtBQUNuQix3QkFBd0I7QUFDeEIsVUFBVTtBQUNWLDRDQUE0QztBQUM1QyxpQ0FBaUM7QUFDakMsaURBQWlEO0FBQ2pELGdCQUFnQjtBQUNoQixVQUFVO0FBQ1YsNkJBQTZCO0FBQzdCLFFBQVE7QUFFUiw0REFBNEQ7QUFDNUQsMERBQTBEO0FBQzFELDhDQUE4QztBQUM5Qyw4QkFBOEI7QUFDOUIsNEJBQTRCO0FBQzVCLGtCQUFrQjtBQUNsQixXQUFXO0FBQ1gsK0JBQStCO0FBQy9CLHdCQUF3QjtBQUN4QixrQ0FBa0M7QUFDbEMscUNBQXFDO0FBQ3JDLG9DQUFvQztBQUNwQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLHNDQUFzQztBQUN0QyxzQ0FBc0M7QUFDdEMsZ0JBQWdCO0FBQ2hCLFVBQVU7QUFDVixRQUFRO0FBRVIsbURBQW1EO0FBQ25ELHNEQUFzRDtBQUN0RCw4Q0FBOEM7QUFDOUMsd0NBQXdDO0FBQ3hDLHdCQUF3QjtBQUN4QixrQkFBa0I7QUFDbEIsV0FBVztBQUNYLCtCQUErQjtBQUMvQix3QkFBd0I7QUFDeEIsa0NBQWtDO0FBQ2xDLCtDQUErQztBQUMvQyw2Q0FBNkM7QUFDN0MsZ0JBQWdCO0FBQ2hCLFVBQVU7QUFDVixRQUFRO0FBRVIsMkRBQTJEO0FBQzNELHNEQUFzRDtBQUN0RCw4Q0FBOEM7QUFDOUMsdUNBQXVDO0FBQ3ZDLHdCQUF3QjtBQUN4Qiw2QkFBNkI7QUFDN0Isa0JBQWtCO0FBQ2xCLFdBQVc7QUFDWCwrQkFBK0I7QUFDL0Isd0JBQXdCO0FBQ3hCLGtDQUFrQztBQUNsQywwQ0FBMEM7QUFDMUMsd0NBQXdDO0FBQ3hDLDBDQUEwQztBQUMxQyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLFFBQVE7QUFFUix1RkFBdUY7QUFDdkYseURBQXlEO0FBQ3pELDhDQUE4QztBQUM5Qyx1Q0FBdUM7QUFDdkMscUJBQXFCO0FBQ3JCLGtCQUFrQjtBQUNsQixXQUFXO0FBQ1gsK0JBQStCO0FBQy9CLHdCQUF3QjtBQUN4QixrQ0FBa0M7QUFDbEMsNkNBQTZDO0FBQzdDLHNDQUFzQztBQUN0QyxnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLFFBQVE7QUFFUix3RUFBd0U7QUFDeEUsOERBQThEO0FBQzlELDhDQUE4QztBQUM5Qyx1Q0FBdUM7QUFDdkMsd0JBQXdCO0FBQ3hCLGtDQUFrQztBQUNsQyx5QkFBeUI7QUFDekIsa0JBQWtCO0FBQ2xCLFdBQVc7QUFDWCwrQkFBK0I7QUFDL0Isd0JBQXdCO0FBRXhCLG1DQUFtQztBQUNuQyxpQ0FBaUM7QUFDakMsNEJBQTRCO0FBQzVCLCtCQUErQjtBQUMvQixnQkFBZ0I7QUFDaEIsVUFBVTtBQUNWLFFBQVE7QUFFUiwyR0FBMkc7QUFDM0cseURBQXlEO0FBQ3pELG9FQUFvRTtBQUVwRSx1Q0FBdUM7QUFDdkMscUJBQXFCO0FBQ3JCLGtCQUFrQjtBQUNsQixXQUFXO0FBQ1gsK0JBQStCO0FBQy9CLHdCQUF3QjtBQUN4QixrQ0FBa0M7QUFDbEMsa0NBQWtDO0FBQ2xDLGdDQUFnQztBQUNoQywwQ0FBMEM7QUFDMUMsd0NBQXdDO0FBQ3hDLGdCQUFnQjtBQUNoQixVQUFVO0FBQ1YsUUFBUTtBQUVSLDJHQUEyRztBQUMzRyx5REFBeUQ7QUFDekQsb0VBQW9FO0FBRXBFLHVDQUF1QztBQUN2QyxxQkFBcUI7QUFDckIsa0JBQWtCO0FBQ2xCLFdBQVc7QUFDWCwrQkFBK0I7QUFDL0Isd0JBQXdCO0FBQ3hCLGtDQUFrQztBQUNsQyxrQ0FBa0M7QUFDbEMsZ0NBQWdDO0FBQ2hDLDBDQUEwQztBQUMxQyx3Q0FBd0M7QUFDeEMsZ0JBQWdCO0FBQ2hCLFVBQVU7QUFDVixRQUFRO0FBRVIsdUZBQXVGO0FBQ3ZGLHlEQUF5RDtBQUN6RCw4Q0FBOEM7QUFFOUMsdUNBQXVDO0FBQ3ZDLGtCQUFrQjtBQUNsQixXQUFXO0FBQ1gscURBQXFEO0FBQ3JELG1DQUFtQztBQUNuQyxVQUFVO0FBQ1YsaUNBQWlDO0FBQ2pDLDRCQUE0QjtBQUM1Qiw4RUFBOEU7QUFDOUUsZ0JBQWdCO0FBQ2hCLFNBQVM7QUFDVCxRQUFRO0FBRVIscUZBQXFGO0FBQ3JGLHNEQUFzRDtBQUN0RCw4Q0FBOEM7QUFFOUMsdUNBQXVDO0FBQ3ZDLGtCQUFrQjtBQUNsQixXQUFXO0FBQ1gscURBQXFEO0FBQ3JELGlDQUFpQztBQUNqQyxVQUFVO0FBQ1YsaUNBQWlDO0FBQ2pDLDRCQUE0QjtBQUM1Qiw4RUFBOEU7QUFDOUUsZ0JBQWdCO0FBQ2hCLFNBQVM7QUFDVCxRQUFRO0FBRVIsK0VBQStFO0FBQy9FLHdEQUF3RDtBQUN4RCw4Q0FBOEM7QUFDOUMsdUNBQXVDO0FBQ3ZDLHFCQUFxQjtBQUNyQixrQkFBa0I7QUFDbEIsV0FBVztBQUNYLGdDQUFnQztBQUNoQyx3QkFBd0I7QUFFeEIsZ0NBQWdDO0FBQ2hDLGtDQUFrQztBQUNsQyxnQ0FBZ0M7QUFDaEMsZ0JBQWdCO0FBQ2hCLFVBQVU7QUFDVixRQUFRO0FBRVIscURBQXFEO0FBQ3JELHlEQUF5RDtBQUN6RCw4Q0FBOEM7QUFDOUMsd0JBQXdCO0FBQ3hCLHVDQUF1QztBQUN2Qyx3QkFBd0I7QUFDeEIseUNBQXlDO0FBQ3pDLHNCQUFzQjtBQUN0Qix1QkFBdUI7QUFDdkIsNEJBQTRCO0FBQzVCLFdBQVc7QUFFWCx1Q0FBdUM7QUFDdkMsMEJBQTBCO0FBQzFCLHFDQUFxQztBQUNyQyxrQ0FBa0M7QUFDbEMsa0JBQWtCO0FBQ2xCLFlBQVk7QUFDWixRQUFRO0FBQ1IsdURBQXVEO0FBQ3ZELHFEQUFxRDtBQUNyRCxzRUFBc0U7QUFDdEUsd0JBQXdCO0FBQ3hCLHlCQUF5QjtBQUN6QiwrQ0FBK0M7QUFDL0Msd0JBQXdCO0FBQ3hCLHlDQUF5QztBQUN6Qyx1QkFBdUI7QUFDdkIsNkNBQTZDO0FBQzdDLDRCQUE0QjtBQUM1QixXQUFXO0FBQ1gsa0NBQWtDO0FBQ2xDLG1DQUFtQztBQUNuQyxrQkFBa0I7QUFDbEIsWUFBWTtBQUNaLFFBQVE7QUFDUiw4Q0FBOEM7QUFDOUMsa0VBQWtFO0FBQ2xFLHVCQUF1QjtBQUN2Qix3QkFBd0I7QUFDeEIsK0JBQStCO0FBQy9CLGdFQUFnRTtBQUNoRSxrQkFBa0I7QUFDbEIsWUFBWTtBQUNaLFFBQVE7QUFFUixpREFBaUQ7QUFDakQsd0VBQXdFO0FBQ3hFLGlDQUFpQztBQUNqQyxZQUFZO0FBQ1osb0NBQW9DO0FBQ3BDLGtCQUFrQjtBQUNsQixTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCLDBDQUEwQztBQUMxQyx5REFBeUQ7QUFDekQscURBQXFEO0FBQ3JELCtCQUErQjtBQUMvQiwyREFBMkQ7QUFDM0QsWUFBWTtBQUNaLGdDQUFnQztBQUNoQyxXQUFXO0FBQ1gsNENBQTRDO0FBQzVDLG1DQUFtQztBQUNuQywwRUFBMEU7QUFDMUUsZUFBZTtBQUNmLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFDOUIsMENBQTBDO0FBQzFDLGVBQWU7QUFDZixjQUFjO0FBQ2QsdUNBQXVDO0FBQ3ZDLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEMsNEJBQTRCO0FBQzVCLFdBQVc7QUFDWCxxQ0FBcUM7QUFDckMsd0JBQXdCO0FBQ3hCLGlDQUFpQztBQUNqQyxrQkFBa0I7QUFDbEIsWUFBWTtBQUNaLFFBQVE7QUFDUixrREFBa0Q7QUFDbEQsd0VBQXdFO0FBQ3hFLFlBQVk7QUFDWixxQ0FBcUM7QUFDckMsa0JBQWtCO0FBQ2xCLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEIsMENBQTBDO0FBQzFDLHdEQUF3RDtBQUN4RCxzREFBc0Q7QUFDdEQsMENBQTBDO0FBQzFDLFdBQVc7QUFDWCx1Q0FBdUM7QUFDdkMsNEJBQTRCO0FBQzVCLDJCQUEyQjtBQUMzQix3REFBd0Q7QUFDeEQsWUFBWTtBQUNaLHlCQUF5QjtBQUN6QixtQ0FBbUM7QUFDbkMsV0FBVztBQUNYLGtDQUFrQztBQUNsQyxrQkFBa0I7QUFDbEIsWUFBWTtBQUNaLFFBQVE7QUFDUiw4R0FBOEc7QUFDOUcsd0VBQXdFO0FBQ3hFLHNCQUFzQjtBQUN0QixpQkFBaUI7QUFDakIsa0JBQWtCO0FBQ2xCLGlCQUFpQjtBQUNqQixTQUFTO0FBRVQsOEJBQThCO0FBRTlCLFlBQVk7QUFDWiwwQkFBMEI7QUFDMUIsZ0RBQWdEO0FBQ2hELGtCQUFrQjtBQUNsQixTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCLDBDQUEwQztBQUMxQyxxREFBcUQ7QUFDckQsd0RBQXdEO0FBQ3hELGNBQWM7QUFDZCxXQUFXO0FBQ1gsdUNBQXVDO0FBQ3ZDLDRCQUE0QjtBQUM1QixnRUFBZ0U7QUFDaEUsa0RBQWtEO0FBQ2xELGlEQUFpRDtBQUNqRCxjQUFjO0FBQ2QsV0FBVztBQUNYLGtDQUFrQztBQUNsQyxrQkFBa0I7QUFDbEIsWUFBWTtBQUNaLFFBQVE7QUFFUixzRUFBc0U7QUFDdEUsd0VBQXdFO0FBQ3hFLDZCQUE2QjtBQUM3Qix3QkFBd0I7QUFDeEIsdUJBQXVCO0FBQ3ZCLFNBQVM7QUFHVCxtQkFBbUI7QUFDbkIsdURBQXVEO0FBQ3ZELGtCQUFrQjtBQUNsQixTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCLHVDQUF1QztBQUN2Qyw0QkFBNEI7QUFDNUIsV0FBVztBQUNYLHlDQUF5QztBQUN6QywyREFBMkQ7QUFDM0Qsd0RBQXdEO0FBQ3hELGNBQWM7QUFDZCxXQUFXO0FBQ1gsUUFBUTtBQUNSLHdEQUF3RDtBQUN4RCxZQUFZO0FBQ1osb0JBQW9CO0FBQ3BCLHVCQUF1QjtBQUN2QixvQkFBb0I7QUFDcEIsU0FBUztBQUNULG1EQUFtRDtBQUNuRCxvQ0FBb0M7QUFDcEMsZ0RBQWdEO0FBQ2hELFdBQVc7QUFDWCxrQ0FBa0M7QUFDbEMsaUJBQWlCO0FBQ2pCLFlBQVk7QUFDWixPQUFPO0FBQ1Asd0RBQXdEO0FBQ3hELDJDQUEyQztBQUMzQywyQkFBMkI7QUFDM0IsWUFBWTtBQUNaLGNBQWM7QUFDZCw0QkFBNEI7QUFDNUIsb0RBQW9EO0FBQ3BELCtCQUErQjtBQUMvQix3QkFBd0I7QUFDeEIseUJBQXlCO0FBQ3pCLG9CQUFvQjtBQUNwQixhQUFhO0FBQ2IsV0FBVztBQUNYLHVCQUF1QjtBQUN2QixvQ0FBb0M7QUFDcEMsb0NBQW9DO0FBQ3BDLFdBQVc7QUFDWCxPQUFPO0FBQ1AsdUNBQXVDO0FBQ3ZDLG1CQUFtQjtBQUNuQixxQkFBcUI7QUFDckIsc0JBQXNCO0FBQ3RCLFdBQVc7QUFDWCxrQkFBa0I7QUFDbEIsU0FBUztBQUNULDJCQUEyQjtBQUMzQixVQUFVO0FBQ1YsZUFBZTtBQUNmLHVCQUF1QjtBQUN2QixpREFBaUQ7QUFDakQsMkNBQTJDO0FBQzNDLFdBQVc7QUFDWCxPQUFPO0FBRVAsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCB7Q29udmVydGVyfSBmcm9tIFwiLi4vc3JjL0NvbnZlcnRlclwiO1xuLy8gaW1wb3J0IGNzdiBmcm9tIFwiLi4vc3JjXCI7XG4vLyB2YXIgYXNzZXJ0ID0gcmVxdWlyZShcImFzc2VydFwiKTtcbi8vIHZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbi8vIHZhciBzYW5kYm94ID0gcmVxdWlyZShcInNpbm9uXCIpLnNhbmRib3guY3JlYXRlKCk7XG4vLyB2YXIgZmlsZSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdGVzdERhdGFcIjtcbi8vIHZhciB0cmFpbENvbW1hRGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdHJhaWxpbmdDb21tYVwiO1xuLy8gZGVzY3JpYmUoXCJDU1YgQ29udmVydCBpbiBCYWNrZ3JvdW5kIFByb2Nlc3NcIiwgZnVuY3Rpb24gKCkge1xuLy8gICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuLy8gICAgIHNhbmRib3gucmVzdG9yZSgpO1xuLy8gICB9KTtcblxuXG4vLyAgIGl0KFwic2hvdWxkIHJlYWQgZnJvbSBhIHN0cmVhbVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciBvYmogPSBuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIGZvcms6IHRydWVcbi8vICAgICB9KTtcbi8vICAgICB2YXIgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbi8vICAgICBvYmoudGhlbihmdW5jdGlvbiAob2JqKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwob2JqLmxlbmd0aCwgMik7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSwoZXJyKT0+e1xuLy8gICAgICAgY29uc29sZS5sb2coZXJyLnRvU3RyaW5nKCkpO1xuLy8gICAgIH0pO1xuLy8gICAgIHN0cmVhbS5waXBlKG9iaik7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwic2hvdWxkIGNhbGwgb25OZXh0IG9uY2UgYSByb3cgaXMgcGFyc2VkLlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciBvYmogPSBuZXcgQ29udmVydGVyKHtmb3JrOnRydWV9KTtcbi8vICAgICB2YXIgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbi8vICAgICB2YXIgY2FsbGVkID0gZmFsc2U7XG4vLyAgICAgb2JqLnN1YnNjcmliZShmdW5jdGlvbiAocmVzdWx0Um93KSB7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0Um93KTtcbi8vICAgICAgIGNhbGxlZCA9IHRydWU7XG4vLyAgICAgfSk7XG4vLyAgICAgb2JqLm9uKFwiZG9uZVwiLCBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICBhc3NlcnQoY2FsbGVkKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgICBzdHJlYW0ucGlwZShvYmopO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBlbWl0IGVuZF9wYXJzZWQgbWVzc2FnZSBvbmNlIGl0IGlzIGZpbmlzaGVkLlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciBvYmogPSBuZXcgQ29udmVydGVyKHtmb3JrOnRydWV9KTtcbi8vICAgICBvYmoudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0KTtcbi8vICAgICAgIGFzc2VydChyZXN1bHQubGVuZ3RoID09PSAyKTtcbi8vICAgICAgIGFzc2VydChyZXN1bHRbMF0uZGF0ZSk7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0WzBdLmVtcGxveWVlKTtcbi8vICAgICAgIGFzc2VydChyZXN1bHRbMF0uZW1wbG95ZWUubmFtZSk7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0WzBdLmVtcGxveWVlLmFnZSk7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0WzBdLmVtcGxveWVlLm51bWJlcik7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0WzBdLmVtcGxveWVlLmtleS5sZW5ndGggPT09IDIpO1xuLy8gICAgICAgYXNzZXJ0KHJlc3VsdFswXS5hZGRyZXNzLmxlbmd0aCA9PT0gMik7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG4vLyAgICAgZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKS5waXBlKG9iaik7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwic2hvdWxkIGhhbmRsZSB0cmFsaW5nIGNvbW1hIGdyYWNlZnVsbHlcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0cmFpbENvbW1hRGF0YSk7XG4vLyAgICAgdmFyIG9iaiA9IG5ldyBDb252ZXJ0ZXIoe2Zvcms6dHJ1ZX0pO1xuLy8gICAgIG9iai50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbi8vICAgICAgIGFzc2VydChyZXN1bHQpO1xuLy8gICAgICAgYXNzZXJ0KHJlc3VsdC5sZW5ndGggPiAwKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgICBzdHJlYW0ucGlwZShvYmopO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBoYW5kbGUgY29tbWEgaW4gY29sdW1uIHdoaWNoIGlzIHN1cnJvdW5kZWQgYnkgcW91dGVzXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aENvbW1hXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIG9iaiA9IG5ldyBDb252ZXJ0ZXIoe1xuLy8gICAgICAgXCJxdW90ZVwiOiBcIiNcIixcbi8vICAgICAgIFwiZm9ya1wiOnRydWVcbi8vICAgICB9KTtcbi8vICAgICBvYmoudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4vLyAgICAgICBhc3NlcnQocmVzdWx0WzBdLmNvbDEgPT09IFwiXFxcIk1pbmkuIFNlY3R0XCIpO1xuLy8gICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdFszXS5jb2wyLCBcIjEyNTAwMSxmZW52a2RzZlwiKTtcbi8vICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG4vLyAgICAgcnMucGlwZShvYmopO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBiZSBhYmxlIHRvIGNvbnZlcnQgYSBjc3YgdG8gY29sdW1uIGFycmF5IGRhdGFcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgY29sdW1BcnJEYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb2x1bW5BcnJheVwiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oY29sdW1BcnJEYXRhKTtcbi8vICAgICB2YXIgcmVzdWx0OmFueSA9IHt9O1xuLy8gICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKHtmb3JrOnRydWV9KTtcbi8vICAgICAvL2VuZF9wYXJzZWQgd2lsbCBiZSBlbWl0dGVkIG9uY2UgcGFyc2luZyBmaW5pc2hlZFxuLy8gICAgIGNzdkNvbnZlcnRlci50aGVuKGZ1bmN0aW9uICgpIHtcbi8vICAgICAgIGFzc2VydChyZXN1bHQuVElNRVNUQU1QLmxlbmd0aCA9PT0gNSk7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG5cbi8vICAgICAvL3JlY29yZF9wYXJzZWQgd2lsbCBiZSBlbWl0dGVkIGVhY2ggdGltZSBhIHJvdyBoYXMgYmVlbiBwYXJzZWQuXG4vLyAgICAgY3N2Q29udmVydGVyLnN1YnNjcmliZShmdW5jdGlvbiAocmVzdWx0Um93LCByb3dJbmRleCkge1xuLy8gICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdFJvdykge1xuLy8gICAgICAgICBpZiAocmVzdWx0Um93Lmhhc093blByb3BlcnR5KGtleSkpIHtcbi8vICAgICAgICAgICBpZiAoIXJlc3VsdFtrZXldIHx8ICEocmVzdWx0W2tleV0gaW5zdGFuY2VvZiBBcnJheSkpIHtcbi8vICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gW107XG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICAgIHJlc3VsdFtrZXldW3Jvd0luZGV4XSA9IHJlc3VsdFJvd1trZXldO1xuLy8gICAgICAgICB9XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgICAgcnMucGlwZShjc3ZDb252ZXJ0ZXIpO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBiZSBhYmxlIHRvIGNvbnZlcnQgY3N2IHN0cmluZyBkaXJlY3RseVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdGVzdERhdGFcIjtcbi8vICAgICB2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyh0ZXN0RGF0YSkudG9TdHJpbmcoKTtcbi8vICAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcih7Zm9yazp0cnVlfSk7XG4vLyAgICAgLy9lbmRfcGFyc2VkIHdpbGwgYmUgZW1pdHRlZCBvbmNlIHBhcnNpbmcgZmluaXNoZWRcbi8vICAgICBjc3ZDb252ZXJ0ZXIudGhlbihmdW5jdGlvbiAoanNvbk9iaikge1xuLy8gICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmoubGVuZ3RoLCAyKTtcbi8vICAgICB9KTtcbi8vICAgICBjc3ZDb252ZXJ0ZXIuZnJvbVN0cmluZyhkYXRhKS50aGVuKGZ1bmN0aW9uIChqc29uT2JqKSB7XG4vLyAgICAgICBhc3NlcnQoanNvbk9iai5sZW5ndGggPT09IDIpO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBiZSBhYmxlIHRvIGNvbnZlcnQgY3N2IHN0cmluZyB3aXRoIGVycm9yXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFVuY2xvc2VkUXVvdGVzXCI7XG4vLyAgICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGVzdERhdGEpLnRvU3RyaW5nKCk7XG4vLyAgICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe2Zvcms6dHJ1ZX0pO1xuLy8gICAgIGNzdkNvbnZlcnRlci5mcm9tU3RyaW5nKGRhdGEpLnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbiAoZXJyKSB7XG4vLyAgICAgICAvLyBjb25zb2xlLmxvZyhlcnIpO1xuLy8gICAgICAgYXNzZXJ0KGVycik7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVyciwgXCJ1bmNsb3NlZF9xdW90ZVwiKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgYmUgYWJsZSB0byBjb252ZXJ0IGNzdiBzdHJpbmcgd2l0aG91dCBjYWxsYmFjayBwcm92aWRlZFwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdGVzdERhdGFcIjtcbi8vICAgICB2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyh0ZXN0RGF0YSkudG9TdHJpbmcoKTtcbi8vICAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcih7Zm9yazp0cnVlfSk7XG4vLyAgICAgLy9lbmRfcGFyc2VkIHdpbGwgYmUgZW1pdHRlZCBvbmNlIHBhcnNpbmcgZmluaXNoZWRcbi8vICAgICBjc3ZDb252ZXJ0ZXIudGhlbihmdW5jdGlvbiAoanNvbk9iaikge1xuLy8gICAgICAgYXNzZXJ0KGpzb25PYmoubGVuZ3RoID09PSAyKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgICBjc3ZDb252ZXJ0ZXIuZnJvbVN0cmluZyhkYXRhKTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgY29sdW1ucyB3aXRoIGRvdWJsZSBxdW90ZXNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoUW91dGVzXCI7XG4vLyAgICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGVzdERhdGEpLnRvU3RyaW5nKCk7XG4vLyAgICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe2Zvcms6dHJ1ZX0pO1xuLy8gICAgIGNzdkNvbnZlcnRlci5mcm9tU3RyaW5nKGRhdGEpLnRoZW4oZnVuY3Rpb24gKGpzb25PYmopIHtcbi8vICAgICAgIGFzc2VydChqc29uT2JqWzBdLlRJTUVTVEFNUCA9PT0gJzEzOTU0MjY0XCIyMicsIEpTT04uc3RyaW5naWZ5KGpzb25PYmpbMF0uVElNRVNUQU1QKSk7XG5cbi8vICAgICAgIGFzc2VydChqc29uT2JqWzFdLlRJTUVTVEFNUCA9PT0gJ2FiYywgZGVmLCBjY2MnLCBKU09OLnN0cmluZ2lmeShqc29uT2JqWzFdLlRJTUVTVEFNUCkpO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBjb2x1bW5zIHdpdGggdHdvIGRvdWJsZSBxdW90ZXNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL3R3b2RvdWJsZXF1b3Rlc1wiO1xuLy8gICAgIHZhciBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHRlc3REYXRhKS50b1N0cmluZygpO1xuLy8gICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKHtmb3JrOnRydWV9KTtcbi8vICAgICBjc3ZDb252ZXJ0ZXIuZnJvbVN0cmluZyhkYXRhKS50aGVuKGZ1bmN0aW9uIChqc29uT2JqKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoanNvbk9ialswXS50aXRsZSwgXCJcXFwiXCIpO1xuLy8gICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0uZGF0YSwgXCJ4eWFiY2RlXCIpO1xuLy8gICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0udXVpZCwgXCJmZWphbFxcXCJlaWZhXCIpO1xuLy8gICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0uZmllbGRBLCBcImJuZWpcXFwiXFxcImZhbGtmZVwiKTtcbi8vICAgICAgIGFzc2VydC5lcXVhbChqc29uT2JqWzBdLmZpZWxkQiwgXCJcXFwiZWlzamZlc1xcXCJcIik7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwic2hvdWxkIGhhbmRsZSBlbXB0eSBjc3YgZmlsZVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZW1wdHlGaWxlXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe2Zvcms6dHJ1ZX0pO1xuLy8gICAgIGNzdkNvbnZlcnRlci50aGVuKGZ1bmN0aW9uIChqc29uT2JqKSB7XG4vLyAgICAgICBhc3NlcnQoanNvbk9iai5sZW5ndGggPT09IDApO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICAgIHJzLnBpcGUoY3N2Q29udmVydGVyKTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgcGFyc2UgbGFyZ2UgY3N2IGZpbGVcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2xhcmdlLWNzdi1zYW1wbGUuY3N2XCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe2Zvcms6dHJ1ZX0pO1xuLy8gICAgIHZhciBjb3VudCA9IDA7XG4vLyAgICAgY3N2Q29udmVydGVyLnN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAvLyBjb25zb2xlLmxvZyhhcmd1bWVudHMpO1xuLy8gICAgICAgY291bnQrKztcbi8vICAgICB9KTtcbi8vICAgICBjc3ZDb252ZXJ0ZXIudGhlbihmdW5jdGlvbiAoKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoY291bnQsIDUyOTApO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICAgIHJzLnBpcGUoY3N2Q29udmVydGVyKTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgcGFyc2UgZGF0YSBhbmQgY292ZXJ0IHRvIHNwZWNpZmljIHR5cGVzXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFR5cGVcIjtcbi8vICAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbi8vICAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcih7XG4vLyAgICAgICBmb3JrOnRydWUsXG4vLyAgICAgICBjaGVja1R5cGU6IHRydWUsXG4vLyAgICAgICBjb2xQYXJzZXI6IHtcbi8vICAgICAgICAgXCJjb2x1bW42XCI6IFwic3RyaW5nXCIsXG4vLyAgICAgICAgIFwiY29sdW1uN1wiOiBcInN0cmluZ1wiXG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgICAgY3N2Q29udmVydGVyLnN1YnNjcmliZShmdW5jdGlvbiAoZCkge1xuLy8gICAgICAgYXNzZXJ0KHR5cGVvZiBkLmNvbHVtbjEgPT09IFwibnVtYmVyXCIpO1xuLy8gICAgICAgYXNzZXJ0KHR5cGVvZiBkLmNvbHVtbjIgPT09IFwic3RyaW5nXCIpO1xuLy8gICAgICAgYXNzZXJ0LmVxdWFsKGRbXCJjb2x1bWU0XCJdLCBcInNvbWVpbnZhbGlkZGF0ZVwiKTtcbi8vICAgICAgIGFzc2VydChkLmNvbHVtbjUuaGVsbG8gPT09IFwid29ybGRcIik7XG4vLyAgICAgICBhc3NlcnQoZC5jb2x1bW42ID09PSAne1wiaGVsbG9cIjpcIndvcmxkXCJ9Jyk7XG4vLyAgICAgICBhc3NlcnQoZC5jb2x1bW43ID09PSBcIjEyMzRcIik7XG4vLyAgICAgICBhc3NlcnQoZC5jb2x1bW44ID09PSBcImFiY2RcIik7XG4vLyAgICAgICBhc3NlcnQoZC5jb2x1bW45ID09PSB0cnVlKTtcbi8vICAgICAgIGFzc2VydChkLmNvbHVtbjEwWzBdID09PSAyMyk7XG4vLyAgICAgICBhc3NlcnQoZC5jb2x1bW4xMFsxXSA9PT0gMzEpO1xuLy8gICAgICAgYXNzZXJ0KGQuY29sdW1uMTFbMF0uaGVsbG8gPT09IFwid29ybGRcIik7XG4vLyAgICAgICBhc3NlcnQoZFtcIm5hbWUjIVwiXSA9PT0gZmFsc2UpO1xuLy8gICAgIH0pO1xuLy8gICAgIGNzdkNvbnZlcnRlci5vbihcImRvbmVcIiwgZnVuY3Rpb24gKCkge1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICAgIHJzLnBpcGUoY3N2Q29udmVydGVyKTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgdHVybiBvZmYgZmllbGQgdHlwZSBjaGVja1wiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YVdpdGhUeXBlXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe1xuLy8gICAgICAgZm9yazp0cnVlLFxuLy8gICAgICAgY2hlY2tUeXBlOiBmYWxzZVxuLy8gICAgIH0pO1xuLy8gICAgIGNzdkNvbnZlcnRlci5zdWJzY3JpYmUoZnVuY3Rpb24gKGQpIHtcbi8vICAgICAgIGFzc2VydCh0eXBlb2YgZC5jb2x1bW4xID09PSBcInN0cmluZ1wiKTtcbi8vICAgICAgIGFzc2VydCh0eXBlb2YgZC5jb2x1bW4yID09PSBcInN0cmluZ1wiKTtcbi8vICAgICAgIGFzc2VydChkW1wiY29sdW1uM1wiXSA9PT0gXCIyMDEyLTAxLTAxXCIpO1xuLy8gICAgICAgYXNzZXJ0KGRbXCJjb2x1bWU0XCJdID09PSBcInNvbWVpbnZhbGlkZGF0ZVwiKTtcbi8vICAgICAgIGFzc2VydChkLmNvbHVtbjUgPT09ICd7XCJoZWxsb1wiOlwid29ybGRcIn0nKTtcbi8vICAgICAgIGFzc2VydC5lcXVhbChkW1wiY29sdW1uNlwiXSwgJ3tcImhlbGxvXCI6XCJ3b3JsZFwifScpO1xuLy8gICAgICAgYXNzZXJ0KGRbXCJjb2x1bW43XCJdID09PSBcIjEyMzRcIik7XG4vLyAgICAgICBhc3NlcnQoZFtcImNvbHVtbjhcIl0gPT09IFwiYWJjZFwiKTtcbi8vICAgICAgIGFzc2VydChkLmNvbHVtbjkgPT09IFwidHJ1ZVwiKTtcbi8vICAgICAgIGFzc2VydChkLmNvbHVtbjEwWzBdID09PSBcIjIzXCIpO1xuLy8gICAgICAgYXNzZXJ0KGQuY29sdW1uMTBbMV0gPT09IFwiMzFcIik7XG4vLyAgICAgICBhc3NlcnQoZFtcIm5hbWUjIVwiXSA9PT0gJ2ZhbHNlJyk7XG4vLyAgICAgfSk7XG4vLyAgICAgY3N2Q29udmVydGVyLnRoZW4oZnVuY3Rpb24gKCkge1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICAgIHJzLnBpcGUoY3N2Q29udmVydGVyKTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgZW1pdCBkYXRhIGV2ZW50IGNvcnJlY3RseVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvbGFyZ2UtY3N2LXNhbXBsZS5jc3ZcIjtcblxuLy8gICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0se29iamVjdE1vZGU6dHJ1ZX0pO1xuLy8gICAgIHZhciBjb3VudCA9IDA7XG4vLyAgICAgY3N2Q29udmVydGVyLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZCkge1xuLy8gICAgICAgY291bnQrKztcbi8vICAgICB9KTtcbi8vICAgICBjc3ZDb252ZXJ0ZXIub24oXCJkb25lXCIsIGZ1bmN0aW9uICgpIHtcbi8vICAgICAgIGFzc2VydC5lcXVhbChjc3ZDb252ZXJ0ZXIucGFyc2VkTGluZU51bWJlciwgNTI5MCk7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgcnMucGlwZShjc3ZDb252ZXJ0ZXIpO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBwcm9jZXNzIGNvbHVtbiB3aXRoIGxpbmVicmVha3NcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2xpbmVCcmVha1wiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuLy8gICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIGZvcms6dHJ1ZSxcbi8vICAgICAgIGNoZWNrVHlwZTogdHJ1ZVxuLy8gICAgIH0pO1xuLy8gICAgIGNzdkNvbnZlcnRlci5zdWJzY3JpYmUoZnVuY3Rpb24gKGQpIHtcbi8vICAgICAgIGFzc2VydChkLlBlcmlvZCA9PT0gMTMpO1xuLy8gICAgICAgYXNzZXJ0KGRbXCJBcHBhcmVudCBhZ2VcIl0gPT09IFwiVW5rbm93blwiKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwiYmUgYWJsZSB0byBpZ25vcmUgZW1wdHkgY29sdW1uc1wiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YUlnbm9yZUVtcHR5XCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShjc3YoeyBcbi8vICAgICAgIGlnbm9yZUVtcHR5OiB0cnVlICxcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pKTtcbi8vICAgICBzdC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbi8vICAgICAgIHZhciBqID0gcmVzWzBdO1xuLy8gICAgICAgYXNzZXJ0KHJlcy5sZW5ndGggPT09IDMpO1xuLy8gICAgICAgYXNzZXJ0KGouY29sMi5sZW5ndGggPT09IDIpO1xuLy8gICAgICAgYXNzZXJ0KGouY29sMlsxXSA9PT0gXCJkM1wiKTtcbi8vICAgICAgIGFzc2VydChqLmNvbDQuY29sMyA9PT0gdW5kZWZpbmVkKTtcbi8vICAgICAgIGFzc2VydChqLmNvbDQuY29sNSA9PT0gXCJ3b3JsZFwiKTtcbi8vICAgICAgIGFzc2VydChyZXNbMV0uY29sMSA9PT0gXCJkMlwiKTtcbi8vICAgICAgIGFzc2VydChyZXNbMl0uY29sMSA9PT0gXCJkNFwiKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgYWxsb3cgbm8gaGVhZGVyXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9ub2hlYWRlcmNzdlwiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuLy8gICAgIHZhciBzdCA9IHJzLnBpcGUobmV3IENvbnZlcnRlcih7IFxuLy8gICAgICAgbm9oZWFkZXI6IHRydWUsXG4vLyAgICAgICBmb3JrOnRydWVcbi8vICAgICB9KSk7XG4vLyAgICAgc3QudGhlbihmdW5jdGlvbiAocmVzKSB7XG4vLyAgICAgICB2YXIgaiA9IHJlc1swXTtcbi8vICAgICAgIGFzc2VydChyZXMubGVuZ3RoID09PSA1KTtcbi8vICAgICAgIGFzc2VydChqLmZpZWxkMSA9PT0gXCJDQzEwMi1QRE1JLTAwMVwiKTtcbi8vICAgICAgIGFzc2VydChqLmZpZWxkMiA9PT0gXCJlQ2xhc3NfNS4xLjNcIik7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwic2hvdWxkIGFsbG93IGN1c3RvbWlzZWQgaGVhZGVyXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9ub2hlYWRlcmNzdlwiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuLy8gICAgIHZhciBzdCA9IHJzLnBpcGUobmV3IENvbnZlcnRlcih7XG4vLyAgICAgICBub2hlYWRlcjogdHJ1ZSxcbi8vICAgICAgIGhlYWRlcnM6IFtcImFcIiwgXCJiXCJdLFxuLy8gICAgICAgZm9yazp0cnVlXG4vLyAgICAgfSkpO1xuLy8gICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuLy8gICAgICAgdmFyIGogPSByZXNbMF07XG4vLyAgICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gNSk7XG4vLyAgICAgICBhc3NlcnQoai5hID09PSBcIkNDMTAyLVBETUktMDAxXCIpO1xuLy8gICAgICAgYXNzZXJ0KGouYiA9PT0gXCJlQ2xhc3NfNS4xLjNcIik7XG4vLyAgICAgICBhc3NlcnQoai5maWVsZDMgPT09IFwiMTAvMy8yMDE0XCIpO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBhbGxvdyBjdXN0b21pc2VkIGhlYWRlciB0byBvdmVycmlkZSBleGlzdGluZyBoZWFkZXJcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2NvbXBsZXhKU09OQ1NWXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIGhlYWRlcnM6IFtdLFxuLy8gICAgICAgZm9yazp0cnVlXG4vLyAgICAgfSkpO1xuLy8gICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuLy8gICAgICAgdmFyIGogPSByZXNbMF07XG4vLyAgICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gMik7XG4vLyAgICAgICBhc3NlcnQoai5maWVsZDEgPT09IFwiRm9vZCBGYWN0b3J5XCIpO1xuLy8gICAgICAgYXNzZXJ0KGouZmllbGQyID09PSBcIk9zY2FyXCIpO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0pO1xuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBoYW5kbGUgd2hlbiB0aGVyZSBpcyBhbiBlbXB0eSBzdHJpbmdcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoRW1wdHlTdHJpbmdcIjtcbi8vICAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbi8vICAgICB2YXIgc3QgPSBycy5waXBlKG5ldyBDb252ZXJ0ZXIoe1xuLy8gICAgICAgbm9oZWFkZXI6IHRydWUsXG4vLyAgICAgICBoZWFkZXJzOiBbXCJhXCIsIFwiYlwiLCBcImNcIl0sXG4vLyAgICAgICBjaGVja1R5cGU6IHRydWUsXG4vLyAgICAgICBmb3JrOnRydWVcbi8vICAgICB9KSk7XG4vLyAgICAgc3QudGhlbihmdW5jdGlvbiAocmVzKSB7XG4vLyAgICAgICB2YXIgaiA9IHJlc1swXTtcblxuLy8gICAgICAgLy8gYXNzZXJ0KHJlcy5sZW5ndGg9PT0yKTtcbi8vICAgICAgIGFzc2VydChqLmEgPT09IFwiZ3JlZW5cIik7XG4vLyAgICAgICBhc3NlcnQoai5iID09PSA0MCk7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoai5jLCBcIlwiKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgZGV0ZWN0IGVvbCBjb3JyZWN0bHkgd2hlbiBmaXJzdCBjaHVuayBpcyBzbWFsbGVyIHRoYW4gaGVhZGVyIHJvdyBsZW5ndGhcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFOb1RyaW1DUkxGXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSwgeyBoaWdoV2F0ZXJNYXJrOiAzIH0pO1xuXG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIHRyaW06IGZhbHNlLFxuLy8gICAgICAgZm9yazp0cnVlXG4vLyAgICAgfSkpO1xuLy8gICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuLy8gICAgICAgdmFyIGogPSByZXNbMF07XG4vLyAgICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gMik7XG4vLyAgICAgICBhc3NlcnQoai5uYW1lID09PSBcImpvZVwiKTtcbi8vICAgICAgIGFzc2VydChqLmFnZSA9PT0gXCIyMFwiKTtcbi8vICAgICAgIGFzc2VydC5lcXVhbChyZXNbMV0ubmFtZSwgXCJzYW1cIik7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwocmVzWzFdLmFnZSwgXCIzMFwiKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgZGV0ZWN0IGVvbCBjb3JyZWN0bHkgd2hlbiBmaXJzdCBjaHVuayBlbmRzIGluIG1pZGRsZSBvZiBDUkxGIGxpbmUgYnJlYWtcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFOb1RyaW1DUkxGXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSwgeyBoaWdoV2F0ZXJNYXJrOiA5IH0pO1xuXG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIHRyaW06IGZhbHNlLFxuLy8gICAgICAgZm9yazp0cnVlXG4vLyAgICAgfSkpO1xuLy8gICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuLy8gICAgICAgdmFyIGogPSByZXNbMF07XG4vLyAgICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gMik7XG4vLyAgICAgICBhc3NlcnQoai5uYW1lID09PSBcImpvZVwiKTtcbi8vICAgICAgIGFzc2VydChqLmFnZSA9PT0gXCIyMFwiKTtcbi8vICAgICAgIGFzc2VydC5lcXVhbChyZXNbMV0ubmFtZSwgXCJzYW1cIik7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwocmVzWzFdLmFnZSwgXCIzMFwiKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgZW1pdCBlb2wgZXZlbnQgd2hlbiBsaW5lIGVuZGluZyBpcyBkZXRlY3RlZCBhcyBDUkxGXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhTm9UcmltQ1JMRlwiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuXG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pKTtcbi8vICAgICB2YXIgZW9sQ2FsbGJhY2sgPSBzYW5kYm94LnNweShmdW5jdGlvbiAoZW9sKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoZW9sLCBcIlxcclxcblwiKTtcbi8vICAgICB9KTtcbi8vICAgICBzdC5vbihcImVvbFwiLCBlb2xDYWxsYmFjayk7XG4vLyAgICAgc3QudGhlbihmdW5jdGlvbiAoKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoZW9sQ2FsbGJhY2suY2FsbENvdW50LCAxLCAnc2hvdWxkIGVtaXQgZW9sIGV2ZW50IG9uY2UnKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KVxuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCBlbWl0IGVvbCBldmVudCB3aGVuIGxpbmUgZW5kaW5nIGlzIGRldGVjdGVkIGFzIExGXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb2x1bW5BcnJheVwiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuXG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pKTtcbi8vICAgICB2YXIgZW9sQ2FsbGJhY2sgPSBzYW5kYm94LnNweShmdW5jdGlvbiAoZW9sKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoZW9sLCBcIlxcblwiKTtcbi8vICAgICB9KTtcbi8vICAgICBzdC5vbihcImVvbFwiLCBlb2xDYWxsYmFjayk7XG4vLyAgICAgc3QudGhlbihmdW5jdGlvbiAoKSB7XG4vLyAgICAgICBhc3NlcnQuZXF1YWwoZW9sQ2FsbGJhY2suY2FsbENvdW50LCAxLCAnc2hvdWxkIGVtaXQgZW9sIGV2ZW50IG9uY2UnKTtcbi8vICAgICAgIGRvbmUoKTtcbi8vICAgICB9KVxuLy8gICB9KTtcblxuLy8gICBpdChcInNob3VsZCByZW1vdmUgdGhlIEJ5dGUgT3JkZXIgTWFyayAoQk9NKSBmcm9tIGlucHV0XCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhTm9UcmltQk9NXCI7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4vLyAgICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbi8vICAgICAgIHRyaW06IGZhbHNlLFxuLy8gICAgICAgZm9yazp0cnVlXG4vLyAgICAgfSkpO1xuLy8gICAgIHN0LnRoZW4oIGZ1bmN0aW9uIChyZXMpIHtcbi8vICAgICAgIHZhciBqID0gcmVzWzBdO1xuXG4vLyAgICAgICBhc3NlcnQocmVzLmxlbmd0aD09PTIpO1xuLy8gICAgICAgYXNzZXJ0KGoubmFtZSA9PT0gXCJqb2VcIik7XG4vLyAgICAgICBhc3NlcnQoai5hZ2UgPT09IFwiMjBcIik7XG4vLyAgICAgICBkb25lKCk7XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwic2hvdWxkIHNldCBvdXRwdXQgYXMgY3N2XCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb21wbGV4SlNPTkNTVlwiO1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuLy8gICAgIHZhciBudW1PZlJvdyA9IDA7XG4vLyAgICAgY3N2KHsgb3V0cHV0OiBcImNzdlwiLGZvcms6dHJ1ZSB9KVxuLy8gICAgICAgLmZyb21TdHJlYW0ocnMpXG4vLyAgICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChyb3csIGlkeCkge1xuLy8gICAgICAgICBudW1PZlJvdysrO1xuLy8gICAgICAgICBhc3NlcnQocm93KTtcbi8vICAgICAgICAgYXNzZXJ0KGlkeCA+PSAwKTtcbi8vICAgICAgIH0pXG5cbi8vICAgICAgIC5vbihcImRvbmVcIiwgZnVuY3Rpb24gKGVycm9yKSB7XG4vLyAgICAgICAgIGFzc2VydCghZXJyb3IpO1xuLy8gICAgICAgICBhc3NlcnQuZXF1YWwoMiwgbnVtT2ZSb3cpO1xuLy8gICAgICAgICBhc3NlcnQobnVtT2ZSb3cgIT09IDApO1xuLy8gICAgICAgICBkb25lKCk7XG4vLyAgICAgICB9KTtcbi8vICAgfSk7XG4vLyAgIGl0KFwic2hvdWxkIHByb2Nlc3MgbG9uZyBoZWFkZXJcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2xvbmdIZWFkZXJcIjtcbi8vICAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhLCB7IGhpZ2hXYXRlck1hcms6IDEwMCB9KTtcbi8vICAgICB2YXIgbnVtT2ZSb3cgPSAwO1xuLy8gICAgIHZhciBudW1PZkpzb24gPSAwO1xuLy8gICAgIGNzdih7Zm9yazp0cnVlfSwgeyBoaWdoV2F0ZXJNYXJrOiAxMDAgfSlcbi8vICAgICAgIC5mcm9tU3RyZWFtKHJzKVxuLy8gICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAocmVzLCBpZHgpIHtcbi8vICAgICAgICAgbnVtT2ZKc29uKys7XG4vLyAgICAgICAgIGFzc2VydC5lcXVhbChyZXMuRGF0ZSwgJzgvMjYvMTYnKTtcbi8vICAgICAgICAgYXNzZXJ0KGlkeCA+PSAwKTtcbi8vICAgICAgIH0pXG4vLyAgICAgICAub24oXCJkb25lXCIsIGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgYXNzZXJ0KG51bU9mSnNvbiA9PT0gMSk7XG4vLyAgICAgICAgIGRvbmUoKTtcbi8vICAgICAgIH0pO1xuLy8gICB9KTtcbi8vICAgaXQoXCJzaG91bGQgcGFyc2UgIzEzOVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhIzEzOVwiKTtcbi8vICAgICBjc3Yoe2Zvcms6dHJ1ZX0pXG4vLyAgICAgICAuZnJvbVN0cmVhbShycylcbi8vICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbi8vICAgICAgICAgYXNzZXJ0LmVxdWFsKHJlc1sxXS5maWVsZDMsIFwiOTAwMTAwOTM5NSA5MDAxMDA5OTkwXCIpO1xuLy8gICAgICAgICBkb25lKCk7XG4vLyAgICAgICB9KTtcbi8vICAgfSk7XG5cbi8vICAgaXQoXCJzaG91bGQgaWdub3JlIGNvbHVtblwiLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFFvdXRlc1wiKTtcbi8vICAgICB2YXIgaGVhZGVyRW1pdHRlZCA9IGZhbHNlO1xuLy8gICAgIGNzdih7XG4vLyAgICAgICBpZ25vcmVDb2x1bW5zOiAvVElNRVNUQU1QLyxcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pXG4vLyAgICAgICAuZnJvbVN0cmVhbShycylcbi8vICAgICAgIC5vbihcImhlYWRlclwiLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG4vLyAgICAgICAgIGFzc2VydC5lcXVhbChoZWFkZXIuaW5kZXhPZihcIlRJTUVTVEFNUFwiKSwgLTEpO1xuLy8gICAgICAgICBhc3NlcnQuZXF1YWwoaGVhZGVyLmluZGV4T2YoXCJVUERBVEVcIiksIDApO1xuLy8gICAgICAgICBpZiAoaGVhZGVyRW1pdHRlZCkge1xuLy8gICAgICAgICAgIHRocm93IChcImhlYWRlciBldmVudCBzaG91bGQgb25seSBoYXBwZW4gb25jZVwiKVxuLy8gICAgICAgICB9XG4vLyAgICAgICAgIGhlYWRlckVtaXR0ZWQgPSB0cnVlO1xuLy8gICAgICAgfSlcbi8vICAgICAgIC8vIC5vbihcImNzdlwiLCBmdW5jdGlvbiAocm93LCBpZHgpIHtcbi8vICAgICAgIC8vICAgaWYgKCFoZWFkZXJFbWl0dGVkKSB7XG4vLyAgICAgICAvLyAgICAgdGhyb3cgKFwiaGVhZGVyIHNob3VsZCBiZSBlbWl0dGVkIGJlZm9yZSBhbnkgZGF0YSBldmVudHNcIik7XG4vLyAgICAgICAvLyAgIH1cbi8vICAgICAgIC8vICAgYXNzZXJ0KGlkeCA+PSAwKTtcbi8vICAgICAgIC8vICAgaWYgKGlkeCA9PT0gMSkge1xuLy8gICAgICAgLy8gICAgIGFzc2VydC5lcXVhbChyb3dbMF0sIFwiblwiKTtcbi8vICAgICAgIC8vICAgfVxuLy8gICAgICAgLy8gfSlcbi8vICAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKGosIGlkeCkge1xuLy8gICAgICAgICAvLyBjb25zb2xlLmxvZyhqKTtcbi8vICAgICAgICAgYXNzZXJ0KCFqLlRJTUVTVEFNUCk7XG4vLyAgICAgICAgIGFzc2VydChpZHggPj0gMCk7XG4vLyAgICAgICB9KVxuLy8gICAgICAgLm9uKFwiZG9uZVwiLCBmdW5jdGlvbiAoZXJyKSB7XG4vLyAgICAgICAgIGFzc2VydCghZXJyKTtcbi8vICAgICAgICAgYXNzZXJ0KGhlYWRlckVtaXR0ZWQpO1xuLy8gICAgICAgICBkb25lKCk7XG4vLyAgICAgICB9KTtcbi8vICAgfSk7XG4vLyAgIGl0KFwic2hvdWxkIGluY2x1ZGUgY29sdW1uXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbShfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoUW91dGVzXCIpO1xuLy8gICAgIGNzdih7XG4vLyAgICAgICBpbmNsdWRlQ29sdW1uczogL1RJTUVTVEFNUC8sXG4vLyAgICAgICBmb3JrOnRydWVcbi8vICAgICB9KVxuLy8gICAgICAgLmZyb21TdHJlYW0ocnMpXG4vLyAgICAgICAub24oXCJoZWFkZXJcIiwgZnVuY3Rpb24gKGhlYWRlcikge1xuLy8gICAgICAgICBhc3NlcnQuZXF1YWwoaGVhZGVyLmluZGV4T2YoXCJUSU1FU1RBTVBcIiksIDApO1xuLy8gICAgICAgICBhc3NlcnQuZXF1YWwoaGVhZGVyLmluZGV4T2YoXCJVUERBVEVcIiksIC0xKTtcbi8vICAgICAgICAgYXNzZXJ0LmVxdWFsKGhlYWRlci5sZW5ndGgsIDEpO1xuLy8gICAgICAgfSlcbi8vICAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKGosIGlkeCkge1xuLy8gICAgICAgICBhc3NlcnQoaWR4ID49IDApO1xuLy8gICAgICAgICBpZiAoaWR4ID09PSAxKSB7XG4vLyAgICAgICAgICAgYXNzZXJ0LmVxdWFsKGouVElNRVNUQU1QLCBcImFiYywgZGVmLCBjY2NcIik7XG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgYXNzZXJ0KCFqLlVJRClcbi8vICAgICAgICAgYXNzZXJ0KCFqWydCWVRFUyBTRU5UJ10pXG4vLyAgICAgICB9KVxuLy8gICAgICAgLm9uKFwiZG9uZVwiLCBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgIGRvbmUoKTtcbi8vICAgICAgIH0pO1xuLy8gICB9KTtcbi8vICAgaXQoXCJzaG91bGQgYWxsb3cgaGVhZGVycyBhbmQgaW5jbHVkZSBjb2x1bW5zIHRvIGJlIGdpdmVuIGFzIHJlZmVyZW5jZSB0byB0aGUgc2FtZSB2YXJcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKF9fZGlybmFtZSArIFwiL2RhdGEvY29tcGxleEpTT05DU1ZcIik7XG4vLyAgICAgdmFyIGhlYWRlcnMgPSBbXG4vLyAgICAgICAnZmlyc3QnLFxuLy8gICAgICAgJ3NlY29uZCcsXG4vLyAgICAgICAndGhpcmQnLFxuLy8gICAgIF07XG5cbi8vICAgICB2YXIgZXhwZWN0ZWQgPSBoZWFkZXJzO1xuXG4vLyAgICAgY3N2KHtcbi8vICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4vLyAgICAgICBpbmNsdWRlQ29sdW1uczogLyhmaXJzdHxzZWNvbmR8dGhpcmQpLyxcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pXG4vLyAgICAgICAuZnJvbVN0cmVhbShycylcbi8vICAgICAgIC5vbihcImhlYWRlclwiLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG4vLyAgICAgICAgIGV4cGVjdGVkLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuLy8gICAgICAgICAgIGFzc2VydC5lcXVhbChoZWFkZXIuaW5kZXhPZih2YWx1ZSksIGluZGV4KTtcbi8vICAgICAgICAgfSk7XG4vLyAgICAgICB9KVxuLy8gICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoaiwgaWR4KSB7XG4vLyAgICAgICAgIGFzc2VydChpZHggPj0gMCk7XG4vLyAgICAgICAgIGFzc2VydC5lcXVhbChleHBlY3RlZC5sZW5ndGgsIE9iamVjdC5rZXlzKGopLmxlbmd0aCk7XG4vLyAgICAgICAgIGV4cGVjdGVkLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZSkge1xuLy8gICAgICAgICAgIGFzc2VydChqLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZSkpO1xuLy8gICAgICAgICB9KTtcbi8vICAgICAgIH0pXG4vLyAgICAgICAub24oXCJkb25lXCIsIGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgZG9uZSgpO1xuLy8gICAgICAgfSk7XG4vLyAgIH0pO1xuXG4vLyAgIGl0KFwic2hvdWxkIGxlYXZlIHByb3ZpZGVkIHBhcmFtcyBvYmplY3RzIHVubXV0YXRlZFwiLCBmdW5jdGlvbigpIHtcbi8vICAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKF9fZGlybmFtZSArIFwiL2RhdGEvY29tcGxleEpTT05DU1ZcIik7XG4vLyAgICAgdmFyIGluY2x1ZGVDb2x1bW5zID0gW1xuLy8gICAgICAgJ2ZpZWxkQS50aXRsZScsXG4vLyAgICAgICAnZGVzY3JpcHRpb24nLFxuLy8gICAgIF07XG5cblxuLy8gICAgIHJldHVybiBjc3Yoe1xuLy8gICAgICAgaW5jbHVkZUNvbHVtbnM6IC8oZmllbGRBXFwudGl0bGV8ZGVzY3JpcHRpb24pLyxcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pXG4vLyAgICAgICAuZnJvbVN0cmVhbShycylcbi8vICAgICAgIC5vbihcImpzb25cIiwgZnVuY3Rpb24oaiwgaWR4KSB7XG4vLyAgICAgICAgIGFzc2VydChpZHggPj0gMCk7XG4vLyAgICAgICB9KVxuLy8gICAgICAgLm9uKFwiaGVhZGVyXCIsIGZ1bmN0aW9uKGhlYWRlcikge1xuLy8gICAgICAgICBpbmNsdWRlQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgpIHtcbi8vICAgICAgICAgICBhc3NlcnQuZXF1YWwoaW5kZXgsIGhlYWRlci5pbmRleE9mKHZhbHVlKSk7XG4vLyAgICAgICAgIH0pO1xuLy8gICAgICAgfSlcbi8vICAgfSk7XG4vLyAgIGl0KFwic2hvdWxkIGFjY2VwdCBwaXBlIGFzIHF1b3RlXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4vLyAgICAgY3N2KHtcbi8vICAgICAgIHF1b3RlOiBcInxcIixcbi8vICAgICAgIG91dHB1dDogXCJjc3ZcIixcbi8vICAgICAgIFwiZm9ya1wiOnRydWVcbi8vICAgICB9KVxuLy8gICAgICAgLmZyb21GaWxlKF9fZGlybmFtZSArIFwiL2RhdGEvcGlwZUFzUXVvdGVcIilcbi8vICAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKGNzdikge1xuLy8gICAgICAgICBhc3NlcnQuZXF1YWwoY3N2WzJdLCBcImJsYWhoaCwgYmxhaFwiKTtcbi8vICAgICAgIH0pXG4vLyAgICAgICAub24oJ2RvbmUnLCBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgIGRvbmUoKVxuLy8gICAgICAgfSk7XG4vLyAgIH0pXG4vLyAgIGl0KFwic2hvdWxkIGFsbG93IGFzeW5jIHN1YnNjcmliZSBmdW5jdGlvblwiLCAoKSA9PiB7XG4vLyAgICAgcmV0dXJuIGNzdih7IHRyaW06IHRydWUsZm9yazp0cnVlIH0pXG4vLyAgICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbi8vICAgICAxLDIsM1xuLy8gICAgIDQsNSw2YClcbi8vICAgICAgIC5zdWJzY3JpYmUoKGQpID0+IHtcbi8vICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbi8vICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbi8vICAgICAgICAgICAgIGQuYSA9IDEwO1xuLy8gICAgICAgICAgICAgcmVzb2x2ZSgpO1xuLy8gICAgICAgICAgIH0sIDIwKTtcbi8vICAgICAgICAgfSlcbi8vICAgICAgIH0pXG4vLyAgICAgICAudGhlbigoZCkgPT4ge1xuLy8gICAgICAgICBhc3NlcnQuZXF1YWwoZFswXS5hLCAxMCk7XG4vLyAgICAgICAgIGFzc2VydC5lcXVhbChkWzFdLmEsIDEwKTtcbi8vICAgICAgIH0pXG4vLyAgIH0pXG4vLyAgIGl0KFwic2hvdWxkIG9taXQgYSBjb2x1bW5cIiwgKCkgPT4ge1xuLy8gICAgIHJldHVybiBjc3Yoe1xuLy8gICAgICAgY29sUGFyc2VyOiB7XG4vLyAgICAgICAgIFwiYVwiOiBcIm9taXRcIlxuLy8gICAgICAgfSxcbi8vICAgICAgIGZvcms6dHJ1ZVxuLy8gICAgIH0pXG4vLyAgICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbi8vICAgMSwyLDNcbi8vICAgZmVmZSw1LDZgKVxuLy8gICAgICAgLnRoZW4oKGQpID0+IHtcbi8vICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRbMF0uYSwgdW5kZWZpbmVkKTtcbi8vICAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMV0uYSwgdW5kZWZpbmVkKTtcbi8vICAgICAgIH0pXG4vLyAgIH0pXG4gIFxuLy8gfSk7XG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/994c8b0ade8061fb63db45ab25baaf68e9e74f24d69965986f1dfd58764d8f18.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/994c8b0ade8061fb63db45ab25baaf68e9e74f24d69965986f1dfd58764d8f18.js new file mode 100644 index 0000000..f9b80d9 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/994c8b0ade8061fb63db45ab25baaf68e9e74f24d69965986f1dfd58764d8f18.js @@ -0,0 +1,223 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var getEol_1 = __importDefault(require("./getEol")); +var util_1 = require("./util"); +var defaulDelimiters = [",", "|", "\t", ";", ":"]; +var RowSplit = /** @class */ (function () { + function RowSplit(conv) { + this.conv = conv; + this.cachedRegExp = {}; + this.delimiterEmitted = false; + this._needEmitDelimiter = undefined; + this.quote = conv.parseParam.quote; + this.trim = conv.parseParam.trim; + this.escape = conv.parseParam.escape; + } + Object.defineProperty(RowSplit.prototype, "needEmitDelimiter", { + get: function () { + if (this._needEmitDelimiter === undefined) { + this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0; + } + return this._needEmitDelimiter; + }, + enumerable: true, + configurable: true + }); + RowSplit.prototype.parse = function (fileline) { + if (fileline.length === 0 || (this.conv.parseParam.ignoreEmpty && fileline.trim().length === 0)) { + return { cells: [], closed: true }; + } + var quote = this.quote; + var trim = this.trim; + var escape = this.escape; + if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") { + this.conv.parseRuntime.delimiter = this.getDelimiter(fileline); + } + if (this.needEmitDelimiter && !this.delimiterEmitted) { + this.conv.emit("delimiter", this.conv.parseRuntime.delimiter); + this.delimiterEmitted = true; + } + var delimiter = this.conv.parseRuntime.delimiter; + var rowArr = fileline.split(delimiter); + if (quote === "off") { + if (trim) { + for (var i = 0; i < rowArr.length; i++) { + rowArr[i] = rowArr[i].trim(); + } + } + return { cells: rowArr, closed: true }; + } + else { + return this.toCSVRow(rowArr, trim, quote, delimiter); + } + }; + RowSplit.prototype.toCSVRow = function (rowArr, trim, quote, delimiter) { + var row = []; + var inquote = false; + var quoteBuff = ''; + for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) { + var e = rowArr[i]; + if (!inquote && trim) { + e = util_1.trimLeft(e); + } + var len = e.length; + if (!inquote) { + if (len === 2 && e === this.quote + this.quote) { + row.push(""); + continue; + } + else if (this.isQuoteOpen(e)) { //quote open + e = e.substr(1); + if (this.isQuoteClose(e)) { //quote close + e = e.substring(0, e.lastIndexOf(quote)); + e = this.escapeQuote(e); + row.push(e); + continue; + } + else if (e.indexOf(quote) !== -1) { + var count = 0; + for (var _i = 0, e_1 = e; _i < e_1.length; _i++) { + var c = e_1[_i]; + if (c === quote) { + count++; + } + } + if (count % 2 === 1) { + if (trim) { + e = util_1.trimRight(e); + } + row.push(quote + e); + continue; + } + else { + inquote = true; + quoteBuff += e; + continue; + } + } + else { + inquote = true; + quoteBuff += e; + continue; + } + } + else { + if (trim) { + e = util_1.trimRight(e); + } + row.push(e); + continue; + } + } + else { //previous quote not closed + if (this.isQuoteClose(e)) { //close double quote + inquote = false; + e = e.substr(0, len - 1); + quoteBuff += delimiter + e; + quoteBuff = this.escapeQuote(quoteBuff); + if (trim) { + quoteBuff = util_1.trimRight(quoteBuff); + } + row.push(quoteBuff); + quoteBuff = ""; + } + else { + quoteBuff += delimiter + e; + } + } + } + // if (!inquote && param._needFilterRow) { + // row = filterRow(row, param); + // } + return { cells: row, closed: !inquote }; + }; + RowSplit.prototype.getDelimiter = function (fileline) { + var checker; + if (this.conv.parseParam.delimiter === "auto") { + checker = defaulDelimiters; + } + else if (this.conv.parseParam.delimiter instanceof Array) { + checker = this.conv.parseParam.delimiter; + } + else { + return this.conv.parseParam.delimiter; + } + var count = 0; + var rtn = ","; + checker.forEach(function (delim) { + var delimCount = fileline.split(delim).length; + if (delimCount > count) { + rtn = delim; + count = delimCount; + } + }); + return rtn; + }; + RowSplit.prototype.isQuoteOpen = function (str) { + var quote = this.quote; + var escape = this.escape; + return str[0] === quote && (str[1] !== quote || + str[1] === escape && (str[2] === quote || str.length === 2)); + }; + RowSplit.prototype.isQuoteClose = function (str) { + var quote = this.quote; + var escape = this.escape; + if (this.conv.parseParam.trim) { + str = util_1.trimRight(str); + } + var count = 0; + var idx = str.length - 1; + while (str[idx] === quote || str[idx] === escape) { + idx--; + count++; + } + return count % 2 !== 0; + }; + // private twoDoubleQuote(str: string): string { + // var twoQuote = this.quote + this.quote; + // var curIndex = -1; + // while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) { + // str = str.substring(0, curIndex) + str.substring(++curIndex); + // } + // return str; + // } + RowSplit.prototype.escapeQuote = function (segment) { + var key = "es|" + this.quote + "|" + this.escape; + if (this.cachedRegExp[key] === undefined) { + this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g'); + } + var regExp = this.cachedRegExp[key]; + // console.log(regExp,segment); + return segment.replace(regExp, this.quote); + }; + RowSplit.prototype.parseMultiLines = function (lines) { + var csvLines = []; + var left = ""; + while (lines.length) { + var line = left + lines.shift(); + var row = this.parse(line); + if (row.cells.length === 0 && this.conv.parseParam.ignoreEmpty) { + continue; + } + if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) { + if (this.conv.parseRuntime.selectedColumns) { + csvLines.push(util_1.filterArray(row.cells, this.conv.parseRuntime.selectedColumns)); + } + else { + csvLines.push(row.cells); + } + left = ""; + } + else { + left = line + (getEol_1.default(line, this.conv.parseRuntime) || "\n"); + } + } + return { rowsCells: csvLines, partial: left }; + }; + return RowSplit; +}()); +exports.RowSplit = RowSplit; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9yb3dTcGxpdC50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9yb3dTcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLG9EQUE4QjtBQUM5QiwrQkFBMEQ7QUFFMUQsSUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwRDtJQWFFLGtCQUFvQixJQUFlO1FBQWYsU0FBSSxHQUFKLElBQUksQ0FBVztRQVQzQixpQkFBWSxHQUE4QixFQUFFLENBQUM7UUFDN0MscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHVCQUFrQixHQUFhLFNBQVMsQ0FBQztRQVEvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBVkQsc0JBQVksdUNBQWlCO2FBQTdCO1lBQ0UsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFO2dCQUN6QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUN2RTtZQUNELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQ2pDLENBQUM7OztPQUFBO0lBTUQsd0JBQUssR0FBTCxVQUFNLFFBQWtCO1FBQ3RCLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtZQUMvRixPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDcEM7UUFDRCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsWUFBWSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtZQUNsSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUVoRTtRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBQ0QsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQ25ELElBQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLEtBQUssS0FBSyxFQUFFO1lBQ25CLElBQUksSUFBSSxFQUFFO2dCQUNSLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUM5QjthQUNGO1lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3hDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDdEQ7SUFFSCxDQUFDO0lBQ08sMkJBQVEsR0FBaEIsVUFBaUIsTUFBZ0IsRUFBRSxJQUFhLEVBQUUsS0FBYSxFQUFFLFNBQWlCO1FBQ2hGLElBQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkQsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO2dCQUNwQixDQUFDLEdBQUcsZUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pCO1lBQ0QsSUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNiLFNBQVM7aUJBQ1Y7cUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsWUFBWTtvQkFDNUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLGFBQWE7d0JBQ3ZDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3pDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNaLFNBQVM7cUJBQ1Y7eUJBQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQ2QsS0FBZ0IsVUFBQyxFQUFELE9BQUMsRUFBRCxlQUFDLEVBQUQsSUFBQzs0QkFBWixJQUFNLENBQUMsVUFBQTs0QkFDVixJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0NBQ2YsS0FBSyxFQUFFLENBQUM7NkJBQ1Q7eUJBQ0Y7d0JBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDbkIsSUFBSSxJQUFJLEVBQUU7Z0NBQ1IsQ0FBQyxHQUFHLGdCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2xCOzRCQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDOzRCQUNwQixTQUFTO3lCQUNWOzZCQUFJOzRCQUNILE9BQU8sR0FBRyxJQUFJLENBQUM7NEJBQ2YsU0FBUyxJQUFJLENBQUMsQ0FBQzs0QkFDZixTQUFTO3lCQUNWO3FCQUNGO3lCQUNJO3dCQUNILE9BQU8sR0FBRyxJQUFJLENBQUM7d0JBQ2YsU0FBUyxJQUFJLENBQUMsQ0FBQzt3QkFDZixTQUFTO3FCQUNWO2lCQUNGO3FCQUFNO29CQUNMLElBQUksSUFBSSxFQUFFO3dCQUNSLENBQUMsR0FBRyxnQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNsQjtvQkFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNaLFNBQVM7aUJBQ1Y7YUFDRjtpQkFBTSxFQUFFLDJCQUEyQjtnQkFDbEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsb0JBQW9CO29CQUM5QyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUNoQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN6QixTQUFTLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDM0IsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hDLElBQUksSUFBSSxFQUFFO3dCQUNSLFNBQVMsR0FBRyxnQkFBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUNsQztvQkFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNwQixTQUFTLEdBQUcsRUFBRSxDQUFDO2lCQUNoQjtxQkFBTTtvQkFDTCxTQUFTLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztpQkFDNUI7YUFDRjtTQUNGO1FBRUQsMENBQTBDO1FBQzFDLGlDQUFpQztRQUNqQyxJQUFJO1FBRUosT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUNPLCtCQUFZLEdBQXBCLFVBQXFCLFFBQWtCO1FBQ3JDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFO1lBQzdDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztTQUM1QjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxZQUFZLEtBQUssRUFBRTtZQUMxRCxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1NBQzFDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztTQUN2QztRQUNELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNkLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLO1lBQzdCLElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2hELElBQUksVUFBVSxHQUFHLEtBQUssRUFBRTtnQkFDdEIsR0FBRyxHQUFHLEtBQUssQ0FBQztnQkFDWixLQUFLLEdBQUcsVUFBVSxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFDTyw4QkFBVyxHQUFuQixVQUFvQixHQUFXO1FBQzdCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FDekIsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUs7WUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDTywrQkFBWSxHQUFwQixVQUFxQixHQUFXO1FBQzlCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUM3QixHQUFHLEdBQUcsZ0JBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxFQUFFO1lBQ2hELEdBQUcsRUFBRSxDQUFDO1lBQ04sS0FBSyxFQUFFLENBQUM7U0FDVDtRQUNELE9BQU8sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCw0Q0FBNEM7SUFDNUMsdUJBQXVCO0lBQ3ZCLGdFQUFnRTtJQUNoRSxvRUFBb0U7SUFDcEUsTUFBTTtJQUNOLGdCQUFnQjtJQUNoQixJQUFJO0lBR0ksOEJBQVcsR0FBbkIsVUFBb0IsT0FBZTtRQUNqQyxJQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDbEY7UUFDRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLCtCQUErQjtRQUMvQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0Qsa0NBQWUsR0FBZixVQUFnQixLQUFpQjtRQUMvQixJQUFNLFFBQVEsR0FBZSxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ25CLElBQU0sSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlELFNBQVM7YUFDVjtZQUNELElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUU7b0JBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7aUJBQy9FO3FCQUFNO29CQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMxQjtnQkFFRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2FBQ1g7aUJBQU07Z0JBQ0wsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLGdCQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7YUFDOUQ7U0FDRjtRQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBQ0gsZUFBQztBQUFELENBQUMsQUE5TUQsSUE4TUM7QUE5TVksNEJBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDU1ZQYXJzZVBhcmFtIH0gZnJvbSBcIi4vUGFyYW1ldGVyc1wiO1xuaW1wb3J0IHsgQ29udmVydGVyIH0gZnJvbSBcIi4vQ29udmVydGVyXCI7XG5pbXBvcnQgeyBGaWxlbGluZSB9IGZyb20gXCIuL2ZpbGVsaW5lXCI7XG5pbXBvcnQgZ2V0RW9sIGZyb20gXCIuL2dldEVvbFwiO1xuaW1wb3J0IHsgZmlsdGVyQXJyYXksIHRyaW1MZWZ0LCB0cmltUmlnaHQgfSBmcm9tIFwiLi91dGlsXCI7XG5cbmNvbnN0IGRlZmF1bERlbGltaXRlcnMgPSBbXCIsXCIsIFwifFwiLCBcIlxcdFwiLCBcIjtcIiwgXCI6XCJdO1xuZXhwb3J0IGNsYXNzIFJvd1NwbGl0IHtcbiAgcHJpdmF0ZSBxdW90ZTogc3RyaW5nO1xuICBwcml2YXRlIHRyaW06IGJvb2xlYW47XG4gIHByaXZhdGUgZXNjYXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgY2FjaGVkUmVnRXhwOiB7IFtrZXk6IHN0cmluZ106IFJlZ0V4cCB9ID0ge307XG4gIHByaXZhdGUgZGVsaW1pdGVyRW1pdHRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9uZWVkRW1pdERlbGltaXRlcj86IGJvb2xlYW4gPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZ2V0IG5lZWRFbWl0RGVsaW1pdGVyKCkge1xuICAgIGlmICh0aGlzLl9uZWVkRW1pdERlbGltaXRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9uZWVkRW1pdERlbGltaXRlciA9IHRoaXMuY29udi5saXN0ZW5lcnMoXCJkZWxpbWl0ZXJcIikubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX25lZWRFbWl0RGVsaW1pdGVyO1xuICB9XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29udjogQ29udmVydGVyKSB7XG4gICAgdGhpcy5xdW90ZSA9IGNvbnYucGFyc2VQYXJhbS5xdW90ZTtcbiAgICB0aGlzLnRyaW0gPSBjb252LnBhcnNlUGFyYW0udHJpbTtcbiAgICB0aGlzLmVzY2FwZSA9IGNvbnYucGFyc2VQYXJhbS5lc2NhcGU7XG4gIH1cbiAgcGFyc2UoZmlsZWxpbmU6IEZpbGVsaW5lKTogUm93U3BsaXRSZXN1bHQge1xuICAgIGlmIChmaWxlbGluZS5sZW5ndGggPT09IDAgfHwgKHRoaXMuY29udi5wYXJzZVBhcmFtLmlnbm9yZUVtcHR5ICYmIGZpbGVsaW5lLnRyaW0oKS5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm4geyBjZWxsczogW10sIGNsb3NlZDogdHJ1ZSB9O1xuICAgIH1cbiAgICBjb25zdCBxdW90ZSA9IHRoaXMucXVvdGU7XG4gICAgY29uc3QgdHJpbSA9IHRoaXMudHJpbTtcbiAgICBjb25zdCBlc2NhcGUgPSB0aGlzLmVzY2FwZTtcbiAgICBpZiAodGhpcy5jb252LnBhcnNlUnVudGltZS5kZWxpbWl0ZXIgaW5zdGFuY2VvZiBBcnJheSB8fCB0aGlzLmNvbnYucGFyc2VSdW50aW1lLmRlbGltaXRlci50b0xvd2VyQ2FzZSgpID09PSBcImF1dG9cIikge1xuICAgICAgdGhpcy5jb252LnBhcnNlUnVudGltZS5kZWxpbWl0ZXIgPSB0aGlzLmdldERlbGltaXRlcihmaWxlbGluZSk7XG5cbiAgICB9XG4gICAgaWYgKHRoaXMubmVlZEVtaXREZWxpbWl0ZXIgJiYgIXRoaXMuZGVsaW1pdGVyRW1pdHRlZCkge1xuICAgICAgdGhpcy5jb252LmVtaXQoXCJkZWxpbWl0ZXJcIiwgdGhpcy5jb252LnBhcnNlUnVudGltZS5kZWxpbWl0ZXIpO1xuICAgICAgdGhpcy5kZWxpbWl0ZXJFbWl0dGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5jb252LnBhcnNlUnVudGltZS5kZWxpbWl0ZXI7XG4gICAgY29uc3Qgcm93QXJyID0gZmlsZWxpbmUuc3BsaXQoZGVsaW1pdGVyKTtcbiAgICBpZiAocXVvdGUgPT09IFwib2ZmXCIpIHtcbiAgICAgIGlmICh0cmltKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93QXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcm93QXJyW2ldID0gcm93QXJyW2ldLnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgY2VsbHM6IHJvd0FyciwgY2xvc2VkOiB0cnVlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQ1NWUm93KHJvd0FyciwgdHJpbSwgcXVvdGUsIGRlbGltaXRlcik7XG4gICAgfVxuXG4gIH1cbiAgcHJpdmF0ZSB0b0NTVlJvdyhyb3dBcnI6IHN0cmluZ1tdLCB0cmltOiBib29sZWFuLCBxdW90ZTogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZyk6IFJvd1NwbGl0UmVzdWx0IHtcbiAgICBjb25zdCByb3c6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGlucXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgcXVvdGVCdWZmID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIHJvd0xlbiA9IHJvd0Fyci5sZW5ndGg7IGkgPCByb3dMZW47IGkrKykge1xuICAgICAgbGV0IGUgPSByb3dBcnJbaV07XG4gICAgICBpZiAoIWlucXVvdGUgJiYgdHJpbSkge1xuICAgICAgICBlID0gdHJpbUxlZnQoZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsZW4gPSBlLmxlbmd0aDtcbiAgICAgIGlmICghaW5xdW90ZSkge1xuICAgICAgICBpZiAobGVuID09PSAyICYmIGUgPT09IHRoaXMucXVvdGUgKyB0aGlzLnF1b3RlKSB7XG4gICAgICAgICAgcm93LnB1c2goXCJcIik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1F1b3RlT3BlbihlKSkgeyAvL3F1b3RlIG9wZW5cbiAgICAgICAgICBlID0gZS5zdWJzdHIoMSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNRdW90ZUNsb3NlKGUpKSB7IC8vcXVvdGUgY2xvc2VcbiAgICAgICAgICAgIGUgPSBlLnN1YnN0cmluZygwLCBlLmxhc3RJbmRleE9mKHF1b3RlKSk7XG4gICAgICAgICAgICBlID0gdGhpcy5lc2NhcGVRdW90ZShlKTtcbiAgICAgICAgICAgIHJvdy5wdXNoKGUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfSBlbHNlIGlmIChlLmluZGV4T2YocXVvdGUpICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBlKSB7XG4gICAgICAgICAgICAgIGlmIChjID09PSBxdW90ZSkge1xuICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb3VudCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICAgaWYgKHRyaW0pIHtcbiAgICAgICAgICAgICAgICBlID0gdHJpbVJpZ2h0KGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJvdy5wdXNoKHF1b3RlICsgZSk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgIGlucXVvdGUgPSB0cnVlO1xuICAgICAgICAgICAgICBxdW90ZUJ1ZmYgKz0gZTtcbiAgICAgICAgICAgICAgY29udGludWU7ICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbnF1b3RlID0gdHJ1ZTtcbiAgICAgICAgICAgIHF1b3RlQnVmZiArPSBlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0cmltKSB7XG4gICAgICAgICAgICBlID0gdHJpbVJpZ2h0KGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByb3cucHVzaChlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy9wcmV2aW91cyBxdW90ZSBub3QgY2xvc2VkXG4gICAgICAgIGlmICh0aGlzLmlzUXVvdGVDbG9zZShlKSkgeyAvL2Nsb3NlIGRvdWJsZSBxdW90ZVxuICAgICAgICAgIGlucXVvdGUgPSBmYWxzZTtcbiAgICAgICAgICBlID0gZS5zdWJzdHIoMCwgbGVuIC0gMSk7XG4gICAgICAgICAgcXVvdGVCdWZmICs9IGRlbGltaXRlciArIGU7XG4gICAgICAgICAgcXVvdGVCdWZmID0gdGhpcy5lc2NhcGVRdW90ZShxdW90ZUJ1ZmYpO1xuICAgICAgICAgIGlmICh0cmltKSB7XG4gICAgICAgICAgICBxdW90ZUJ1ZmYgPSB0cmltUmlnaHQocXVvdGVCdWZmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93LnB1c2gocXVvdGVCdWZmKTtcbiAgICAgICAgICBxdW90ZUJ1ZmYgPSBcIlwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1b3RlQnVmZiArPSBkZWxpbWl0ZXIgKyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgKCFpbnF1b3RlICYmIHBhcmFtLl9uZWVkRmlsdGVyUm93KSB7XG4gICAgLy8gICByb3cgPSBmaWx0ZXJSb3cocm93LCBwYXJhbSk7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIHsgY2VsbHM6IHJvdywgY2xvc2VkOiAhaW5xdW90ZSB9O1xuICB9XG4gIHByaXZhdGUgZ2V0RGVsaW1pdGVyKGZpbGVsaW5lOiBGaWxlbGluZSk6IHN0cmluZyB7XG4gICAgbGV0IGNoZWNrZXI7XG4gICAgaWYgKHRoaXMuY29udi5wYXJzZVBhcmFtLmRlbGltaXRlciA9PT0gXCJhdXRvXCIpIHtcbiAgICAgIGNoZWNrZXIgPSBkZWZhdWxEZWxpbWl0ZXJzO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb252LnBhcnNlUGFyYW0uZGVsaW1pdGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNoZWNrZXIgPSB0aGlzLmNvbnYucGFyc2VQYXJhbS5kZWxpbWl0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnYucGFyc2VQYXJhbS5kZWxpbWl0ZXI7XG4gICAgfVxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgbGV0IHJ0biA9IFwiLFwiO1xuICAgIGNoZWNrZXIuZm9yRWFjaChmdW5jdGlvbiAoZGVsaW0pIHtcbiAgICAgIGNvbnN0IGRlbGltQ291bnQgPSBmaWxlbGluZS5zcGxpdChkZWxpbSkubGVuZ3RoO1xuICAgICAgaWYgKGRlbGltQ291bnQgPiBjb3VudCkge1xuICAgICAgICBydG4gPSBkZWxpbTtcbiAgICAgICAgY291bnQgPSBkZWxpbUNvdW50O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBydG47XG4gIH1cbiAgcHJpdmF0ZSBpc1F1b3RlT3BlbihzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHF1b3RlID0gdGhpcy5xdW90ZTtcbiAgICBjb25zdCBlc2NhcGUgPSB0aGlzLmVzY2FwZTtcbiAgICByZXR1cm4gc3RyWzBdID09PSBxdW90ZSAmJiAoXG4gICAgICBzdHJbMV0gIT09IHF1b3RlIHx8XG4gICAgICBzdHJbMV0gPT09IGVzY2FwZSAmJiAoc3RyWzJdID09PSBxdW90ZSB8fCBzdHIubGVuZ3RoID09PSAyKSk7XG4gIH1cbiAgcHJpdmF0ZSBpc1F1b3RlQ2xvc2Uoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBxdW90ZSA9IHRoaXMucXVvdGU7XG4gICAgY29uc3QgZXNjYXBlID0gdGhpcy5lc2NhcGU7XG4gICAgaWYgKHRoaXMuY29udi5wYXJzZVBhcmFtLnRyaW0pIHtcbiAgICAgIHN0ciA9IHRyaW1SaWdodChzdHIpO1xuICAgIH1cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBpZHggPSBzdHIubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoc3RyW2lkeF0gPT09IHF1b3RlIHx8IHN0cltpZHhdID09PSBlc2NhcGUpIHtcbiAgICAgIGlkeC0tO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ICUgMiAhPT0gMDtcbiAgfVxuXG4gIC8vIHByaXZhdGUgdHdvRG91YmxlUXVvdGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyAgIHZhciB0d29RdW90ZSA9IHRoaXMucXVvdGUgKyB0aGlzLnF1b3RlO1xuICAvLyAgIHZhciBjdXJJbmRleCA9IC0xO1xuICAvLyAgIHdoaWxlICgoY3VySW5kZXggPSBzdHIuaW5kZXhPZih0d29RdW90ZSwgY3VySW5kZXgpKSA+IC0xKSB7XG4gIC8vICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGN1ckluZGV4KSArIHN0ci5zdWJzdHJpbmcoKytjdXJJbmRleCk7XG4gIC8vICAgfVxuICAvLyAgIHJldHVybiBzdHI7XG4gIC8vIH1cblxuXG4gIHByaXZhdGUgZXNjYXBlUXVvdGUoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXkgPSBcImVzfFwiICsgdGhpcy5xdW90ZSArIFwifFwiICsgdGhpcy5lc2NhcGU7XG4gICAgaWYgKHRoaXMuY2FjaGVkUmVnRXhwW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jYWNoZWRSZWdFeHBba2V5XSA9IG5ldyBSZWdFeHAoJ1xcXFwnICsgdGhpcy5lc2NhcGUgKyAnXFxcXCcgKyB0aGlzLnF1b3RlLCAnZycpO1xuICAgIH1cbiAgICBjb25zdCByZWdFeHAgPSB0aGlzLmNhY2hlZFJlZ0V4cFtrZXldO1xuICAgIC8vIGNvbnNvbGUubG9nKHJlZ0V4cCxzZWdtZW50KTtcbiAgICByZXR1cm4gc2VnbWVudC5yZXBsYWNlKHJlZ0V4cCwgdGhpcy5xdW90ZSk7XG4gIH1cbiAgcGFyc2VNdWx0aUxpbmVzKGxpbmVzOiBGaWxlbGluZVtdKTogTXVsdGlwbGVSb3dSZXN1bHQge1xuICAgIGNvbnN0IGNzdkxpbmVzOiBzdHJpbmdbXVtdID0gW107XG4gICAgbGV0IGxlZnQgPSBcIlwiO1xuICAgIHdoaWxlIChsaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsZWZ0ICsgbGluZXMuc2hpZnQoKTtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMucGFyc2UobGluZSk7XG4gICAgICBpZiAocm93LmNlbGxzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmNvbnYucGFyc2VQYXJhbS5pZ25vcmVFbXB0eSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3cuY2xvc2VkIHx8IHRoaXMuY29udi5wYXJzZVBhcmFtLmFsd2F5c1NwbGl0QXRFT0wpIHtcbiAgICAgICAgaWYgKHRoaXMuY29udi5wYXJzZVJ1bnRpbWUuc2VsZWN0ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgY3N2TGluZXMucHVzaChmaWx0ZXJBcnJheShyb3cuY2VsbHMsIHRoaXMuY29udi5wYXJzZVJ1bnRpbWUuc2VsZWN0ZWRDb2x1bW5zKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3N2TGluZXMucHVzaChyb3cuY2VsbHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVmdCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0ID0gbGluZSArIChnZXRFb2wobGluZSwgdGhpcy5jb252LnBhcnNlUnVudGltZSkgfHwgXCJcXG5cIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJvd3NDZWxsczogY3N2TGluZXMsIHBhcnRpYWw6IGxlZnQgfTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBNdWx0aXBsZVJvd1Jlc3VsdCB7XG4gIHJvd3NDZWxsczogc3RyaW5nW11bXTtcbiAgcGFydGlhbDogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBSb3dTcGxpdFJlc3VsdCB7XG4gIC8qKlxuICAgKiBjc3Ygcm93IGFycmF5LiBbXCJhXCIsXCJiXCIsXCJjXCJdXG4gICAqL1xuICBjZWxsczogc3RyaW5nW10sXG4gIC8qKlxuICAgKiBpZiB0aGUgcGFzc2VkIGZpbGVsaW5lIGlzIGEgY29tcGxldGUgcm93XG4gICAqL1xuICBjbG9zZWQ6IGJvb2xlYW5cbn1cblxuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/9ec1200ff64260596014a889ec30264b6721c20a7144d863993a743b0fd3d45f.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/9ec1200ff64260596014a889ec30264b6721c20a7144d863993a743b0fd3d45f.js new file mode 100644 index 0000000..7adced4 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/9ec1200ff64260596014a889ec30264b6721c20a7144d863993a743b0fd3d45f.js @@ -0,0 +1,164 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var bluebird_1 = __importDefault(require("bluebird")); +var os_1 = require("os"); +var Result = /** @class */ (function () { + function Result(converter) { + this.converter = converter; + this.finalResult = []; + } + Object.defineProperty(Result.prototype, "needEmitLine", { + get: function () { + return !!this.converter.parseRuntime.subscribe && !!this.converter.parseRuntime.subscribe.onNext || this.needPushDownstream; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Result.prototype, "needPushDownstream", { + get: function () { + if (this._needPushDownstream === undefined) { + this._needPushDownstream = this.converter.listeners("data").length > 0 || this.converter.listeners("readable").length > 0; + } + return this._needPushDownstream; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Result.prototype, "needEmitAll", { + get: function () { + return !!this.converter.parseRuntime.then && this.converter.parseParam.needEmitAll; + // return !!this.converter.parseRuntime.then; + }, + enumerable: true, + configurable: true + }); + Result.prototype.processResult = function (resultLines) { + var _this = this; + var startPos = this.converter.parseRuntime.parsedLineNumber; + if (this.needPushDownstream && this.converter.parseParam.downstreamFormat === "array") { + if (startPos === 0) { + pushDownstream(this.converter, "[" + os_1.EOL); + } + } + // let prom: P; + return new bluebird_1.default(function (resolve, reject) { + if (_this.needEmitLine) { + processLineByLine(resultLines, _this.converter, 0, _this.needPushDownstream, function (err) { + if (err) { + reject(err); + } + else { + _this.appendFinalResult(resultLines); + resolve(); + } + }); + // resolve(); + } + else { + _this.appendFinalResult(resultLines); + resolve(); + } + }); + }; + Result.prototype.appendFinalResult = function (lines) { + if (this.needEmitAll) { + this.finalResult = this.finalResult.concat(lines); + } + this.converter.parseRuntime.parsedLineNumber += lines.length; + }; + Result.prototype.processError = function (err) { + if (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onError) { + this.converter.parseRuntime.subscribe.onError(err); + } + if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onrejected) { + this.converter.parseRuntime.then.onrejected(err); + } + }; + Result.prototype.endProcess = function () { + if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onfulfilled) { + if (this.needEmitAll) { + this.converter.parseRuntime.then.onfulfilled(this.finalResult); + } + else { + this.converter.parseRuntime.then.onfulfilled([]); + } + } + if (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onCompleted) { + this.converter.parseRuntime.subscribe.onCompleted(); + } + if (this.needPushDownstream && this.converter.parseParam.downstreamFormat === "array") { + pushDownstream(this.converter, "]" + os_1.EOL); + } + }; + return Result; +}()); +exports.Result = Result; +function processLineByLine(lines, conv, offset, needPushDownstream, cb) { + if (offset >= lines.length) { + cb(); + } + else { + if (conv.parseRuntime.subscribe && conv.parseRuntime.subscribe.onNext) { + var hook_1 = conv.parseRuntime.subscribe.onNext; + var nextLine_1 = lines[offset]; + var res = hook_1(nextLine_1, conv.parseRuntime.parsedLineNumber + offset); + offset++; + // if (isAsync === undefined) { + if (res && res.then) { + res.then(function () { + processRecursive(lines, hook_1, conv, offset, needPushDownstream, cb, nextLine_1); + }, cb); + } + else { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false); + if (needPushDownstream) { + pushDownstream(conv, nextLine_1); + } + while (offset < lines.length) { + var line = lines[offset]; + hook_1(line, conv.parseRuntime.parsedLineNumber + offset); + offset++; + if (needPushDownstream) { + pushDownstream(conv, line); + } + } + cb(); + } + // } else if (isAsync === true) { + // (res as PromiseLike).then(function () { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, true); + // }, cb); + // } else if (isAsync === false) { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false); + // } + } + else { + if (needPushDownstream) { + while (offset < lines.length) { + var line = lines[offset++]; + pushDownstream(conv, line); + } + } + cb(); + } + } +} +function processRecursive(lines, hook, conv, offset, needPushDownstream, cb, res) { + if (needPushDownstream) { + pushDownstream(conv, res); + } + processLineByLine(lines, conv, offset, needPushDownstream, cb); +} +function pushDownstream(conv, res) { + if (typeof res === "object" && !conv.options.objectMode) { + var data = JSON.stringify(res); + conv.push(data + (conv.parseParam.downstreamFormat === "array" ? "," + os_1.EOL : os_1.EOL), "utf8"); + } + else { + conv.push(res); + } +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9SZXN1bHQudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvUmVzdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsc0RBQXlCO0FBRXpCLHlCQUF5QjtBQUN6QjtJQWdCRSxnQkFBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQURoQyxnQkFBVyxHQUFVLEVBQUUsQ0FBQztJQUNZLENBQUM7SUFmN0Msc0JBQVksZ0NBQVk7YUFBeEI7WUFDRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFBO1FBQzdILENBQUM7OztPQUFBO0lBRUQsc0JBQVksc0NBQWtCO2FBQTlCO1lBQ0UsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUyxFQUFFO2dCQUMxQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQzNIO1lBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDbEMsQ0FBQzs7O09BQUE7SUFDRCxzQkFBWSwrQkFBVzthQUF2QjtZQUNFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDbkYsNkNBQTZDO1FBQy9DLENBQUM7OztPQUFBO0lBR0QsOEJBQWEsR0FBYixVQUFjLFdBQWdDO1FBQTlDLGlCQThCQztRQTdCQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsS0FBSyxPQUFPLEVBQUU7WUFDckYsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsUUFBRyxDQUFDLENBQUM7YUFDM0M7U0FDRjtRQUNELG9CQUFvQjtRQUNwQixPQUFPLElBQUksa0JBQUMsQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQzNCLElBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDckIsaUJBQWlCLENBQ2YsV0FBVyxFQUNYLEtBQUksQ0FBQyxTQUFTLEVBQ2QsQ0FBQyxFQUNELEtBQUksQ0FBQyxrQkFBa0IsRUFDdkIsVUFBQyxHQUFHO29CQUNGLElBQUksR0FBRyxFQUFFO3dCQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDYjt5QkFBTTt3QkFDTCxLQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ3BDLE9BQU8sRUFBRSxDQUFDO3FCQUNYO2dCQUNILENBQUMsQ0FDRixDQUFBO2dCQUNELGFBQWE7YUFDZDtpQkFBTTtnQkFDTCxLQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3BDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxrQ0FBaUIsR0FBakIsVUFBa0IsS0FBWTtRQUM1QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDL0QsQ0FBQztJQUNELDZCQUFZLEdBQVosVUFBYSxHQUFhO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDMUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwRDtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFDRCwyQkFBVSxHQUFWO1FBRUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwRixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2hFO2lCQUFJO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDbEQ7U0FDRjtRQUNILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7WUFDOUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEtBQUssT0FBTyxFQUFFO1lBQ3JGLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsR0FBRyxRQUFHLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFDSCxhQUFDO0FBQUQsQ0FBQyxBQTlFRCxJQThFQztBQTlFWSx3QkFBTTtBQWdGbkIsMkJBQ0UsS0FBMEIsRUFFMUIsSUFBZSxFQUNmLE1BQWMsRUFDZCxrQkFBMkIsRUFDM0IsRUFBa0I7SUFFbEIsSUFBSSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUMxQixFQUFFLEVBQUUsQ0FBQztLQUNOO1NBQU07UUFDTCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUNyRSxJQUFNLE1BQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDaEQsSUFBTSxVQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLElBQU0sR0FBRyxHQUFHLE1BQUksQ0FBQyxVQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsQ0FBQztZQUN4RSxNQUFNLEVBQUUsQ0FBQztZQUNULCtCQUErQjtZQUMvQixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFO2dCQUNuQixHQUFHLENBQUMsSUFBSSxDQUFDO29CQUNQLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsVUFBUSxDQUFDLENBQUM7Z0JBQ2hGLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNSO2lCQUFNO2dCQUNMLHdGQUF3RjtnQkFDeEYsSUFBSSxrQkFBa0IsRUFBRTtvQkFDdEIsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFRLENBQUMsQ0FBQztpQkFDaEM7Z0JBQ0QsT0FBTyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDNUIsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMzQixNQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUM7b0JBQ3hELE1BQU0sRUFBRSxDQUFDO29CQUNULElBQUksa0JBQWtCLEVBQUU7d0JBQ3RCLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQzVCO2lCQUNGO2dCQUNELEVBQUUsRUFBRSxDQUFDO2FBQ047WUFDRCxpQ0FBaUM7WUFDakMsa0RBQWtEO1lBQ2xELDJGQUEyRjtZQUMzRixZQUFZO1lBQ1osa0NBQWtDO1lBQ2xDLDBGQUEwRjtZQUMxRixJQUFJO1NBQ0w7YUFBTTtZQUNMLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3RCLE9BQU8sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQzVCLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO29CQUM3QixjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUM1QjthQUVGO1lBQ0QsRUFBRSxFQUFFLENBQUM7U0FDTjtLQUVGO0FBQ0gsQ0FBQztBQUVELDBCQUNFLEtBQTBCLEVBQzFCLElBQWlFLEVBQ2pFLElBQWUsRUFDZixNQUFjLEVBQ2Qsa0JBQTJCLEVBQzNCLEVBQWtCLEVBQ2xCLEdBQXNCO0lBRXRCLElBQUksa0JBQWtCLEVBQUU7UUFDdEIsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztLQUMzQjtJQUNELGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCx3QkFBd0IsSUFBZSxFQUFFLEdBQXNCO0lBQzdELElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7UUFDdkQsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsUUFBRyxDQUFDLENBQUMsQ0FBQyxRQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUM1RjtTQUFNO1FBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNoQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb252ZXJ0ZXIgfSBmcm9tIFwiLi9Db252ZXJ0ZXJcIjtcbmltcG9ydCB7IFByb2Nlc3NMaW5lUmVzdWx0IH0gZnJvbSBcIi4vUHJvY2Vzc29yXCI7XG5pbXBvcnQgUCBmcm9tIFwiYmx1ZWJpcmRcIjtcbmltcG9ydCBDU1ZFcnJvciBmcm9tIFwiLi9DU1ZFcnJvclwiO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSBcIm9zXCI7XG5leHBvcnQgY2xhc3MgUmVzdWx0IHtcbiAgcHJpdmF0ZSBnZXQgbmVlZEVtaXRMaW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29udmVydGVyLnBhcnNlUnVudGltZS5zdWJzY3JpYmUgJiYgISF0aGlzLmNvbnZlcnRlci5wYXJzZVJ1bnRpbWUuc3Vic2NyaWJlLm9uTmV4dCB8fCB0aGlzLm5lZWRQdXNoRG93bnN0cmVhbVxuICB9XG4gIHByaXZhdGUgX25lZWRQdXNoRG93bnN0cmVhbT86IGJvb2xlYW47XG4gIHByaXZhdGUgZ2V0IG5lZWRQdXNoRG93bnN0cmVhbSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fbmVlZFB1c2hEb3duc3RyZWFtID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX25lZWRQdXNoRG93bnN0cmVhbSA9IHRoaXMuY29udmVydGVyLmxpc3RlbmVycyhcImRhdGFcIikubGVuZ3RoID4gMCB8fCB0aGlzLmNvbnZlcnRlci5saXN0ZW5lcnMoXCJyZWFkYWJsZVwiKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbmVlZFB1c2hEb3duc3RyZWFtO1xuICB9XG4gIHByaXZhdGUgZ2V0IG5lZWRFbWl0QWxsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29udmVydGVyLnBhcnNlUnVudGltZS50aGVuICYmIHRoaXMuY29udmVydGVyLnBhcnNlUGFyYW0ubmVlZEVtaXRBbGw7XG4gICAgLy8gcmV0dXJuICEhdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnRoZW47XG4gIH1cbiAgcHJpdmF0ZSBmaW5hbFJlc3VsdDogYW55W10gPSBbXTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb252ZXJ0ZXI6IENvbnZlcnRlcikgeyB9XG4gIHByb2Nlc3NSZXN1bHQocmVzdWx0TGluZXM6IFByb2Nlc3NMaW5lUmVzdWx0W10pOiBQPGFueT4ge1xuICAgIGNvbnN0IHN0YXJ0UG9zID0gdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnBhcnNlZExpbmVOdW1iZXI7XG4gICAgaWYgKHRoaXMubmVlZFB1c2hEb3duc3RyZWFtICYmIHRoaXMuY29udmVydGVyLnBhcnNlUGFyYW0uZG93bnN0cmVhbUZvcm1hdCA9PT0gXCJhcnJheVwiKSB7XG4gICAgICBpZiAoc3RhcnRQb3MgPT09IDApIHtcbiAgICAgICAgcHVzaERvd25zdHJlYW0odGhpcy5jb252ZXJ0ZXIsIFwiW1wiICsgRU9MKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbGV0IHByb206IFA8YW55PjtcbiAgICByZXR1cm4gbmV3IFAoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmVlZEVtaXRMaW5lKSB7XG4gICAgICAgIHByb2Nlc3NMaW5lQnlMaW5lKFxuICAgICAgICAgIHJlc3VsdExpbmVzLFxuICAgICAgICAgIHRoaXMuY29udmVydGVyLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgdGhpcy5uZWVkUHVzaERvd25zdHJlYW0sXG4gICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYXBwZW5kRmluYWxSZXN1bHQocmVzdWx0TGluZXMpO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICAvLyByZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwcGVuZEZpbmFsUmVzdWx0KHJlc3VsdExpbmVzKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgYXBwZW5kRmluYWxSZXN1bHQobGluZXM6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMubmVlZEVtaXRBbGwpIHtcbiAgICAgIHRoaXMuZmluYWxSZXN1bHQgPSB0aGlzLmZpbmFsUmVzdWx0LmNvbmNhdChsaW5lcyk7XG4gICAgfVxuICAgIHRoaXMuY29udmVydGVyLnBhcnNlUnVudGltZS5wYXJzZWRMaW5lTnVtYmVyICs9IGxpbmVzLmxlbmd0aDtcbiAgfVxuICBwcm9jZXNzRXJyb3IoZXJyOiBDU1ZFcnJvcikge1xuICAgIGlmICh0aGlzLmNvbnZlcnRlci5wYXJzZVJ1bnRpbWUuc3Vic2NyaWJlICYmIHRoaXMuY29udmVydGVyLnBhcnNlUnVudGltZS5zdWJzY3JpYmUub25FcnJvcikge1xuICAgICAgdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnN1YnNjcmliZS5vbkVycm9yKGVycik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnZlcnRlci5wYXJzZVJ1bnRpbWUudGhlbiAmJiB0aGlzLmNvbnZlcnRlci5wYXJzZVJ1bnRpbWUudGhlbi5vbnJlamVjdGVkKSB7XG4gICAgICB0aGlzLmNvbnZlcnRlci5wYXJzZVJ1bnRpbWUudGhlbi5vbnJlamVjdGVkKGVycik7XG4gICAgfVxuICB9XG4gIGVuZFByb2Nlc3MoKSB7XG4gICAgXG4gICAgICBpZiAodGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnRoZW4gJiYgdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnRoZW4ub25mdWxmaWxsZWQpIHtcbiAgICAgICAgaWYgKHRoaXMubmVlZEVtaXRBbGwpIHtcbiAgICAgICAgICB0aGlzLmNvbnZlcnRlci5wYXJzZVJ1bnRpbWUudGhlbi5vbmZ1bGZpbGxlZCh0aGlzLmZpbmFsUmVzdWx0KTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnRoZW4ub25mdWxmaWxsZWQoW10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgaWYgKHRoaXMuY29udmVydGVyLnBhcnNlUnVudGltZS5zdWJzY3JpYmUgJiYgdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnN1YnNjcmliZS5vbkNvbXBsZXRlZCkge1xuICAgICAgdGhpcy5jb252ZXJ0ZXIucGFyc2VSdW50aW1lLnN1YnNjcmliZS5vbkNvbXBsZXRlZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWVkUHVzaERvd25zdHJlYW0gJiYgdGhpcy5jb252ZXJ0ZXIucGFyc2VQYXJhbS5kb3duc3RyZWFtRm9ybWF0ID09PSBcImFycmF5XCIpIHtcbiAgICAgIHB1c2hEb3duc3RyZWFtKHRoaXMuY29udmVydGVyLCBcIl1cIiArIEVPTCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NMaW5lQnlMaW5lKFxuICBsaW5lczogUHJvY2Vzc0xpbmVSZXN1bHRbXSxcblxuICBjb252OiBDb252ZXJ0ZXIsXG4gIG9mZnNldDogbnVtYmVyLFxuICBuZWVkUHVzaERvd25zdHJlYW06IGJvb2xlYW4sXG4gIGNiOiAoZXJyPykgPT4gdm9pZCxcbikge1xuICBpZiAob2Zmc2V0ID49IGxpbmVzLmxlbmd0aCkge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbnYucGFyc2VSdW50aW1lLnN1YnNjcmliZSAmJiBjb252LnBhcnNlUnVudGltZS5zdWJzY3JpYmUub25OZXh0KSB7XG4gICAgICBjb25zdCBob29rID0gY29udi5wYXJzZVJ1bnRpbWUuc3Vic2NyaWJlLm9uTmV4dDtcbiAgICAgIGNvbnN0IG5leHRMaW5lID0gbGluZXNbb2Zmc2V0XTtcbiAgICAgIGNvbnN0IHJlcyA9IGhvb2sobmV4dExpbmUsIGNvbnYucGFyc2VSdW50aW1lLnBhcnNlZExpbmVOdW1iZXIgKyBvZmZzZXQpO1xuICAgICAgb2Zmc2V0Kys7XG4gICAgICAvLyBpZiAoaXNBc3luYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocmVzICYmIHJlcy50aGVuKSB7XG4gICAgICAgIHJlcy50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwcm9jZXNzUmVjdXJzaXZlKGxpbmVzLCBob29rLCBjb252LCBvZmZzZXQsIG5lZWRQdXNoRG93bnN0cmVhbSwgY2IsIG5leHRMaW5lKTtcbiAgICAgICAgfSwgY2IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJvY2Vzc1JlY3Vyc2l2ZShsaW5lcywgaG9vaywgY29udiwgb2Zmc2V0LCBuZWVkUHVzaERvd25zdHJlYW0sIGNiLCBuZXh0TGluZSwgZmFsc2UpO1xuICAgICAgICBpZiAobmVlZFB1c2hEb3duc3RyZWFtKSB7XG4gICAgICAgICAgcHVzaERvd25zdHJlYW0oY29udiwgbmV4dExpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChvZmZzZXQgPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbb2Zmc2V0XTtcbiAgICAgICAgICBob29rKGxpbmUsIGNvbnYucGFyc2VSdW50aW1lLnBhcnNlZExpbmVOdW1iZXIgKyBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCsrO1xuICAgICAgICAgIGlmIChuZWVkUHVzaERvd25zdHJlYW0pIHtcbiAgICAgICAgICAgIHB1c2hEb3duc3RyZWFtKGNvbnYsIGxpbmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYigpO1xuICAgICAgfVxuICAgICAgLy8gfSBlbHNlIGlmIChpc0FzeW5jID09PSB0cnVlKSB7XG4gICAgICAvLyAgIChyZXMgYXMgUHJvbWlzZUxpa2U8dm9pZD4pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gICAgIHByb2Nlc3NSZWN1cnNpdmUobGluZXMsIGhvb2ssIGNvbnYsIG9mZnNldCwgbmVlZFB1c2hEb3duc3RyZWFtLCBjYiwgbmV4dExpbmUsIHRydWUpO1xuICAgICAgLy8gICB9LCBjYik7XG4gICAgICAvLyB9IGVsc2UgaWYgKGlzQXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAvLyAgIHByb2Nlc3NSZWN1cnNpdmUobGluZXMsIGhvb2ssIGNvbnYsIG9mZnNldCwgbmVlZFB1c2hEb3duc3RyZWFtLCBjYiwgbmV4dExpbmUsIGZhbHNlKTtcbiAgICAgIC8vIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZWRQdXNoRG93bnN0cmVhbSkge1xuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW29mZnNldCsrXTtcbiAgICAgICAgICBwdXNoRG93bnN0cmVhbShjb252LCBsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgICBjYigpO1xuICAgIH1cblxuICB9XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSZWN1cnNpdmUoXG4gIGxpbmVzOiBQcm9jZXNzTGluZVJlc3VsdFtdLFxuICBob29rOiAoZGF0YTogYW55LCBsaW5lTnVtYmVyOiBudW1iZXIpID0+IHZvaWQgfCBQcm9taXNlTGlrZTx2b2lkPixcbiAgY29udjogQ29udmVydGVyLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbmVlZFB1c2hEb3duc3RyZWFtOiBib29sZWFuLFxuICBjYjogKGVycj8pID0+IHZvaWQsXG4gIHJlczogUHJvY2Vzc0xpbmVSZXN1bHQsXG4pIHtcbiAgaWYgKG5lZWRQdXNoRG93bnN0cmVhbSkge1xuICAgIHB1c2hEb3duc3RyZWFtKGNvbnYsIHJlcyk7XG4gIH1cbiAgcHJvY2Vzc0xpbmVCeUxpbmUobGluZXMsIGNvbnYsIG9mZnNldCwgbmVlZFB1c2hEb3duc3RyZWFtLCBjYik7XG59XG5mdW5jdGlvbiBwdXNoRG93bnN0cmVhbShjb252OiBDb252ZXJ0ZXIsIHJlczogUHJvY2Vzc0xpbmVSZXN1bHQpIHtcbiAgaWYgKHR5cGVvZiByZXMgPT09IFwib2JqZWN0XCIgJiYgIWNvbnYub3B0aW9ucy5vYmplY3RNb2RlKSB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHJlcyk7XG4gICAgY29udi5wdXNoKGRhdGEgKyAoY29udi5wYXJzZVBhcmFtLmRvd25zdHJlYW1Gb3JtYXQgPT09IFwiYXJyYXlcIiA/IFwiLFwiICsgRU9MIDogRU9MKSwgXCJ1dGY4XCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbnYucHVzaChyZXMpO1xuICB9XG59Il19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/ac6559c9ea3c7a83782cf43cf1cc03a456f7a02682d837efbfd48c3882c1725a.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/ac6559c9ea3c7a83782cf43cf1cc03a456f7a02682d837efbfd48c3882c1725a.js new file mode 100644 index 0000000..09b71bc --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/ac6559c9ea3c7a83782cf43cf1cc03a456f7a02682d837efbfd48c3882c1725a.js @@ -0,0 +1,72 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var strip_bom_1 = __importDefault(require("strip-bom")); +/** + * For each data chunk coming to parser: + * 1. append the data to the buffer that is left from last chunk + * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + * 3. stripBom + */ +function prepareData(chunk, runtime) { + var workChunk = concatLeftChunk(chunk, runtime); + runtime.csvLineBuffer = undefined; + var cleanCSVString = cleanUtf8Split(workChunk, runtime).toString("utf8"); + if (runtime.started === false) { + return strip_bom_1.default(cleanCSVString); + } + else { + return cleanCSVString; + } +} +exports.prepareData = prepareData; +/** + * append data to buffer that is left form last chunk + */ +function concatLeftChunk(chunk, runtime) { + if (runtime.csvLineBuffer && runtime.csvLineBuffer.length > 0) { + return Buffer.concat([runtime.csvLineBuffer, chunk]); + } + else { + return chunk; + } +} +/** + * check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + */ +function cleanUtf8Split(chunk, runtime) { + var idx = chunk.length - 1; + /** + * From Keyang: + * The code below is to check if a single utf8 char (which could be multiple bytes) being split. + * If the char being split, the buffer from two chunk needs to be concat + * check how utf8 being encoded to understand the code below. + * If anyone has any better way to do this, please let me know. + */ + if ((chunk[idx] & 1 << 7) != 0) { + while ((chunk[idx] & 3 << 6) === 128) { + idx--; + } + idx--; + } + if (idx != chunk.length - 1) { + runtime.csvLineBuffer = chunk.slice(idx + 1); + return chunk.slice(0, idx + 1); + // var _cb=cb; + // var self=this; + // cb=function(){ + // if (self._csvLineBuffer){ + // self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]); + // }else{ + // self._csvLineBuffer=left; + // } + // _cb(); + // } + } + else { + return chunk; + } +} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9kYXRhQ2xlYW4udHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi9zcmMvZGF0YUNsZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esd0RBQWlDO0FBQ2pDOzs7OztHQUtHO0FBQ0gscUJBQTRCLEtBQWEsRUFBRSxPQUFxQjtJQUM5RCxJQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE9BQU8sQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLElBQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUU7UUFDN0IsT0FBTyxtQkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQ2pDO1NBQU07UUFDTCxPQUFPLGNBQWMsQ0FBQztLQUN2QjtBQUNILENBQUM7QUFURCxrQ0FTQztBQUNEOztHQUVHO0FBQ0gseUJBQXlCLEtBQWEsRUFBRSxPQUFxQjtJQUMzRCxJQUFJLE9BQU8sQ0FBQyxhQUFhLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzdELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUN0RDtTQUFNO1FBQ0wsT0FBTyxLQUFLLENBQUM7S0FDZDtBQUNILENBQUM7QUFDRDs7R0FFRztBQUNILHdCQUF3QixLQUFhLEVBQUUsT0FBcUI7SUFDMUQsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0I7Ozs7OztPQU1HO0lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNwQyxHQUFHLEVBQUUsQ0FBQztTQUNQO1FBQ0QsR0FBRyxFQUFFLENBQUM7S0FDUDtJQUNELElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE9BQU8sQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDOUIsY0FBYztRQUNkLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsOEJBQThCO1FBQzlCLDJGQUEyRjtRQUMzRixXQUFXO1FBQ1gsZ0NBQWdDO1FBQ2hDLE1BQU07UUFDTixXQUFXO1FBQ1gsSUFBSTtLQUNMO1NBQU07UUFDTCxPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcnNlUnVudGltZSB9IGZyb20gXCIuL1BhcnNlUnVudGltZVwiO1xuaW1wb3J0IHN0cmlwQm9tIGZyb20gXCJzdHJpcC1ib21cIjtcbi8qKlxuICogRm9yIGVhY2ggZGF0YSBjaHVuayBjb21pbmcgdG8gcGFyc2VyOlxuICogMS4gYXBwZW5kIHRoZSBkYXRhIHRvIHRoZSBidWZmZXIgdGhhdCBpcyBsZWZ0IGZyb20gbGFzdCBjaHVua1xuICogMi4gY2hlY2sgaWYgdXRmOCBjaGFycyBiZWluZyBzcGxpdCwgaWYgZG9lcywgc3RyaXBlIHRoZSBieXRlcyBhbmQgYWRkIHRvIGxlZnQgYnVmZmVyLlxuICogMy4gc3RyaXBCb20gXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlRGF0YShjaHVuazogQnVmZmVyLCBydW50aW1lOiBQYXJzZVJ1bnRpbWUpOiBzdHJpbmcge1xuICBjb25zdCB3b3JrQ2h1bmsgPSBjb25jYXRMZWZ0Q2h1bmsoY2h1bmssIHJ1bnRpbWUpO1xuICBydW50aW1lLmNzdkxpbmVCdWZmZXIgPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsZWFuQ1NWU3RyaW5nID0gY2xlYW5VdGY4U3BsaXQod29ya0NodW5rLCBydW50aW1lKS50b1N0cmluZyhcInV0ZjhcIik7XG4gIGlmIChydW50aW1lLnN0YXJ0ZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHN0cmlwQm9tKGNsZWFuQ1NWU3RyaW5nKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2xlYW5DU1ZTdHJpbmc7XG4gIH1cbn1cbi8qKlxuICogIGFwcGVuZCBkYXRhIHRvIGJ1ZmZlciB0aGF0IGlzIGxlZnQgZm9ybSBsYXN0IGNodW5rXG4gKi9cbmZ1bmN0aW9uIGNvbmNhdExlZnRDaHVuayhjaHVuazogQnVmZmVyLCBydW50aW1lOiBQYXJzZVJ1bnRpbWUpOiBCdWZmZXIge1xuICBpZiAocnVudGltZS5jc3ZMaW5lQnVmZmVyICYmIHJ1bnRpbWUuY3N2TGluZUJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3J1bnRpbWUuY3N2TGluZUJ1ZmZlciwgY2h1bmtdKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2h1bms7XG4gIH1cbn1cbi8qKlxuICogY2hlY2sgaWYgdXRmOCBjaGFycyBiZWluZyBzcGxpdCwgaWYgZG9lcywgc3RyaXBlIHRoZSBieXRlcyBhbmQgYWRkIHRvIGxlZnQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBjbGVhblV0ZjhTcGxpdChjaHVuazogQnVmZmVyLCBydW50aW1lOiBQYXJzZVJ1bnRpbWUpOiBCdWZmZXIge1xuICBsZXQgaWR4ID0gY2h1bmsubGVuZ3RoIC0gMTtcbiAgLyoqXG4gICAqIEZyb20gS2V5YW5nOlxuICAgKiBUaGUgY29kZSBiZWxvdyBpcyB0byBjaGVjayBpZiBhIHNpbmdsZSB1dGY4IGNoYXIgKHdoaWNoIGNvdWxkIGJlIG11bHRpcGxlIGJ5dGVzKSBiZWluZyBzcGxpdC5cbiAgICogSWYgdGhlIGNoYXIgYmVpbmcgc3BsaXQsIHRoZSBidWZmZXIgZnJvbSB0d28gY2h1bmsgbmVlZHMgdG8gYmUgY29uY2F0XG4gICAqIGNoZWNrIGhvdyB1dGY4IGJlaW5nIGVuY29kZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29kZSBiZWxvdy4gXG4gICAqIElmIGFueW9uZSBoYXMgYW55IGJldHRlciB3YXkgdG8gZG8gdGhpcywgcGxlYXNlIGxldCBtZSBrbm93LlxuICAgKi9cbiAgaWYgKChjaHVua1tpZHhdICYgMSA8PCA3KSAhPSAwKSB7XG4gICAgd2hpbGUgKChjaHVua1tpZHhdICYgMyA8PCA2KSA9PT0gMTI4KSB7XG4gICAgICBpZHgtLTtcbiAgICB9XG4gICAgaWR4LS07XG4gIH1cbiAgaWYgKGlkeCAhPSBjaHVuay5sZW5ndGggLSAxKSB7XG4gICAgcnVudGltZS5jc3ZMaW5lQnVmZmVyID0gY2h1bmsuc2xpY2UoaWR4ICsgMSk7XG4gICAgcmV0dXJuIGNodW5rLnNsaWNlKDAsIGlkeCArIDEpXG4gICAgLy8gdmFyIF9jYj1jYjtcbiAgICAvLyB2YXIgc2VsZj10aGlzO1xuICAgIC8vIGNiPWZ1bmN0aW9uKCl7XG4gICAgLy8gICBpZiAoc2VsZi5fY3N2TGluZUJ1ZmZlcil7XG4gICAgLy8gICAgIHNlbGYuX2NzdkxpbmVCdWZmZXI9QnVmZmVyLmNvbmNhdChbYnVmRnJvbVN0cmluZyhzZWxmLl9jc3ZMaW5lQnVmZmVyLFwidXRmOFwiKSxsZWZ0XSk7XG4gICAgLy8gICB9ZWxzZXtcbiAgICAvLyAgICAgc2VsZi5fY3N2TGluZUJ1ZmZlcj1sZWZ0O1xuICAgIC8vICAgfVxuICAgIC8vICAgX2NiKCk7XG4gICAgLy8gfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBjaHVuaztcbiAgfVxufSJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c4d06c0118a31c538a37ec66e7b4ed78373de3210b31ccf65b4aed7731f9e9cd.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c4d06c0118a31c538a37ec66e7b4ed78373de3210b31ccf65b4aed7731f9e9cd.js new file mode 100644 index 0000000..2b2a748 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c4d06c0118a31c538a37ec66e7b4ed78373de3210b31ccf65b4aed7731f9e9cd.js @@ -0,0 +1,418 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var Converter_1 = require("../src/Converter"); +var src_1 = __importDefault(require("../src")); +var assert = require("assert"); +var fs = require("fs"); +var sandbox = require("sinon").sandbox.create(); +var file = __dirname + "/data/testData"; +var trailCommaData = __dirname + "/data/trailingComma"; +describe("CSV Converter", function () { + afterEach(function () { + sandbox.restore(); + }); + it("should create new instance of csv", function () { + var obj = new Converter_1.Converter(); + assert(obj); + }); + it("should read from a stream", function (done) { + var obj = new Converter_1.Converter(); + var stream = fs.createReadStream(file); + obj.then(function (obj) { + assert.equal(obj.length, 2); + done(); + }); + stream.pipe(obj); + }); + it("should call onNext once a row is parsed.", function (done) { + var obj = new Converter_1.Converter(); + var stream = fs.createReadStream(file); + var called = false; + obj.subscribe(function (resultRow) { + assert(resultRow); + called = true; + }); + obj.on("done", function () { + assert(called); + done(); + }); + stream.pipe(obj); + }); + it("should emit end_parsed message once it is finished.", function (done) { + var obj = new Converter_1.Converter(); + obj.then(function (result) { + assert(result); + assert(result.length === 2); + assert(result[0].date); + assert(result[0].employee); + assert(result[0].employee.name); + assert(result[0].employee.age); + assert(result[0].employee.number); + assert(result[0].employee.key.length === 2); + assert(result[0].address.length === 2); + done(); + }); + fs.createReadStream(file).pipe(obj); + }); + it("should handle traling comma gracefully", function (done) { + var stream = fs.createReadStream(trailCommaData); + var obj = new Converter_1.Converter(); + obj.then(function (result) { + assert(result); + assert(result.length > 0); + done(); + }); + stream.pipe(obj); + }); + it("should handle comma in column which is surrounded by qoutes", function (done) { + var testData = __dirname + "/data/dataWithComma"; + var rs = fs.createReadStream(testData); + var obj = new Converter_1.Converter({ + "quote": "#" + }); + obj.then(function (result) { + assert(result[0].col1 === "\"Mini. Sectt"); + assert.equal(result[3].col2, "125001,fenvkdsf"); + // console.log(result); + done(); + }); + rs.pipe(obj); + }); + it("should be able to convert a csv to column array data", function (done) { + var columArrData = __dirname + "/data/columnArray"; + var rs = fs.createReadStream(columArrData); + var result = {}; + var csvConverter = new Converter_1.Converter(); + //end_parsed will be emitted once parsing finished + csvConverter.then(function () { + assert(result.TIMESTAMP.length === 5); + done(); + }); + //record_parsed will be emitted each time a row has been parsed. + csvConverter.subscribe(function (resultRow, rowIndex) { + for (var key in resultRow) { + if (resultRow.hasOwnProperty(key)) { + if (!result[key] || !(result[key] instanceof Array)) { + result[key] = []; + } + result[key][rowIndex] = resultRow[key]; + } + } + }); + rs.pipe(csvConverter); + }); + it("should be able to convert csv string directly", function (done) { + var testData = __dirname + "/data/testData"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter_1.Converter(); + //end_parsed will be emitted once parsing finished + csvConverter.then(function (jsonObj) { + assert.equal(jsonObj.length, 2); + }); + csvConverter.fromString(data).then(function (jsonObj) { + assert(jsonObj.length === 2); + done(); + }); + }); + it("should be able to convert csv string with error", function (done) { + var testData = __dirname + "/data/dataWithUnclosedQuotes"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter_1.Converter(); + csvConverter.fromString(data).then(undefined, function (err) { + assert(err); + assert.equal(err.err, "unclosed_quote"); + done(); + }); + }); + it("should be able to convert csv string without callback provided", function (done) { + var testData = __dirname + "/data/testData"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter_1.Converter(); + //end_parsed will be emitted once parsing finished + csvConverter.then(function (jsonObj) { + assert(jsonObj.length === 2); + done(); + }); + csvConverter.fromString(data); + }); + it("should be able to handle columns with double quotes", function (done) { + var testData = __dirname + "/data/dataWithQoutes"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter_1.Converter(); + csvConverter.fromString(data).then(function (jsonObj) { + assert(jsonObj[0].TIMESTAMP === '13954264"22', JSON.stringify(jsonObj[0].TIMESTAMP)); + assert(jsonObj[1].TIMESTAMP === 'abc, def, ccc', JSON.stringify(jsonObj[1].TIMESTAMP)); + done(); + }); + }); + it("should be able to handle columns with two double quotes", function (done) { + var testData = __dirname + "/data/twodoublequotes"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter_1.Converter(); + csvConverter.fromString(data).then(function (jsonObj) { + assert.equal(jsonObj[0].title, "\""); + assert.equal(jsonObj[0].data, "xyabcde"); + assert.equal(jsonObj[0].uuid, "fejal\"eifa"); + assert.equal(jsonObj[0].fieldA, "bnej\"\"falkfe"); + assert.equal(jsonObj[0].fieldB, "\"eisjfes\""); + done(); + }); + }); + it("should handle empty csv file", function (done) { + var testData = __dirname + "/data/emptyFile"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter_1.Converter(); + csvConverter.then(function (jsonObj) { + assert(jsonObj.length === 0); + done(); + }); + rs.pipe(csvConverter); + }); + it("should parse large csv file", function (done) { + var testData = __dirname + "/data/large-csv-sample.csv"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter_1.Converter(); + var count = 0; + csvConverter.subscribe(function () { + //console.log(arguments); + count++; + }); + csvConverter.then(function () { + assert(count === 5290); + done(); + }); + rs.pipe(csvConverter); + }); + it("should parse data and covert to specific types", function (done) { + var testData = __dirname + "/data/dataWithType"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter_1.Converter({ + checkType: true, + colParser: { + "column6": "string", + "column7": "string" + } + }); + csvConverter.subscribe(function (d) { + assert(typeof d.column1 === "number"); + assert(typeof d.column2 === "string"); + assert.equal(d["colume4"], "someinvaliddate"); + assert(d.column5.hello === "world"); + assert(d.column6 === '{"hello":"world"}'); + assert(d.column7 === "1234"); + assert(d.column8 === "abcd"); + assert(d.column9 === true); + assert(d.column10[0] === 23); + assert(d.column10[1] === 31); + assert(d.column11[0].hello === "world"); + assert(d["name#!"] === false); + }); + csvConverter.on("done", function () { + done(); + }); + rs.pipe(csvConverter); + }); + it("should turn off field type check", function (done) { + var testData = __dirname + "/data/dataWithType"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter_1.Converter({ + checkType: false + }); + csvConverter.subscribe(function (d) { + assert(typeof d.column1 === "string"); + assert(typeof d.column2 === "string"); + assert(d["column3"] === "2012-01-01"); + assert(d["colume4"] === "someinvaliddate"); + assert(d.column5 === '{"hello":"world"}'); + assert.equal(d["column6"], '{"hello":"world"}'); + assert(d["column7"] === "1234"); + assert(d["column8"] === "abcd"); + assert(d.column9 === "true"); + assert(d.column10[0] === "23"); + assert(d.column10[1] === "31"); + assert(d["name#!"] === 'false'); + }); + csvConverter.then(function () { + done(); + }); + rs.pipe(csvConverter); + }); + it("should emit data event correctly", function (done) { + var testData = __dirname + "/data/large-csv-sample.csv"; + var csvConverter = new Converter_1.Converter({}); + var count = 0; + csvConverter.on("data", function (d) { + count++; + }); + csvConverter.on("end", function () { + assert.equal(count, 5290); + done(); + }); + var rs = fs.createReadStream(testData); + rs.pipe(csvConverter); + }); + it("should process column with linebreaks", function (done) { + var testData = __dirname + "/data/lineBreak"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter_1.Converter({ + checkType: true + }); + csvConverter.subscribe(function (d) { + assert(d.Period === 13); + assert(d["Apparent age"] === "Unknown"); + done(); + }); + rs.pipe(csvConverter); + }); + it("be able to ignore empty columns", function (done) { + var testData = __dirname + "/data/dataIgnoreEmpty"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(src_1.default({ ignoreEmpty: true })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 3); + assert(j.col2.length === 2); + assert(j.col2[1] === "d3"); + assert(j.col4.col3 === undefined); + assert(j.col4.col5 === "world"); + assert(res[1].col1 === "d2"); + assert(res[2].col1 === "d4"); + done(); + }); + }); + it("should allow no header", function (done) { + var testData = __dirname + "/data/noheadercsv"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter({ noheader: true })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 5); + assert(j.field1 === "CC102-PDMI-001"); + assert(j.field2 === "eClass_5.1.3"); + done(); + }); + }); + it("should allow customised header", function (done) { + var testData = __dirname + "/data/noheadercsv"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter({ + noheader: true, + headers: ["a", "b"] + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 5); + assert(j.a === "CC102-PDMI-001"); + assert(j.b === "eClass_5.1.3"); + assert(j.field3 === "10/3/2014"); + done(); + }); + }); + it("should allow customised header to override existing header", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter({ + headers: [] + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.field1 === "Food Factory"); + assert(j.field2 === "Oscar"); + done(); + }); + }); + it("should handle when there is an empty string", function (done) { + var testData = __dirname + "/data/dataWithEmptyString"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter({ + noheader: true, + headers: ["a", "b", "c"], + checkType: true + })); + st.then(function (res) { + var j = res[0]; + // assert(res.length===2); + assert(j.a === "green"); + assert(j.b === 40); + assert.equal(j.c, ""); + done(); + }); + }); + it("should detect eol correctly when first chunk is smaller than header row length", function (done) { + var testData = __dirname + "/data/dataNoTrimCRLF"; + var rs = fs.createReadStream(testData, { highWaterMark: 3 }); + var st = rs.pipe(new Converter_1.Converter({ + trim: false + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.name === "joe"); + assert(j.age === "20"); + assert.equal(res[1].name, "sam"); + assert.equal(res[1].age, "30"); + done(); + }); + }); + it("should detect eol correctly when first chunk ends in middle of CRLF line break", function (done) { + var testData = __dirname + "/data/dataNoTrimCRLF"; + var rs = fs.createReadStream(testData, { highWaterMark: 9 }); + var st = rs.pipe(new Converter_1.Converter({ + trim: false + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.name === "joe"); + assert(j.age === "20"); + assert.equal(res[1].name, "sam"); + assert.equal(res[1].age, "30"); + done(); + }); + }); + it("should emit eol event when line ending is detected as CRLF", function (done) { + var testData = __dirname + "/data/dataNoTrimCRLF"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter()); + var eolCallback = sandbox.spy(function (eol) { + assert.equal(eol, "\r\n"); + }); + st.on("eol", eolCallback); + st.then(function () { + assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); + done(); + }); + }); + it("should emit eol event when line ending is detected as LF", function (done) { + var testData = __dirname + "/data/columnArray"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter()); + var eolCallback = sandbox.spy(function (eol) { + assert.equal(eol, "\n"); + }); + st.on("eol", eolCallback); + st.then(function () { + assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); + done(); + }); + }); + it("should remove the Byte Order Mark (BOM) from input", function (done) { + var testData = __dirname + "/data/dataNoTrimBOM"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter_1.Converter({ + trim: false + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.name === "joe"); + assert(j.age === "20"); + done(); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdENTVkNvbnZlcnRlci50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdENTVkNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhDQUEyQztBQUMzQywrQ0FBeUI7QUFDekIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9CLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ2hELElBQUksSUFBSSxHQUFHLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztBQUN4QyxJQUFJLGNBQWMsR0FBRyxTQUFTLEdBQUcscUJBQXFCLENBQUM7QUFDdkQsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixTQUFTLENBQUM7UUFDUixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7UUFDdEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkJBQTJCLEVBQUUsVUFBVSxJQUFJO1FBQzVDLElBQUksR0FBRyxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsVUFBVSxJQUFJO1FBQzNELElBQUksR0FBRyxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQzFCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLFNBQVM7WUFDL0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUNiLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNmLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLFVBQVUsSUFBSTtRQUN0RSxJQUFJLEdBQUcsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTTtZQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsVUFBVSxJQUFJO1FBQ3pELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNqRCxJQUFJLEdBQUcsR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTTtZQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxVQUFVLElBQUk7UUFDOUUsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLHFCQUFxQixDQUFDO1FBQ2pELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLEdBQUcsR0FBRyxJQUFJLHFCQUFTLENBQUM7WUFDdEIsT0FBTyxFQUFFLEdBQUc7U0FDYixDQUFDLENBQUM7UUFDSCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsTUFBTTtZQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNoRCx1QkFBdUI7WUFDdkIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxVQUFVLElBQUk7UUFDdkUsSUFBSSxZQUFZLEdBQUcsU0FBUyxHQUFHLG1CQUFtQixDQUFDO1FBQ25ELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxJQUFJLE1BQU0sR0FBTyxFQUFFLENBQUM7UUFDcEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDbkMsa0RBQWtEO1FBQ2xELFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFFSCxnRUFBZ0U7UUFDaEUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLFNBQVMsRUFBRSxRQUFRO1lBQ2xELEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFO2dCQUN6QixJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRTt3QkFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztxQkFDbEI7b0JBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxVQUFVLElBQUk7UUFDaEUsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLGdCQUFnQixDQUFDO1FBQzVDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDbkMsa0RBQWtEO1FBQ2xELFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxPQUFPO1lBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTztZQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsVUFBVSxJQUFJO1FBQ2xFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQztRQUMxRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQ25DLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEdBQUc7WUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ1osTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDeEMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLFVBQVUsSUFBSTtRQUNqRixJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7UUFDNUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxJQUFJLFlBQVksR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztRQUNuQyxrREFBa0Q7UUFDbEQsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLE9BQU87WUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsVUFBVSxJQUFJO1FBQ3RFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNsRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQ25DLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTztZQUNsRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUVyRixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN2RixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseURBQXlELEVBQUUsVUFBVSxJQUFJO1FBQzFFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztRQUNuRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQ25DLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsT0FBTztZQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDL0MsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFLFVBQVUsSUFBSTtRQUMvQyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7UUFDN0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksWUFBWSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQ25DLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxPQUFPO1lBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFLFVBQVUsSUFBSTtRQUM5QyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsNEJBQTRCLENBQUM7UUFDeEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksWUFBWSxHQUFHLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQ25DLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDckIseUJBQXlCO1lBQ3pCLEtBQUssRUFBRSxDQUFDO1FBQ1YsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsVUFBVSxJQUFJO1FBQ2pFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztRQUNoRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxZQUFZLEdBQUcsSUFBSSxxQkFBUyxDQUFDO1lBQy9CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsU0FBUyxFQUFFO2dCQUNULFNBQVMsRUFBRSxRQUFRO2dCQUNuQixTQUFTLEVBQUUsUUFBUTthQUNwQjtTQUNGLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUUsVUFBVSxJQUFJO1FBQ25ELElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQztRQUNoRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxZQUFZLEdBQUcsSUFBSSxxQkFBUyxDQUFDO1lBQy9CLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssaUJBQWlCLENBQUMsQ0FBQztZQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ2hCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLFVBQVUsSUFBSTtRQUNuRCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsNEJBQTRCLENBQUM7UUFFeEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQ2hDLENBQUMsQ0FBQztRQUNILElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztZQUNqQyxLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDO1FBQ0gsWUFBWSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUU7WUFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLFVBQVUsSUFBSTtRQUN4RCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7UUFDN0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksWUFBWSxHQUFHLElBQUkscUJBQVMsQ0FBQztZQUMvQixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUM7UUFDSCxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFLFVBQVUsSUFBSTtRQUNsRCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsdUJBQXVCLENBQUM7UUFDbkQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBRyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3QyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxJQUFJO1FBQ3pDLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztRQUMvQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BELEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLENBQUM7WUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssY0FBYyxDQUFDLENBQUM7WUFDcEMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLFVBQVUsSUFBSTtRQUNqRCxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBUyxDQUFDO1lBQzdCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztTQUNwQixDQUFDLENBQUMsQ0FBQztRQUNKLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUM7WUFDL0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUM7WUFDakMsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDREQUE0RCxFQUFFLFVBQVUsSUFBSTtRQUM3RSxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBUyxDQUFDO1lBQzdCLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQyxDQUFDLENBQUM7UUFDSixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsVUFBVSxJQUFJO1FBQzlELElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRywyQkFBMkIsQ0FBQztRQUN2RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFTLENBQUM7WUFDN0IsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztZQUN4QixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUFDLENBQUMsQ0FBQztRQUNKLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVmLDBCQUEwQjtZQUMxQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdGQUFnRixFQUFFLFVBQVUsSUFBSTtRQUNqRyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTdELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBUyxDQUFDO1lBQzdCLElBQUksRUFBRSxLQUFLO1NBQ1osQ0FBQyxDQUFDLENBQUM7UUFDSixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9CLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxnRkFBZ0YsRUFBRSxVQUFVLElBQUk7UUFDakcsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQVMsQ0FBQztZQUM3QixJQUFJLEVBQUUsS0FBSztTQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ0osRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDbkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDekIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUUsVUFBVSxJQUFJO1FBQzdFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNsRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztZQUNyRSxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMERBQTBELEVBQUUsVUFBVSxJQUFJO1FBQzNFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztRQUMvQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHO1lBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztZQUNyRSxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsVUFBVSxJQUFJO1FBQ3JFLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQztRQUNqRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFTLENBQUM7WUFDN0IsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDLENBQUMsQ0FBQztRQUNKLEVBQUUsQ0FBQyxJQUFJLENBQUUsVUFBVSxHQUFHO1lBQ3BCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVmLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb252ZXJ0ZXJ9IGZyb20gXCIuLi9zcmMvQ29udmVydGVyXCI7XG5pbXBvcnQgY3N2IGZyb20gXCIuLi9zcmNcIjtcbnZhciBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpO1xudmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xudmFyIHNhbmRib3ggPSByZXF1aXJlKFwic2lub25cIikuc2FuZGJveC5jcmVhdGUoKTtcbnZhciBmaWxlID0gX19kaXJuYW1lICsgXCIvZGF0YS90ZXN0RGF0YVwiO1xudmFyIHRyYWlsQ29tbWFEYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS90cmFpbGluZ0NvbW1hXCI7XG5kZXNjcmliZShcIkNTViBDb252ZXJ0ZXJcIiwgZnVuY3Rpb24gKCkge1xuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBjcmVhdGUgbmV3IGluc3RhbmNlIG9mIGNzdlwiLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG9iaiA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICBhc3NlcnQob2JqKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcmVhZCBmcm9tIGEgc3RyZWFtXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIG9iaiA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICB2YXIgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbiAgICBvYmoudGhlbihmdW5jdGlvbiAob2JqKSB7XG4gICAgICBhc3NlcnQuZXF1YWwob2JqLmxlbmd0aCwgMik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgc3RyZWFtLnBpcGUob2JqKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgY2FsbCBvbk5leHQgb25jZSBhIHJvdyBpcyBwYXJzZWQuXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIG9iaiA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICB2YXIgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbiAgICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gICAgb2JqLnN1YnNjcmliZShmdW5jdGlvbiAocmVzdWx0Um93KSB7XG4gICAgICBhc3NlcnQocmVzdWx0Um93KTtcbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgb2JqLm9uKFwiZG9uZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQoY2FsbGVkKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBzdHJlYW0ucGlwZShvYmopO1xuICB9KTtcblxuICBpdChcInNob3VsZCBlbWl0IGVuZF9wYXJzZWQgbWVzc2FnZSBvbmNlIGl0IGlzIGZpbmlzaGVkLlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciBvYmogPSBuZXcgQ29udmVydGVyKCk7XG4gICAgb2JqLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgYXNzZXJ0KHJlc3VsdCk7XG4gICAgICBhc3NlcnQocmVzdWx0Lmxlbmd0aCA9PT0gMik7XG4gICAgICBhc3NlcnQocmVzdWx0WzBdLmRhdGUpO1xuICAgICAgYXNzZXJ0KHJlc3VsdFswXS5lbXBsb3llZSk7XG4gICAgICBhc3NlcnQocmVzdWx0WzBdLmVtcGxveWVlLm5hbWUpO1xuICAgICAgYXNzZXJ0KHJlc3VsdFswXS5lbXBsb3llZS5hZ2UpO1xuICAgICAgYXNzZXJ0KHJlc3VsdFswXS5lbXBsb3llZS5udW1iZXIpO1xuICAgICAgYXNzZXJ0KHJlc3VsdFswXS5lbXBsb3llZS5rZXkubGVuZ3RoID09PSAyKTtcbiAgICAgIGFzc2VydChyZXN1bHRbMF0uYWRkcmVzcy5sZW5ndGggPT09IDIpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZSkucGlwZShvYmopO1xuICB9KTtcblxuICBpdChcInNob3VsZCBoYW5kbGUgdHJhbGluZyBjb21tYSBncmFjZWZ1bGx5XCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHN0cmVhbSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odHJhaWxDb21tYURhdGEpO1xuICAgIHZhciBvYmogPSBuZXcgQ29udmVydGVyKCk7XG4gICAgb2JqLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgYXNzZXJ0KHJlc3VsdCk7XG4gICAgICBhc3NlcnQocmVzdWx0Lmxlbmd0aCA+IDApO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHN0cmVhbS5waXBlKG9iaik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBjb21tYSBpbiBjb2x1bW4gd2hpY2ggaXMgc3Vycm91bmRlZCBieSBxb3V0ZXNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoQ29tbWFcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgb2JqID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBcInF1b3RlXCI6IFwiI1wiXG4gICAgfSk7XG4gICAgb2JqLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgYXNzZXJ0KHJlc3VsdFswXS5jb2wxID09PSBcIlxcXCJNaW5pLiBTZWN0dFwiKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRbM10uY29sMiwgXCIxMjUwMDEsZmVudmtkc2ZcIik7XG4gICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUob2JqKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgYmUgYWJsZSB0byBjb252ZXJ0IGEgY3N2IHRvIGNvbHVtbiBhcnJheSBkYXRhXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIGNvbHVtQXJyRGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvY29sdW1uQXJyYXlcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGNvbHVtQXJyRGF0YSk7XG4gICAgdmFyIHJlc3VsdDphbnkgPSB7fTtcbiAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcigpO1xuICAgIC8vZW5kX3BhcnNlZCB3aWxsIGJlIGVtaXR0ZWQgb25jZSBwYXJzaW5nIGZpbmlzaGVkXG4gICAgY3N2Q29udmVydGVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0KHJlc3VsdC5USU1FU1RBTVAubGVuZ3RoID09PSA1KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcblxuICAgIC8vcmVjb3JkX3BhcnNlZCB3aWxsIGJlIGVtaXR0ZWQgZWFjaCB0aW1lIGEgcm93IGhhcyBiZWVuIHBhcnNlZC5cbiAgICBjc3ZDb252ZXJ0ZXIuc3Vic2NyaWJlKGZ1bmN0aW9uIChyZXN1bHRSb3csIHJvd0luZGV4KSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0Um93KSB7XG4gICAgICAgIGlmIChyZXN1bHRSb3cuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICghcmVzdWx0W2tleV0gfHwgIShyZXN1bHRba2V5XSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0W2tleV1bcm93SW5kZXhdID0gcmVzdWx0Um93W2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGJlIGFibGUgdG8gY29udmVydCBjc3Ygc3RyaW5nIGRpcmVjdGx5XCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS90ZXN0RGF0YVwiO1xuICAgIHZhciBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHRlc3REYXRhKS50b1N0cmluZygpO1xuICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKCk7XG4gICAgLy9lbmRfcGFyc2VkIHdpbGwgYmUgZW1pdHRlZCBvbmNlIHBhcnNpbmcgZmluaXNoZWRcbiAgICBjc3ZDb252ZXJ0ZXIudGhlbihmdW5jdGlvbiAoanNvbk9iaikge1xuICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmoubGVuZ3RoLCAyKTtcbiAgICB9KTtcbiAgICBjc3ZDb252ZXJ0ZXIuZnJvbVN0cmluZyhkYXRhKS50aGVuKGZ1bmN0aW9uIChqc29uT2JqKSB7XG4gICAgICBhc3NlcnQoanNvbk9iai5sZW5ndGggPT09IDIpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBiZSBhYmxlIHRvIGNvbnZlcnQgY3N2IHN0cmluZyB3aXRoIGVycm9yXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFVuY2xvc2VkUXVvdGVzXCI7XG4gICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGVzdERhdGEpLnRvU3RyaW5nKCk7XG4gICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICBjc3ZDb252ZXJ0ZXIuZnJvbVN0cmluZyhkYXRhKS50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgYXNzZXJ0KGVycik7XG4gICAgICBhc3NlcnQuZXF1YWwoZXJyLmVyciwgXCJ1bmNsb3NlZF9xdW90ZVwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgYmUgYWJsZSB0byBjb252ZXJ0IGNzdiBzdHJpbmcgd2l0aG91dCBjYWxsYmFjayBwcm92aWRlZFwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdGVzdERhdGFcIjtcbiAgICB2YXIgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyh0ZXN0RGF0YSkudG9TdHJpbmcoKTtcbiAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcigpO1xuICAgIC8vZW5kX3BhcnNlZCB3aWxsIGJlIGVtaXR0ZWQgb25jZSBwYXJzaW5nIGZpbmlzaGVkXG4gICAgY3N2Q29udmVydGVyLnRoZW4oZnVuY3Rpb24gKGpzb25PYmopIHtcbiAgICAgIGFzc2VydChqc29uT2JqLmxlbmd0aCA9PT0gMik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgY3N2Q29udmVydGVyLmZyb21TdHJpbmcoZGF0YSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGNvbHVtbnMgd2l0aCBkb3VibGUgcXVvdGVzXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFFvdXRlc1wiO1xuICAgIHZhciBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHRlc3REYXRhKS50b1N0cmluZygpO1xuICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKCk7XG4gICAgY3N2Q29udmVydGVyLmZyb21TdHJpbmcoZGF0YSkudGhlbihmdW5jdGlvbiAoanNvbk9iaikge1xuICAgICAgYXNzZXJ0KGpzb25PYmpbMF0uVElNRVNUQU1QID09PSAnMTM5NTQyNjRcIjIyJywgSlNPTi5zdHJpbmdpZnkoanNvbk9ialswXS5USU1FU1RBTVApKTtcblxuICAgICAgYXNzZXJ0KGpzb25PYmpbMV0uVElNRVNUQU1QID09PSAnYWJjLCBkZWYsIGNjYycsIEpTT04uc3RyaW5naWZ5KGpzb25PYmpbMV0uVElNRVNUQU1QKSk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGNvbHVtbnMgd2l0aCB0d28gZG91YmxlIHF1b3Rlc1wiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvdHdvZG91YmxlcXVvdGVzXCI7XG4gICAgdmFyIGRhdGEgPSBmcy5yZWFkRmlsZVN5bmModGVzdERhdGEpLnRvU3RyaW5nKCk7XG4gICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICBjc3ZDb252ZXJ0ZXIuZnJvbVN0cmluZyhkYXRhKS50aGVuKGZ1bmN0aW9uIChqc29uT2JqKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoanNvbk9ialswXS50aXRsZSwgXCJcXFwiXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0uZGF0YSwgXCJ4eWFiY2RlXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0udXVpZCwgXCJmZWphbFxcXCJlaWZhXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0uZmllbGRBLCBcImJuZWpcXFwiXFxcImZhbGtmZVwiKTtcbiAgICAgIGFzc2VydC5lcXVhbChqc29uT2JqWzBdLmZpZWxkQiwgXCJcXFwiZWlzamZlc1xcXCJcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGhhbmRsZSBlbXB0eSBjc3YgZmlsZVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZW1wdHlGaWxlXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoKTtcbiAgICBjc3ZDb252ZXJ0ZXIudGhlbihmdW5jdGlvbiAoanNvbk9iaikge1xuICAgICAgYXNzZXJ0KGpzb25PYmoubGVuZ3RoID09PSAwKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlIGxhcmdlIGNzdiBmaWxlXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9sYXJnZS1jc3Ytc2FtcGxlLmNzdlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKCk7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBjc3ZDb252ZXJ0ZXIuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vY29uc29sZS5sb2coYXJndW1lbnRzKTtcbiAgICAgIGNvdW50Kys7XG4gICAgfSk7XG4gICAgY3N2Q29udmVydGVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0KGNvdW50ID09PSA1MjkwKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHBhcnNlIGRhdGEgYW5kIGNvdmVydCB0byBzcGVjaWZpYyB0eXBlc1wiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YVdpdGhUeXBlXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNzdkNvbnZlcnRlciA9IG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgY2hlY2tUeXBlOiB0cnVlLFxuICAgICAgY29sUGFyc2VyOiB7XG4gICAgICAgIFwiY29sdW1uNlwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcImNvbHVtbjdcIjogXCJzdHJpbmdcIlxuICAgICAgfVxuICAgIH0pO1xuICAgIGNzdkNvbnZlcnRlci5zdWJzY3JpYmUoZnVuY3Rpb24gKGQpIHtcbiAgICAgIGFzc2VydCh0eXBlb2YgZC5jb2x1bW4xID09PSBcIm51bWJlclwiKTtcbiAgICAgIGFzc2VydCh0eXBlb2YgZC5jb2x1bW4yID09PSBcInN0cmluZ1wiKTtcbiAgICAgIGFzc2VydC5lcXVhbChkW1wiY29sdW1lNFwiXSwgXCJzb21laW52YWxpZGRhdGVcIik7XG4gICAgICBhc3NlcnQoZC5jb2x1bW41LmhlbGxvID09PSBcIndvcmxkXCIpO1xuICAgICAgYXNzZXJ0KGQuY29sdW1uNiA9PT0gJ3tcImhlbGxvXCI6XCJ3b3JsZFwifScpO1xuICAgICAgYXNzZXJ0KGQuY29sdW1uNyA9PT0gXCIxMjM0XCIpO1xuICAgICAgYXNzZXJ0KGQuY29sdW1uOCA9PT0gXCJhYmNkXCIpO1xuICAgICAgYXNzZXJ0KGQuY29sdW1uOSA9PT0gdHJ1ZSk7XG4gICAgICBhc3NlcnQoZC5jb2x1bW4xMFswXSA9PT0gMjMpO1xuICAgICAgYXNzZXJ0KGQuY29sdW1uMTBbMV0gPT09IDMxKTtcbiAgICAgIGFzc2VydChkLmNvbHVtbjExWzBdLmhlbGxvID09PSBcIndvcmxkXCIpO1xuICAgICAgYXNzZXJ0KGRbXCJuYW1lIyFcIl0gPT09IGZhbHNlKTtcbiAgICB9KTtcbiAgICBjc3ZDb252ZXJ0ZXIub24oXCJkb25lXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHR1cm4gb2ZmIGZpZWxkIHR5cGUgY2hlY2tcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoVHlwZVwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBuZXcgQ29udmVydGVyKHtcbiAgICAgIGNoZWNrVHlwZTogZmFsc2VcbiAgICB9KTtcbiAgICBjc3ZDb252ZXJ0ZXIuc3Vic2NyaWJlKGZ1bmN0aW9uIChkKSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGQuY29sdW1uMSA9PT0gXCJzdHJpbmdcIik7XG4gICAgICBhc3NlcnQodHlwZW9mIGQuY29sdW1uMiA9PT0gXCJzdHJpbmdcIik7XG4gICAgICBhc3NlcnQoZFtcImNvbHVtbjNcIl0gPT09IFwiMjAxMi0wMS0wMVwiKTtcbiAgICAgIGFzc2VydChkW1wiY29sdW1lNFwiXSA9PT0gXCJzb21laW52YWxpZGRhdGVcIik7XG4gICAgICBhc3NlcnQoZC5jb2x1bW41ID09PSAne1wiaGVsbG9cIjpcIndvcmxkXCJ9Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoZFtcImNvbHVtbjZcIl0sICd7XCJoZWxsb1wiOlwid29ybGRcIn0nKTtcbiAgICAgIGFzc2VydChkW1wiY29sdW1uN1wiXSA9PT0gXCIxMjM0XCIpO1xuICAgICAgYXNzZXJ0KGRbXCJjb2x1bW44XCJdID09PSBcImFiY2RcIik7XG4gICAgICBhc3NlcnQoZC5jb2x1bW45ID09PSBcInRydWVcIik7XG4gICAgICBhc3NlcnQoZC5jb2x1bW4xMFswXSA9PT0gXCIyM1wiKTtcbiAgICAgIGFzc2VydChkLmNvbHVtbjEwWzFdID09PSBcIjMxXCIpO1xuICAgICAgYXNzZXJ0KGRbXCJuYW1lIyFcIl0gPT09ICdmYWxzZScpO1xuICAgIH0pO1xuICAgIGNzdkNvbnZlcnRlci50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGVtaXQgZGF0YSBldmVudCBjb3JyZWN0bHlcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2xhcmdlLWNzdi1zYW1wbGUuY3N2XCI7XG5cbiAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcih7XG4gICAgfSk7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBjc3ZDb252ZXJ0ZXIub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChkKSB7XG4gICAgICBjb3VudCsrO1xuICAgIH0pO1xuICAgIGNzdkNvbnZlcnRlci5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoY291bnQsIDUyOTApO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHJzLnBpcGUoY3N2Q29udmVydGVyKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvY2VzcyBjb2x1bW4gd2l0aCBsaW5lYnJlYWtzXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9saW5lQnJlYWtcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgY3N2Q29udmVydGVyID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBjaGVja1R5cGU6IHRydWVcbiAgICB9KTtcbiAgICBjc3ZDb252ZXJ0ZXIuc3Vic2NyaWJlKGZ1bmN0aW9uIChkKSB7XG4gICAgICBhc3NlcnQoZC5QZXJpb2QgPT09IDEzKTtcbiAgICAgIGFzc2VydChkW1wiQXBwYXJlbnQgYWdlXCJdID09PSBcIlVua25vd25cIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgcnMucGlwZShjc3ZDb252ZXJ0ZXIpO1xuICB9KTtcblxuICBpdChcImJlIGFibGUgdG8gaWdub3JlIGVtcHR5IGNvbHVtbnNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFJZ25vcmVFbXB0eVwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBzdCA9IHJzLnBpcGUoY3N2KHsgaWdub3JlRW1wdHk6IHRydWUgfSkpO1xuICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGogPSByZXNbMF07XG4gICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gMyk7XG4gICAgICBhc3NlcnQoai5jb2wyLmxlbmd0aCA9PT0gMik7XG4gICAgICBhc3NlcnQoai5jb2wyWzFdID09PSBcImQzXCIpO1xuICAgICAgYXNzZXJ0KGouY29sNC5jb2wzID09PSB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0KGouY29sNC5jb2w1ID09PSBcIndvcmxkXCIpO1xuICAgICAgYXNzZXJ0KHJlc1sxXS5jb2wxID09PSBcImQyXCIpO1xuICAgICAgYXNzZXJ0KHJlc1syXS5jb2wxID09PSBcImQ0XCIpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBhbGxvdyBubyBoZWFkZXJcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL25vaGVhZGVyY3N2XCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHsgbm9oZWFkZXI6IHRydWUgfSkpO1xuICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGogPSByZXNbMF07XG4gICAgICBhc3NlcnQocmVzLmxlbmd0aCA9PT0gNSk7XG4gICAgICBhc3NlcnQoai5maWVsZDEgPT09IFwiQ0MxMDItUERNSS0wMDFcIik7XG4gICAgICBhc3NlcnQoai5maWVsZDIgPT09IFwiZUNsYXNzXzUuMS4zXCIpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBhbGxvdyBjdXN0b21pc2VkIGhlYWRlclwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvbm9oZWFkZXJjc3ZcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgc3QgPSBycy5waXBlKG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgbm9oZWFkZXI6IHRydWUsXG4gICAgICBoZWFkZXJzOiBbXCJhXCIsIFwiYlwiXVxuICAgIH0pKTtcbiAgICBzdC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciBqID0gcmVzWzBdO1xuICAgICAgYXNzZXJ0KHJlcy5sZW5ndGggPT09IDUpO1xuICAgICAgYXNzZXJ0KGouYSA9PT0gXCJDQzEwMi1QRE1JLTAwMVwiKTtcbiAgICAgIGFzc2VydChqLmIgPT09IFwiZUNsYXNzXzUuMS4zXCIpO1xuICAgICAgYXNzZXJ0KGouZmllbGQzID09PSBcIjEwLzMvMjAxNFwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgYWxsb3cgY3VzdG9taXNlZCBoZWFkZXIgdG8gb3ZlcnJpZGUgZXhpc3RpbmcgaGVhZGVyXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb21wbGV4SlNPTkNTVlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBzdCA9IHJzLnBpcGUobmV3IENvbnZlcnRlcih7XG4gICAgICBoZWFkZXJzOiBbXVxuICAgIH0pKTtcbiAgICBzdC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciBqID0gcmVzWzBdO1xuICAgICAgYXNzZXJ0KHJlcy5sZW5ndGggPT09IDIpO1xuICAgICAgYXNzZXJ0KGouZmllbGQxID09PSBcIkZvb2QgRmFjdG9yeVwiKTtcbiAgICAgIGFzc2VydChqLmZpZWxkMiA9PT0gXCJPc2NhclwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgaGFuZGxlIHdoZW4gdGhlcmUgaXMgYW4gZW1wdHkgc3RyaW5nXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aEVtcHR5U3RyaW5nXCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKHtcbiAgICAgIG5vaGVhZGVyOiB0cnVlLFxuICAgICAgaGVhZGVyczogW1wiYVwiLCBcImJcIiwgXCJjXCJdLFxuICAgICAgY2hlY2tUeXBlOiB0cnVlXG4gICAgfSkpO1xuICAgIHN0LnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGogPSByZXNbMF07XG5cbiAgICAgIC8vIGFzc2VydChyZXMubGVuZ3RoPT09Mik7XG4gICAgICBhc3NlcnQoai5hID09PSBcImdyZWVuXCIpO1xuICAgICAgYXNzZXJ0KGouYiA9PT0gNDApO1xuICAgICAgYXNzZXJ0LmVxdWFsKGouYywgXCJcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGRldGVjdCBlb2wgY29ycmVjdGx5IHdoZW4gZmlyc3QgY2h1bmsgaXMgc21hbGxlciB0aGFuIGhlYWRlciByb3cgbGVuZ3RoXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhTm9UcmltQ1JMRlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEsIHsgaGlnaFdhdGVyTWFyazogMyB9KTtcblxuICAgIHZhciBzdCA9IHJzLnBpcGUobmV3IENvbnZlcnRlcih7XG4gICAgICB0cmltOiBmYWxzZVxuICAgIH0pKTtcbiAgICBzdC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciBqID0gcmVzWzBdO1xuICAgICAgYXNzZXJ0KHJlcy5sZW5ndGggPT09IDIpO1xuICAgICAgYXNzZXJ0KGoubmFtZSA9PT0gXCJqb2VcIik7XG4gICAgICBhc3NlcnQoai5hZ2UgPT09IFwiMjBcIik7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzWzFdLm5hbWUsIFwic2FtXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1sxXS5hZ2UsIFwiMzBcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGRldGVjdCBlb2wgY29ycmVjdGx5IHdoZW4gZmlyc3QgY2h1bmsgZW5kcyBpbiBtaWRkbGUgb2YgQ1JMRiBsaW5lIGJyZWFrXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhTm9UcmltQ1JMRlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEsIHsgaGlnaFdhdGVyTWFyazogOSB9KTtcblxuICAgIHZhciBzdCA9IHJzLnBpcGUobmV3IENvbnZlcnRlcih7XG4gICAgICB0cmltOiBmYWxzZVxuICAgIH0pKTtcbiAgICBzdC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHZhciBqID0gcmVzWzBdO1xuICAgICAgYXNzZXJ0KHJlcy5sZW5ndGggPT09IDIpO1xuICAgICAgYXNzZXJ0KGoubmFtZSA9PT0gXCJqb2VcIik7XG4gICAgICBhc3NlcnQoai5hZ2UgPT09IFwiMjBcIik7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzWzFdLm5hbWUsIFwic2FtXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc1sxXS5hZ2UsIFwiMzBcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIGVtaXQgZW9sIGV2ZW50IHdoZW4gbGluZSBlbmRpbmcgaXMgZGV0ZWN0ZWQgYXMgQ1JMRlwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YU5vVHJpbUNSTEZcIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcblxuICAgIHZhciBzdCA9IHJzLnBpcGUobmV3IENvbnZlcnRlcigpKTtcbiAgICB2YXIgZW9sQ2FsbGJhY2sgPSBzYW5kYm94LnNweShmdW5jdGlvbiAoZW9sKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoZW9sLCBcIlxcclxcblwiKTtcbiAgICB9KTtcbiAgICBzdC5vbihcImVvbFwiLCBlb2xDYWxsYmFjayk7XG4gICAgc3QudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoZW9sQ2FsbGJhY2suY2FsbENvdW50LCAxLCAnc2hvdWxkIGVtaXQgZW9sIGV2ZW50IG9uY2UnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KVxuICB9KTtcblxuICBpdChcInNob3VsZCBlbWl0IGVvbCBldmVudCB3aGVuIGxpbmUgZW5kaW5nIGlzIGRldGVjdGVkIGFzIExGXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9jb2x1bW5BcnJheVwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuXG4gICAgdmFyIHN0ID0gcnMucGlwZShuZXcgQ29udmVydGVyKCkpO1xuICAgIHZhciBlb2xDYWxsYmFjayA9IHNhbmRib3guc3B5KGZ1bmN0aW9uIChlb2wpIHtcbiAgICAgIGFzc2VydC5lcXVhbChlb2wsIFwiXFxuXCIpO1xuICAgIH0pO1xuICAgIHN0Lm9uKFwiZW9sXCIsIGVvbENhbGxiYWNrKTtcbiAgICBzdC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChlb2xDYWxsYmFjay5jYWxsQ291bnQsIDEsICdzaG91bGQgZW1pdCBlb2wgZXZlbnQgb25jZScpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pXG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHJlbW92ZSB0aGUgQnl0ZSBPcmRlciBNYXJrIChCT00pIGZyb20gaW5wdXRcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFOb1RyaW1CT01cIjtcbiAgICB2YXIgcnMgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHRlc3REYXRhKTtcbiAgICB2YXIgc3QgPSBycy5waXBlKG5ldyBDb252ZXJ0ZXIoe1xuICAgICAgdHJpbTogZmFsc2VcbiAgICB9KSk7XG4gICAgc3QudGhlbiggZnVuY3Rpb24gKHJlcykge1xuICAgICAgdmFyIGogPSByZXNbMF07XG5cbiAgICAgIGFzc2VydChyZXMubGVuZ3RoPT09Mik7XG4gICAgICBhc3NlcnQoai5uYW1lID09PSBcImpvZVwiKTtcbiAgICAgIGFzc2VydChqLmFnZSA9PT0gXCIyMFwiKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c8e70df643ed74eb6c2787fa04bd777abbe25614c4f67780bdd3d4f82f7da832.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c8e70df643ed74eb6c2787fa04bd777abbe25614c4f67780bdd3d4f82f7da832.js new file mode 100644 index 0000000..fe18ea1 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c8e70df643ed74eb6c2787fa04bd777abbe25614c4f67780bdd3d4f82f7da832.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function bufFromString(str) { + var length = Buffer.byteLength(str); + var buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(length) + : new Buffer(length); + buffer.write(str); + return buffer; +} +exports.bufFromString = bufFromString; +function emptyBuffer() { + var buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(0) + : new Buffer(0); + return buffer; +} +exports.emptyBuffer = emptyBuffer; +function filterArray(arr, filter) { + var rtn = []; + for (var i = 0; i < arr.length; i++) { + if (filter.indexOf(i) > -1) { + rtn.push(arr[i]); + } + } + return rtn; +} +exports.filterArray = filterArray; +exports.trimLeft = String.prototype.trimLeft ? function trimLeftNative(str) { + return str.trimLeft(); +} : function trimLeftRegExp(str) { + return str.replace(/^\s+/, ""); +}; +exports.trimRight = String.prototype.trimRight ? function trimRightNative(str) { + return str.trimRight(); +} : function trimRightRegExp(str) { + return str.replace(/\s+$/, ""); +}; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy91dGlsLnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1QkFBOEIsR0FBVztJQUN2QyxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUM1QixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBUEQsc0NBT0M7QUFFRDtJQUNFLElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXO1FBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUxELGtDQUtDO0FBRUQscUJBQTRCLEdBQVUsRUFBRSxNQUFnQjtJQUN0RCxJQUFNLEdBQUcsR0FBVSxFQUFFLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7S0FDRjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQVJELGtDQVFDO0FBRVksUUFBQSxRQUFRLEdBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUEsQ0FBQyxDQUFBLHdCQUF3QixHQUFVO0lBQ2hGLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3hCLENBQUMsQ0FBQSxDQUFDLENBQUEsd0JBQXdCLEdBQVU7SUFDbEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUE7QUFFWSxRQUFBLFNBQVMsR0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQSxDQUFDLENBQUEseUJBQXlCLEdBQVU7SUFDbkYsT0FBTyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFBLENBQUMsQ0FBQSx5QkFBeUIsR0FBVTtJQUNuQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBidWZGcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogQnVmZmVyIHtcbiAgY29uc3QgbGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlXG4gICAgPyBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICAgIDogbmV3IEJ1ZmZlcihsZW5ndGgpO1xuICBidWZmZXIud3JpdGUoc3RyKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5QnVmZmVyKCk6IEJ1ZmZlcntcbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlXG4gICAgPyBCdWZmZXIuYWxsb2NVbnNhZmUoMClcbiAgICA6IG5ldyBCdWZmZXIoMCk7XG4gIHJldHVybiBidWZmZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJBcnJheShhcnI6IGFueVtdLCBmaWx0ZXI6IG51bWJlcltdKTogYW55W10ge1xuICBjb25zdCBydG46IGFueVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZpbHRlci5pbmRleE9mKGkpID4gLTEpIHtcbiAgICAgIHJ0bi5wdXNoKGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydG47XG59XG5cbmV4cG9ydCBjb25zdCB0cmltTGVmdD1TdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2Z1bmN0aW9uIHRyaW1MZWZ0TmF0aXZlKHN0cjpzdHJpbmcpe1xuICByZXR1cm4gc3RyLnRyaW1MZWZ0KCk7XG59OmZ1bmN0aW9uIHRyaW1MZWZ0UmVnRXhwKHN0cjpzdHJpbmcpe1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrLywgXCJcIik7XG59XG5cbmV4cG9ydCBjb25zdCB0cmltUmlnaHQ9U3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQ/ZnVuY3Rpb24gdHJpbVJpZ2h0TmF0aXZlKHN0cjpzdHJpbmcpe1xuICByZXR1cm4gc3RyLnRyaW1SaWdodCgpO1xufTpmdW5jdGlvbiB0cmltUmlnaHRSZWdFeHAoc3RyOnN0cmluZyl7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxzKyQvLCBcIlwiKTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c9dd2cde876725b95252230af48b72d263fc7188f8adba2c85aec0c27e54ba1e.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c9dd2cde876725b95252230af48b72d263fc7188f8adba2c85aec0c27e54ba1e.js new file mode 100644 index 0000000..46e25d9 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/c9dd2cde876725b95252230af48b72d263fc7188f8adba2c85aec0c27e54ba1e.js @@ -0,0 +1,342 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [0, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var src_1 = __importDefault(require("../src")); +var assert_1 = __importDefault(require("assert")); +var fs = require("fs"); +var sinon_1 = require("sinon"); +var sb = sinon_1.sandbox.create(); +describe("testCSVConverter3", function () { + afterEach(function () { + sb.restore(); + }); + it("should parse large csv file with UTF-8 without spliting characters", function (done) { + var testData = __dirname + "/data/large-utf8.csv"; + var rs = fs.createReadStream(testData); + var csvConverter = src_1.default({}); + var count = 0; + csvConverter.preRawData(function (csvRawData) { + assert_1.default(csvRawData.charCodeAt(0) < 2000); + return csvRawData; + }); + csvConverter.on("data", function () { + count++; + }); + csvConverter.then(function () { + assert_1.default(count === 5290); + done(); + }); + rs.pipe(csvConverter); + }); + it("should setup customise type convert function", function (done) { + src_1.default({ + checkType: true, + colParser: { + "column1": "string", + "column5": function (item, head, resultRow, row, i) { + assert_1.default.equal(item, '{"hello":"world"}'); + assert_1.default.equal(head, "column5"), + assert_1.default(resultRow); + assert_1.default(row); + assert_1.default.equal(i, 5); + return "hello world"; + } + } + }) + .fromFile(__dirname + "/data/dataWithType") + .subscribe(function (json) { + assert_1.default.equal(typeof json.column1, "string"); + assert_1.default.equal(json.column5, "hello world"); + assert_1.default.strictEqual(json["name#!"], false); + assert_1.default.strictEqual(json["column9"], true); + }) + .on('done', function () { + done(); + }); + }); + it("should accept pipe as quote", function (done) { + src_1.default({ + quote: "|", + output: "csv" + }) + .fromFile(__dirname + "/data/pipeAsQuote") + .subscribe(function (csv) { + assert_1.default.equal(csv[2], "blahhh, blah"); + }) + .on('done', function () { + done(); + }); + }); + it("emit file not exists error when try to open a non-exists file", function () { + var called = false; + var cb = sb.spy(function (err) { + assert_1.default(err.toString().indexOf("File does not exist") > -1); + }); + return src_1.default() + .fromFile("somefile") + .subscribe(function (csv) { + }) + .on("error", cb) + .then(function () { + assert_1.default(false); + }, function (err) { + assert_1.default.equal(cb.callCount, 1); + }); + }); + it("should include column that is both included and excluded", function () { + return src_1.default({ + includeColumns: /b/, + ignoreColumns: /a|b/ + }) + .fromString("a,b,c\n1,2,3\n4,5,6") + .subscribe(function (d) { + assert_1.default(d.b); + assert_1.default(!d.a); + }); + }); + it("should allow async preLine hook", function () { + return src_1.default() + .preFileLine(function (line) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + resolve(line + "changed"); + }, 20); + }); + }) + .fromString("a,b\n1,2") + .subscribe(function (d) { + assert_1.default(d.bchanged); + assert_1.default.equal(d.bchanged, "2changed"); + }); + }); + it("should allow async subscribe function", function () { + return src_1.default({ trim: true }) + .fromString("a,b,c\n 1,2,3\n 4,5,6") + .subscribe(function (d) { + return new Promise(function (resolve, reject) { + setTimeout(function () { + d.a = 10; + resolve(); + }, 20); + }); + }) + .then(function (d) { + assert_1.default.equal(d[0].a, 10); + assert_1.default.equal(d[1].a, 10); + }); + }); + it("should propagate value to next then", function () { + return src_1.default({ trim: true }) + .fromString("a,b,c\n 1,2,3\n 4,5,6") + .then(undefined, undefined) + .then(function (d) { + assert_1.default.equal(d.length, 2); + assert_1.default.equal(d[0].a, "1"); + }); + }); + it("should propagate error to next then", function () { + return src_1.default({ trim: true }) + .fromFile(__dirname + "/data/dataWithUnclosedQuotes") + .then(undefined, undefined) + .then(function () { + assert_1.default(false); + }, function (err) { + assert_1.default(err); + assert_1.default.equal(err.err, "unclosed_quote"); + }); + }); + it("should fallback to text is number can not be parsed", function () { + return src_1.default({ + colParser: { + "a": "number" + } + }) + .fromString("a,b,c\n 1,2,3\n fefe,5,6") + .then(function (d) { + assert_1.default.strictEqual(d[0].a, 1); + assert_1.default.equal(d[1].a, "fefe"); + }); + }); + it("should omit a column", function () { + return src_1.default({ + colParser: { + "a": "omit" + } + }) + .fromString("a,b,c\n 1,2,3\n fefe,5,6") + .then(function (d) { + assert_1.default.strictEqual(d[0].a, undefined); + assert_1.default.equal(d[1].a, undefined); + }); + }); + it("could turn off quote and should trim even quote is turned off", function () { + return src_1.default({ + quote: "off", + trim: true + }) + .fromString("a,b,c\n \"1\",\"2\",\"3\"\n \"fefe,5\",6") + .then(function (d) { + assert_1.default.equal(d[0].a, '"1"'); + assert_1.default.equal(d[0].b, '"2"'); + assert_1.default.equal(d[1].a, '"fefe'); + assert_1.default.equal(d[1].b, '5"'); + }); + }); + it("should allow ignoreEmpty with checkColumn", function () { + return src_1.default({ + checkColumn: true, + ignoreEmpty: true + }) + .fromString("date,altitude,airtime\n 2016-07-08,2000,23\n \n 2016-07-09,3000,43") + .then(function (data) { + }, function (err) { + console.log(err); + assert_1.default(!err); + }); + }); + it("should allow quotes without content", function () { + var data = "a|^^|^b^"; + return src_1.default({ + delimiter: '|', + quote: '^', + noheader: true, + }) + .fromString(data) + .then(function (jsonObj) { + assert_1.default.equal(jsonObj[0].field2, ""); + }); + }); + it("should parse header with quotes correctly", function () { + var testData = __dirname + "/data/csvWithUnclosedHeader"; + return src_1.default({ + headers: ["exam_date", "sample_no", "status", "sample_type", "patient_id", "last_name", "first_name", "gender_of_patient", "patient_birth_date", "patient_note", "patient_department", "accession_number", "sample_site", "physician", "operator", "department", "note", "test_order_code", "draw_time", "approval_status", "approval_time", "report_layout", "patient_account_number", "none_1", "errors_detected_during_measurement", "age", "error_code_01", "weight", "error_code_02", "height", "error_code_03", "hcg_beta_p", "error_code_04", "troponin_i_p", "error_code_05", "ck_mb_p", "error_code_06", "d_dimer_p", "error_code_07", "hscrp_p", "error_code_08", "myoglobin_p", "error_code_09", "nt_probnp", "error_code_10", "crp", "error_code_11", "bnp", "error_code_12", "tnt", "error_code_13", "demo_p", "error_code_14", "pct", "error_code_15"] + }) + .fromFile(testData) + .then(function (d) { + assert_1.default.equal(d.length, 2); + assert_1.default.equal(d[0].sample_no, "12669"); + }); + }); + it("should stream json string correctly", function (done) { + var data = "a,b,c\n1,2,3\n4,5,6"; + var hasLeftBracket = false; + var hasRightBracket = false; + src_1.default({ + downstreamFormat: "array" + }) + .fromString(data) + .on("data", function (d) { + var str = d.toString(); + if (str[0] === "[" && str.length === 2) { + hasLeftBracket = true; + } + else if (str[0] === "]" && str.length === 2) { + hasRightBracket = true; + } + else { + assert_1.default.equal(str[str.length - 2], ","); + } + }) + .on("end", function () { + assert_1.default.equal(hasLeftBracket, true); + assert_1.default.equal(hasRightBracket, true); + done(); + }); + }); + it("should stream json line correctly", function (done) { + var data = "a,b,c\n1,2,3\n4,5,6"; + src_1.default({ + downstreamFormat: "line" + }) + .fromString(data) + .on("data", function (d) { + var str = d.toString(); + assert_1.default.notEqual(str[str.length - 2], ","); + }) + .on("end", function () { + done(); + }); + }); + it("should not send json if needEmitAll is false", function () { + return __awaiter(this, void 0, void 0, function () { + var data; + return __generator(this, function (_a) { + data = "a,b,c\n1,2,3\n4,5,6"; + return [2 /*return*/, src_1.default({ + needEmitAll: false + }) + .fromString(data) + .then(function (d) { + assert_1.default(d.length === 0); + })]; + }); + }); + }); + it("should convert null to null object", function () { + return __awaiter(this, void 0, void 0, function () { + var data; + return __generator(this, function (_a) { + data = "a,b,c\nnull,2,3\n4,5,6"; + return [2 /*return*/, src_1.default({ + nullObject: true + }) + .fromString(data) + .then(function (d) { + assert_1.default.equal(d[0].a, null); + })]; + }); + }); + }); + it("should process period properly", function () { + return __awaiter(this, void 0, void 0, function () { + var data; + return __generator(this, function (_a) { + data = "a..,b,c\n1,2,3\n4,5,6"; + return [2 /*return*/, src_1.default({}) + .fromString(data) + .then(function (d) { + assert_1.default.equal(d[0]["a.."], 1); + assert_1.default.equal(d[1]["a.."], 4); + })]; + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdENTVkNvbnZlcnRlcjMudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi90ZXN0L3Rlc3RDU1ZDb252ZXJ0ZXIzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBeUI7QUFDekIsa0RBQTRCO0FBQzVCLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QiwrQkFBZ0M7QUFFaEMsSUFBTSxFQUFFLEdBQUcsZUFBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzVCLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixTQUFTLENBQUM7UUFDUixFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRSxVQUFVLElBQUk7UUFDckYsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxJQUFJLFlBQVksR0FBRyxhQUFHLENBQUMsRUFDdEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxVQUFVLFVBQVU7WUFDMUMsZ0JBQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDaEIsZ0JBQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsOENBQThDLEVBQUUsVUFBVSxJQUFJO1FBQy9ELGFBQUcsQ0FBQztZQUNGLFNBQVMsRUFBRSxJQUFJO1lBQ2YsU0FBUyxFQUFFO2dCQUNULFNBQVMsRUFBRSxRQUFRO2dCQUNuQixTQUFTLEVBQUUsVUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztvQkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7b0JBQ3hDLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7d0JBQzNCLGdCQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3BCLGdCQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ1osZ0JBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNuQixPQUFPLGFBQWEsQ0FBQztnQkFDdkIsQ0FBQzthQUNGO1NBQ0YsQ0FBQzthQUNDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsb0JBQW9CLENBQUM7YUFDMUMsU0FBUyxDQUFDLFVBQVUsSUFBSTtZQUN2QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztZQUMxQyxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDVixJQUFJLEVBQUUsQ0FBQTtRQUNSLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxJQUFJO1FBQzlDLGFBQUcsQ0FBQztZQUNGLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDO2FBQ0MsUUFBUSxDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQzthQUN6QyxTQUFTLENBQUMsVUFBVSxHQUFHO1lBQ3RCLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ1YsSUFBSSxFQUFFLENBQUE7UUFDUixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLCtEQUErRCxFQUFFO1FBQ2xFLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBRztZQUNwQixnQkFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxhQUFHLEVBQUU7YUFDVCxRQUFRLENBQUMsVUFBVSxDQUFDO2FBQ3BCLFNBQVMsQ0FBQyxVQUFVLEdBQUc7UUFFeEIsQ0FBQyxDQUFDO2FBQ0QsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7YUFDZixJQUFJLENBQUM7WUFDSixnQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hCLENBQUMsRUFBRSxVQUFDLEdBQUc7WUFDTCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO0lBRU4sQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsMERBQTBELEVBQUU7UUFDN0QsT0FBTyxhQUFHLENBQUM7WUFDVCxjQUFjLEVBQUUsR0FBRztZQUNuQixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDO2FBQ0MsVUFBVSxDQUFDLHFCQUVaLENBQUM7YUFDQSxTQUFTLENBQUMsVUFBQyxDQUFDO1lBQ1gsZ0JBQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDWixnQkFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUNwQyxPQUFPLGFBQUcsRUFBRTthQUNULFdBQVcsQ0FBQyxVQUFDLElBQUk7WUFDaEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO2dCQUNqQyxVQUFVLENBQUM7b0JBQ1QsT0FBTyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQTtnQkFDM0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRVQsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUM7YUFDRCxVQUFVLENBQUMsVUFDZCxDQUFDO2FBQ0UsU0FBUyxDQUFDLFVBQUMsQ0FBQztZQUNYLGdCQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25CLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUE7SUFFTixDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtRQUMxQyxPQUFPLGFBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN2QixVQUFVLENBQUMsNkJBRVIsQ0FBQzthQUNKLFNBQVMsQ0FBQyxVQUFDLENBQUM7WUFDWCxPQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07Z0JBQ2pDLFVBQVUsQ0FBQztvQkFDVCxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDVCxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDVCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxVQUFDLENBQUM7WUFDTixnQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRTtRQUN4QyxPQUFPLGFBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN2QixVQUFVLENBQUMseUJBRVYsQ0FBQzthQUNGLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO2FBQzFCLElBQUksQ0FBQyxVQUFDLENBQUM7WUFDTixnQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUE7SUFFTixDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRTtRQUN4QyxPQUFPLGFBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN2QixRQUFRLENBQUMsU0FBUyxHQUFHLDhCQUE4QixDQUFDO2FBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO2FBQzFCLElBQUksQ0FBQztZQUNKLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDZixDQUFDLEVBQUUsVUFBQyxHQUFhO1lBQ2YsZ0JBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1FBQ3hELE9BQU8sYUFBRyxDQUFDO1lBQ1QsU0FBUyxFQUFFO2dCQUNULEdBQUcsRUFBRSxRQUFRO2FBQ2Q7U0FDRixDQUFDO2FBQ0MsVUFBVSxDQUFDLDRCQUVQLENBQUM7YUFDTCxJQUFJLENBQUMsVUFBQyxDQUFDO1lBQ04sZ0JBQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsc0JBQXNCLEVBQUU7UUFDekIsT0FBTyxhQUFHLENBQUM7WUFDVCxTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxFQUFFLE1BQU07YUFDWjtTQUNGLENBQUM7YUFDQyxVQUFVLENBQUMsNEJBRVAsQ0FBQzthQUNMLElBQUksQ0FBQyxVQUFDLENBQUM7WUFDTixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQywrREFBK0QsRUFBRTtRQUNsRSxPQUFPLGFBQUcsQ0FBQztZQUNULEtBQUssRUFBRSxLQUFLO1lBQ1osSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDO2FBQ0MsVUFBVSxDQUFDLDRDQUVMLENBQUM7YUFDUCxJQUFJLENBQUMsVUFBQyxDQUFDO1lBQ04sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVCLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ0YsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1FBQzlDLE9BQU8sYUFBRyxDQUFDO1lBQ1QsV0FBVyxFQUFFLElBQUk7WUFDakIsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQzthQUNDLFVBQVUsQ0FBQyw2RUFHSyxDQUFDO2FBQ2pCLElBQUksQ0FBQyxVQUFDLElBQUk7UUFFWCxDQUFDLEVBQUUsVUFBQyxHQUFHO1lBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixnQkFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1FBQ3hDLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN4QixPQUFPLGFBQUcsQ0FBQztZQUNULFNBQVMsRUFBRSxHQUFHO1lBQ2QsS0FBSyxFQUFFLEdBQUc7WUFDVixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7YUFDQyxVQUFVLENBQUMsSUFBSSxDQUFDO2FBQ2hCLElBQUksQ0FBQyxVQUFDLE9BQU87WUFDWixnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUMsMkNBQTJDLEVBQUU7UUFDOUMsSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLDZCQUE2QixDQUFDO1FBQ3pELE9BQU8sYUFBRyxDQUFDO1lBQ1QsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLFFBQVEsRUFBRSxvQ0FBb0MsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQztTQUNyMEIsQ0FBQzthQUNDLFFBQVEsQ0FBQyxRQUFRLENBQUM7YUFDbEIsSUFBSSxDQUFDLFVBQUMsQ0FBQztZQUNOLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQTtJQUVOLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFFLHFDQUFxQyxFQUFDLFVBQVMsSUFBSTtRQUNyRCxJQUFNLElBQUksR0FBQyxxQkFFVCxDQUFBO1FBQ0YsSUFBSSxjQUFjLEdBQUMsS0FBSyxDQUFDO1FBQ3pCLElBQUksZUFBZSxHQUFDLEtBQUssQ0FBQztRQUMxQixhQUFHLENBQUM7WUFDRixnQkFBZ0IsRUFBQyxPQUFPO1NBQ3pCLENBQUM7YUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDO2FBQ2hCLEVBQUUsQ0FBQyxNQUFNLEVBQUMsVUFBQyxDQUFDO1lBQ1gsSUFBTSxHQUFHLEdBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFJLENBQUMsRUFBQztnQkFDbEMsY0FBYyxHQUFDLElBQUksQ0FBQzthQUNyQjtpQkFBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBRyxDQUFDLEVBQUM7Z0JBQ3ZDLGVBQWUsR0FBQyxJQUFJLENBQUM7YUFDdEI7aUJBQUk7Z0JBQ0gsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLENBQUM7YUFDckM7UUFFSCxDQUFDLENBQUM7YUFDRCxFQUFFLENBQUMsS0FBSyxFQUFDO1lBQ1IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUUsbUNBQW1DLEVBQUMsVUFBUyxJQUFJO1FBQ25ELElBQU0sSUFBSSxHQUFDLHFCQUVULENBQUE7UUFDRixhQUFHLENBQUM7WUFDRixnQkFBZ0IsRUFBQyxNQUFNO1NBQ3hCLENBQUM7YUFDRCxVQUFVLENBQUMsSUFBSSxDQUFDO2FBQ2hCLEVBQUUsQ0FBQyxNQUFNLEVBQUMsVUFBQyxDQUFDO1lBQ1gsSUFBTSxHQUFHLEdBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRXZCLGdCQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQzthQUNELEVBQUUsQ0FBQyxLQUFLLEVBQUM7WUFDUixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7SUFDRixFQUFFLENBQUUsOENBQThDLEVBQUM7Ozs7Z0JBQzNDLElBQUksR0FBQyxxQkFFVCxDQUFBO2dCQUNGLHNCQUFPLGFBQUcsQ0FBQzt3QkFDVCxXQUFXLEVBQUMsS0FBSztxQkFDbEIsQ0FBQzt5QkFDRCxVQUFVLENBQUMsSUFBSSxDQUFDO3lCQUNoQixJQUFJLENBQUMsVUFBQyxDQUFDO3dCQUNOLGdCQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLEVBQUE7OztLQUNILENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBRSxvQ0FBb0MsRUFBQzs7OztnQkFDakMsSUFBSSxHQUFDLHdCQUVULENBQUE7Z0JBQ0Ysc0JBQU8sYUFBRyxDQUFDO3dCQUNULFVBQVUsRUFBQyxJQUFJO3FCQUNoQixDQUFDO3lCQUNELFVBQVUsQ0FBQyxJQUFJLENBQUM7eUJBQ2hCLElBQUksQ0FBQyxVQUFDLENBQUM7d0JBQ04sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLENBQUMsQ0FBQTtvQkFDM0IsQ0FBQyxDQUFDLEVBQUE7OztLQUNILENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBRSxnQ0FBZ0MsRUFBQzs7OztnQkFDN0IsSUFBSSxHQUFDLHVCQUVULENBQUE7Z0JBQ0Ysc0JBQU8sYUFBRyxDQUFDLEVBQ1YsQ0FBQzt5QkFDRCxVQUFVLENBQUMsSUFBSSxDQUFDO3lCQUNoQixJQUFJLENBQUMsVUFBQyxDQUFDO3dCQUNOLGdCQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM5QixDQUFDLENBQUMsRUFBQTs7O0tBQ0gsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3N2IGZyb20gXCIuLi9zcmNcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xudmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xuaW1wb3J0IHsgc2FuZGJveCB9IGZyb20gXCJzaW5vblwiO1xuaW1wb3J0IENTVkVycm9yIGZyb20gXCIuLi9zcmMvQ1NWRXJyb3JcIjtcbmNvbnN0IHNiID0gc2FuZGJveC5jcmVhdGUoKTtcbmRlc2NyaWJlKFwidGVzdENTVkNvbnZlcnRlcjNcIiwgZnVuY3Rpb24gKCkge1xuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNiLnJlc3RvcmUoKTtcbiAgfSk7XG4gIGl0KFwic2hvdWxkIHBhcnNlIGxhcmdlIGNzdiBmaWxlIHdpdGggVVRGLTggd2l0aG91dCBzcGxpdGluZyBjaGFyYWN0ZXJzXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHRlc3REYXRhID0gX19kaXJuYW1lICsgXCIvZGF0YS9sYXJnZS11dGY4LmNzdlwiO1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGVzdERhdGEpO1xuICAgIHZhciBjc3ZDb252ZXJ0ZXIgPSBjc3Yoe1xuICAgIH0pO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgY3N2Q29udmVydGVyLnByZVJhd0RhdGEoZnVuY3Rpb24gKGNzdlJhd0RhdGEpIHtcbiAgICAgIGFzc2VydChjc3ZSYXdEYXRhLmNoYXJDb2RlQXQoMCkgPCAyMDAwKTtcbiAgICAgIHJldHVybiBjc3ZSYXdEYXRhO1xuICAgIH0pXG4gICAgY3N2Q29udmVydGVyLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb3VudCsrO1xuICAgIH0pO1xuICAgIGNzdkNvbnZlcnRlci50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydChjb3VudCA9PT0gNTI5MCk7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgcnMucGlwZShjc3ZDb252ZXJ0ZXIpO1xuICB9KTtcbiAgaXQoXCJzaG91bGQgc2V0dXAgY3VzdG9taXNlIHR5cGUgY29udmVydCBmdW5jdGlvblwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIGNzdih7XG4gICAgICBjaGVja1R5cGU6IHRydWUsXG4gICAgICBjb2xQYXJzZXI6IHtcbiAgICAgICAgXCJjb2x1bW4xXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiY29sdW1uNVwiOiBmdW5jdGlvbiAoaXRlbSwgaGVhZCwgcmVzdWx0Um93LCByb3csIGkpIHtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwoaXRlbSwgJ3tcImhlbGxvXCI6XCJ3b3JsZFwifScpO1xuICAgICAgICAgIGFzc2VydC5lcXVhbChoZWFkLCBcImNvbHVtbjVcIiksXG4gICAgICAgICAgICBhc3NlcnQocmVzdWx0Um93KTtcbiAgICAgICAgICBhc3NlcnQocm93KTtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwoaSwgNSk7XG4gICAgICAgICAgcmV0dXJuIFwiaGVsbG8gd29ybGRcIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgICAuZnJvbUZpbGUoX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFR5cGVcIilcbiAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKGpzb24pIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBqc29uLmNvbHVtbjEsIFwic3RyaW5nXCIpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoanNvbi5jb2x1bW41LCBcImhlbGxvIHdvcmxkXCIpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbltcIm5hbWUjIVwiXSwgZmFsc2UpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoanNvbltcImNvbHVtbjlcIl0sIHRydWUpO1xuICAgICAgfSlcbiAgICAgIC5vbignZG9uZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZG9uZSgpXG4gICAgICB9KTtcbiAgfSlcbiAgaXQoXCJzaG91bGQgYWNjZXB0IHBpcGUgYXMgcXVvdGVcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICBjc3Yoe1xuICAgICAgcXVvdGU6IFwifFwiLFxuICAgICAgb3V0cHV0OiBcImNzdlwiXG4gICAgfSlcbiAgICAgIC5mcm9tRmlsZShfX2Rpcm5hbWUgKyBcIi9kYXRhL3BpcGVBc1F1b3RlXCIpXG4gICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChjc3YpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGNzdlsyXSwgXCJibGFoaGgsIGJsYWhcIik7XG4gICAgICB9KVxuICAgICAgLm9uKCdkb25lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkb25lKClcbiAgICAgIH0pO1xuICB9KVxuICBpdChcImVtaXQgZmlsZSBub3QgZXhpc3RzIGVycm9yIHdoZW4gdHJ5IHRvIG9wZW4gYSBub24tZXhpc3RzIGZpbGVcIiwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjYiA9IHNiLnNweSgoZXJyKSA9PiB7XG4gICAgICBhc3NlcnQoZXJyLnRvU3RyaW5nKCkuaW5kZXhPZihcIkZpbGUgZG9lcyBub3QgZXhpc3RcIikgPiAtMSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNzdigpXG4gICAgICAuZnJvbUZpbGUoXCJzb21lZmlsZVwiKVxuICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoY3N2KSB7XG5cbiAgICAgIH0pXG4gICAgICAub24oXCJlcnJvclwiLCBjYilcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlKTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGNiLmNhbGxDb3VudCwgMSk7XG4gICAgICB9KVxuXG4gIH0pXG4gIGl0KFwic2hvdWxkIGluY2x1ZGUgY29sdW1uIHRoYXQgaXMgYm90aCBpbmNsdWRlZCBhbmQgZXhjbHVkZWRcIiwgKCkgPT4ge1xuICAgIHJldHVybiBjc3Yoe1xuICAgICAgaW5jbHVkZUNvbHVtbnM6IC9iLyxcbiAgICAgIGlnbm9yZUNvbHVtbnM6IC9hfGIvXG4gICAgfSlcbiAgICAgIC5mcm9tU3RyaW5nKGBhLGIsY1xuMSwyLDNcbjQsNSw2YClcbiAgICAgIC5zdWJzY3JpYmUoKGQpID0+IHtcbiAgICAgICAgYXNzZXJ0KGQuYik7XG4gICAgICAgIGFzc2VydCghZC5hKTtcbiAgICAgIH0pXG4gIH0pXG4gIGl0KFwic2hvdWxkIGFsbG93IGFzeW5jIHByZUxpbmUgaG9va1wiLCAoKSA9PiB7XG4gICAgcmV0dXJuIGNzdigpXG4gICAgICAucHJlRmlsZUxpbmUoKGxpbmUpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUobGluZSArIFwiY2hhbmdlZFwiKVxuICAgICAgICAgIH0sIDIwKTtcblxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIC5mcm9tU3RyaW5nKGBhLGJcbjEsMmApXG4gICAgICAuc3Vic2NyaWJlKChkKSA9PiB7XG4gICAgICAgIGFzc2VydChkLmJjaGFuZ2VkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGQuYmNoYW5nZWQsIFwiMmNoYW5nZWRcIik7XG4gICAgICB9KVxuXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgYWxsb3cgYXN5bmMgc3Vic2NyaWJlIGZ1bmN0aW9uXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KHsgdHJpbTogdHJ1ZSB9KVxuICAgICAgLmZyb21TdHJpbmcoYGEsYixjXG4gICAgMSwyLDNcbiAgICA0LDUsNmApXG4gICAgICAuc3Vic2NyaWJlKChkKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBkLmEgPSAxMDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LCAyMCk7XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgLnRoZW4oKGQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMF0uYSwgMTApO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFsxXS5hLCAxMCk7XG4gICAgICB9KVxuICB9KVxuICBpdChcInNob3VsZCBwcm9wYWdhdGUgdmFsdWUgdG8gbmV4dCB0aGVuXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KHsgdHJpbTogdHJ1ZSB9KVxuICAgICAgLmZyb21TdHJpbmcoYGEsYixjXG4gIDEsMiwzXG4gIDQsNSw2YClcbiAgICAgIC50aGVuKHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxuICAgICAgLnRoZW4oKGQpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGQubGVuZ3RoLCAyKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMF0uYSwgXCIxXCIpO1xuICAgICAgfSlcblxuICB9KVxuICBpdChcInNob3VsZCBwcm9wYWdhdGUgZXJyb3IgdG8gbmV4dCB0aGVuXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KHsgdHJpbTogdHJ1ZSB9KVxuICAgICAgLmZyb21GaWxlKF9fZGlybmFtZSArIFwiL2RhdGEvZGF0YVdpdGhVbmNsb3NlZFF1b3Rlc1wiKVxuICAgICAgLnRoZW4odW5kZWZpbmVkLCB1bmRlZmluZWQpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGFzc2VydChmYWxzZSlcbiAgICAgIH0sIChlcnI6IENTVkVycm9yKSA9PiB7XG4gICAgICAgIGFzc2VydChlcnIpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVyciwgXCJ1bmNsb3NlZF9xdW90ZVwiKTtcbiAgICAgIH0pXG4gIH0pXG4gIGl0KFwic2hvdWxkIGZhbGxiYWNrIHRvIHRleHQgaXMgbnVtYmVyIGNhbiBub3QgYmUgcGFyc2VkXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KHtcbiAgICAgIGNvbFBhcnNlcjoge1xuICAgICAgICBcImFcIjogXCJudW1iZXJcIlxuICAgICAgfVxuICAgIH0pXG4gICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbiAgMSwyLDNcbiAgZmVmZSw1LDZgKVxuICAgICAgLnRoZW4oKGQpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRbMF0uYSwgMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChkWzFdLmEsIFwiZmVmZVwiKTtcbiAgICAgIH0pXG4gIH0pXG4gIGl0KFwic2hvdWxkIG9taXQgYSBjb2x1bW5cIiwgKCkgPT4ge1xuICAgIHJldHVybiBjc3Yoe1xuICAgICAgY29sUGFyc2VyOiB7XG4gICAgICAgIFwiYVwiOiBcIm9taXRcIlxuICAgICAgfVxuICAgIH0pXG4gICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbiAgMSwyLDNcbiAgZmVmZSw1LDZgKVxuICAgICAgLnRoZW4oKGQpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGRbMF0uYSwgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMV0uYSwgdW5kZWZpbmVkKTtcbiAgICAgIH0pXG4gIH0pXG4gIGl0KFwiY291bGQgdHVybiBvZmYgcXVvdGUgYW5kIHNob3VsZCB0cmltIGV2ZW4gcXVvdGUgaXMgdHVybmVkIG9mZlwiLCAoKSA9PiB7XG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBxdW90ZTogXCJvZmZcIixcbiAgICAgIHRyaW06IHRydWVcbiAgICB9KVxuICAgICAgLmZyb21TdHJpbmcoYGEsYixjXG4gIFwiMVwiLFwiMlwiLFwiM1wiXG4gIFwiZmVmZSw1XCIsNmApXG4gICAgICAudGhlbigoZCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFswXS5hLCAnXCIxXCInKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMF0uYiwgJ1wiMlwiJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChkWzFdLmEsICdcImZlZmUnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMV0uYiwgJzVcIicpO1xuICAgICAgfSlcbiAgfSlcbiAgaXQoXCJzaG91bGQgYWxsb3cgaWdub3JlRW1wdHkgd2l0aCBjaGVja0NvbHVtblwiLCAoKSA9PiB7XG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBjaGVja0NvbHVtbjogdHJ1ZSxcbiAgICAgIGlnbm9yZUVtcHR5OiB0cnVlXG4gICAgfSlcbiAgICAgIC5mcm9tU3RyaW5nKGBkYXRlLGFsdGl0dWRlLGFpcnRpbWVcbiAgICAyMDE2LTA3LTA4LDIwMDAsMjNcbiAgICBcbiAgICAyMDE2LTA3LTA5LDMwMDAsNDNgKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcblxuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICBhc3NlcnQoIWVycik7XG4gICAgICB9KVxuICB9KTtcbiAgaXQoXCJzaG91bGQgYWxsb3cgcXVvdGVzIHdpdGhvdXQgY29udGVudFwiLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IFwiYXxeXnxeYl5cIjtcbiAgICByZXR1cm4gY3N2KHtcbiAgICAgIGRlbGltaXRlcjogJ3wnLFxuICAgICAgcXVvdGU6ICdeJyxcbiAgICAgIG5vaGVhZGVyOiB0cnVlLFxuICAgIH0pXG4gICAgICAuZnJvbVN0cmluZyhkYXRhKVxuICAgICAgLnRoZW4oKGpzb25PYmopID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGpzb25PYmpbMF0uZmllbGQyLCBcIlwiKTtcbiAgICAgIH0pO1xuICB9KVxuICBpdChcInNob3VsZCBwYXJzZSBoZWFkZXIgd2l0aCBxdW90ZXMgY29ycmVjdGx5XCIsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2NzdldpdGhVbmNsb3NlZEhlYWRlclwiO1xuICAgIHJldHVybiBjc3Yoe1xuICAgICAgaGVhZGVyczogW1wiZXhhbV9kYXRlXCIsIFwic2FtcGxlX25vXCIsIFwic3RhdHVzXCIsIFwic2FtcGxlX3R5cGVcIiwgXCJwYXRpZW50X2lkXCIsIFwibGFzdF9uYW1lXCIsIFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlcl9vZl9wYXRpZW50XCIsIFwicGF0aWVudF9iaXJ0aF9kYXRlXCIsIFwicGF0aWVudF9ub3RlXCIsIFwicGF0aWVudF9kZXBhcnRtZW50XCIsIFwiYWNjZXNzaW9uX251bWJlclwiLCBcInNhbXBsZV9zaXRlXCIsIFwicGh5c2ljaWFuXCIsIFwib3BlcmF0b3JcIiwgXCJkZXBhcnRtZW50XCIsIFwibm90ZVwiLCBcInRlc3Rfb3JkZXJfY29kZVwiLCBcImRyYXdfdGltZVwiLCBcImFwcHJvdmFsX3N0YXR1c1wiLCBcImFwcHJvdmFsX3RpbWVcIiwgXCJyZXBvcnRfbGF5b3V0XCIsIFwicGF0aWVudF9hY2NvdW50X251bWJlclwiLCBcIm5vbmVfMVwiLCBcImVycm9yc19kZXRlY3RlZF9kdXJpbmdfbWVhc3VyZW1lbnRcIiwgXCJhZ2VcIiwgXCJlcnJvcl9jb2RlXzAxXCIsIFwid2VpZ2h0XCIsIFwiZXJyb3JfY29kZV8wMlwiLCBcImhlaWdodFwiLCBcImVycm9yX2NvZGVfMDNcIiwgXCJoY2dfYmV0YV9wXCIsIFwiZXJyb3JfY29kZV8wNFwiLCBcInRyb3BvbmluX2lfcFwiLCBcImVycm9yX2NvZGVfMDVcIiwgXCJja19tYl9wXCIsIFwiZXJyb3JfY29kZV8wNlwiLCBcImRfZGltZXJfcFwiLCBcImVycm9yX2NvZGVfMDdcIiwgXCJoc2NycF9wXCIsIFwiZXJyb3JfY29kZV8wOFwiLCBcIm15b2dsb2Jpbl9wXCIsIFwiZXJyb3JfY29kZV8wOVwiLCBcIm50X3Byb2JucFwiLCBcImVycm9yX2NvZGVfMTBcIiwgXCJjcnBcIiwgXCJlcnJvcl9jb2RlXzExXCIsIFwiYm5wXCIsIFwiZXJyb3JfY29kZV8xMlwiLCBcInRudFwiLCBcImVycm9yX2NvZGVfMTNcIiwgXCJkZW1vX3BcIiwgXCJlcnJvcl9jb2RlXzE0XCIsIFwicGN0XCIsIFwiZXJyb3JfY29kZV8xNVwiXVxuICAgIH0pXG4gICAgICAuZnJvbUZpbGUodGVzdERhdGEpXG4gICAgICAudGhlbigoZCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZC5sZW5ndGgsIDIpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFswXS5zYW1wbGVfbm8sIFwiMTI2NjlcIik7XG4gICAgICB9KVxuXG4gIH0pO1xuICBpdCAoXCJzaG91bGQgc3RyZWFtIGpzb24gc3RyaW5nIGNvcnJlY3RseVwiLGZ1bmN0aW9uKGRvbmUpe1xuICAgIGNvbnN0IGRhdGE9YGEsYixjXG4xLDIsM1xuNCw1LDZgXG4gICAgbGV0IGhhc0xlZnRCcmFja2V0PWZhbHNlO1xuICAgIGxldCBoYXNSaWdodEJyYWNrZXQ9ZmFsc2U7XG4gICAgY3N2KHtcbiAgICAgIGRvd25zdHJlYW1Gb3JtYXQ6XCJhcnJheVwiXG4gICAgfSlcbiAgICAuZnJvbVN0cmluZyhkYXRhKVxuICAgIC5vbihcImRhdGFcIiwoZCk9PntcbiAgICAgIGNvbnN0IHN0cj1kLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoc3RyWzBdPT09XCJbXCIgJiYgc3RyLmxlbmd0aCA9PT0yKXtcbiAgICAgICAgaGFzTGVmdEJyYWNrZXQ9dHJ1ZTtcbiAgICAgIH1lbHNlIGlmIChzdHJbMF09PT1cIl1cIiAmJiBzdHIubGVuZ3RoPT09Mil7XG4gICAgICAgIGhhc1JpZ2h0QnJhY2tldD10cnVlO1xuICAgICAgfWVsc2V7XG4gICAgICAgIGFzc2VydC5lcXVhbChzdHJbc3RyLmxlbmd0aC0yXSxcIixcIik7XG4gICAgICB9XG4gICAgICBcbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCgpPT57XG4gICAgICBhc3NlcnQuZXF1YWwoaGFzTGVmdEJyYWNrZXQsdHJ1ZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoaGFzUmlnaHRCcmFja2V0LHRydWUpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pXG4gIH0pXG4gIGl0IChcInNob3VsZCBzdHJlYW0ganNvbiBsaW5lIGNvcnJlY3RseVwiLGZ1bmN0aW9uKGRvbmUpe1xuICAgIGNvbnN0IGRhdGE9YGEsYixjXG4xLDIsM1xuNCw1LDZgXG4gICAgY3N2KHtcbiAgICAgIGRvd25zdHJlYW1Gb3JtYXQ6XCJsaW5lXCJcbiAgICB9KVxuICAgIC5mcm9tU3RyaW5nKGRhdGEpXG4gICAgLm9uKFwiZGF0YVwiLChkKT0+e1xuICAgICAgY29uc3Qgc3RyPWQudG9TdHJpbmcoKTtcbiAgICAgIFxuICAgICAgYXNzZXJ0Lm5vdEVxdWFsKHN0cltzdHIubGVuZ3RoLTJdLFwiLFwiKTtcbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCgpPT57XG4gICAgICBkb25lKCk7XG4gICAgfSlcbiAgfSlcbiAgaXQgKFwic2hvdWxkIG5vdCBzZW5kIGpzb24gaWYgbmVlZEVtaXRBbGwgaXMgZmFsc2VcIixhc3luYyBmdW5jdGlvbigpe1xuICAgIGNvbnN0IGRhdGE9YGEsYixjXG4xLDIsM1xuNCw1LDZgXG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBuZWVkRW1pdEFsbDpmYWxzZVxuICAgIH0pXG4gICAgLmZyb21TdHJpbmcoZGF0YSlcbiAgICAudGhlbigoZCk9PntcbiAgICAgIGFzc2VydChkLmxlbmd0aD09PTApO1xuICAgIH0pXG4gIH0pXG4gIGl0IChcInNob3VsZCBjb252ZXJ0IG51bGwgdG8gbnVsbCBvYmplY3RcIixhc3luYyBmdW5jdGlvbigpe1xuICAgIGNvbnN0IGRhdGE9YGEsYixjXG5udWxsLDIsM1xuNCw1LDZgXG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBudWxsT2JqZWN0OnRydWVcbiAgICB9KVxuICAgIC5mcm9tU3RyaW5nKGRhdGEpXG4gICAgLnRoZW4oKGQpPT57XG4gICAgICBhc3NlcnQuZXF1YWwoZFswXS5hLG51bGwpXG4gICAgfSlcbiAgfSlcbiAgaXQgKFwic2hvdWxkIHByb2Nlc3MgcGVyaW9kIHByb3Blcmx5XCIsYXN5bmMgZnVuY3Rpb24oKXtcbiAgICBjb25zdCBkYXRhPWBhLi4sYixjXG4xLDIsM1xuNCw1LDZgXG4gICAgcmV0dXJuIGNzdih7XG4gICAgfSlcbiAgICAuZnJvbVN0cmluZyhkYXRhKVxuICAgIC50aGVuKChkKT0+e1xuICAgICAgYXNzZXJ0LmVxdWFsKGRbMF1bXCJhLi5cIl0sMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZFsxXVtcImEuLlwiXSw0KTtcbiAgICB9KVxuICB9KVxufSk7XG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/dff58c3574a6aa9c5fb6c818f7da8b891eb80498ee4ab50c99085e120ad44307.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/dff58c3574a6aa9c5fb6c818f7da8b891eb80498ee4ab50c99085e120ad44307.js new file mode 100644 index 0000000..572629d --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/dff58c3574a6aa9c5fb6c818f7da8b891eb80498ee4ab50c99085e120ad44307.js @@ -0,0 +1,42 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var CSVError = /** @class */ (function (_super) { + __extends(CSVError, _super); + function CSVError(err, line, extra) { + var _this = _super.call(this, "Error: " + err + ". JSON Line number: " + line + (extra ? " near: " + extra : "")) || this; + _this.err = err; + _this.line = line; + _this.extra = extra; + _this.name = "CSV Parse Error"; + return _this; + } + CSVError.column_mismatched = function (index, extra) { + return new CSVError("column_mismatched", index, extra); + }; + CSVError.unclosed_quote = function (index, extra) { + return new CSVError("unclosed_quote", index, extra); + }; + CSVError.fromJSON = function (obj) { + return new CSVError(obj.err, obj.line, obj.extra); + }; + CSVError.prototype.toJSON = function () { + return { + err: this.err, + line: this.line, + extra: this.extra + }; + }; + return CSVError; +}(Error)); +exports.default = CSVError; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9DU1ZFcnJvci50cyIsInNvdXJjZXMiOlsiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9DU1ZFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQTtJQUFzQyw0QkFBSztJQVV6QyxrQkFDUyxHQUFXLEVBQ1gsSUFBWSxFQUNaLEtBQWM7UUFIdkIsWUFLRSxrQkFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLHNCQUFzQixHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FFMUY7UUFOUSxTQUFHLEdBQUgsR0FBRyxDQUFRO1FBQ1gsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUNaLFdBQUssR0FBTCxLQUFLLENBQVM7UUFHckIsS0FBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQzs7SUFDaEMsQ0FBQztJQWhCTSwwQkFBaUIsR0FBeEIsVUFBeUIsS0FBYSxFQUFFLEtBQWM7UUFDcEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUNNLHVCQUFjLEdBQXJCLFVBQXNCLEtBQWEsRUFBRSxLQUFjO1FBQ2pELE9BQU8sSUFBSSxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDTSxpQkFBUSxHQUFmLFVBQWdCLEdBQUc7UUFDakIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFTRCx5QkFBTSxHQUFOO1FBQ0UsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNsQixDQUFBO0lBQ0gsQ0FBQztJQUVILGVBQUM7QUFBRCxDQUFDLEFBMUJELENBQXNDLEtBQUssR0EwQjFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1NWRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXRpYyBjb2x1bW5fbWlzbWF0Y2hlZChpbmRleDogbnVtYmVyLCBleHRyYT86IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgQ1NWRXJyb3IoXCJjb2x1bW5fbWlzbWF0Y2hlZFwiLCBpbmRleCwgZXh0cmEpO1xuICB9XG4gIHN0YXRpYyB1bmNsb3NlZF9xdW90ZShpbmRleDogbnVtYmVyLCBleHRyYT86IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgQ1NWRXJyb3IoXCJ1bmNsb3NlZF9xdW90ZVwiLCBpbmRleCwgZXh0cmEpO1xuICB9XG4gIHN0YXRpYyBmcm9tSlNPTihvYmopIHtcbiAgICByZXR1cm4gbmV3IENTVkVycm9yKG9iai5lcnIsIG9iai5saW5lLCBvYmouZXh0cmEpO1xuICB9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlcnI6IHN0cmluZyxcbiAgICBwdWJsaWMgbGluZTogbnVtYmVyLFxuICAgIHB1YmxpYyBleHRyYT86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihcIkVycm9yOiBcIiArIGVyciArIFwiLiBKU09OIExpbmUgbnVtYmVyOiBcIiArIGxpbmUgKyAoZXh0cmEgPyBcIiBuZWFyOiBcIiArIGV4dHJhIDogXCJcIikpO1xuICAgIHRoaXMubmFtZSA9IFwiQ1NWIFBhcnNlIEVycm9yXCI7XG4gIH1cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlcnI6IHRoaXMuZXJyLFxuICAgICAgbGluZTogdGhpcy5saW5lLFxuICAgICAgZXh0cmE6IHRoaXMuZXh0cmFcbiAgICB9XG4gIH1cblxufVxuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/ea6725c683df8e737bfe3585acce32bd3d2a0b578a3d58bf502142d57979736c.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/ea6725c683df8e737bfe3585acce32bd3d2a0b578a3d58bf502142d57979736c.js new file mode 100644 index 0000000..8b70abb --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/ea6725c683df8e737bfe3585acce32bd3d2a0b578a3d58bf502142d57979736c.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Converter_1 = require("../src/Converter"); +var assert = require("assert"); +var fs = require("fs"); +describe("Converter error handling", function () { + it("should handle quote not closed", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithUnclosedQuotes"); + var conv = new Converter_1.Converter({}); + conv.on("error", function (err) { + assert(err.err === "unclosed_quote"); + done(); + }); + rs.pipe(conv); + }); + it("should handle column number mismatched error", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithMismatchedColumn"); + var conv = new Converter_1.Converter({ + checkColumn: true + }); + var tested = false; + conv.on("error", function (err) { + if (tested === false) { + assert(err.err === "column_mismatched"); + tested = true; + // done(); + } + }); + conv.on('done', function () { + assert(tested); + done(); + }); + rs.pipe(conv); + }); + it("should treat quote not closed as column_mismatched when alwaysSplitAtEOL is true", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithUnclosedQuotes"); + var conv = new Converter_1.Converter({ + checkColumn: true, + alwaysSplitAtEOL: true, + }); + var tested = false; + conv.on("error", function (err) { + if (tested === false) { + assert(err.err === "column_mismatched"); + tested = true; + } + }); + conv.on('done', function () { + assert(tested); + done(); + }); + rs.pipe(conv); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdEVycm9ySGFuZGxlLnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vdGVzdC90ZXN0RXJyb3JIYW5kbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FBMkM7QUFFM0MsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9CLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUV2QixRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsRUFBRSxDQUFDLGdDQUFnQyxFQUFFLFVBQVMsSUFBSTtRQUNoRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLDhCQUE4QixDQUFDLENBQUM7UUFDekUsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVMsR0FBWTtZQUNwQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3JDLElBQUksRUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBR0gsRUFBRSxDQUFFLDhDQUE4QyxFQUFFLFVBQVMsSUFBSTtRQUMvRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLGdDQUFnQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxDQUFDO1lBQ3ZCLFdBQVcsRUFBQyxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFTLEdBQVk7WUFDcEMsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNkLFVBQVU7YUFDWDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUM7WUFDYixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxrRkFBa0YsRUFBRSxVQUFTLElBQUk7UUFDbEcsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3pFLElBQUksSUFBSSxHQUFHLElBQUkscUJBQVMsQ0FBQztZQUN2QixXQUFXLEVBQUMsSUFBSTtZQUNoQixnQkFBZ0IsRUFBQyxJQUFJO1NBQ3RCLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFTLEdBQVk7WUFDcEMsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFDO1lBQ2IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2YsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29udmVydGVyfSBmcm9tIFwiLi4vc3JjL0NvbnZlcnRlclwiO1xuaW1wb3J0IENTVkVycm9yIGZyb20gXCIuLi9zcmMvQ1NWRXJyb3JcIjtcbnZhciBhc3NlcnQgPSByZXF1aXJlKFwiYXNzZXJ0XCIpO1xudmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xuXG5kZXNjcmliZShcIkNvbnZlcnRlciBlcnJvciBoYW5kbGluZ1wiLCBmdW5jdGlvbigpIHtcbiAgaXQoXCJzaG91bGQgaGFuZGxlIHF1b3RlIG5vdCBjbG9zZWRcIiwgZnVuY3Rpb24oZG9uZSkge1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFVuY2xvc2VkUXVvdGVzXCIpO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7fSk7XG4gICAgY29udi5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycjpDU1ZFcnJvcikge1xuICAgICAgYXNzZXJ0KGVyci5lcnIgPT09IFwidW5jbG9zZWRfcXVvdGVcIik7XG4gICAgICBkb25lKCk7XG4gICAgfSk7XG4gICAgcnMucGlwZShjb252KTtcbiAgfSk7XG4gXG5cbiAgaXQgKFwic2hvdWxkIGhhbmRsZSBjb2x1bW4gbnVtYmVyIG1pc21hdGNoZWQgZXJyb3JcIiwgZnVuY3Rpb24oZG9uZSkge1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aE1pc21hdGNoZWRDb2x1bW5cIik7XG4gICAgdmFyIGNvbnYgPSBuZXcgQ29udmVydGVyKHtcbiAgICAgIGNoZWNrQ29sdW1uOnRydWVcbiAgICB9KTtcbiAgICB2YXIgdGVzdGVkID0gZmFsc2U7XG4gICAgY29udi5vbihcImVycm9yXCIsIGZ1bmN0aW9uKGVycjpDU1ZFcnJvcikge1xuICAgICAgaWYgKHRlc3RlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgYXNzZXJ0KGVyci5lcnIgPT09IFwiY29sdW1uX21pc21hdGNoZWRcIik7XG4gICAgICAgIHRlc3RlZCA9IHRydWU7XG4gICAgICAgIC8vIGRvbmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb252Lm9uKCdkb25lJyxmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydCh0ZXN0ZWQpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHRyZWF0IHF1b3RlIG5vdCBjbG9zZWQgYXMgY29sdW1uX21pc21hdGNoZWQgd2hlbiBhbHdheXNTcGxpdEF0RU9MIGlzIHRydWVcIiwgZnVuY3Rpb24oZG9uZSkge1xuICAgIHZhciBycyA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFVuY2xvc2VkUXVvdGVzXCIpO1xuICAgIHZhciBjb252ID0gbmV3IENvbnZlcnRlcih7XG4gICAgICBjaGVja0NvbHVtbjp0cnVlLFxuICAgICAgYWx3YXlzU3BsaXRBdEVPTDp0cnVlLFxuICAgIH0pO1xuICAgIHZhciB0ZXN0ZWQgPSBmYWxzZTtcbiAgICBjb252Lm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXJyOkNTVkVycm9yKSB7XG4gICAgICBpZiAodGVzdGVkID09PSBmYWxzZSkge1xuICAgICAgICBhc3NlcnQoZXJyLmVyciA9PT0gXCJjb2x1bW5fbWlzbWF0Y2hlZFwiKTtcbiAgICAgICAgdGVzdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb252Lm9uKCdkb25lJyxmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydCh0ZXN0ZWQpO1xuICAgICAgZG9uZSgpO1xuICAgIH0pO1xuICAgIHJzLnBpcGUoY29udik7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/f869b8207955336fc82664bcde4b115d1ca9f4258e909100787837de7b2c2dde.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/f869b8207955336fc82664bcde4b115d1ca9f4258e909100787837de7b2c2dde.js new file mode 100644 index 0000000..23fc6dd --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/f869b8207955336fc82664bcde4b115d1ca9f4258e909100787837de7b2c2dde.js @@ -0,0 +1,99 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [0, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var ProcessorLocal_1 = require("./ProcessorLocal"); +var Converter_1 = require("./Converter"); +var fs_1 = require("fs"); +var path_1 = __importDefault(require("path")); +var assert_1 = __importDefault(require("assert")); +var dataDir = path_1.default.join(__dirname, "../test/data/"); +describe("ProcessLocal", function () { + it("should process csv chunks and output json", function () { + return __awaiter(this, void 0, void 0, function () { + var processor, data, lines, line0; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + processor = new ProcessorLocal_1.ProcessorLocal(new Converter_1.Converter()); + data = fs_1.readFileSync(dataDir + "/complexJSONCSV"); + return [4 /*yield*/, processor.process(data)]; + case 1: + lines = _a.sent(); + assert_1.default(lines.length === 2); + line0 = lines[0]; + assert_1.default.equal(line0.fieldA.title, "Food Factory"); + assert_1.default.equal(line0.fieldA.children.length, 2); + assert_1.default.equal(line0.fieldA.children[1].employee[0].name, "Tim"); + return [2 /*return*/]; + } + }); + }); + }); + it("should process csv chunks and output csv rows", function () { + return __awaiter(this, void 0, void 0, function () { + var processor, data, lines; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + processor = new ProcessorLocal_1.ProcessorLocal(new Converter_1.Converter({ output: "line" })); + data = fs_1.readFileSync(dataDir + "/complexJSONCSV"); + return [4 /*yield*/, processor.process(data)]; + case 1: + lines = _a.sent(); + assert_1.default(lines.length === 2); + return [2 /*return*/]; + } + }); + }); + }); + it("should return empty array if preRawHook removed the data", function () { + var conv = new Converter_1.Converter(); + conv.preRawData(function (str) { + return ""; + }); + var processor = new ProcessorLocal_1.ProcessorLocal(conv); + var data = fs_1.readFileSync(dataDir + "/complexJSONCSV"); + return processor.process(data) + .then(function (list) { + assert_1.default.equal(list.length, 0); + }); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9Qcm9jZXNzb3JMb2NhbC50ZXN0LnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL1Byb2Nlc3NvckxvY2FsLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFnRDtBQUNoRCx5Q0FBd0M7QUFFeEMseUJBQWdDO0FBQ2hDLDhDQUF3QjtBQUN4QixrREFBNEI7QUFFNUIsSUFBTSxPQUFPLEdBQUMsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsZUFBZSxDQUFDLENBQUM7QUFDbkQsUUFBUSxDQUFDLGNBQWMsRUFBQztJQUN0QixFQUFFLENBQUUsMkNBQTJDLEVBQUM7Ozs7Ozt3QkFDeEMsU0FBUyxHQUFDLElBQUksK0JBQWMsQ0FBQyxJQUFJLHFCQUFTLEVBQUUsQ0FBQyxDQUFDO3dCQUM5QyxJQUFJLEdBQUMsaUJBQVksQ0FBQyxPQUFPLEdBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDdkMscUJBQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQTs7d0JBQW5DLEtBQUssR0FBQyxTQUE2Qjt3QkFDekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixLQUFLLEdBQUMsS0FBSyxDQUFDLENBQUMsQ0FBZSxDQUFDO3dCQUNuQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBQyxjQUFjLENBQUMsQ0FBQzt3QkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFDLEtBQUssQ0FBQyxDQUFDOzs7OztLQUMvRCxDQUFDLENBQUE7SUFDRixFQUFFLENBQUUsK0NBQStDLEVBQUM7Ozs7Ozt3QkFDNUMsU0FBUyxHQUFDLElBQUksK0JBQWMsQ0FBQyxJQUFJLHFCQUFTLENBQUMsRUFBQyxNQUFNLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3RCxJQUFJLEdBQUMsaUJBQVksQ0FBQyxPQUFPLEdBQUMsaUJBQWlCLENBQUMsQ0FBQzt3QkFDdkMscUJBQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBQTs7d0JBQW5DLEtBQUssR0FBQyxTQUE2Qjt3QkFFekMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDOzs7OztLQUM1QixDQUFDLENBQUE7SUFDRixFQUFFLENBQUUsMERBQTBELEVBQUM7UUFDN0QsSUFBTSxJQUFJLEdBQUMsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFDLEdBQUc7WUFDbEIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztRQUNILElBQU0sU0FBUyxHQUFDLElBQUksK0JBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxJQUFNLElBQUksR0FBQyxpQkFBWSxDQUFDLE9BQU8sR0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7YUFDN0IsSUFBSSxDQUFDLFVBQUMsSUFBSTtZQUNULGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQcm9jZXNzb3JMb2NhbH0gZnJvbSBcIi4vUHJvY2Vzc29yTG9jYWxcIjtcbmltcG9ydCB7IENvbnZlcnRlciB9IGZyb20gXCIuL0NvbnZlcnRlclwiO1xuaW1wb3J0IFAgZnJvbSBcImJsdWViaXJkXCI7XG5pbXBvcnQge3JlYWRGaWxlU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBKU09OUmVzdWx0IH0gZnJvbSBcIi4vbGluZVRvSnNvblwiO1xuY29uc3QgZGF0YURpcj1wYXRoLmpvaW4oX19kaXJuYW1lLFwiLi4vdGVzdC9kYXRhL1wiKTtcbmRlc2NyaWJlKFwiUHJvY2Vzc0xvY2FsXCIsKCk9PntcbiAgaXQgKFwic2hvdWxkIHByb2Nlc3MgY3N2IGNodW5rcyBhbmQgb3V0cHV0IGpzb25cIixhc3luYyBmdW5jdGlvbiAoKXtcbiAgICBjb25zdCBwcm9jZXNzb3I9bmV3IFByb2Nlc3NvckxvY2FsKG5ldyBDb252ZXJ0ZXIoKSk7XG4gICAgY29uc3QgZGF0YT1yZWFkRmlsZVN5bmMoZGF0YURpcitcIi9jb21wbGV4SlNPTkNTVlwiKTtcbiAgICBjb25zdCBsaW5lcz1hd2FpdCBwcm9jZXNzb3IucHJvY2VzcyhkYXRhKTtcbiAgICBhc3NlcnQobGluZXMubGVuZ3RoID09PSAyKTtcbiAgICBjb25zdCBsaW5lMD1saW5lc1swXSBhcyBKU09OUmVzdWx0O1xuICAgIGFzc2VydC5lcXVhbChsaW5lMC5maWVsZEEudGl0bGUsXCJGb29kIEZhY3RvcnlcIik7XG4gICAgYXNzZXJ0LmVxdWFsKGxpbmUwLmZpZWxkQS5jaGlsZHJlbi5sZW5ndGgsMik7XG4gICAgYXNzZXJ0LmVxdWFsKGxpbmUwLmZpZWxkQS5jaGlsZHJlblsxXS5lbXBsb3llZVswXS5uYW1lLFwiVGltXCIpO1xuICB9KVxuICBpdCAoXCJzaG91bGQgcHJvY2VzcyBjc3YgY2h1bmtzIGFuZCBvdXRwdXQgY3N2IHJvd3NcIixhc3luYyBmdW5jdGlvbiAoKXtcbiAgICBjb25zdCBwcm9jZXNzb3I9bmV3IFByb2Nlc3NvckxvY2FsKG5ldyBDb252ZXJ0ZXIoe291dHB1dDpcImxpbmVcIn0pKTtcbiAgICBjb25zdCBkYXRhPXJlYWRGaWxlU3luYyhkYXRhRGlyK1wiL2NvbXBsZXhKU09OQ1NWXCIpO1xuICAgIGNvbnN0IGxpbmVzPWF3YWl0IHByb2Nlc3Nvci5wcm9jZXNzKGRhdGEpO1xuICAgIFxuICAgIGFzc2VydChsaW5lcy5sZW5ndGggPT09IDIpO1xuICB9KVxuICBpdCAoXCJzaG91bGQgcmV0dXJuIGVtcHR5IGFycmF5IGlmIHByZVJhd0hvb2sgcmVtb3ZlZCB0aGUgZGF0YVwiLCgpPT57XG4gICAgY29uc3QgY29udj1uZXcgQ29udmVydGVyKCk7XG4gICAgY29udi5wcmVSYXdEYXRhKChzdHIpPT57XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9KTtcbiAgICBjb25zdCBwcm9jZXNzb3I9bmV3IFByb2Nlc3NvckxvY2FsKGNvbnYpO1xuICAgIGNvbnN0IGRhdGE9cmVhZEZpbGVTeW5jKGRhdGFEaXIrXCIvY29tcGxleEpTT05DU1ZcIik7XG4gICAgcmV0dXJuIHByb2Nlc3Nvci5wcm9jZXNzKGRhdGEpXG4gICAgLnRoZW4oKGxpc3QpPT57XG4gICAgICBhc3NlcnQuZXF1YWwobGlzdC5sZW5ndGgsMCk7XG4gICAgfSlcbiAgfSlcbn0pXG5cbiJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/faa9fa3d0ff9bc89b0f57c0b9fcba99b4eb7ee0ec505f5bc404dfb198396e590.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/faa9fa3d0ff9bc89b0f57c0b9fcba99b4eb7ee0ec505f5bc404dfb198396e590.js new file mode 100644 index 0000000..48ddf39 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/faa9fa3d0ff9bc89b0f57c0b9fcba99b4eb7ee0ec505f5bc404dfb198396e590.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +describe("CSVError", function () { + it("should toString()", function () { + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9DU1ZFcnJvci50ZXN0LnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL0NTVkVycm9yLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSxRQUFRLENBQUMsVUFBVSxFQUFDO0lBQ2xCLEVBQUUsQ0FBRSxtQkFBbUIsRUFBQztJQUN4QixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENTVkVycm9yIGZyb20gXCIuL0NTVkVycm9yXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmRlc2NyaWJlKFwiQ1NWRXJyb3JcIiwoKT0+e1xuICBpdCAoXCJzaG91bGQgdG9TdHJpbmcoKVwiLCgpPT57XG4gIH0pXG59KSJdfQ== \ No newline at end of file diff --git a/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/fcd05a9b151e0034c5b5950c400691dc885e4e64429d73b07dd25f75a49704bb.js b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/fcd05a9b151e0034c5b5950c400691dc885e4e64429d73b07dd25f75a49704bb.js new file mode 100644 index 0000000..b736d66 --- /dev/null +++ b/node_modules/csvtojson/.ts-node/4c960549db1acf61706147e6827e627a7fda2f32ddc1336b4438c12d731ddee1/fcd05a9b151e0034c5b5950c400691dc885e4e64429d73b07dd25f75a49704bb.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var fileline_1 = require("./fileline"); +var Converter_1 = require("./Converter"); +var assert = require("assert"); +describe("fileline function", function () { + it("should convert data to multiple lines ", function () { + var conv = new Converter_1.Converter(); + var data = "abcde\nefef"; + var result = fileline_1.stringToLines(data, conv.parseRuntime); + assert.equal(result.lines.length, 1); + assert.equal(result.partial, "efef"); + assert.equal(result.lines[0], "abcde"); + }); +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3NyYy9maWxlbGluZS50ZXN0LnRzIiwic291cmNlcyI6WyIvVXNlcnMva3hpYW5nL3dvcmsvcHJvamVjdHMvY3N2Mmpzb24vc3JjL2ZpbGVsaW5lLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBeUM7QUFFekMseUNBQXdDO0FBQ3hDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQixRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsRUFBRSxDQUFFLHdDQUF3QyxFQUFFO1FBQzVDLElBQU0sSUFBSSxHQUFDLElBQUkscUJBQVMsRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUN6QixJQUFJLE1BQU0sR0FBRyx3QkFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3N0cmluZ1RvTGluZXN9IGZyb20gXCIuL2ZpbGVsaW5lXCI7XG5pbXBvcnQgeyBtZXJnZVBhcmFtcyB9IGZyb20gXCIuL1BhcmFtZXRlcnNcIjtcbmltcG9ydCB7IENvbnZlcnRlciB9IGZyb20gXCIuL0NvbnZlcnRlclwiO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5kZXNjcmliZShcImZpbGVsaW5lIGZ1bmN0aW9uXCIsIGZ1bmN0aW9uKCkge1xuICBpdCAoXCJzaG91bGQgY29udmVydCBkYXRhIHRvIG11bHRpcGxlIGxpbmVzIFwiLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBjb252PW5ldyBDb252ZXJ0ZXIoKTtcbiAgICB2YXIgZGF0YSA9IFwiYWJjZGVcXG5lZmVmXCI7XG4gICAgdmFyIHJlc3VsdCA9IHN0cmluZ1RvTGluZXMoZGF0YSwgY29udi5wYXJzZVJ1bnRpbWUpO1xuICAgIGFzc2VydC5lcXVhbChyZXN1bHQubGluZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnBhcnRpYWwsIFwiZWZlZlwiKTtcbiAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmxpbmVzWzBdLCBcImFiY2RlXCIpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/node_modules/csvtojson/LICENSE b/node_modules/csvtojson/LICENSE new file mode 100644 index 0000000..bd64207 --- /dev/null +++ b/node_modules/csvtojson/LICENSE @@ -0,0 +1,7 @@ +Copyright (C) 2013 Keyang Xiang + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/csvtojson/bin/csvtojson b/node_modules/csvtojson/bin/csvtojson new file mode 100755 index 0000000..aa991be --- /dev/null +++ b/node_modules/csvtojson/bin/csvtojson @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('./csvtojson.js')(); diff --git a/node_modules/csvtojson/bin/csvtojson.bat b/node_modules/csvtojson/bin/csvtojson.bat new file mode 100644 index 0000000..7d3b17c --- /dev/null +++ b/node_modules/csvtojson/bin/csvtojson.bat @@ -0,0 +1 @@ +@node csvtojson.js %* \ No newline at end of file diff --git a/node_modules/csvtojson/bin/csvtojson.js b/node_modules/csvtojson/bin/csvtojson.js new file mode 100644 index 0000000..1e79547 --- /dev/null +++ b/node_modules/csvtojson/bin/csvtojson.js @@ -0,0 +1,180 @@ +function csvtojson() { + var Converter = require("../v2").Converter; + var fs = require("fs"); + var options = require("./options.json"); + var cmds = options.commands; + var opts = options.options; + var exps = options.examples; + var pkg = require("../package.json"); + var os = require("os"); + /** + *{ + "cmd": "parse", command to run + "options": {}, options to passe to the command + "inputStream": process.stdin // input stream for the command. default is stdin. can be a file read stream. + }; + * + */ + var parsedCmd; + + function _showHelp(errno) { + var key; + errno = typeof errno === "number" ? errno : 0; + console.log("csvtojson: Convert csv to JSON format"); + console.log("version:", pkg.version); + console.log("Usage: csvtojson [] [] filepath\n"); + console.log("Commands: "); + for (key in cmds) { + if (cmds.hasOwnProperty(key)) { + console.log("\t%s: %s", key, cmds[key]); + } + } + console.log("Options: "); + for (key in opts) { + if (opts.hasOwnProperty(key)) { + console.log("\t%s: %s", key, opts[key].desc); + } + } + console.log("Examples: "); + for (var i = 0; i < exps.length; i++) { + console.log("\t%s", exps[i]); + } + process.exit(errno); + } + function stringToRegExp(str) { + var lastSlash = str.lastIndexOf("/"); + var source = str.substring(1, lastSlash); + var flag = str.substring(lastSlash + 1); + return new RegExp(source,flag); + } + function parse() { + var is = parsedCmd.inputStream; + if (parsedCmd.options.maxRowLength === undefined) { + parsedCmd.options.maxRowLength = 10240; + } + if (is === process.stdin && is.isTTY) { + console.log("Please specify csv file path or pipe the csv data through.\n"); + _showHelp(1); + } + if (parsedCmd.options.delimiter === "\\t") { + parsedCmd.options.delimiter = "\t"; + } + if (parsedCmd.options.ignoreColumns) { + parsedCmd.options.ignoreColumns=stringToRegExp(parsedCmd.options.ignoreColumns); + + } + if (parsedCmd.options.includeColumns) { + parsedCmd.options.includeColumns=stringToRegExp(parsedCmd.options.includeColumns); + + } + var conv = new Converter(parsedCmd.options); + var isFirst = true; + conv.on("error", function (err, pos) { + if (!parsedCmd.options.quiet) { + console.error("csvtojson got an error: ", err); + if (pos) { + console.error("The error happens at following line: "); + console.log(pos); + } + } + process.exit(1); + }) + .on("data",function (dataStr) { + process.stdout.write((isFirst ? "" : "," + os.EOL) + dataStr.toString().substr(0,dataStr.length-1)); + isFirst = false; + }) + .on("done", function () { + console.log(os.EOL + "]"); + }) + console.log("["); + is.pipe(conv); + // is.pipe(conv); + } + + function run(cmd, options) { + if (cmd === "parse") { + parse(); + } else if (cmd === "version") { + console.log(pkg.version); + } else { + console.log("unknown command %s.", cmd); + _showHelp(1); + } + } + + function commandParser() { + var parsedCmd = { + "cmd": "parse", + "options": {}, + "inputStream": process.stdin + }; + + function parseObject(val, optional) { + try { + return JSON.parse(val); + } catch (e) { + if (optional) { + return val; + } else { + console.error(e); + process.exit(1); + } + } + } + + function parseBool(str, optName) { + str = str.toLowerCase(); + if (str === "true" || str === "y") { + return true; + } else if (str === "false" || str === "n") { + return false; + } + console.log("Unknown boolean value %s for parameter %s.", str, optName); + _showHelp(1); + } + process.argv.slice(2).forEach(function (item) { + if (item.indexOf("--") > -1) { + var itemArr = item.split("="); + var optName = itemArr[0]; + var key, val, type; + if (!opts[optName]) { + console.log("Option %s not supported.", optName); + _showHelp(1); + } + key = optName.replace('--', ''); + val = itemArr[1] || ''; + type = opts[optName].type; + if (type === "string") { + parsedCmd.options[key] = val.toString(); + } else if (type === "boolean") { + parsedCmd.options[key] = parseBool(val, optName); + } else if (type === "number") { + parsedCmd.options[key] = parseFloat(val); + } else if (type === "object") { + parsedCmd.options[key] = parseObject(val, false); + } else if (type === "~object") { + parsedCmd.options[key] = parseObject(val, true); + } else { + throw ({ + name: "UnimplementedException", + message: "Option type parsing not implemented. See bin/options.json" + }); + } + } else if (cmds[item]) { + parsedCmd.cmd = item; + } else if (fs.existsSync(item)) { + parsedCmd.inputStream = fs.createReadStream(item); + } else { + console.log("unknown parameter %s.", item); + } + }); + return parsedCmd; + } + process.stdin.setEncoding('utf8'); + parsedCmd = commandParser(); + run(parsedCmd.cmd, parsedCmd.options); +} +module.exports = csvtojson; +if (!module.parent) { + csvtojson(); +} diff --git a/node_modules/csvtojson/bin/genCsv.js b/node_modules/csvtojson/bin/genCsv.js new file mode 100755 index 0000000..9c17601 --- /dev/null +++ b/node_modules/csvtojson/bin/genCsv.js @@ -0,0 +1,32 @@ +#!/usr/bin/env node +var minimist = require("minimist"); +var argv = process.argv; +argv.shift(); +argv.shift(); +var args = minimist(argv); +var headers = ["name", "header1", "file2", "description", "header2", "field2", "header3"]; + +if (args.headers) { + headers = JSON.parse(args.headers); +} +var rowNum = args.row ? args.row : 10000; +var chars = args.chars ? args.chars : "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; +var maxLength = parseInt(args.max ? args.max : "15"); +console.log(headers.join(",")); +for (var i = 0; i < rowNum; i++) { + var row = []; + for (var j = 0; j < headers.length; j++) { + row.push(genWord()); + } + console.log(row.join(",")); +} + +function genWord() { + var len = Math.round(Math.random() * maxLength); + var rtn = ""; + for (var i = 0; i < len; i++) { + var pos = Math.round(Math.random() * chars.length); + rtn += chars[pos]; + } + return rtn; +} diff --git a/node_modules/csvtojson/bin/options.json b/node_modules/csvtojson/bin/options.json new file mode 100644 index 0000000..220b457 --- /dev/null +++ b/node_modules/csvtojson/bin/options.json @@ -0,0 +1,95 @@ +{ + "commands": { + "parse": "(Default)Parse a csv file to json", + "version": "Show version of current csvtojson" + }, + "options": { + "--output":{ + "desc": "The format to be converted to. \"json\" (default) -- convert csv to json. \"csv\" -- convert csv to csv row array. \"line\" -- convert csv to csv line string", + "type": "string" + }, + "--delimiter": { + "desc": "delimiter to separate columns. Possible to give an array or just use 'auto'. default comma (,). e.g. --delimiter=# --delimiter='[\",\",\";\"]' --delimiter=auto", + "type": "~object" + }, + "--quote": { + "desc": "quote surrounding a column content containing delimiters. To turn off quote, please use 'off' --quote=off. default double quote (\"). e.g. chage to hash: --quote=# ", + "type": "string" + }, + "--trim": { + "desc": "Indicate if parser trim off spaces surrounding column content. e.g. \" content \" will be trimmed to \"content\". Default: true", + "type": "boolean" + }, + "--checkType": { + "desc": "This parameter turns on and off whether check field type. default is false.", + "type": "boolean" + + }, + "--ignoreEmpty": { + "desc": "This parameter turns on and off whether ignore empty column values while parsing. default is false", + "type": "boolean" + }, + "--noheader": { + "desc": "Indicating csv data has no header row and first row is data row. Default is false", + "type": "boolean" + }, + "--headers": { + "desc": "An array to specify the headers of CSV data. If --noheader is false, this value will override CSV header. Default: null. Example: --headers='[\"my field\",\"name\"]'", + "type": "object" + }, + "--flatKeys": { + "desc": "Don't interpret dots (.) and square brackets in header fields as nested object or array identifiers at all (treat them like regular characters for JSON field identifiers). Default: false.", + "type": "boolean" + }, + "--maxRowLength": { + "desc": "the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit \"error\" of \"row_exceed\". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 10240", + "type": "number" + }, + "--checkColumn": { + "desc": "whether check column number of a row is the same as headers. If column number mismatched headers number, an error of \"mismatched_column\" will be emitted.. default: false", + "type": "boolean" + }, + "--eol": { + "desc": "Explicitly specify the end of line character to use.", + "type": "string" + }, + "--quiet": { + "desc": "If any error happens, quit the process quietly rather than log out the error. Default is false.", + "type": "boolean" + }, + "--escape":{ + "desc":"escape character used in quoted column. Default is double quote (\") according to RFC4108. Change to back slash (\\) or other chars for your own case.", + "type":"string" + }, + "--ignoreColumns": { + "desc": "RegExp matched columns to ignore from input. e.g. --ignoreColumns=/(name|age)/ ", + "type": "string" + }, + "--includeColumns": { + "desc": "RegExp matched columns to include from input. e.g. --includeColumns=/(name|age)/ ", + "type": "string" + }, + "--colParser": { + "desc": "Specific parser for columns. e.g. --colParser='{\"col1\":\"number\",\"col2\":\"string\"}'", + "type": "~object" + }, + "--alwaysSplitAtEOL":{ + "desc": "Always interpret each line (as defined by eol) as a row. This will prevent eol characters from being used within a row (even inside a quoted field). This ensures that misplaced quotes only break on row, and not all ensuing rows.", + "type": "boolean" + }, + "--nullObject":{ + "desc":"How to parse if a csv cell contains 'null'. Default false will keep 'null' as string. Change to true if a null object is needed.", + "type":"boolean" + }, + "--downstreamFormat":{ + "desc":"Option to set what JSON array format is needed by downstream. 'line' is also called ndjson format. This format will write lines of JSON (without square brackets and commas) to downstream. 'array' will write complete JSON array string to downstream (suitable for file writable stream etc). Default 'line'", + "type":"string" + } + }, + "examples": [ + "csvtojson < csvfile", + "csvtojson ", + "cat | csvtojson", + "csvtojson --checkType=false --trim=false --delimiter=#" + ] +} diff --git a/node_modules/csvtojson/browser/browser.js b/node_modules/csvtojson/browser/browser.js new file mode 100644 index 0000000..60538a6 --- /dev/null +++ b/node_modules/csvtojson/browser/browser.js @@ -0,0 +1,8 @@ +module.exports=function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(n,i,function(e){return t[e]}.bind(null,i));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=32)}([function(t,e){var r;r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,e,r){"use strict";var n=r(6),i=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};t.exports=f;var o=r(5);o.inherits=r(2);var s=r(23),a=r(14);o.inherits(f,s);for(var u=i(a.prototype),c=0;c + * @license MIT + */ +var n=r(38),i=r(39),o=r(40);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|t}function d(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return N(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return H(t).length;default:if(n)return N(t).length;e=(""+e).toLowerCase(),n=!0}}function _(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function v(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:y(t,e,r,n,i);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):y(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function y(t,e,r,n,i){var o,s=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,r/=2}function c(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var l=-1;for(o=r;oa&&(r=a-u),o=r;o>=0;o--){for(var f=!0,h=0;hi&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function x(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function j(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:c>223?3:c>191?2:1;if(i+f<=r)switch(f){case 1:c<128&&(l=c);break;case 2:128==(192&(o=t[i+1]))&&(u=(31&c)<<6|63&o)>127&&(l=u);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&(u=(15&c)<<12|(63&o)<<6|63&s)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(u=(15&c)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&u<1114112&&(l=u)}null===l?(l=65533,f=1):l>65535&&(l-=65536,n.push(l>>>10&1023|55296),l=56320|1023&l),n.push(l),i+=f}return function(t){var e=t.length;if(e<=S)return String.fromCharCode.apply(String,t);for(var r="",n=0;nthis.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return j(this,e,r);case"ascii":return R(this,e,r);case"latin1":case"binary":return k(this,e,r);case"base64":return x(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},u.prototype.equals=function(t){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===u.compare(this,t)},u.prototype.inspect=function(){var t="",r=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},u.prototype.compare=function(t,e,r,n,i){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,i>>>=0,this===t)return 0;for(var o=i-n,s=r-e,a=Math.min(o,s),c=this.slice(n,i),l=t.slice(e,r),f=0;fi)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return m(this,t,e,r);case"utf8":case"utf-8":return g(this,t,e,r);case"ascii":return b(this,t,e,r);case"latin1":case"binary":return w(this,t,e,r);case"base64":return E(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function R(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function A(t,e,r,n,i,o){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function F(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function L(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function M(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function B(t,e,r,n,o){return o||M(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function D(t,e,r,n,o){return o||M(t,0,r,8),i.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if(t=~~t,e=void 0===e?n:~~e,t<0?(t+=n)<0&&(t=0):t>n&&(t=n),e<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},u.prototype.readUInt8=function(t,e){return e||O(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||O(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||O(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||O(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||O(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||O(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||O(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},u.prototype.readInt8=function(t,e){return e||O(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||O(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||O(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||O(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||O(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||O(t,4,this.length),i.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||O(t,4,this.length),i.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||O(t,8,this.length),i.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||O(t,8,this.length),i.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){t=+t,e|=0,r|=0,n||A(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):F(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):F(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):L(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):L(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);A(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);A(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):F(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):F(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):L(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):L(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return B(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return B(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return D(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return D(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function H(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(I,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function V(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(this,r(0))},function(t,e){var r,n,i=t.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(t){if(r===setTimeout)return setTimeout(t,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:o}catch(t){r=o}try{n="function"==typeof clearTimeout?clearTimeout:s}catch(t){n=s}}();var u,c=[],l=!1,f=-1;function h(){l&&u&&(l=!1,u.length?c=u.concat(c):f=-1,c.length&&p())}function p(){if(!l){var t=a(h);l=!0;for(var e=c.length;e;){for(u=c,c=[];++f1)for(var r=1;r=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},r(35),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,r(0))},function(t,e){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return"function"==typeof t}function i(t){return"object"==typeof t&&null!==t}function o(t){return void 0===t}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(t){if(!function(t){return"number"==typeof t}(t)||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},r.prototype.emit=function(t){var e,r,s,a,u,c;if(this._events||(this._events={}),"error"===t&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var l=new Error('Uncaught, unspecified "error" event. ('+e+")");throw l.context=e,l}if(o(r=this._events[t]))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(i(r))for(a=Array.prototype.slice.call(arguments,1),s=(c=r.slice()).length,u=0;u0&&this._events[t].length>s&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){if(!n(e))throw TypeError("listener must be a function");var r=!1;function i(){this.removeListener(t,i),r||(r=!0,e.apply(this,arguments))}return i.listener=e,this.on(t,i),this},r.prototype.removeListener=function(t,e){var r,o,s,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(s=(r=this._events[t]).length,o=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(i(r)){for(a=s;a-- >0;)if(r[a]===e||r[a].listener&&r[a].listener===e){o=a;break}if(o<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(o,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(n(r=this._events[t]))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},r.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e,r){(e=t.exports=r(23)).Stream=e,e.Readable=e,e.Writable=r(14),e.Duplex=r(1),e.Transform=r(27),e.PassThrough=r(45)},function(t,e,r){"use strict";(function(e,n,i){var o=r(6);function s(t){var e=this;this.next=null,this.entry=null,this.finish=function(){!function(t,e,r){var n=t.entry;for(t.entry=null;n;){var i=n.callback;e.pendingcb--,i(void 0),n=n.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}(e,t)}}t.exports=m;var a,u=!e.browser&&["v0.10","v0.9."].indexOf(e.version.slice(0,5))>-1?n:o.nextTick;m.WritableState=y;var c=r(5);c.inherits=r(2);var l,f={deprecate:r(44)},h=r(24),p=r(7).Buffer,d=i.Uint8Array||function(){},_=r(25);function v(){}function y(t,e){a=a||r(1),t=t||{};var n=e instanceof a;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,c=t.writableHighWaterMark,l=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(c||0===c)?c:l,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var f=!1===t.decodeStrings;this.decodeStrings=!f,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,n=r.sync,i=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,n,i){--e.pendingcb,r?(o.nextTick(i,n),o.nextTick(x,t,e),t._writableState.errorEmitted=!0,t.emit("error",n)):(i(n),t._writableState.errorEmitted=!0,t.emit("error",n),x(t,e))}(t,r,n,e,i);else{var s=E(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||w(t,r),n?u(b,t,r,s,i):b(t,r,s,i)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function m(t){if(a=a||r(1),!(l.call(m,this)||this instanceof a))return new m(t);this._writableState=new y(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev),"function"==typeof t.destroy&&(this._destroy=t.destroy),"function"==typeof t.final&&(this._final=t.final)),h.call(this)}function g(t,e,r,n,i,o,s){e.writelen=n,e.writecb=s,e.writing=!0,e.sync=!0,r?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function b(t,e,r,n){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,n(),x(t,e)}function w(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var n=e.bufferedRequestCount,i=new Array(n),o=e.corkedRequestsFree;o.entry=r;for(var a=0,u=!0;r;)i[a]=r,r.isBuf||(u=!1),r=r.next,a+=1;i.allBuffers=u,g(t,e,!0,e.length,i,"",o.finish),e.pendingcb++,e.lastBufferedRequest=null,o.next?(e.corkedRequestsFree=o.next,o.next=null):e.corkedRequestsFree=new s(e),e.bufferedRequestCount=0}else{for(;r;){var c=r.chunk,l=r.encoding,f=r.callback;if(g(t,e,!1,e.objectMode?1:c.length,c,l,f),r=r.next,e.bufferedRequestCount--,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequest=r,e.bufferProcessing=!1}function E(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function C(t,e){t._final(function(r){e.pendingcb--,r&&t.emit("error",r),e.prefinished=!0,t.emit("prefinish"),x(t,e)})}function x(t,e){var r=E(e);return r&&(function(t,e){e.prefinished||e.finalCalled||("function"==typeof t._final?(e.pendingcb++,e.finalCalled=!0,o.nextTick(C,t,e)):(e.prefinished=!0,t.emit("prefinish")))}(t,e),0===e.pendingcb&&(e.finished=!0,t.emit("finish"))),r}c.inherits(m,h),y.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(y.prototype,"buffer",{get:f.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(l=Function.prototype[Symbol.hasInstance],Object.defineProperty(m,Symbol.hasInstance,{value:function(t){return!!l.call(this,t)||this===m&&t&&t._writableState instanceof y}})):l=function(t){return t instanceof this},m.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},m.prototype.write=function(t,e,r){var n=this._writableState,i=!1,s=!n.objectMode&&function(t){return p.isBuffer(t)||t instanceof d}(t);return s&&!p.isBuffer(t)&&(t=function(t){return p.from(t)}(t)),"function"==typeof e&&(r=e,e=null),s?e="buffer":e||(e=n.defaultEncoding),"function"!=typeof r&&(r=v),n.ended?function(t,e){var r=new Error("write after end");t.emit("error",r),o.nextTick(e,r)}(this,r):(s||function(t,e,r,n){var i=!0,s=!1;return null===r?s=new TypeError("May not write null values to stream"):"string"==typeof r||void 0===r||e.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(t.emit("error",s),o.nextTick(n,s),i=!1),i}(this,n,t,r))&&(n.pendingcb++,i=function(t,e,r,n,i,o){if(!r){var s=function(t,e,r){return t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=p.from(e,r)),e}(e,n,i);n!==s&&(r=!0,i="buffer",n=s)}var a=e.objectMode?1:n.length;e.length+=a;var u=e.length-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(m.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),m.prototype._write=function(t,e,r){r(new Error("_write() is not implemented"))},m.prototype._writev=null,m.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!==t&&void 0!==t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,x(t,e),r&&(e.finished?o.nextTick(r):t.once("finish",r)),e.ended=!0,t.writable=!1}(this,n,r)},Object.defineProperty(m.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),m.prototype.destroy=_.destroy,m.prototype._undestroy=_.undestroy,m.prototype._destroy=function(t,e){this.end(),e(t)}}).call(this,r(4),r(11).setImmediate,r(0))},function(t,e,r){(function(e,r,n){t.exports=function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof _dereq_&&_dereq_;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=r[s]={exports:{}};e[s][0].call(l.exports,function(t){return i(e[s][1][t]||t)},l,l.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s0;){var e=t.shift();if("function"==typeof e){var r=t.shift(),n=t.shift();e.call(r,n)}else e._settlePromises()}},u.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,this._drainQueue(this._lateQueue)},u.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},u.prototype._reset=function(){this._isTickUsed=!1},r.exports=u,r.exports.firstLineError=i},{"./queue":26,"./schedule":29,"./util":36}],3:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0==(50397184&this._bitField)&&this._resolveCallback(e.target)},u=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=n.propagateFromFunction(),t.prototype._boundValue=n.boundValueFunction());var c=r(o),l=new t(e);l._propagateFrom(this,1);var f=this._target();if(l._setBoundTo(c),c instanceof t){var h={promiseRejectionQueued:!1,promise:l,target:f,bindingPromise:c};f._then(e,s,void 0,l,h),c._then(a,u,void 0,l,h),l._setOnCancel(c)}else l._resolveCallback(f);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152==(2097152&this._bitField)},t.bind=function(e,r){return t.resolve(r).bind(e)}}},{}],4:[function(t,e,r){"use strict";var n;"undefined"!=typeof Promise&&(n=Promise);var i=t("./promise")();i.noConflict=function(){try{Promise===i&&(Promise=n)}catch(t){}return i},e.exports=i},{"./promise":22}],5:[function(t,e,r){"use strict";var n=Object.create;if(n){var i=n(null),o=n(null);i[" size"]=o[" size"]=0}e.exports=function(e){var r=t("./util"),n=r.canEvaluate;function i(t){return function(t,n){var i;if(null!=t&&(i=t[n]),"function"!=typeof i){var o="Object "+r.classString(t)+" has no method '"+r.toString(n)+"'";throw new e.TypeError(o)}return i}(t,this.pop()).apply(t,this)}function o(t){return t[this]}function s(t){var e=+this;return e<0&&(e=Math.max(0,e+t.length)),t[e]}r.isIdentifier,e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(i,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e;if("number"==typeof t)e=s;else if(n){var r=(void 0)(t);e=null!==r?r:o}else e=o;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,r){"use strict";e.exports=function(e,r,n,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,u=e._async;e.prototype.break=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var r=t._cancellationParent;if(null==r||!r._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=r}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),!!this._enoughBranchesHaveCancelled()&&(this._invokeOnCancel(),!0))},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),u.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var r=0;r=0)return r[t]}return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},n.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,r.push(this._trace))},n.prototype._popContext=function(){if(void 0!==this._trace){var t=r.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},n.CapturedTrace=null,n.create=function(){if(e)return new n},n.deactivateLongStackTraces=function(){},n.activateLongStackTraces=function(){var r=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,u=t.prototype._promiseCreated;n.deactivateLongStackTraces=function(){t.prototype._pushContext=r,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=u,e=!1},e=!0,t.prototype._pushContext=n.prototype._pushContext,t.prototype._popContext=n.prototype._popContext,t._peekContext=t.prototype._peekContext=i,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},n}},{}],9:[function(t,r,n){"use strict";r.exports=function(r,n){var i,o,s,a=r._getDomain,u=r._async,c=t("./errors").Warning,l=t("./util"),f=l.canAttachTrace,h=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,p=/\((?:timers\.js):\d+:\d+\)/,d=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,_=null,v=null,y=!1,m=!(0==l.env("BLUEBIRD_DEBUG")),g=!(0==l.env("BLUEBIRD_WARNINGS")||!m&&!l.env("BLUEBIRD_WARNINGS")),b=!(0==l.env("BLUEBIRD_LONG_STACK_TRACES")||!m&&!l.env("BLUEBIRD_LONG_STACK_TRACES")),w=0!=l.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(g||!!l.env("BLUEBIRD_W_FORGOTTEN_RETURN"));r.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},r.prototype._ensurePossibleRejectionHandled=function(){if(0==(524288&this._bitField)){this._setRejectionIsUnhandled();var t=this;setTimeout(function(){t._notifyUnhandledRejection()},1)}},r.prototype._notifyUnhandledRejectionIsHandled=function(){q("rejectionHandled",i,void 0,this)},r.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},r.prototype._returnedNonUndefined=function(){return 0!=(268435456&this._bitField)},r.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),q("unhandledRejection",o,t,this)}},r.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},r.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},r.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},r.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},r.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},r.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},r.prototype._warn=function(t,e,r){return U(t,e,r||this)},r.onPossiblyUnhandledRejection=function(t){var e=a();o="function"==typeof t?null===e?t:l.domainBind(e,t):void 0},r.onUnhandledRejectionHandled=function(t){var e=a();i="function"==typeof t?null===e?t:l.domainBind(e,t):void 0};var E=function(){};r.longStackTraces=function(){if(u.haveItemsQueued()&&!J.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!J.longStackTraces&&Y()){var t=r.prototype._captureStackTrace,e=r.prototype._attachExtraTrace;J.longStackTraces=!0,E=function(){if(u.haveItemsQueued()&&!J.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");r.prototype._captureStackTrace=t,r.prototype._attachExtraTrace=e,n.deactivateLongStackTraces(),u.enableTrampoline(),J.longStackTraces=!1},r.prototype._captureStackTrace=D,r.prototype._attachExtraTrace=I,n.activateLongStackTraces(),u.disableTrampolineIfNecessary()}},r.hasLongStackTraces=function(){return J.longStackTraces&&Y()};var C=function(){try{if("function"==typeof CustomEvent){var t=new CustomEvent("CustomEvent");return l.global.dispatchEvent(t),function(t,e){var r=new CustomEvent(t.toLowerCase(),{detail:e,cancelable:!0});return!l.global.dispatchEvent(r)}}return"function"==typeof Event?(t=new Event("CustomEvent"),l.global.dispatchEvent(t),function(t,e){var r=new Event(t.toLowerCase(),{cancelable:!0});return r.detail=e,!l.global.dispatchEvent(r)}):((t=document.createEvent("CustomEvent")).initCustomEvent("testingtheevent",!1,!0,{}),l.global.dispatchEvent(t),function(t,e){var r=document.createEvent("CustomEvent");return r.initCustomEvent(t.toLowerCase(),!1,!0,e),!l.global.dispatchEvent(r)})}catch(t){}return function(){return!1}}(),x=l.isNode?function(){return e.emit.apply(e,arguments)}:l.global?function(t){var e="on"+t.toLowerCase(),r=l.global[e];return!!r&&(r.apply(l.global,[].slice.call(arguments,1)),!0)}:function(){return!1};function j(t,e){return{promise:e}}var S={promiseCreated:j,promiseFulfilled:j,promiseRejected:j,promiseResolved:j,promiseCancelled:j,promiseChained:function(t,e,r){return{promise:e,child:r}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,r){return{reason:e,promise:r}},rejectionHandled:j},R=function(t){var e=!1;try{e=x.apply(null,arguments)}catch(t){u.throwLater(t),e=!0}var r=!1;try{r=C(t,S[t].apply(null,arguments))}catch(t){u.throwLater(t),r=!0}return r||e};function k(){return!1}function T(t,e,r){var n=this;try{t(e,r,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+l.toString(t));n._attachCancellationCallback(t)})}catch(t){return t}}function P(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?l.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function O(){return this._onCancelField}function A(t){this._onCancelField=t}function F(){this._cancellationParent=void 0,this._onCancelField=void 0}function L(t,e){if(0!=(1&e)){this._cancellationParent=t;var r=t._branchesRemainingToCancel;void 0===r&&(r=0),t._branchesRemainingToCancel=r+1}0!=(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}r.config=function(t){if("longStackTraces"in(t=Object(t))&&(t.longStackTraces?r.longStackTraces():!t.longStackTraces&&r.hasLongStackTraces()&&E()),"warnings"in t){var e=t.warnings;J.warnings=!!e,w=J.warnings,l.isObject(e)&&"wForgottenReturn"in e&&(w=!!e.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!J.cancellation){if(u.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");r.prototype._clearCancellationData=F,r.prototype._propagateFrom=L,r.prototype._onCancel=O,r.prototype._setOnCancel=A,r.prototype._attachCancellationCallback=P,r.prototype._execute=T,M=L,J.cancellation=!0}return"monitoring"in t&&(t.monitoring&&!J.monitoring?(J.monitoring=!0,r.prototype._fireEvent=R):!t.monitoring&&J.monitoring&&(J.monitoring=!1,r.prototype._fireEvent=k)),r},r.prototype._fireEvent=k,r.prototype._execute=function(t,e,r){try{t(e,r)}catch(t){return t}},r.prototype._onCancel=function(){},r.prototype._setOnCancel=function(t){},r.prototype._attachCancellationCallback=function(t){},r.prototype._captureStackTrace=function(){},r.prototype._attachExtraTrace=function(){},r.prototype._clearCancellationData=function(){},r.prototype._propagateFrom=function(t,e){};var M=function(t,e){0!=(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)};function B(){var t=this._boundTo;return void 0!==t&&t instanceof r?t.isFulfilled()?t.value():void 0:t}function D(){this._trace=new X(this._peekContext())}function I(t,e){if(f(t)){var r=this._trace;if(void 0!==r&&e&&(r=r._parent),void 0!==r)r.attachExtraTrace(t);else if(!t.__stackCleaned__){var n=H(t);l.notEnumerableProp(t,"stack",n.message+"\n"+n.stack.join("\n")),l.notEnumerableProp(t,"__stackCleaned__",!0)}}}function U(t,e,n){if(J.warnings){var i,o=new c(t);if(e)n._attachExtraTrace(o);else if(J.longStackTraces&&(i=r._peekContext()))i.attachExtraTrace(o);else{var s=H(o);o.stack=s.message+"\n"+s.stack.join("\n")}R("warning",o)||V(o,"",!0)}}function N(t){for(var e=[],r=0;r0?function(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),r=0;r0&&"SyntaxError"!=t.name&&(e=e.slice(r)),e}(t):[" (No stack trace)"],{message:r,stack:"SyntaxError"==t.name?e:N(e)}}function V(t,e,r){if("undefined"!=typeof console){var n;if(l.isObject(t)){var i=t.stack;n=e+v(i,t)}else n=e+String(t);"function"==typeof s?s(n,r):"function"!=typeof console.log&&"object"!=typeof console.log||console.log(n)}}function q(t,e,r,n){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(n):e(r,n))}catch(t){u.throwLater(t)}"unhandledRejection"===t?R(t,r,n)||i||V(r,"Unhandled rejection "):R(t,n)}function W(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{if(e=t&&"function"==typeof t.toString?t.toString():l.toString(t),/\[object [a-zA-Z0-9$_]+\]/.test(e))try{e=JSON.stringify(t)}catch(t){}0===e.length&&(e="(empty array)")}return"(<"+function(t){return t.length<41?t:t.substr(0,38)+"..."}(e)+">, no stack trace)"}function Y(){return"function"==typeof G}var $=function(){return!1},z=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;function Q(t){var e=t.match(z);if(e)return{fileName:e[1],line:parseInt(e[2],10)}}function X(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);G(this,X),e>32&&this.uncycle()}l.inherits(X,Error),n.CapturedTrace=X,X.prototype.uncycle=function(){var t=this._length;if(!(t<2)){for(var e=[],r={},n=0,i=this;void 0!==i;++n)e.push(i),i=i._parent;for(n=(t=this._length=n)-1;n>=0;--n){var o=e[n].stack;void 0===r[o]&&(r[o]=n)}for(n=0;n0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[n]._parent=void 0,e[n]._length=1;var a=n>0?e[n-1]:this;s=0;--c)e[c]._length=u,u++;return}}}},X.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=H(t),r=e.message,n=[e.stack],i=this;void 0!==i;)n.push(N(i.stack.split("\n"))),i=i._parent;!function(t){for(var e=t[0],r=1;r=0;--a)if(n[a]===o){s=a;break}for(a=s;a>=0;--a){var u=n[a];if(e[i]!==u)break;e.pop(),i--}e=n}}(n),function(t){for(var e=0;e=0)return _=/@/,v=e,y=!0,function(t){t.stack=(new Error).stack};try{throw new Error}catch(t){n="stack"in t}return"stack"in i||!n||"number"!=typeof Error.stackTraceLimit?(v=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?W(e):e.toString()},null):(_=t,v=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}();"undefined"!=typeof console&&void 0!==console.warn&&(s=function(t){console.warn(t)},l.isNode&&e.stderr.isTTY?s=function(t,e){var r=e?"":"";console.warn(r+t+"\n")}:l.isNode||"string"!=typeof(new Error).stack||(s=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var J={warnings:g,longStackTraces:!1,cancellation:!1,monitoring:!1};return b&&r.longStackTraces(),{longStackTraces:function(){return J.longStackTraces},warnings:function(){return J.warnings},cancellation:function(){return J.cancellation},monitoring:function(){return J.monitoring},propagateFromFunction:function(){return M},boundValueFunction:function(){return B},checkForgottenReturns:function(t,e,r,n,i){if(void 0===t&&null!==e&&w){if(void 0!==i&&i._returnedNonUndefined())return;if(0==(65535&n._bitField))return;r&&(r+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),u=N(a),c=u.length-1;c>=0;--c){var l=u[c];if(!p.test(l)){var f=l.match(d);f&&(o="at "+f[1]+":"+f[2]+":"+f[3]+" ");break}}if(u.length>0){var h=u[0];for(c=0;c0&&(s="\n"+a[c-1]);break}}}var _="a promise was created in a "+r+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;n._warn(_,!0,e)}},setBounds:function(t,e){if(Y()){for(var r,n,i=t.stack.split("\n"),o=e.stack.split("\n"),s=-1,a=-1,u=0;u=a||($=function(t){if(h.test(t))return!0;var e=Q(t);return!!(e&&e.fileName===r&&s<=e.line&&e.line<=a)})}},warn:U,deprecated:function(t,e){var r=t+" is deprecated and will be removed in a future version.";return e&&(r+=" Use "+e+" instead."),U(r)},CapturedTrace:X,fireDomEvent:C,fireGlobalEvent:x}}},{"./errors":12,"./util":36}],10:[function(t,e,r){"use strict";e.exports=function(t){function e(){return this.value}function r(){throw this.reason}t.prototype.return=t.prototype.thenReturn=function(r){return r instanceof t&&r.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:r},void 0)},t.prototype.throw=t.prototype.thenThrow=function(t){return this._then(r,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,r,void 0,{reason:t},void 0);var e=arguments[1];return this.caught(t,function(){throw e})},t.prototype.catchReturn=function(r){if(arguments.length<=1)return r instanceof t&&r.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:r},void 0);var n=arguments[1];return n instanceof t&&n.suppressUnhandledRejections(),this.caught(r,function(){return n})}}},{}],11:[function(t,e,r){"use strict";e.exports=function(t,e){var r=t.reduce,n=t.all;function i(){return n(this)}t.prototype.each=function(t){return r(this,t,e,0)._then(i,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return r(this,t,e,e)},t.each=function(t,n){return r(t,n,e,0)._then(i,void 0,void 0,t,void 0)},t.mapSeries=function(t,n){return r(t,n,e,e)}}},{}],12:[function(t,e,r){"use strict";var n,i,o=t("./es5"),s=o.freeze,a=t("./util"),u=a.inherits,c=a.notEnumerableProp;function l(t,e){function r(n){if(!(this instanceof r))return new r(n);c(this,"message","string"==typeof n?n:e),c(this,"name",t),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this)}return u(r,Error),r}var f=l("Warning","warning"),h=l("CancellationError","cancellation error"),p=l("TimeoutError","timeout error"),d=l("AggregateError","aggregate error");try{n=TypeError,i=RangeError}catch(t){n=l("TypeError","type error"),i=l("RangeError","range error")}for(var _="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),v=0;v<_.length;++v)"function"==typeof Array.prototype[_[v]]&&(d.prototype[_[v]]=Array.prototype[_[v]]);o.defineProperty(d.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),d.prototype.isOperational=!0;var y=0;function m(t){if(!(this instanceof m))return new m(t);c(this,"name","OperationalError"),c(this,"message",t),this.cause=t,this.isOperational=!0,t instanceof Error?(c(this,"message",t.message),c(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}d.prototype.toString=function(){var t=Array(4*y+1).join(" "),e="\n"+t+"AggregateError of:\n";y++,t=Array(4*y+1).join(" ");for(var r=0;r1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0)}function f(){return p.call(this,this.promise._target()._settledValue())}function h(t){if(!l(this,t))return s.e=t,s}function p(t){var i=this.promise,a=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?a.call(i._boundValue()):a.call(i._boundValue(),t);if(u===n)return u;if(void 0!==u){i._setReturnedNonUndefined();var p=r(u,i);if(p instanceof e){if(null!=this.cancelPromise){if(p._isCancelled()){var d=new o("late cancellation observer");return i._attachExtraTrace(d),s.e=d,s}p.isPending()&&p._attachCancellationCallback(new c(this))}return p._then(f,h,void 0,this,void 0)}}}return i.isRejected()?(l(this),s.e=t,s):(l(this),t)}return u.prototype.isFinallyHandler=function(){return 0===this.type},c.prototype._resultCancelled=function(){l(this.finallyHandler)},e.prototype._passThrough=function(t,e,r,n){return"function"!=typeof t?this.then():this._then(r,n,void 0,new u(this,e,t),void 0)},e.prototype.lastly=e.prototype.finally=function(t){return this._passThrough(t,0,p,p)},e.prototype.tap=function(t){return this._passThrough(t,1,p)},e.prototype.tapCatch=function(t){var r=arguments.length;if(1===r)return this._passThrough(t,1,void 0,p);var n,o=new Array(r-1),s=0;for(n=0;n0&&"function"==typeof arguments[e]&&(t=arguments[e]);var n=[].slice.call(arguments);t&&n.pop();var i=new r(n).promise();return void 0!==t?i.spread(t):i}}},{"./util":36}],18:[function(t,e,r){"use strict";e.exports=function(e,r,n,i,o,s){var a=e._getDomain,u=t("./util"),c=u.tryCatch,l=u.errorObj,f=e._async;function h(t,e,r,n){this.constructor$(t),this._promise._captureStackTrace();var i=a();this._callback=null===i?e:u.domainBind(i,e),this._preservedValues=n===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0)}function p(t,r,i,o){if("function"!=typeof r)return n("expecting a function but got "+u.classString(r));var s=0;if(void 0!==i){if("object"!=typeof i||null===i)return e.reject(new TypeError("options argument must be an object but it is "+u.classString(i)));if("number"!=typeof i.concurrency)return e.reject(new TypeError("'concurrency' must be a number but it is "+u.classString(i.concurrency)));s=i.concurrency}return new h(t,r,s="number"==typeof s&&isFinite(s)&&s>=1?s:0,o).promise()}u.inherits(h,r),h.prototype._asyncInit=function(){this._init$(void 0,-2)},h.prototype._init=function(){},h.prototype._promiseFulfilled=function(t,r){var n=this._values,o=this.length(),a=this._preservedValues,u=this._limit;if(r<0){if(n[r=-1*r-1]=t,u>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(u>=1&&this._inFlight>=u)return n[r]=t,this._queue.push(r),!1;null!==a&&(a[r]=t);var f=this._promise,h=this._callback,p=f._boundValue();f._pushContext();var d=c(h).call(p,t,r,o),_=f._popContext();if(s.checkForgottenReturns(d,_,null!==a?"Promise.filter":"Promise.map",f),d===l)return this._reject(d.e),!0;var v=i(d,this._promise);if(v instanceof e){var y=(v=v._target())._bitField;if(0==(50397184&y))return u>=1&&this._inFlight++,n[r]=v,v._proxy(this,-1*(r+1)),!1;if(0==(33554432&y))return 0!=(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);d=v._value()}n[r]=d}return++this._totalResolved>=o&&(null!==a?this._filter(n,a):this._resolve(n),!0)},h.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,r=this._values;t.length>0&&this._inFlight1){o.deprecated("calling Promise.try with more than 1 argument");var c=arguments[1],l=arguments[2];n=s.isArray(c)?a(t).apply(l,c):a(t).call(l,c)}else n=a(t)();var f=u._popContext();return o.checkForgottenReturns(n,f,"Promise.try",u),u._resolveFromSyncValue(n),u},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,r){"use strict";var n=t("./util"),i=n.maybeWrapAsError,o=t("./errors").OperationalError,s=t("./es5"),a=/^(?:name|message|stack|cause)$/;function u(t){var e;if(function(t){return t instanceof Error&&s.getPrototypeOf(t)===Error.prototype}(t)){(e=new o(t)).name=t.name,e.message=t.message,e.stack=t.stack;for(var r=s.keys(t),i=0;i1){var r,n=new Array(e-1),i=0;for(r=0;r0&&"function"!=typeof t&&"function"!=typeof e){var r=".then() only accepts functions but was passed: "+c.classString(t);arguments.length>1&&(r+=", "+c.classString(e)),this._warn(r)}return this._then(t,e,void 0,void 0,void 0)},T.prototype.done=function(t,e){this._then(t,e,void 0,void 0,void 0)._setIsFinal()},T.prototype.spread=function(t){return"function"!=typeof t?o("expecting a function but got "+c.classString(t)):this.all()._then(t,void 0,void 0,y,void 0)},T.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},T.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new b(this).promise()},T.prototype.error=function(t){return this.caught(c.originatesFromRejection,t)},T.getNewLibraryCopy=r.exports,T.is=function(t){return t instanceof T},T.fromNode=T.fromCallback=function(t){var e=new T(v);e._captureStackTrace();var r=arguments.length>1&&!!Object(arguments[1]).multiArgs,n=k(t)(S(e,r));return n===R&&e._rejectCallback(n.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},T.all=function(t){return new b(t).promise()},T.cast=function(t){var e=g(t);return e instanceof T||((e=new T(v))._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},T.resolve=T.fulfilled=T.cast,T.reject=T.rejected=function(t){var e=new T(v);return e._captureStackTrace(),e._rejectCallback(t,!0),e},T.setScheduler=function(t){if("function"!=typeof t)throw new d("expecting a function but got "+c.classString(t));return h.setScheduler(t)},T.prototype._then=function(t,e,r,n,i){var o=void 0!==i,s=o?i:new T(v),u=this._target(),l=u._bitField;o||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===n&&0!=(2097152&this._bitField)&&(n=0!=(50397184&l)?this._boundValue():u===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var f=a();if(0!=(50397184&l)){var p,d,y=u._settlePromiseCtx;0!=(33554432&l)?(d=u._rejectionHandler0,p=t):0!=(16777216&l)?(d=u._fulfillmentHandler0,p=e,u._unsetRejectionIsUnhandled()):(y=u._settlePromiseLateCancellationObserver,d=new _("late cancellation observer"),u._attachExtraTrace(d),p=e),h.invoke(y,u,{handler:null===f?p:"function"==typeof p&&c.domainBind(f,p),promise:s,receiver:n,value:d})}else u._addCallbacks(t,e,s,n,f);return s},T.prototype._length=function(){return 65535&this._bitField},T.prototype._isFateSealed=function(){return 0!=(117506048&this._bitField)},T.prototype._isFollowing=function(){return 67108864==(67108864&this._bitField)},T.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},T.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},T.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},T.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},T.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},T.prototype._isFinal=function(){return(4194304&this._bitField)>0},T.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},T.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},T.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},T.prototype._setAsyncGuaranteed=function(){h.hasCustomScheduler()||(this._bitField=134217728|this._bitField)},T.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];if(e!==u)return void 0===e&&this._isBound()?this._boundValue():e},T.prototype._promiseAt=function(t){return this[4*t-4+2]},T.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},T.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},T.prototype._boundValue=function(){},T.prototype._migrateCallback0=function(t){t._bitField;var e=t._fulfillmentHandler0,r=t._rejectionHandler0,n=t._promise0,i=t._receiverAt(0);void 0===i&&(i=u),this._addCallbacks(e,r,n,i,null)},T.prototype._migrateCallbackAt=function(t,e){var r=t._fulfillmentHandlerAt(e),n=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=u),this._addCallbacks(r,n,i,o,null)},T.prototype._addCallbacks=function(t,e,r,n,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=r,this._receiver0=n,"function"==typeof t&&(this._fulfillmentHandler0=null===i?t:c.domainBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=null===i?e:c.domainBind(i,e));else{var s=4*o-4;this[s+2]=r,this[s+3]=n,"function"==typeof t&&(this[s+0]=null===i?t:c.domainBind(i,t)),"function"==typeof e&&(this[s+1]=null===i?e:c.domainBind(i,e))}return this._setLength(o+1),o},T.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},T.prototype._resolveCallback=function(t,e){if(0==(117506048&this._bitField)){if(t===this)return this._rejectCallback(n(),!1);var r=g(t,this);if(!(r instanceof T))return this._fulfill(t);e&&this._propagateFrom(r,2);var i=r._target();if(i!==this){var o=i._bitField;if(0==(50397184&o)){var s=this._length();s>0&&i._migrateCallback0(this);for(var a=1;a>>16)){if(t===this){var r=n();return this._attachExtraTrace(r),this._reject(r)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!=(134217728&e)?this._settlePromises():h.settlePromises(this))}},T.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(this._setRejected(),this._fulfillmentHandler0=t,this._isFinal())return h.fatalError(t,c.isNode);(65535&e)>0?h.settlePromises(this):this._ensurePossibleRejectionHandled()}},T.prototype._fulfillPromises=function(t,e){for(var r=1;r0){if(0!=(16842752&t)){var r=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,r,t),this._rejectPromises(e,r)}else{var n=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,n,t),this._fulfillPromises(e,n)}this._setLength(0)}this._clearCancellationData()},T.prototype._settledValue=function(){var t=this._bitField;return 0!=(33554432&t)?this._rejectionHandler0:0!=(16777216&t)?this._fulfillmentHandler0:void 0},T.defer=T.pending=function(){return C.deprecated("Promise.defer","new Promise"),{promise:new T(v),resolve:P,reject:O}},c.notEnumerableProp(T,"_makeSelfResolutionError",n),t("./method")(T,v,g,o,C),t("./bind")(T,v,g,C),t("./cancel")(T,b,o,C),t("./direct_resolve")(T),t("./synchronous_inspection")(T),t("./join")(T,b,g,v,h,a),T.Promise=T,T.version="3.5.1",t("./map.js")(T,b,o,g,v,C),t("./call_get.js")(T),t("./using.js")(T,o,g,E,v,C),t("./timers.js")(T,v,C),t("./generators.js")(T,o,v,g,s,C),t("./nodeify.js")(T),t("./promisify.js")(T,v),t("./props.js")(T,b,g,o),t("./race.js")(T,v,g,o),t("./reduce.js")(T,b,o,g,v,C),t("./settle.js")(T,b,C),t("./some.js")(T,b,o),t("./filter.js")(T,v),t("./each.js")(T,v),t("./any.js")(T),c.toFastProperties(T),c.toFastProperties(T.prototype),A({a:1}),A({b:2}),A({c:3}),A(1),A(function(){}),A(void 0),A(!1),A(new T(v)),C.setBounds(f.firstLineError,c.lastLineError),T}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36}],23:[function(t,e,r){"use strict";e.exports=function(e,r,n,i,o){var s=t("./util");function a(t){var n=this._promise=new e(r);t instanceof e&&n._propagateFrom(t,3),n._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}return s.isArray,s.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function t(r,o){var a=n(this._values,this._promise);if(a instanceof e){var u=(a=a._target())._bitField;if(this._values=a,0==(50397184&u))return this._promise._setAsyncGuaranteed(),a._then(t,this._reject,void 0,this,o);if(0==(33554432&u))return 0!=(16777216&u)?this._reject(a._reason()):this._cancel();a=a._value()}if(null!==(a=s.asArray(a)))0!==a.length?this._iterate(a):-5===o?this._resolveEmptyArray():this._resolve(function(t){switch(o){case-2:return[];case-3:return{};case-6:return new Map}}());else{var c=i("expecting an array or an iterable object but got "+s.classString(a)).reason();this._promise._rejectCallback(c,!1)}},a.prototype._iterate=function(t){var r=this.getActualLength(t.length);this._length=r,this._values=this.shouldCopyValues()?new Array(r):this._values;for(var i=this._promise,o=!1,s=null,a=0;a=this._length&&(this._resolve(this._values),!0)},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var r=0;r=this._length){var r;if(this._isMap)r=function(t){for(var e=new o,r=t.length/2|0,n=0;n>1},e.prototype.props=function(){return f(this)},e.props=function(t){return f(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,r){"use strict";function n(t){this._capacity=t,this._length=0,this._front=0}n.prototype._willBeOverCapacity=function(t){return this._capacity=this._length&&(this._resolve(this._values),!0)},o.prototype._promiseFulfilled=function(t,e){var r=new i;return r._bitField=33554432,r._settledValueField=t,this._promiseResolved(e,r)},o.prototype._promiseRejected=function(t,e){var r=new i;return r._bitField=16777216,r._settledValueField=t,this._promiseResolved(e,r)},e.settle=function(t){return n.deprecated(".settle()",".reflect()"),new o(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,r){"use strict";e.exports=function(e,r,n){var i=t("./util"),o=t("./errors").RangeError,s=t("./errors").AggregateError,a=i.isArray,u={};function c(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function l(t,e){if((0|e)!==e||e<0)return n("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");var r=new c(t),i=r.promise();return r.setHowMany(e),r.init(),i}i.inherits(c,r),c.prototype._init=function(){if(this._initialized)if(0!==this._howMany){this._init$(void 0,-5);var t=a(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}else this._resolve([])},c.prototype.init=function(){this._initialized=!0,this._init()},c.prototype.setUnwrap=function(){this._unwrap=!0},c.prototype.howMany=function(){return this._howMany},c.prototype.setHowMany=function(t){this._howMany=t},c.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0)},c.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},c.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(u),this._checkOutcome())},c.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new s,e=this.length();e0?this._reject(t):this._cancel(),!0}return!1},c.prototype._fulfilled=function(){return this._totalResolved},c.prototype._rejected=function(){return this._values.length-this.length()},c.prototype._addRejected=function(t){this._values.push(t)},c.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},c.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},c.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new o(e)},c.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return l(t,e)},e.prototype.some=function(t){return l(this,t)},e._SomePromiseArray=c}},{"./errors":12,"./util":36}],32:[function(t,e,r){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var r=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},n=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!=(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!=(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0==(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!=(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!=(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536==(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!=(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return r.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),n.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,r){"use strict";e.exports=function(e,r){var n=t("./util"),i=n.errorObj,o=n.isObject,s={}.hasOwnProperty;return function(t,a){if(o(t)){if(t instanceof e)return t;var u=function(t){try{return function(t){return t.then}(t)}catch(t){return i.e=t,i}}(t);if(u===i){a&&a._pushContext();var c=e.reject(u.e);return a&&a._popContext(),c}if("function"==typeof u)return function(t){try{return s.call(t,"_promise0")}catch(t){return!1}}(t)?(c=new e(r),t._then(c._fulfill,c._reject,void 0,c,null),c):function(t,o,s){var a=new e(r),u=a;s&&s._pushContext(),a._captureStackTrace(),s&&s._popContext();var c=!0,l=n.tryCatch(o).call(t,function(t){a&&(a._resolveCallback(t),a=null)},function(t){a&&(a._rejectCallback(t,c,!0),a=null)});return c=!1,a&&l===i&&(a._rejectCallback(l.e,!0,!0),a=null),u}(t,u,a)}return t}}},{"./util":36}],34:[function(t,e,r){"use strict";e.exports=function(e,r,n){var i=t("./util"),o=e.TimeoutError;function s(t){this.handle=t}s.prototype._resultCancelled=function(){clearTimeout(this.handle)};var a=function(t){return u(+this).thenReturn(t)},u=e.delay=function(t,i){var o,u;return void 0!==i?(o=e.resolve(i)._then(a,null,null,t,void 0),n.cancellation()&&i instanceof e&&o._setOnCancel(i)):(o=new e(r),u=setTimeout(function(){o._fulfill()},+t),n.cancellation()&&o._setOnCancel(new s(u)),o._captureStackTrace()),o._setAsyncGuaranteed(),o};function c(t){return clearTimeout(this.handle),t}function l(t){throw clearTimeout(this.handle),t}e.prototype.delay=function(t){return u(t,this)},e.prototype.timeout=function(t,e){var r,a;t=+t;var u=new s(setTimeout(function(){r.isPending()&&function(t,e,r){var n;n="string"!=typeof e?e instanceof Error?e:new o("operation timed out"):new o(e),i.markAsOriginatingFromRejection(n),t._attachExtraTrace(n),t._reject(n),null!=r&&r.cancel()}(r,e,a)},t));return n.cancellation()?(a=this.then(),(r=a._then(c,l,void 0,u,void 0))._setOnCancel(u)):r=this._then(c,l,void 0,u,void 0),r}}},{"./util":36}],35:[function(t,e,r){"use strict";e.exports=function(e,r,n,i,o,s){var a=t("./util"),u=t("./errors").TypeError,c=t("./util").inherits,l=a.errorObj,f=a.tryCatch,h={};function p(t){setTimeout(function(){throw t},0)}function d(t,r){var i=0,s=t.length,a=new e(o);return function o(){if(i>=s)return a._fulfill();var u=function(t){var e=n(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}(t[i++]);if(u instanceof e&&u._isDisposable()){try{u=n(u._getDisposer().tryDispose(r),t.promise)}catch(t){return p(t)}if(u instanceof e)return u._then(o,p,null,null,null)}o()}(),a}function _(t,e,r){this._data=t,this._promise=e,this._context=r}function v(t,e,r){this.constructor$(t,e,r)}function y(t){return _.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function m(t){this.length=t,this.promise=null,this[t-1]=null}_.prototype.data=function(){return this._data},_.prototype.promise=function(){return this._promise},_.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():h},_.prototype.tryDispose=function(t){var e=this.resource(),r=this._context;void 0!==r&&r._pushContext();var n=e!==h?this.doDispose(e,t):null;return void 0!==r&&r._popContext(),this._promise._unsetDisposable(),this._data=null,n},_.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},c(v,_),v.prototype.doDispose=function(t,e){return this.data().call(t,t,e)},m.prototype._resultCancelled=function(){for(var t=this.length,r=0;r0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new v(t,this,i());throw new u}}},{"./errors":12,"./util":36}],36:[function(t,n,i){"use strict";var o,s=t("./es5"),a="undefined"==typeof navigator,u={e:{}},c="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==r?r:void 0!==this?this:null;function l(){try{var t=o;return o=null,t.apply(this,arguments)}catch(t){return u.e=t,u}}function f(t){return null==t||!0===t||!1===t||"string"==typeof t||"number"==typeof t}function h(t,e,r){if(f(t))return t;var n={value:r,configurable:!0,enumerable:!1,writable:!0};return s.defineProperty(t,e,n),t}var p=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var r=0;r1,n=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=d.test(t+"")&&s.names(t).length>0;if(r||n||i)return!0}return!1}catch(t){return!1}},isIdentifier:function(t){return _.test(t)},inheritedDataKeys:p,getDataPropertyOrDefault:function(t,e,r){if(!s.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var n=Object.getOwnPropertyDescriptor(t,e);return null!=n?null==n.get&&null==n.set?n.value:r:void 0},thrower:function(t){throw t},isArray:s.isArray,asArray:w,notEnumerableProp:h,isPrimitive:f,isObject:function(t){return"function"==typeof t||"object"==typeof t&&null!==t},isError:y,canEvaluate:a,errorObj:u,tryCatch:function(t){return o=t,l},inherits:function(t,e){var r={}.hasOwnProperty;function n(){for(var n in this.constructor=t,this.constructor$=e,e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}return n.prototype=e.prototype,t.prototype=new n,t.prototype},withAppended:function(t,e){var r,n=t.length,i=new Array(n+1);for(r=0;r10||t[0]>0}(),j.isNode&&j.toFastProperties(e);try{throw new Error}catch(t){j.lastLineError=t}n.exports=j},{"./es5":13}]},{},[4])(4),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise)}).call(this,r(4),r(0),r(11).setImmediate)},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e){if(!e.eol&&t)for(var r=0,n=t.length;r0?("string"==typeof e||s.objectMode||Object.getPrototypeOf(e)===c.prototype||(e=function(t){return c.from(t)}(e)),n?s.endEmitted?t.emit("error",new Error("stream.unshift() after end event")):w(t,s,e,!0):s.ended?t.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?w(t,s,e,!1):S(t,s)):w(t,s,e,!1))):n||(s.reading=!1)),function(t){return!t.ended&&(t.needReadable||t.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=E?t=E:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function x(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(p("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?i.nextTick(j,t):j(t))}function j(t){p("emit readable"),t.emit("readable"),P(t)}function S(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(R,t,e))}function R(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var n;return to.length?o.length:t;if(s===o.length?i+=o:i+=o.slice(0,t),0==(t-=s)){s===o.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(s));break}++n}return e.length-=n,i}(t,e):function(t,e){var r=c.allocUnsafe(t),n=e.head,i=1;for(n.data.copy(r),t-=n.data.length;n=n.next;){var o=n.data,s=t>o.length?o.length:t;if(o.copy(r,r.length-t,0,s),0==(t-=s)){s===o.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(s));break}++i}return e.length-=i,r}(t,e),n}(t,e.buffer,e.decoder),r);var r}function A(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,i.nextTick(F,e,t))}function F(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function L(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return p("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?A(this):x(this),null;if(0===(t=C(t,e))&&e.ended)return 0===e.length&&A(this),null;var n,i=e.needReadable;return p("need readable",i),(0===e.length||e.length-t0?O(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&A(this)),null!==n&&this.emit("data",n),n},g.prototype._read=function(t){this.emit("error",new Error("_read() is not implemented"))},g.prototype.pipe=function(t,e){var r=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=t;break;case 1:o.pipes=[o.pipes,t];break;default:o.pipes.push(t)}o.pipesCount+=1,p("pipe count=%d opts=%j",o.pipesCount,e);var u=e&&!1===e.end||t===n.stdout||t===n.stderr?m:c;function c(){p("onend"),t.end()}o.endEmitted?i.nextTick(u):r.once("end",u),t.on("unpipe",function e(n,i){p("onunpipe"),n===r&&i&&!1===i.hasUnpiped&&(i.hasUnpiped=!0,p("cleanup"),t.removeListener("close",v),t.removeListener("finish",y),t.removeListener("drain",l),t.removeListener("error",_),t.removeListener("unpipe",e),r.removeListener("end",c),r.removeListener("end",m),r.removeListener("data",d),f=!0,!o.awaitDrain||t._writableState&&!t._writableState.needDrain||l())});var l=function(t){return function(){var e=t._readableState;p("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&a(t,"data")&&(e.flowing=!0,P(t))}}(r);t.on("drain",l);var f=!1,h=!1;function d(e){p("ondata"),h=!1,!1!==t.write(e)||h||((1===o.pipesCount&&o.pipes===t||o.pipesCount>1&&-1!==L(o.pipes,t))&&!f&&(p("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,h=!0),r.pause())}function _(e){p("onerror",e),m(),t.removeListener("error",_),0===a(t,"error")&&t.emit("error",e)}function v(){t.removeListener("finish",y),m()}function y(){p("onfinish"),t.removeListener("close",v),m()}function m(){p("unpipe"),r.unpipe(t)}return r.on("data",d),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?s(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",_),t.once("close",v),t.once("finish",y),t.emit("pipe",r),o.flowing||(p("pipe resume"),r.resume()),t},g.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function a(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function u(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function c(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function l(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function f(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function h(t){return t.toString(this.encoding)}function p(t){return t&&t.length?this.write(t):""}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0?(i>0&&(t.lastNeed=i-1),i):--n=0?(i>0&&(t.lastNeed=i-2),i):--n=0?(i>0&&(2===i?i=0:t.lastNeed=i-3),i):0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,r){"use strict";t.exports=o;var n=r(1),i=r(5);function o(t){if(!(this instanceof o))return new o(t);n.call(this,t),this._transformState={afterTransform:function(t,e){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(!n)return this.emit("error",new Error("write callback called multiple times"));r.writechunk=null,r.writecb=null,null!=e&&this.push(e),n(t);var i=this._readableState;i.reading=!1,(i.needReadable||i.length-1&&r.push(t[n]);return r},e.trimLeft=String.prototype.trimLeft?function(t){return t.trimLeft()}:function(t){return t.replace(/^\s+/,"")},e.trimRight=String.prototype.trimRight?function(t){return t.trimRight()}:function(t){return t.replace(/\s+$/,"")}}).call(this,r(3).Buffer)},function(t,e,r){"use strict";var n=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=function(t){function e(e,r,n){var i=t.call(this,"Error: "+e+". JSON Line number: "+r+(n?" near: "+n:""))||this;return i.err=e,i.line=r,i.extra=n,i.name="CSV Parse Error",i}return n(e,t),e.column_mismatched=function(t,r){return new e("column_mismatched",t,r)},e.unclosed_quote=function(t,r){return new e("unclosed_quote",t,r)},e.fromJSON=function(t){return new e(t.err,t.line,t.extra)},e.prototype.toJSON=function(){return{err:this.err,line:this.line,extra:this.extra}},e}(Error);e.default=i},function(t,e,r){var n=r(18),i=r(68),o=r(69),s=n?n.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":s&&s in Object(t)?i(t):o(t)}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,r){t.exports=r(33)},function(t,e,r){"use strict";var n=r(34),i=function(t,e){return new n.Converter(t,e)};i.csv=i,i.Converter=n.Converter,t.exports=i},function(t,e,r){"use strict";(function(t){var n=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=r(36),s=r(50),a=r(51),u=i(r(15)),c=r(52),l=r(105),f=function(e){function i(r,n){void 0===n&&(n={});var i=e.call(this,n)||this;return i.options=n,i.params=s.mergeParams(r),i.runtime=a.initParseRuntime(i),i.result=new l.Result(i),i.processor=new c.ProcessorLocal(i),i.once("error",function(e){t(function(){i.result.processError(e),i.emit("done",e)})}),i.once("done",function(){i.processor.destroy()}),i}return n(i,e),i.prototype.preRawData=function(t){return this.runtime.preRawDataHook=t,this},i.prototype.preFileLine=function(t){return this.runtime.preFileLineHook=t,this},i.prototype.subscribe=function(t,e,r){return this.parseRuntime.subscribe={onNext:t,onError:e,onCompleted:r},this},i.prototype.fromFile=function(t,e){var n=this,i=r(!function(){var t=new Error("Cannot find module 'fs'");throw t.code="MODULE_NOT_FOUND",t}());return i.exists(t,function(r){r?i.createReadStream(t,e).pipe(n):n.emit("error",new Error("File does not exist. Check to make sure the file path to your csv is correct."))}),this},i.prototype.fromStream=function(t){return t.pipe(this),this},i.prototype.fromString=function(t){t.toString();var e=new o.Readable,r=0;return e._read=function(e){if(r>=t.length)this.push(null);else{var n=t.substr(r,e);this.push(n),r+=e}},this.fromStream(e)},i.prototype.then=function(t,e){var r=this;return new u.default(function(n,i){r.parseRuntime.then={onfulfilled:function(e){n(t?t(e):e)},onrejected:function(t){e?n(e(t)):i(t)}}})},Object.defineProperty(i.prototype,"parseParam",{get:function(){return this.params},enumerable:!0,configurable:!0}),Object.defineProperty(i.prototype,"parseRuntime",{get:function(){return this.runtime},enumerable:!0,configurable:!0}),i.prototype._transform=function(t,e,r){var n=this;this.processor.process(t).then(function(t){if(t.length>0)return n.runtime.started=!0,n.result.processResult(t)}).then(function(){n.emit("drained"),r()},function(t){n.runtime.hasError=!0,n.runtime.error=t,n.emit("error",t),r()})},i.prototype._flush=function(t){var e=this;this.processor.flush().then(function(t){if(t.length>0)return e.result.processResult(t)}).then(function(){e.processEnd(t)},function(r){e.emit("error",r),t()})},i.prototype.processEnd=function(t){this.result.endProcess(),this.emit("done"),t()},Object.defineProperty(i.prototype,"parsedLineNumber",{get:function(){return this.runtime.parsedLineNumber},enumerable:!0,configurable:!0}),i}(o.Transform);e.Converter=f}).call(this,r(11).setImmediate)},function(t,e,r){(function(t,e){!function(t,r){"use strict";if(!t.setImmediate){var n,i=1,o={},s=!1,a=t.document,u=Object.getPrototypeOf&&Object.getPrototypeOf(t);u=u&&u.setTimeout?u:t,"[object process]"==={}.toString.call(t.process)?n=function(t){e.nextTick(function(){l(t)})}:function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=r,e}}()?function(){var e="setImmediate$"+Math.random()+"$",r=function(r){r.source===t&&"string"==typeof r.data&&0===r.data.indexOf(e)&&l(+r.data.slice(e.length))};t.addEventListener?t.addEventListener("message",r,!1):t.attachEvent("onmessage",r),n=function(r){t.postMessage(e+r,"*")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){l(t.data)},n=function(e){t.port2.postMessage(e)}}():a&&"onreadystatechange"in a.createElement("script")?function(){var t=a.documentElement;n=function(e){var r=a.createElement("script");r.onreadystatechange=function(){l(e),r.onreadystatechange=null,t.removeChild(r),r=null},t.appendChild(r)}}():n=function(t){setTimeout(l,0,t)},u.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),r=0;r0?n-4:n,f=0;f>16&255,a[u++]=e>>8&255,a[u++]=255&e;return 2===s&&(e=i[t.charCodeAt(f)]<<2|i[t.charCodeAt(f+1)]>>4,a[u++]=255&e),1===s&&(e=i[t.charCodeAt(f)]<<10|i[t.charCodeAt(f+1)]<<4|i[t.charCodeAt(f+2)]>>2,a[u++]=e>>8&255,a[u++]=255&e),a},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));return 1===i?(e=t[r-1],o.push(n[e>>2]+n[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],o.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t){return n[t>>18&63]+n[t>>12&63]+n[t>>6&63]+n[63&t]}function f(t,e,r){for(var n,i=[],o=e;o>1,l=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,o=p&(1<<-l)-1,p>>=-l,l+=a;l>0;o=256*o+t[e+f],f+=h,l-=8);for(s=o&(1<<-l)-1,o>>=-l,l+=n;l>0;s=256*s+t[e+f],f+=h,l-=8);if(0===o)o=1-c;else{if(o===u)return s?NaN:1/0*(p?-1:1);s+=Math.pow(2,n),o-=c}return(p?-1:1)*s*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var s,a,u,c=8*o-i-1,l=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:o-1,d=n?1:-1,_=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=l):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?h/u:h*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=l?(a=0,s=l):s+f>=1?(a=(e*u-1)*Math.pow(2,i),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;t[r+p]=255&a,p+=d,a/=256,i-=8);for(s=s<0;t[r+p]=255&s,p+=d,s/=256,c-=8);t[r+p-d]|=128*_}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e){},function(t,e,r){"use strict";var n=r(7).Buffer,i=r(43);function o(t,e,r){t.copy(e,r)}t.exports=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.head=null,this.tail=null,this.length=0}return t.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},t.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},t.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},t.prototype.clear=function(){this.head=this.tail=null,this.length=0},t.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},t.prototype.concat=function(t){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var e=n.allocUnsafe(t>>>0),r=this.head,i=0;r;)o(r.data,e,i),i+=r.data.length,r=r.next;return e},t}(),i&&i.inspect&&i.inspect.custom&&(t.exports.prototype[i.inspect.custom]=function(){var t=i.inspect({length:this.length});return this.constructor.name+" "+t})},function(t,e){},function(t,e,r){(function(e){function r(t){try{if(!e.localStorage)return!1}catch(t){return!1}var r=e.localStorage[t];return null!=r&&"true"===String(r).toLowerCase()}t.exports=function(t,e){if(r("noDeprecation"))return t;var n=!1;return function(){if(!n){if(r("throwDeprecation"))throw new Error(e);r("traceDeprecation")?console.trace(e):console.warn(e),n=!0}return t.apply(this,arguments)}}}).call(this,r(0))},function(t,e,r){"use strict";t.exports=o;var n=r(27),i=r(5);function o(t){if(!(this instanceof o))return new o(t);n.call(this,t)}i.inherits=r(2),i.inherits(o,n),o.prototype._transform=function(t,e,r){r(null,t)}},function(t,e,r){t.exports=r(14)},function(t,e,r){t.exports=r(1)},function(t,e,r){t.exports=r(13).Transform},function(t,e,r){t.exports=r(13).PassThrough},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mergeParams=function(t){var e={delimiter:",",ignoreColumns:void 0,includeColumns:void 0,quote:'"',trim:!0,checkType:!1,ignoreEmpty:!1,noheader:!1,headers:void 0,flatKeys:!1,maxRowLength:0,checkColumn:!1,escape:'"',colParser:{},eol:void 0,alwaysSplitAtEOL:!1,output:"json",nullObject:!1,downstreamFormat:"line",needEmitAll:!0};for(var r in t||(t={}),t)t.hasOwnProperty(r)&&(Array.isArray(t[r])?e[r]=[].concat(t[r]):e[r]=t[r]);return e}},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.initParseRuntime=function(t){var e=t.parseParam,r={needProcessIgnoreColumn:!1,needProcessIncludeColumn:!1,selectedColumns:void 0,ended:!1,hasError:!1,error:void 0,delimiter:t.parseParam.delimiter,eol:t.parseParam.eol,columnConv:[],headerType:[],headerTitle:[],headerFlag:[],headers:void 0,started:!1,parsedLineNumber:0,columnValueSetter:[]};return e.ignoreColumns&&(r.needProcessIgnoreColumn=!0),e.includeColumns&&(r.needProcessIncludeColumn=!0),r}},function(t,e,r){"use strict";(function(t){var n=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=r(53),s=i(r(15)),a=r(54),u=i(r(16)),c=r(57),l=r(28),f=r(58),h=i(r(59)),p=i(r(29)),d=function(e){function r(){var t=null!==e&&e.apply(this,arguments)||this;return t.rowSplit=new f.RowSplit(t.converter),t.eolEmitted=!1,t._needEmitEol=void 0,t.headEmitted=!1,t._needEmitHead=void 0,t}return n(r,e),r.prototype.flush=function(){var t=this;if(this.runtime.csvLineBuffer&&this.runtime.csvLineBuffer.length>0){var e=this.runtime.csvLineBuffer;return this.runtime.csvLineBuffer=void 0,this.process(e,!0).then(function(e){return t.runtime.csvLineBuffer&&t.runtime.csvLineBuffer.length>0?s.default.reject(p.default.unclosed_quote(t.runtime.parsedLineNumber,t.runtime.csvLineBuffer.toString())):s.default.resolve(e)})}return s.default.resolve([])},r.prototype.destroy=function(){return s.default.resolve()},Object.defineProperty(r.prototype,"needEmitEol",{get:function(){return void 0===this._needEmitEol&&(this._needEmitEol=this.converter.listeners("eol").length>0),this._needEmitEol},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"needEmitHead",{get:function(){return void 0===this._needEmitHead&&(this._needEmitHead=this.converter.listeners("header").length>0),this._needEmitHead},enumerable:!0,configurable:!0}),r.prototype.process=function(t,e){var r,n=this;return void 0===e&&(e=!1),r=e?t.toString():a.prepareData(t,this.converter.parseRuntime),s.default.resolve().then(function(){return n.runtime.preRawDataHook?n.runtime.preRawDataHook(r):r}).then(function(t){return t&&t.length>0?n.processCSV(t,e):s.default.resolve([])})},r.prototype.processCSV=function(t,e){var r=this,n=this.params,i=this.runtime;i.eol||u.default(t,i),this.needEmitEol&&!this.eolEmitted&&i.eol&&(this.converter.emit("eol",i.eol),this.eolEmitted=!0),n.ignoreEmpty&&!i.started&&(t=l.trimLeft(t));var o=c.stringToLines(t,i);return e?(o.lines.push(o.partial),o.partial=""):this.prependLeftBuf(l.bufFromString(o.partial)),o.lines.length>0?(i.preFileLineHook?this.runPreLineHook(o.lines):s.default.resolve(o.lines)).then(function(t){return i.started||r.runtime.headers?r.processCSVBody(t):r.processDataWithHead(t)}):s.default.resolve([])},r.prototype.processDataWithHead=function(t){if(this.params.noheader)this.params.headers?this.runtime.headers=this.params.headers:this.runtime.headers=[];else{for(var e="",r=[];t.length;){var n=e+t.shift(),i=this.rowSplit.parse(n);if(i.closed){r=i.cells,e="";break}e=n+u.default(n,this.runtime)}if(this.prependLeftBuf(l.bufFromString(e)),0===r.length)return[];this.params.headers?this.runtime.headers=this.params.headers:this.runtime.headers=r}return(this.runtime.needProcessIgnoreColumn||this.runtime.needProcessIncludeColumn)&&this.filterHeader(),this.needEmitHead&&!this.headEmitted&&(this.converter.emit("header",this.runtime.headers),this.headEmitted=!0),this.processCSVBody(t)},r.prototype.filterHeader=function(){if(this.runtime.selectedColumns=[],this.runtime.headers){for(var t=this.runtime.headers,e=0;e=e.length)i();else if(r.preFileLineHook){var o=e[n],s=r.preFileLineHook(o,r.parsedLineNumber+n);if(n++,s&&s.then)s.then(function(o){e[n-1]=o,t(e,r,n,i)});else{for(e[n-1]=s;n0?t.concat([r.csvLineBuffer,e]):e}(e,r);r.csvLineBuffer=void 0;var o=function(t,e){var r=t.length-1;if(0!=(128&t[r])){for(;128==(192&t[r]);)r--;r--}return r!=t.length-1?(e.csvLineBuffer=t.slice(r+1),t.slice(0,r+1)):t}(n,r).toString("utf8");return!1===r.started?i.default(o):o}}).call(this,r(3).Buffer)},function(t,e,r){"use strict";(function(e){var n=r(56);t.exports=function(t){return"string"==typeof t&&65279===t.charCodeAt(0)?t.slice(1):e.isBuffer(t)&&n(t)&&239===t[0]&&187===t[1]&&191===t[2]?t.slice(3):t}}).call(this,r(3).Buffer)},function(t,e){t.exports=function(t){for(var e=0;e0),this._needEmitDelimiter},enumerable:!0,configurable:!0}),t.prototype.parse=function(t){if(0===t.length||this.conv.parseParam.ignoreEmpty&&0===t.trim().length)return{cells:[],closed:!0};var e=this.quote,r=this.trim;this.escape,(this.conv.parseRuntime.delimiter instanceof Array||"auto"===this.conv.parseRuntime.delimiter.toLowerCase())&&(this.conv.parseRuntime.delimiter=this.getDelimiter(t)),this.needEmitDelimiter&&!this.delimiterEmitted&&(this.conv.emit("delimiter",this.conv.parseRuntime.delimiter),this.delimiterEmitted=!0);var n=this.conv.parseRuntime.delimiter,i=t.split(n);if("off"===e){if(r)for(var o=0;or&&(n=e,r=i)}),n},t.prototype.isQuoteOpen=function(t){var e=this.quote,r=this.escape;return t[0]===e&&(t[1]!==e||t[1]===r&&(t[2]===e||2===t.length))},t.prototype.isQuoteClose=function(t){var e=this.quote,r=this.escape;this.conv.parseParam.trim&&(t=o.trimRight(t));for(var n=0,i=t.length-1;t[i]===e||t[i]===r;)i--,n++;return n%2!=0},t.prototype.escapeQuote=function(t){var e="es|"+this.quote+"|"+this.escape;void 0===this.cachedRegExp[e]&&(this.cachedRegExp[e]=new RegExp("\\"+this.escape+"\\"+this.quote,"g"));var r=this.cachedRegExp[e];return t.replace(r,this.quote)},t.prototype.parseMultiLines=function(t){for(var e=[],r="";t.length;){var n=r+t.shift(),s=this.parse(n);0===s.cells.length&&this.conv.parseParam.ignoreEmpty||(s.closed||this.conv.parseParam.alwaysSplitAtEOL?(this.conv.parseRuntime.selectedColumns?e.push(o.filterArray(s.cells,this.conv.parseRuntime.selectedColumns)):e.push(s.cells),r=""):r=n+(i.default(n,this.conv.parseRuntime)||"\n"))}return{rowsCells:e,partial:r}},t}();e.RowSplit=a},function(t,e,r){"use strict";var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var i=n(r(29)),o=n(r(60)),s=/^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;function a(t,e,r){if(e.parseParam.checkColumn&&e.parseRuntime.headers&&t.length!==e.parseRuntime.headers.length)throw i.default.column_mismatched(e.parseRuntime.parsedLineNumber+r);return function(t,e,r){for(var n=!1,i={},o=0,s=t.length;o-1){for(var o=e.split("."),s=!0;o.length>0;)if(0===o.shift().length){s=!1;break}!s||n.parseParam.colParser[e]&&n.parseParam.colParser[e].flat?n.parseRuntime.columnValueSetter[i]=f:n.parseRuntime.columnValueSetter[i]=h}else n.parseRuntime.columnValueSetter[i]=f;!0===n.parseParam.nullObject&&"null"===r&&(r=null),n.parseRuntime.columnValueSetter[i](t,e,r)}function f(t,e,r){t[e]=r}function h(t,e,r){o.default(t,e,r)}function p(t,e,r,n){return n.parseRuntime.headerType[r]?n.parseRuntime.headerType[r]:e.indexOf("number#!")>-1?n.parseRuntime.headerType[r]=d:e.indexOf("string#!")>-1?n.parseRuntime.headerType[r]=_:n.parseParam.checkType?n.parseRuntime.headerType[r]=v:n.parseRuntime.headerType[r]=_}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function _(t){return t.toString()}function v(t){var e=t.trim();return""===e?_(t):s.test(e)?d(t):5===e.length&&"false"===e.toLowerCase()||4===e.length&&"true"===e.toLowerCase()?function(t){var e=t.trim();return 5!==e.length||"false"!==e.toLowerCase()}(t):"{"===e[0]&&"}"===e[e.length-1]||"["===e[0]&&"]"===e[e.length-1]?function(t){try{return JSON.parse(t)}catch(e){return t}}(t):_(t)}},function(t,e,r){var n=r(61);t.exports=function(t,e,r){return null==t?t:n(t,e,r)}},function(t,e,r){var n=r(62),i=r(74),o=r(103),s=r(20),a=r(104);t.exports=function(t,e,r,u){if(!s(t))return t;for(var c=-1,l=(e=i(e,t)).length,f=l-1,h=t;null!=h&&++c-1}},function(t,e,r){var n=r(9);t.exports=function(t,e){var r=this.__data__,i=n(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}},function(t,e,r){var n=r(17)(r(19),"Map");t.exports=n},function(t,e,r){var n=r(10);t.exports=function(t){var e=n(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,r){var n=r(10);t.exports=function(t){return n(this,t).get(t)}},function(t,e,r){var n=r(10);t.exports=function(t){return n(this,t).has(t)}},function(t,e,r){var n=r(10);t.exports=function(t,e){var r=n(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}},function(t,e,r){var n=r(101);t.exports=function(t){return null==t?"":n(t)}},function(t,e,r){var n=r(18),i=r(102),o=r(21),s=r(22),a=n?n.prototype:void 0,u=a?a.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(o(e))return i(e,t)+"";if(s(e))return u?u.call(e):"";var r=e+"";return"0"==r&&1/e==-1/0?"-0":r}},function(t,e){t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length,i=Array(n);++r-1&&t%1==0&&t0||this.converter.listeners("readable").length>0),this._needPushDownstream},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"needEmitAll",{get:function(){return!!this.converter.parseRuntime.then&&this.converter.parseParam.needEmitAll},enumerable:!0,configurable:!0}),t.prototype.processResult=function(t){var e=this,r=this.converter.parseRuntime.parsedLineNumber;return this.needPushDownstream&&"array"===this.converter.parseParam.downstreamFormat&&0===r&&a(this.converter,"["+o.EOL),new i.default(function(r,n){e.needEmitLine?function t(e,r,n,i,o){if(n>=e.length)o();else if(r.parseRuntime.subscribe&&r.parseRuntime.subscribe.onNext){var s=r.parseRuntime.subscribe.onNext,u=e[n],c=s(u,r.parseRuntime.parsedLineNumber+n);if(n++,c&&c.then)c.then(function(){!function(e,r,n,i,o,s,u){o&&a(n,u),t(e,n,i,o,s)}(e,0,r,n,i,o,u)},o);else{for(i&&a(r,u);n + * @license MIT + */ +var n=r(38),i=r(39),o=r(40);function s(){return u.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(s()=s())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s().toString(16)+" bytes");return 0|t}function d(t,e){if(u.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return N(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return H(t).length;default:if(n)return N(t).length;e=(""+e).toLowerCase(),n=!0}}function _(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function v(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=u.from(e,n)),u.isBuffer(e))return 0===e.length?-1:y(t,e,r,n,i);if("number"==typeof e)return e&=255,u.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):y(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function y(t,e,r,n,i){var o,s=1,a=t.length,u=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;s=2,a/=2,u/=2,r/=2}function c(t,e){return 1===s?t[e]:t.readUInt16BE(e*s)}if(i){var l=-1;for(o=r;oa&&(r=a-u),o=r;o>=0;o--){for(var f=!0,h=0;hi&&(n=i):n=i;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;s>8,i=r%256,o.push(i),o.push(n);return o}(e,t.length-r),t,r,n)}function x(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function j(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i239?4:c>223?3:c>191?2:1;if(i+f<=r)switch(f){case 1:c<128&&(l=c);break;case 2:128==(192&(o=t[i+1]))&&(u=(31&c)<<6|63&o)>127&&(l=u);break;case 3:o=t[i+1],s=t[i+2],128==(192&o)&&128==(192&s)&&(u=(15&c)<<12|(63&o)<<6|63&s)>2047&&(u<55296||u>57343)&&(l=u);break;case 4:o=t[i+1],s=t[i+2],a=t[i+3],128==(192&o)&&128==(192&s)&&128==(192&a)&&(u=(15&c)<<18|(63&o)<<12|(63&s)<<6|63&a)>65535&&u<1114112&&(l=u)}null===l?(l=65533,f=1):l>65535&&(l-=65536,n.push(l>>>10&1023|55296),l=56320|1023&l),n.push(l),i+=f}return function(t){var e=t.length;if(e<=S)return String.fromCharCode.apply(String,t);for(var r="",n=0;nthis.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return j(this,e,r);case"ascii":return R(this,e,r);case"latin1":case"binary":return k(this,e,r);case"base64":return x(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},u.prototype.equals=function(t){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===u.compare(this,t)},u.prototype.inspect=function(){var t="",r=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(t+=" ... ")),""},u.prototype.compare=function(t,e,r,n,i){if(!u.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(e>>>=0,r>>>=0,n>>>=0,i>>>=0,this===t)return 0;for(var o=i-n,s=r-e,a=Math.min(o,s),c=this.slice(n,i),l=t.slice(e,r),f=0;fi)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return m(this,t,e,r);case"utf8":case"utf-8":return g(this,t,e,r);case"ascii":return b(this,t,e,r);case"latin1":case"binary":return w(this,t,e,r);case"base64":return E(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,t,e,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},u.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var S=4096;function R(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;in)&&(r=n);for(var i="",o=e;or)throw new RangeError("Trying to access beyond buffer length")}function A(t,e,r,n,i,o){if(!u.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||et.length)throw new RangeError("Index out of range")}function F(t,e,r,n){e<0&&(e=65535+e+1);for(var i=0,o=Math.min(t.length-r,2);i>>8*(n?i:1-i)}function L(t,e,r,n){e<0&&(e=4294967295+e+1);for(var i=0,o=Math.min(t.length-r,4);i>>8*(n?i:3-i)&255}function M(t,e,r,n,i,o){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function B(t,e,r,n,o){return o||M(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function D(t,e,r,n,o){return o||M(t,0,r,8),i.write(t,e,r,n,52,8),r+8}u.prototype.slice=function(t,e){var r,n=this.length;if(t=~~t,e=void 0===e?n:~~e,t<0?(t+=n)<0&&(t=0):t>n&&(t=n),e<0?(e+=n)<0&&(e=0):e>n&&(e=n),e0&&(i*=256);)n+=this[t+--e]*i;return n},u.prototype.readUInt8=function(t,e){return e||O(t,1,this.length),this[t]},u.prototype.readUInt16LE=function(t,e){return e||O(t,2,this.length),this[t]|this[t+1]<<8},u.prototype.readUInt16BE=function(t,e){return e||O(t,2,this.length),this[t]<<8|this[t+1]},u.prototype.readUInt32LE=function(t,e){return e||O(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},u.prototype.readUInt32BE=function(t,e){return e||O(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},u.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||O(t,e,this.length);for(var n=this[t],i=1,o=0;++o=(i*=128)&&(n-=Math.pow(2,8*e)),n},u.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||O(t,e,this.length);for(var n=e,i=1,o=this[t+--n];n>0&&(i*=256);)o+=this[t+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*e)),o},u.prototype.readInt8=function(t,e){return e||O(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},u.prototype.readInt16LE=function(t,e){e||O(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt16BE=function(t,e){e||O(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},u.prototype.readInt32LE=function(t,e){return e||O(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},u.prototype.readInt32BE=function(t,e){return e||O(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},u.prototype.readFloatLE=function(t,e){return e||O(t,4,this.length),i.read(this,t,!0,23,4)},u.prototype.readFloatBE=function(t,e){return e||O(t,4,this.length),i.read(this,t,!1,23,4)},u.prototype.readDoubleLE=function(t,e){return e||O(t,8,this.length),i.read(this,t,!0,52,8)},u.prototype.readDoubleBE=function(t,e){return e||O(t,8,this.length),i.read(this,t,!1,52,8)},u.prototype.writeUIntLE=function(t,e,r,n){t=+t,e|=0,r|=0,n||A(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[e]=255&t;++o=0&&(o*=256);)this[e+i]=t/o&255;return e+r},u.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,1,255,0),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},u.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):F(this,t,e,!0),e+2},u.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,65535,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):F(this,t,e,!1),e+2},u.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):L(this,t,e,!0),e+4},u.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,4294967295,0),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):L(this,t,e,!1),e+4},u.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);A(this,t,e,r,i-1,-i)}var o=0,s=1,a=0;for(this[e]=255&t;++o>0)-a&255;return e+r},u.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e|=0,!n){var i=Math.pow(2,8*r-1);A(this,t,e,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[e+o]=255&t;--o>=0&&(s*=256);)t<0&&0===a&&0!==this[e+o+1]&&(a=1),this[e+o]=(t/s>>0)-a&255;return e+r},u.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,1,127,-128),u.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},u.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):F(this,t,e,!0),e+2},u.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,2,32767,-32768),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):F(this,t,e,!1),e+2},u.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,2147483647,-2147483648),u.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):L(this,t,e,!0),e+4},u.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||A(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),u.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):L(this,t,e,!1),e+4},u.prototype.writeFloatLE=function(t,e,r){return B(this,t,e,!0,r)},u.prototype.writeFloatBE=function(t,e,r){return B(this,t,e,!1,r)},u.prototype.writeDoubleLE=function(t,e,r){return D(this,t,e,!0,r)},u.prototype.writeDoubleBE=function(t,e,r){return D(this,t,e,!1,r)},u.prototype.copy=function(t,e,r,n){if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e=0;--i)t[i+e]=this[i+r];else if(o<1e3||!u.TYPED_ARRAY_SUPPORT)for(i=0;i>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;o.push(r)}else if(r<2048){if((e-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function H(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(I,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function V(t,e,r,n){for(var i=0;i=e.length||i>=t.length);++i)e[i+r]=t[i];return i}}).call(this,r(0))},function(t,e){var r,n,i=t.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function a(t){if(r===setTimeout)return setTimeout(t,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:o}catch(t){r=o}try{n="function"==typeof clearTimeout?clearTimeout:s}catch(t){n=s}}();var u,c=[],l=!1,f=-1;function h(){l&&u&&(l=!1,u.length?c=u.concat(c):f=-1,c.length&&p())}function p(){if(!l){var t=a(h);l=!0;for(var e=c.length;e;){for(u=c,c=[];++f1)for(var r=1;r=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},r(35),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(this,r(0))},function(t,e){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return"function"==typeof t}function i(t){return"object"==typeof t&&null!==t}function o(t){return void 0===t}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(t){if(!function(t){return"number"==typeof t}(t)||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},r.prototype.emit=function(t){var e,r,s,a,u,c;if(this._events||(this._events={}),"error"===t&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var l=new Error('Uncaught, unspecified "error" event. ('+e+")");throw l.context=e,l}if(o(r=this._events[t]))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(i(r))for(a=Array.prototype.slice.call(arguments,1),s=(c=r.slice()).length,u=0;u0&&this._events[t].length>s&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace()),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){if(!n(e))throw TypeError("listener must be a function");var r=!1;function i(){this.removeListener(t,i),r||(r=!0,e.apply(this,arguments))}return i.listener=e,this.on(t,i),this},r.prototype.removeListener=function(t,e){var r,o,s,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(s=(r=this._events[t]).length,o=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(i(r)){for(a=s;a-- >0;)if(r[a]===e||r[a].listener&&r[a].listener===e){o=a;break}if(o<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(o,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(n(r=this._events[t]))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},r.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e,r){(e=t.exports=r(23)).Stream=e,e.Readable=e,e.Writable=r(14),e.Duplex=r(1),e.Transform=r(27),e.PassThrough=r(45)},function(t,e,r){"use strict";(function(e,n,i){var o=r(6);function s(t){var e=this;this.next=null,this.entry=null,this.finish=function(){!function(t,e,r){var n=t.entry;for(t.entry=null;n;){var i=n.callback;e.pendingcb--,i(void 0),n=n.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}(e,t)}}t.exports=m;var a,u=!e.browser&&["v0.10","v0.9."].indexOf(e.version.slice(0,5))>-1?n:o.nextTick;m.WritableState=y;var c=r(5);c.inherits=r(2);var l,f={deprecate:r(44)},h=r(24),p=r(7).Buffer,d=i.Uint8Array||function(){},_=r(25);function v(){}function y(t,e){a=a||r(1),t=t||{};var n=e instanceof a;this.objectMode=!!t.objectMode,n&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var i=t.highWaterMark,c=t.writableHighWaterMark,l=this.objectMode?16:16384;this.highWaterMark=i||0===i?i:n&&(c||0===c)?c:l,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var f=!1===t.decodeStrings;this.decodeStrings=!f,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,n=r.sync,i=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,n,i){--e.pendingcb,r?(o.nextTick(i,n),o.nextTick(x,t,e),t._writableState.errorEmitted=!0,t.emit("error",n)):(i(n),t._writableState.errorEmitted=!0,t.emit("error",n),x(t,e))}(t,r,n,e,i);else{var s=E(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||w(t,r),n?u(b,t,r,s,i):b(t,r,s,i)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new s(this)}function m(t){if(a=a||r(1),!(l.call(m,this)||this instanceof a))return new m(t);this._writableState=new y(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev),"function"==typeof t.destroy&&(this._destroy=t.destroy),"function"==typeof t.final&&(this._final=t.final)),h.call(this)}function g(t,e,r,n,i,o,s){e.writelen=n,e.writecb=s,e.writing=!0,e.sync=!0,r?t._writev(i,e.onwrite):t._write(i,o,e.onwrite),e.sync=!1}function b(t,e,r,n){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,n(),x(t,e)}function w(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var n=e.bufferedRequestCount,i=new Array(n),o=e.corkedRequestsFree;o.entry=r;for(var a=0,u=!0;r;)i[a]=r,r.isBuf||(u=!1),r=r.next,a+=1;i.allBuffers=u,g(t,e,!0,e.length,i,"",o.finish),e.pendingcb++,e.lastBufferedRequest=null,o.next?(e.corkedRequestsFree=o.next,o.next=null):e.corkedRequestsFree=new s(e),e.bufferedRequestCount=0}else{for(;r;){var c=r.chunk,l=r.encoding,f=r.callback;if(g(t,e,!1,e.objectMode?1:c.length,c,l,f),r=r.next,e.bufferedRequestCount--,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequest=r,e.bufferProcessing=!1}function E(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function C(t,e){t._final(function(r){e.pendingcb--,r&&t.emit("error",r),e.prefinished=!0,t.emit("prefinish"),x(t,e)})}function x(t,e){var r=E(e);return r&&(function(t,e){e.prefinished||e.finalCalled||("function"==typeof t._final?(e.pendingcb++,e.finalCalled=!0,o.nextTick(C,t,e)):(e.prefinished=!0,t.emit("prefinish")))}(t,e),0===e.pendingcb&&(e.finished=!0,t.emit("finish"))),r}c.inherits(m,h),y.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(y.prototype,"buffer",{get:f.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(l=Function.prototype[Symbol.hasInstance],Object.defineProperty(m,Symbol.hasInstance,{value:function(t){return!!l.call(this,t)||this===m&&t&&t._writableState instanceof y}})):l=function(t){return t instanceof this},m.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},m.prototype.write=function(t,e,r){var n=this._writableState,i=!1,s=!n.objectMode&&function(t){return p.isBuffer(t)||t instanceof d}(t);return s&&!p.isBuffer(t)&&(t=function(t){return p.from(t)}(t)),"function"==typeof e&&(r=e,e=null),s?e="buffer":e||(e=n.defaultEncoding),"function"!=typeof r&&(r=v),n.ended?function(t,e){var r=new Error("write after end");t.emit("error",r),o.nextTick(e,r)}(this,r):(s||function(t,e,r,n){var i=!0,s=!1;return null===r?s=new TypeError("May not write null values to stream"):"string"==typeof r||void 0===r||e.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(t.emit("error",s),o.nextTick(n,s),i=!1),i}(this,n,t,r))&&(n.pendingcb++,i=function(t,e,r,n,i,o){if(!r){var s=function(t,e,r){return t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=p.from(e,r)),e}(e,n,i);n!==s&&(r=!0,i="buffer",n=s)}var a=e.objectMode?1:n.length;e.length+=a;var u=e.length-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},Object.defineProperty(m.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}}),m.prototype._write=function(t,e,r){r(new Error("_write() is not implemented"))},m.prototype._writev=null,m.prototype.end=function(t,e,r){var n=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!==t&&void 0!==t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,r){e.ending=!0,x(t,e),r&&(e.finished?o.nextTick(r):t.once("finish",r)),e.ended=!0,t.writable=!1}(this,n,r)},Object.defineProperty(m.prototype,"destroyed",{get:function(){return void 0!==this._writableState&&this._writableState.destroyed},set:function(t){this._writableState&&(this._writableState.destroyed=t)}}),m.prototype.destroy=_.destroy,m.prototype._undestroy=_.undestroy,m.prototype._destroy=function(t,e){this.end(),e(t)}}).call(this,r(4),r(11).setImmediate,r(0))},function(t,e,r){(function(e,r,n){t.exports=function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof _dereq_&&_dereq_;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=r[s]={exports:{}};e[s][0].call(l.exports,function(t){return i(e[s][1][t]||t)},l,l.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s0;){var e=t.shift();if("function"==typeof e){var r=t.shift(),n=t.shift();e.call(r,n)}else e._settlePromises()}},u.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,this._drainQueue(this._lateQueue)},u.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},u.prototype._reset=function(){this._isTickUsed=!1},r.exports=u,r.exports.firstLineError=i},{"./queue":26,"./schedule":29,"./util":36}],3:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0==(50397184&this._bitField)&&this._resolveCallback(e.target)},u=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=n.propagateFromFunction(),t.prototype._boundValue=n.boundValueFunction());var c=r(o),l=new t(e);l._propagateFrom(this,1);var f=this._target();if(l._setBoundTo(c),c instanceof t){var h={promiseRejectionQueued:!1,promise:l,target:f,bindingPromise:c};f._then(e,s,void 0,l,h),c._then(a,u,void 0,l,h),l._setOnCancel(c)}else l._resolveCallback(f);return l},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152==(2097152&this._bitField)},t.bind=function(e,r){return t.resolve(r).bind(e)}}},{}],4:[function(t,e,r){"use strict";var n;"undefined"!=typeof Promise&&(n=Promise);var i=t("./promise")();i.noConflict=function(){try{Promise===i&&(Promise=n)}catch(t){}return i},e.exports=i},{"./promise":22}],5:[function(t,e,r){"use strict";var n=Object.create;if(n){var i=n(null),o=n(null);i[" size"]=o[" size"]=0}e.exports=function(e){var r=t("./util"),n=r.canEvaluate;function i(t){return function(t,n){var i;if(null!=t&&(i=t[n]),"function"!=typeof i){var o="Object "+r.classString(t)+" has no method '"+r.toString(n)+"'";throw new e.TypeError(o)}return i}(t,this.pop()).apply(t,this)}function o(t){return t[this]}function s(t){var e=+this;return e<0&&(e=Math.max(0,e+t.length)),t[e]}r.isIdentifier,e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(i,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e;if("number"==typeof t)e=s;else if(n){var r=(void 0)(t);e=null!==r?r:o}else e=o;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e,r){"use strict";e.exports=function(e,r,n,i){var o=t("./util"),s=o.tryCatch,a=o.errorObj,u=e._async;e.prototype.break=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var r=t._cancellationParent;if(null==r||!r._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=r}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),!!this._enoughBranchesHaveCancelled()&&(this._invokeOnCancel(),!0))},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this._isCancellable()&&(this._setCancelled(),u.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype._isCancellable=function(){return this.isPending()&&!this._isCancelled()},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var r=0;r=0)return r[t]}return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},n.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,r.push(this._trace))},n.prototype._popContext=function(){if(void 0!==this._trace){var t=r.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},n.CapturedTrace=null,n.create=function(){if(e)return new n},n.deactivateLongStackTraces=function(){},n.activateLongStackTraces=function(){var r=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,u=t.prototype._promiseCreated;n.deactivateLongStackTraces=function(){t.prototype._pushContext=r,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=u,e=!1},e=!0,t.prototype._pushContext=n.prototype._pushContext,t.prototype._popContext=n.prototype._popContext,t._peekContext=t.prototype._peekContext=i,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},n}},{}],9:[function(t,r,n){"use strict";r.exports=function(r,n){var i,o,s,a=r._getDomain,u=r._async,c=t("./errors").Warning,l=t("./util"),f=l.canAttachTrace,h=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,p=/\((?:timers\.js):\d+:\d+\)/,d=/[\/<\(](.+?):(\d+):(\d+)\)?\s*$/,_=null,v=null,y=!1,m=!(0==l.env("BLUEBIRD_DEBUG")),g=!(0==l.env("BLUEBIRD_WARNINGS")||!m&&!l.env("BLUEBIRD_WARNINGS")),b=!(0==l.env("BLUEBIRD_LONG_STACK_TRACES")||!m&&!l.env("BLUEBIRD_LONG_STACK_TRACES")),w=0!=l.env("BLUEBIRD_W_FORGOTTEN_RETURN")&&(g||!!l.env("BLUEBIRD_W_FORGOTTEN_RETURN"));r.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|524288},r.prototype._ensurePossibleRejectionHandled=function(){if(0==(524288&this._bitField)){this._setRejectionIsUnhandled();var t=this;setTimeout(function(){t._notifyUnhandledRejection()},1)}},r.prototype._notifyUnhandledRejectionIsHandled=function(){q("rejectionHandled",i,void 0,this)},r.prototype._setReturnedNonUndefined=function(){this._bitField=268435456|this._bitField},r.prototype._returnedNonUndefined=function(){return 0!=(268435456&this._bitField)},r.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),q("unhandledRejection",o,t,this)}},r.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},r.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},r.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},r.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},r.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},r.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},r.prototype._warn=function(t,e,r){return U(t,e,r||this)},r.onPossiblyUnhandledRejection=function(t){var e=a();o="function"==typeof t?null===e?t:l.domainBind(e,t):void 0},r.onUnhandledRejectionHandled=function(t){var e=a();i="function"==typeof t?null===e?t:l.domainBind(e,t):void 0};var E=function(){};r.longStackTraces=function(){if(u.haveItemsQueued()&&!J.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!J.longStackTraces&&Y()){var t=r.prototype._captureStackTrace,e=r.prototype._attachExtraTrace;J.longStackTraces=!0,E=function(){if(u.haveItemsQueued()&&!J.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");r.prototype._captureStackTrace=t,r.prototype._attachExtraTrace=e,n.deactivateLongStackTraces(),u.enableTrampoline(),J.longStackTraces=!1},r.prototype._captureStackTrace=D,r.prototype._attachExtraTrace=I,n.activateLongStackTraces(),u.disableTrampolineIfNecessary()}},r.hasLongStackTraces=function(){return J.longStackTraces&&Y()};var C=function(){try{if("function"==typeof CustomEvent){var t=new CustomEvent("CustomEvent");return l.global.dispatchEvent(t),function(t,e){var r=new CustomEvent(t.toLowerCase(),{detail:e,cancelable:!0});return!l.global.dispatchEvent(r)}}return"function"==typeof Event?(t=new Event("CustomEvent"),l.global.dispatchEvent(t),function(t,e){var r=new Event(t.toLowerCase(),{cancelable:!0});return r.detail=e,!l.global.dispatchEvent(r)}):((t=document.createEvent("CustomEvent")).initCustomEvent("testingtheevent",!1,!0,{}),l.global.dispatchEvent(t),function(t,e){var r=document.createEvent("CustomEvent");return r.initCustomEvent(t.toLowerCase(),!1,!0,e),!l.global.dispatchEvent(r)})}catch(t){}return function(){return!1}}(),x=l.isNode?function(){return e.emit.apply(e,arguments)}:l.global?function(t){var e="on"+t.toLowerCase(),r=l.global[e];return!!r&&(r.apply(l.global,[].slice.call(arguments,1)),!0)}:function(){return!1};function j(t,e){return{promise:e}}var S={promiseCreated:j,promiseFulfilled:j,promiseRejected:j,promiseResolved:j,promiseCancelled:j,promiseChained:function(t,e,r){return{promise:e,child:r}},warning:function(t,e){return{warning:e}},unhandledRejection:function(t,e,r){return{reason:e,promise:r}},rejectionHandled:j},R=function(t){var e=!1;try{e=x.apply(null,arguments)}catch(t){u.throwLater(t),e=!0}var r=!1;try{r=C(t,S[t].apply(null,arguments))}catch(t){u.throwLater(t),r=!0}return r||e};function k(){return!1}function T(t,e,r){var n=this;try{t(e,r,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+l.toString(t));n._attachCancellationCallback(t)})}catch(t){return t}}function P(t){if(!this._isCancellable())return this;var e=this._onCancel();void 0!==e?l.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function O(){return this._onCancelField}function A(t){this._onCancelField=t}function F(){this._cancellationParent=void 0,this._onCancelField=void 0}function L(t,e){if(0!=(1&e)){this._cancellationParent=t;var r=t._branchesRemainingToCancel;void 0===r&&(r=0),t._branchesRemainingToCancel=r+1}0!=(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}r.config=function(t){if("longStackTraces"in(t=Object(t))&&(t.longStackTraces?r.longStackTraces():!t.longStackTraces&&r.hasLongStackTraces()&&E()),"warnings"in t){var e=t.warnings;J.warnings=!!e,w=J.warnings,l.isObject(e)&&"wForgottenReturn"in e&&(w=!!e.wForgottenReturn)}if("cancellation"in t&&t.cancellation&&!J.cancellation){if(u.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");r.prototype._clearCancellationData=F,r.prototype._propagateFrom=L,r.prototype._onCancel=O,r.prototype._setOnCancel=A,r.prototype._attachCancellationCallback=P,r.prototype._execute=T,M=L,J.cancellation=!0}return"monitoring"in t&&(t.monitoring&&!J.monitoring?(J.monitoring=!0,r.prototype._fireEvent=R):!t.monitoring&&J.monitoring&&(J.monitoring=!1,r.prototype._fireEvent=k)),r},r.prototype._fireEvent=k,r.prototype._execute=function(t,e,r){try{t(e,r)}catch(t){return t}},r.prototype._onCancel=function(){},r.prototype._setOnCancel=function(t){},r.prototype._attachCancellationCallback=function(t){},r.prototype._captureStackTrace=function(){},r.prototype._attachExtraTrace=function(){},r.prototype._clearCancellationData=function(){},r.prototype._propagateFrom=function(t,e){};var M=function(t,e){0!=(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)};function B(){var t=this._boundTo;return void 0!==t&&t instanceof r?t.isFulfilled()?t.value():void 0:t}function D(){this._trace=new X(this._peekContext())}function I(t,e){if(f(t)){var r=this._trace;if(void 0!==r&&e&&(r=r._parent),void 0!==r)r.attachExtraTrace(t);else if(!t.__stackCleaned__){var n=H(t);l.notEnumerableProp(t,"stack",n.message+"\n"+n.stack.join("\n")),l.notEnumerableProp(t,"__stackCleaned__",!0)}}}function U(t,e,n){if(J.warnings){var i,o=new c(t);if(e)n._attachExtraTrace(o);else if(J.longStackTraces&&(i=r._peekContext()))i.attachExtraTrace(o);else{var s=H(o);o.stack=s.message+"\n"+s.stack.join("\n")}R("warning",o)||V(o,"",!0)}}function N(t){for(var e=[],r=0;r0?function(t){for(var e=t.stack.replace(/\s+$/g,"").split("\n"),r=0;r0&&"SyntaxError"!=t.name&&(e=e.slice(r)),e}(t):[" (No stack trace)"],{message:r,stack:"SyntaxError"==t.name?e:N(e)}}function V(t,e,r){if("undefined"!=typeof console){var n;if(l.isObject(t)){var i=t.stack;n=e+v(i,t)}else n=e+String(t);"function"==typeof s?s(n,r):"function"!=typeof console.log&&"object"!=typeof console.log||console.log(n)}}function q(t,e,r,n){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(n):e(r,n))}catch(t){u.throwLater(t)}"unhandledRejection"===t?R(t,r,n)||i||V(r,"Unhandled rejection "):R(t,n)}function W(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{if(e=t&&"function"==typeof t.toString?t.toString():l.toString(t),/\[object [a-zA-Z0-9$_]+\]/.test(e))try{e=JSON.stringify(t)}catch(t){}0===e.length&&(e="(empty array)")}return"(<"+function(t){return t.length<41?t:t.substr(0,38)+"..."}(e)+">, no stack trace)"}function Y(){return"function"==typeof G}var $=function(){return!1},z=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;function Q(t){var e=t.match(z);if(e)return{fileName:e[1],line:parseInt(e[2],10)}}function X(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);G(this,X),e>32&&this.uncycle()}l.inherits(X,Error),n.CapturedTrace=X,X.prototype.uncycle=function(){var t=this._length;if(!(t<2)){for(var e=[],r={},n=0,i=this;void 0!==i;++n)e.push(i),i=i._parent;for(n=(t=this._length=n)-1;n>=0;--n){var o=e[n].stack;void 0===r[o]&&(r[o]=n)}for(n=0;n0&&(e[s-1]._parent=void 0,e[s-1]._length=1),e[n]._parent=void 0,e[n]._length=1;var a=n>0?e[n-1]:this;s=0;--c)e[c]._length=u,u++;return}}}},X.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=H(t),r=e.message,n=[e.stack],i=this;void 0!==i;)n.push(N(i.stack.split("\n"))),i=i._parent;!function(t){for(var e=t[0],r=1;r=0;--a)if(n[a]===o){s=a;break}for(a=s;a>=0;--a){var u=n[a];if(e[i]!==u)break;e.pop(),i--}e=n}}(n),function(t){for(var e=0;e=0)return _=/@/,v=e,y=!0,function(t){t.stack=(new Error).stack};try{throw new Error}catch(t){n="stack"in t}return"stack"in i||!n||"number"!=typeof Error.stackTraceLimit?(v=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?W(e):e.toString()},null):(_=t,v=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}();"undefined"!=typeof console&&void 0!==console.warn&&(s=function(t){console.warn(t)},l.isNode&&e.stderr.isTTY?s=function(t,e){var r=e?"":"";console.warn(r+t+"\n")}:l.isNode||"string"!=typeof(new Error).stack||(s=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var J={warnings:g,longStackTraces:!1,cancellation:!1,monitoring:!1};return b&&r.longStackTraces(),{longStackTraces:function(){return J.longStackTraces},warnings:function(){return J.warnings},cancellation:function(){return J.cancellation},monitoring:function(){return J.monitoring},propagateFromFunction:function(){return M},boundValueFunction:function(){return B},checkForgottenReturns:function(t,e,r,n,i){if(void 0===t&&null!==e&&w){if(void 0!==i&&i._returnedNonUndefined())return;if(0==(65535&n._bitField))return;r&&(r+=" ");var o="",s="";if(e._trace){for(var a=e._trace.stack.split("\n"),u=N(a),c=u.length-1;c>=0;--c){var l=u[c];if(!p.test(l)){var f=l.match(d);f&&(o="at "+f[1]+":"+f[2]+":"+f[3]+" ");break}}if(u.length>0){var h=u[0];for(c=0;c0&&(s="\n"+a[c-1]);break}}}var _="a promise was created in a "+r+"handler "+o+"but was not returned from it, see http://goo.gl/rRqMUw"+s;n._warn(_,!0,e)}},setBounds:function(t,e){if(Y()){for(var r,n,i=t.stack.split("\n"),o=e.stack.split("\n"),s=-1,a=-1,u=0;u=a||($=function(t){if(h.test(t))return!0;var e=Q(t);return!!(e&&e.fileName===r&&s<=e.line&&e.line<=a)})}},warn:U,deprecated:function(t,e){var r=t+" is deprecated and will be removed in a future version.";return e&&(r+=" Use "+e+" instead."),U(r)},CapturedTrace:X,fireDomEvent:C,fireGlobalEvent:x}}},{"./errors":12,"./util":36}],10:[function(t,e,r){"use strict";e.exports=function(t){function e(){return this.value}function r(){throw this.reason}t.prototype.return=t.prototype.thenReturn=function(r){return r instanceof t&&r.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:r},void 0)},t.prototype.throw=t.prototype.thenThrow=function(t){return this._then(r,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,r,void 0,{reason:t},void 0);var e=arguments[1];return this.caught(t,function(){throw e})},t.prototype.catchReturn=function(r){if(arguments.length<=1)return r instanceof t&&r.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:r},void 0);var n=arguments[1];return n instanceof t&&n.suppressUnhandledRejections(),this.caught(r,function(){return n})}}},{}],11:[function(t,e,r){"use strict";e.exports=function(t,e){var r=t.reduce,n=t.all;function i(){return n(this)}t.prototype.each=function(t){return r(this,t,e,0)._then(i,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return r(this,t,e,e)},t.each=function(t,n){return r(t,n,e,0)._then(i,void 0,void 0,t,void 0)},t.mapSeries=function(t,n){return r(t,n,e,e)}}},{}],12:[function(t,e,r){"use strict";var n,i,o=t("./es5"),s=o.freeze,a=t("./util"),u=a.inherits,c=a.notEnumerableProp;function l(t,e){function r(n){if(!(this instanceof r))return new r(n);c(this,"message","string"==typeof n?n:e),c(this,"name",t),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this)}return u(r,Error),r}var f=l("Warning","warning"),h=l("CancellationError","cancellation error"),p=l("TimeoutError","timeout error"),d=l("AggregateError","aggregate error");try{n=TypeError,i=RangeError}catch(t){n=l("TypeError","type error"),i=l("RangeError","range error")}for(var _="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),v=0;v<_.length;++v)"function"==typeof Array.prototype[_[v]]&&(d.prototype[_[v]]=Array.prototype[_[v]]);o.defineProperty(d.prototype,"length",{value:0,configurable:!1,writable:!0,enumerable:!0}),d.prototype.isOperational=!0;var y=0;function m(t){if(!(this instanceof m))return new m(t);c(this,"name","OperationalError"),c(this,"message",t),this.cause=t,this.isOperational=!0,t instanceof Error?(c(this,"message",t.message),c(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}d.prototype.toString=function(){var t=Array(4*y+1).join(" "),e="\n"+t+"AggregateError of:\n";y++,t=Array(4*y+1).join(" ");for(var r=0;r1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0)}function f(){return p.call(this,this.promise._target()._settledValue())}function h(t){if(!l(this,t))return s.e=t,s}function p(t){var i=this.promise,a=this.handler;if(!this.called){this.called=!0;var u=this.isFinallyHandler()?a.call(i._boundValue()):a.call(i._boundValue(),t);if(u===n)return u;if(void 0!==u){i._setReturnedNonUndefined();var p=r(u,i);if(p instanceof e){if(null!=this.cancelPromise){if(p._isCancelled()){var d=new o("late cancellation observer");return i._attachExtraTrace(d),s.e=d,s}p.isPending()&&p._attachCancellationCallback(new c(this))}return p._then(f,h,void 0,this,void 0)}}}return i.isRejected()?(l(this),s.e=t,s):(l(this),t)}return u.prototype.isFinallyHandler=function(){return 0===this.type},c.prototype._resultCancelled=function(){l(this.finallyHandler)},e.prototype._passThrough=function(t,e,r,n){return"function"!=typeof t?this.then():this._then(r,n,void 0,new u(this,e,t),void 0)},e.prototype.lastly=e.prototype.finally=function(t){return this._passThrough(t,0,p,p)},e.prototype.tap=function(t){return this._passThrough(t,1,p)},e.prototype.tapCatch=function(t){var r=arguments.length;if(1===r)return this._passThrough(t,1,void 0,p);var n,o=new Array(r-1),s=0;for(n=0;n0&&"function"==typeof arguments[e]&&(t=arguments[e]);var n=[].slice.call(arguments);t&&n.pop();var i=new r(n).promise();return void 0!==t?i.spread(t):i}}},{"./util":36}],18:[function(t,e,r){"use strict";e.exports=function(e,r,n,i,o,s){var a=e._getDomain,u=t("./util"),c=u.tryCatch,l=u.errorObj,f=e._async;function h(t,e,r,n){this.constructor$(t),this._promise._captureStackTrace();var i=a();this._callback=null===i?e:u.domainBind(i,e),this._preservedValues=n===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0)}function p(t,r,i,o){if("function"!=typeof r)return n("expecting a function but got "+u.classString(r));var s=0;if(void 0!==i){if("object"!=typeof i||null===i)return e.reject(new TypeError("options argument must be an object but it is "+u.classString(i)));if("number"!=typeof i.concurrency)return e.reject(new TypeError("'concurrency' must be a number but it is "+u.classString(i.concurrency)));s=i.concurrency}return new h(t,r,s="number"==typeof s&&isFinite(s)&&s>=1?s:0,o).promise()}u.inherits(h,r),h.prototype._asyncInit=function(){this._init$(void 0,-2)},h.prototype._init=function(){},h.prototype._promiseFulfilled=function(t,r){var n=this._values,o=this.length(),a=this._preservedValues,u=this._limit;if(r<0){if(n[r=-1*r-1]=t,u>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(u>=1&&this._inFlight>=u)return n[r]=t,this._queue.push(r),!1;null!==a&&(a[r]=t);var f=this._promise,h=this._callback,p=f._boundValue();f._pushContext();var d=c(h).call(p,t,r,o),_=f._popContext();if(s.checkForgottenReturns(d,_,null!==a?"Promise.filter":"Promise.map",f),d===l)return this._reject(d.e),!0;var v=i(d,this._promise);if(v instanceof e){var y=(v=v._target())._bitField;if(0==(50397184&y))return u>=1&&this._inFlight++,n[r]=v,v._proxy(this,-1*(r+1)),!1;if(0==(33554432&y))return 0!=(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);d=v._value()}n[r]=d}return++this._totalResolved>=o&&(null!==a?this._filter(n,a):this._resolve(n),!0)},h.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,r=this._values;t.length>0&&this._inFlight1){o.deprecated("calling Promise.try with more than 1 argument");var c=arguments[1],l=arguments[2];n=s.isArray(c)?a(t).apply(l,c):a(t).call(l,c)}else n=a(t)();var f=u._popContext();return o.checkForgottenReturns(n,f,"Promise.try",u),u._resolveFromSyncValue(n),u},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,r){"use strict";var n=t("./util"),i=n.maybeWrapAsError,o=t("./errors").OperationalError,s=t("./es5"),a=/^(?:name|message|stack|cause)$/;function u(t){var e;if(function(t){return t instanceof Error&&s.getPrototypeOf(t)===Error.prototype}(t)){(e=new o(t)).name=t.name,e.message=t.message,e.stack=t.stack;for(var r=s.keys(t),i=0;i1){var r,n=new Array(e-1),i=0;for(r=0;r0&&"function"!=typeof t&&"function"!=typeof e){var r=".then() only accepts functions but was passed: "+c.classString(t);arguments.length>1&&(r+=", "+c.classString(e)),this._warn(r)}return this._then(t,e,void 0,void 0,void 0)},T.prototype.done=function(t,e){this._then(t,e,void 0,void 0,void 0)._setIsFinal()},T.prototype.spread=function(t){return"function"!=typeof t?o("expecting a function but got "+c.classString(t)):this.all()._then(t,void 0,void 0,y,void 0)},T.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},T.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new b(this).promise()},T.prototype.error=function(t){return this.caught(c.originatesFromRejection,t)},T.getNewLibraryCopy=r.exports,T.is=function(t){return t instanceof T},T.fromNode=T.fromCallback=function(t){var e=new T(v);e._captureStackTrace();var r=arguments.length>1&&!!Object(arguments[1]).multiArgs,n=k(t)(S(e,r));return n===R&&e._rejectCallback(n.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},T.all=function(t){return new b(t).promise()},T.cast=function(t){var e=g(t);return e instanceof T||((e=new T(v))._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},T.resolve=T.fulfilled=T.cast,T.reject=T.rejected=function(t){var e=new T(v);return e._captureStackTrace(),e._rejectCallback(t,!0),e},T.setScheduler=function(t){if("function"!=typeof t)throw new d("expecting a function but got "+c.classString(t));return h.setScheduler(t)},T.prototype._then=function(t,e,r,n,i){var o=void 0!==i,s=o?i:new T(v),u=this._target(),l=u._bitField;o||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===n&&0!=(2097152&this._bitField)&&(n=0!=(50397184&l)?this._boundValue():u===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var f=a();if(0!=(50397184&l)){var p,d,y=u._settlePromiseCtx;0!=(33554432&l)?(d=u._rejectionHandler0,p=t):0!=(16777216&l)?(d=u._fulfillmentHandler0,p=e,u._unsetRejectionIsUnhandled()):(y=u._settlePromiseLateCancellationObserver,d=new _("late cancellation observer"),u._attachExtraTrace(d),p=e),h.invoke(y,u,{handler:null===f?p:"function"==typeof p&&c.domainBind(f,p),promise:s,receiver:n,value:d})}else u._addCallbacks(t,e,s,n,f);return s},T.prototype._length=function(){return 65535&this._bitField},T.prototype._isFateSealed=function(){return 0!=(117506048&this._bitField)},T.prototype._isFollowing=function(){return 67108864==(67108864&this._bitField)},T.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},T.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},T.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},T.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},T.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},T.prototype._isFinal=function(){return(4194304&this._bitField)>0},T.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},T.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},T.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},T.prototype._setAsyncGuaranteed=function(){h.hasCustomScheduler()||(this._bitField=134217728|this._bitField)},T.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];if(e!==u)return void 0===e&&this._isBound()?this._boundValue():e},T.prototype._promiseAt=function(t){return this[4*t-4+2]},T.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},T.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},T.prototype._boundValue=function(){},T.prototype._migrateCallback0=function(t){t._bitField;var e=t._fulfillmentHandler0,r=t._rejectionHandler0,n=t._promise0,i=t._receiverAt(0);void 0===i&&(i=u),this._addCallbacks(e,r,n,i,null)},T.prototype._migrateCallbackAt=function(t,e){var r=t._fulfillmentHandlerAt(e),n=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=u),this._addCallbacks(r,n,i,o,null)},T.prototype._addCallbacks=function(t,e,r,n,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=r,this._receiver0=n,"function"==typeof t&&(this._fulfillmentHandler0=null===i?t:c.domainBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=null===i?e:c.domainBind(i,e));else{var s=4*o-4;this[s+2]=r,this[s+3]=n,"function"==typeof t&&(this[s+0]=null===i?t:c.domainBind(i,t)),"function"==typeof e&&(this[s+1]=null===i?e:c.domainBind(i,e))}return this._setLength(o+1),o},T.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},T.prototype._resolveCallback=function(t,e){if(0==(117506048&this._bitField)){if(t===this)return this._rejectCallback(n(),!1);var r=g(t,this);if(!(r instanceof T))return this._fulfill(t);e&&this._propagateFrom(r,2);var i=r._target();if(i!==this){var o=i._bitField;if(0==(50397184&o)){var s=this._length();s>0&&i._migrateCallback0(this);for(var a=1;a>>16)){if(t===this){var r=n();return this._attachExtraTrace(r),this._reject(r)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!=(134217728&e)?this._settlePromises():h.settlePromises(this))}},T.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(this._setRejected(),this._fulfillmentHandler0=t,this._isFinal())return h.fatalError(t,c.isNode);(65535&e)>0?h.settlePromises(this):this._ensurePossibleRejectionHandled()}},T.prototype._fulfillPromises=function(t,e){for(var r=1;r0){if(0!=(16842752&t)){var r=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,r,t),this._rejectPromises(e,r)}else{var n=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,n,t),this._fulfillPromises(e,n)}this._setLength(0)}this._clearCancellationData()},T.prototype._settledValue=function(){var t=this._bitField;return 0!=(33554432&t)?this._rejectionHandler0:0!=(16777216&t)?this._fulfillmentHandler0:void 0},T.defer=T.pending=function(){return C.deprecated("Promise.defer","new Promise"),{promise:new T(v),resolve:P,reject:O}},c.notEnumerableProp(T,"_makeSelfResolutionError",n),t("./method")(T,v,g,o,C),t("./bind")(T,v,g,C),t("./cancel")(T,b,o,C),t("./direct_resolve")(T),t("./synchronous_inspection")(T),t("./join")(T,b,g,v,h,a),T.Promise=T,T.version="3.5.1",t("./map.js")(T,b,o,g,v,C),t("./call_get.js")(T),t("./using.js")(T,o,g,E,v,C),t("./timers.js")(T,v,C),t("./generators.js")(T,o,v,g,s,C),t("./nodeify.js")(T),t("./promisify.js")(T,v),t("./props.js")(T,b,g,o),t("./race.js")(T,v,g,o),t("./reduce.js")(T,b,o,g,v,C),t("./settle.js")(T,b,C),t("./some.js")(T,b,o),t("./filter.js")(T,v),t("./each.js")(T,v),t("./any.js")(T),c.toFastProperties(T),c.toFastProperties(T.prototype),A({a:1}),A({b:2}),A({c:3}),A(1),A(function(){}),A(void 0),A(!1),A(new T(v)),C.setBounds(f.firstLineError,c.lastLineError),T}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36}],23:[function(t,e,r){"use strict";e.exports=function(e,r,n,i,o){var s=t("./util");function a(t){var n=this._promise=new e(r);t instanceof e&&n._propagateFrom(t,3),n._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}return s.isArray,s.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function t(r,o){var a=n(this._values,this._promise);if(a instanceof e){var u=(a=a._target())._bitField;if(this._values=a,0==(50397184&u))return this._promise._setAsyncGuaranteed(),a._then(t,this._reject,void 0,this,o);if(0==(33554432&u))return 0!=(16777216&u)?this._reject(a._reason()):this._cancel();a=a._value()}if(null!==(a=s.asArray(a)))0!==a.length?this._iterate(a):-5===o?this._resolveEmptyArray():this._resolve(function(t){switch(o){case-2:return[];case-3:return{};case-6:return new Map}}());else{var c=i("expecting an array or an iterable object but got "+s.classString(a)).reason();this._promise._rejectCallback(c,!1)}},a.prototype._iterate=function(t){var r=this.getActualLength(t.length);this._length=r,this._values=this.shouldCopyValues()?new Array(r):this._values;for(var i=this._promise,o=!1,s=null,a=0;a=this._length&&(this._resolve(this._values),!0)},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var r=0;r=this._length){var r;if(this._isMap)r=function(t){for(var e=new o,r=t.length/2|0,n=0;n>1},e.prototype.props=function(){return f(this)},e.props=function(t){return f(t)}}},{"./es5":13,"./util":36}],26:[function(t,e,r){"use strict";function n(t){this._capacity=t,this._length=0,this._front=0}n.prototype._willBeOverCapacity=function(t){return this._capacity=this._length&&(this._resolve(this._values),!0)},o.prototype._promiseFulfilled=function(t,e){var r=new i;return r._bitField=33554432,r._settledValueField=t,this._promiseResolved(e,r)},o.prototype._promiseRejected=function(t,e){var r=new i;return r._bitField=16777216,r._settledValueField=t,this._promiseResolved(e,r)},e.settle=function(t){return n.deprecated(".settle()",".reflect()"),new o(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e,r){"use strict";e.exports=function(e,r,n){var i=t("./util"),o=t("./errors").RangeError,s=t("./errors").AggregateError,a=i.isArray,u={};function c(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function l(t,e){if((0|e)!==e||e<0)return n("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");var r=new c(t),i=r.promise();return r.setHowMany(e),r.init(),i}i.inherits(c,r),c.prototype._init=function(){if(this._initialized)if(0!==this._howMany){this._init$(void 0,-5);var t=a(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}else this._resolve([])},c.prototype.init=function(){this._initialized=!0,this._init()},c.prototype.setUnwrap=function(){this._unwrap=!0},c.prototype.howMany=function(){return this._howMany},c.prototype.setHowMany=function(t){this._howMany=t},c.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0)},c.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},c.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(u),this._checkOutcome())},c.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new s,e=this.length();e0?this._reject(t):this._cancel(),!0}return!1},c.prototype._fulfilled=function(){return this._totalResolved},c.prototype._rejected=function(){return this._values.length-this.length()},c.prototype._addRejected=function(t){this._values.push(t)},c.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},c.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},c.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new o(e)},c.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return l(t,e)},e.prototype.some=function(t){return l(this,t)},e._SomePromiseArray=c}},{"./errors":12,"./util":36}],32:[function(t,e,r){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var r=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},n=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!=(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!=(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0==(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!=(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!=(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536==(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!=(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return r.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),n.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,r){"use strict";e.exports=function(e,r){var n=t("./util"),i=n.errorObj,o=n.isObject,s={}.hasOwnProperty;return function(t,a){if(o(t)){if(t instanceof e)return t;var u=function(t){try{return function(t){return t.then}(t)}catch(t){return i.e=t,i}}(t);if(u===i){a&&a._pushContext();var c=e.reject(u.e);return a&&a._popContext(),c}if("function"==typeof u)return function(t){try{return s.call(t,"_promise0")}catch(t){return!1}}(t)?(c=new e(r),t._then(c._fulfill,c._reject,void 0,c,null),c):function(t,o,s){var a=new e(r),u=a;s&&s._pushContext(),a._captureStackTrace(),s&&s._popContext();var c=!0,l=n.tryCatch(o).call(t,function(t){a&&(a._resolveCallback(t),a=null)},function(t){a&&(a._rejectCallback(t,c,!0),a=null)});return c=!1,a&&l===i&&(a._rejectCallback(l.e,!0,!0),a=null),u}(t,u,a)}return t}}},{"./util":36}],34:[function(t,e,r){"use strict";e.exports=function(e,r,n){var i=t("./util"),o=e.TimeoutError;function s(t){this.handle=t}s.prototype._resultCancelled=function(){clearTimeout(this.handle)};var a=function(t){return u(+this).thenReturn(t)},u=e.delay=function(t,i){var o,u;return void 0!==i?(o=e.resolve(i)._then(a,null,null,t,void 0),n.cancellation()&&i instanceof e&&o._setOnCancel(i)):(o=new e(r),u=setTimeout(function(){o._fulfill()},+t),n.cancellation()&&o._setOnCancel(new s(u)),o._captureStackTrace()),o._setAsyncGuaranteed(),o};function c(t){return clearTimeout(this.handle),t}function l(t){throw clearTimeout(this.handle),t}e.prototype.delay=function(t){return u(t,this)},e.prototype.timeout=function(t,e){var r,a;t=+t;var u=new s(setTimeout(function(){r.isPending()&&function(t,e,r){var n;n="string"!=typeof e?e instanceof Error?e:new o("operation timed out"):new o(e),i.markAsOriginatingFromRejection(n),t._attachExtraTrace(n),t._reject(n),null!=r&&r.cancel()}(r,e,a)},t));return n.cancellation()?(a=this.then(),(r=a._then(c,l,void 0,u,void 0))._setOnCancel(u)):r=this._then(c,l,void 0,u,void 0),r}}},{"./util":36}],35:[function(t,e,r){"use strict";e.exports=function(e,r,n,i,o,s){var a=t("./util"),u=t("./errors").TypeError,c=t("./util").inherits,l=a.errorObj,f=a.tryCatch,h={};function p(t){setTimeout(function(){throw t},0)}function d(t,r){var i=0,s=t.length,a=new e(o);return function o(){if(i>=s)return a._fulfill();var u=function(t){var e=n(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}(t[i++]);if(u instanceof e&&u._isDisposable()){try{u=n(u._getDisposer().tryDispose(r),t.promise)}catch(t){return p(t)}if(u instanceof e)return u._then(o,p,null,null,null)}o()}(),a}function _(t,e,r){this._data=t,this._promise=e,this._context=r}function v(t,e,r){this.constructor$(t,e,r)}function y(t){return _.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function m(t){this.length=t,this.promise=null,this[t-1]=null}_.prototype.data=function(){return this._data},_.prototype.promise=function(){return this._promise},_.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():h},_.prototype.tryDispose=function(t){var e=this.resource(),r=this._context;void 0!==r&&r._pushContext();var n=e!==h?this.doDispose(e,t):null;return void 0!==r&&r._popContext(),this._promise._unsetDisposable(),this._data=null,n},_.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},c(v,_),v.prototype.doDispose=function(t,e){return this.data().call(t,t,e)},m.prototype._resultCancelled=function(){for(var t=this.length,r=0;r0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new v(t,this,i());throw new u}}},{"./errors":12,"./util":36}],36:[function(t,n,i){"use strict";var o,s=t("./es5"),a="undefined"==typeof navigator,u={e:{}},c="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==r?r:void 0!==this?this:null;function l(){try{var t=o;return o=null,t.apply(this,arguments)}catch(t){return u.e=t,u}}function f(t){return null==t||!0===t||!1===t||"string"==typeof t||"number"==typeof t}function h(t,e,r){if(f(t))return t;var n={value:r,configurable:!0,enumerable:!1,writable:!0};return s.defineProperty(t,e,n),t}var p=function(){var t=[Array.prototype,Object.prototype,Function.prototype],e=function(e){for(var r=0;r1,n=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=d.test(t+"")&&s.names(t).length>0;if(r||n||i)return!0}return!1}catch(t){return!1}},isIdentifier:function(t){return _.test(t)},inheritedDataKeys:p,getDataPropertyOrDefault:function(t,e,r){if(!s.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var n=Object.getOwnPropertyDescriptor(t,e);return null!=n?null==n.get&&null==n.set?n.value:r:void 0},thrower:function(t){throw t},isArray:s.isArray,asArray:w,notEnumerableProp:h,isPrimitive:f,isObject:function(t){return"function"==typeof t||"object"==typeof t&&null!==t},isError:y,canEvaluate:a,errorObj:u,tryCatch:function(t){return o=t,l},inherits:function(t,e){var r={}.hasOwnProperty;function n(){for(var n in this.constructor=t,this.constructor$=e,e.prototype)r.call(e.prototype,n)&&"$"!==n.charAt(n.length-1)&&(this[n+"$"]=e.prototype[n])}return n.prototype=e.prototype,t.prototype=new n,t.prototype},withAppended:function(t,e){var r,n=t.length,i=new Array(n+1);for(r=0;r10||t[0]>0}(),j.isNode&&j.toFastProperties(e);try{throw new Error}catch(t){j.lastLineError=t}n.exports=j},{"./es5":13}]},{},[4])(4),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise)}).call(this,r(4),r(0),r(11).setImmediate)},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e){if(!e.eol&&t)for(var r=0,n=t.length;r0?("string"==typeof e||s.objectMode||Object.getPrototypeOf(e)===c.prototype||(e=function(t){return c.from(t)}(e)),n?s.endEmitted?t.emit("error",new Error("stream.unshift() after end event")):w(t,s,e,!0):s.ended?t.emit("error",new Error("stream.push() after EOF")):(s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||0!==e.length?w(t,s,e,!1):S(t,s)):w(t,s,e,!1))):n||(s.reading=!1)),function(t){return!t.ended&&(t.needReadable||t.lengthe.highWaterMark&&(e.highWaterMark=function(t){return t>=E?t=E:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function x(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(p("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?i.nextTick(j,t):j(t))}function j(t){p("emit readable"),t.emit("readable"),P(t)}function S(t,e){e.readingMore||(e.readingMore=!0,i.nextTick(R,t,e))}function R(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var n;return to.length?o.length:t;if(s===o.length?i+=o:i+=o.slice(0,t),0==(t-=s)){s===o.length?(++n,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=o.slice(s));break}++n}return e.length-=n,i}(t,e):function(t,e){var r=c.allocUnsafe(t),n=e.head,i=1;for(n.data.copy(r),t-=n.data.length;n=n.next;){var o=n.data,s=t>o.length?o.length:t;if(o.copy(r,r.length-t,0,s),0==(t-=s)){s===o.length?(++i,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=o.slice(s));break}++i}return e.length-=i,r}(t,e),n}(t,e.buffer,e.decoder),r);var r}function A(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,i.nextTick(F,e,t))}function F(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function L(t,e){for(var r=0,n=t.length;r=e.highWaterMark||e.ended))return p("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?A(this):x(this),null;if(0===(t=C(t,e))&&e.ended)return 0===e.length&&A(this),null;var n,i=e.needReadable;return p("need readable",i),(0===e.length||e.length-t0?O(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&A(this)),null!==n&&this.emit("data",n),n},g.prototype._read=function(t){this.emit("error",new Error("_read() is not implemented"))},g.prototype.pipe=function(t,e){var r=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=t;break;case 1:o.pipes=[o.pipes,t];break;default:o.pipes.push(t)}o.pipesCount+=1,p("pipe count=%d opts=%j",o.pipesCount,e);var u=e&&!1===e.end||t===n.stdout||t===n.stderr?m:c;function c(){p("onend"),t.end()}o.endEmitted?i.nextTick(u):r.once("end",u),t.on("unpipe",function e(n,i){p("onunpipe"),n===r&&i&&!1===i.hasUnpiped&&(i.hasUnpiped=!0,p("cleanup"),t.removeListener("close",v),t.removeListener("finish",y),t.removeListener("drain",l),t.removeListener("error",_),t.removeListener("unpipe",e),r.removeListener("end",c),r.removeListener("end",m),r.removeListener("data",d),f=!0,!o.awaitDrain||t._writableState&&!t._writableState.needDrain||l())});var l=function(t){return function(){var e=t._readableState;p("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&a(t,"data")&&(e.flowing=!0,P(t))}}(r);t.on("drain",l);var f=!1,h=!1;function d(e){p("ondata"),h=!1,!1!==t.write(e)||h||((1===o.pipesCount&&o.pipes===t||o.pipesCount>1&&-1!==L(o.pipes,t))&&!f&&(p("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,h=!0),r.pause())}function _(e){p("onerror",e),m(),t.removeListener("error",_),0===a(t,"error")&&t.emit("error",e)}function v(){t.removeListener("finish",y),m()}function y(){p("onfinish"),t.removeListener("close",v),m()}function m(){p("unpipe"),r.unpipe(t)}return r.on("data",d),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?s(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",_),t.once("close",v),t.once("finish",y),t.emit("pipe",r),o.flowing||(p("pipe resume"),r.resume()),t},g.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function a(t){var e=this.lastTotal-this.lastNeed,r=function(t,e,r){if(128!=(192&e[0]))return t.lastNeed=0,"�";if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�";if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�"}}(this,t);return void 0!==r?r:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function u(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var n=r.charCodeAt(r.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function c(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function l(t,e){var r=(t.length-e)%3;return 0===r?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,1===r?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function f(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function h(t){return t.toString(this.encoding)}function p(t){return t&&t.length?this.write(t):""}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return"";var e,r;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r=0?(i>0&&(t.lastNeed=i-1),i):--n=0?(i>0&&(t.lastNeed=i-2),i):--n=0?(i>0&&(2===i?i=0:t.lastNeed=i-3),i):0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var n=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,r){"use strict";t.exports=o;var n=r(1),i=r(5);function o(t){if(!(this instanceof o))return new o(t);n.call(this,t),this._transformState={afterTransform:function(t,e){var r=this._transformState;r.transforming=!1;var n=r.writecb;if(!n)return this.emit("error",new Error("write callback called multiple times"));r.writechunk=null,r.writecb=null,null!=e&&this.push(e),n(t);var i=this._readableState;i.reading=!1,(i.needReadable||i.length-1&&r.push(t[n]);return r},e.trimLeft=String.prototype.trimLeft?function(t){return t.trimLeft()}:function(t){return t.replace(/^\s+/,"")},e.trimRight=String.prototype.trimRight?function(t){return t.trimRight()}:function(t){return t.replace(/\s+$/,"")}}).call(this,r(3).Buffer)},function(t,e,r){"use strict";var n=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=function(t){function e(e,r,n){var i=t.call(this,"Error: "+e+". JSON Line number: "+r+(n?" near: "+n:""))||this;return i.err=e,i.line=r,i.extra=n,i.name="CSV Parse Error",i}return n(e,t),e.column_mismatched=function(t,r){return new e("column_mismatched",t,r)},e.unclosed_quote=function(t,r){return new e("unclosed_quote",t,r)},e.fromJSON=function(t){return new e(t.err,t.line,t.extra)},e.prototype.toJSON=function(){return{err:this.err,line:this.line,extra:this.extra}},e}(Error);e.default=i},function(t,e,r){var n=r(18),i=r(68),o=r(69),s=n?n.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":s&&s in Object(t)?i(t):o(t)}},function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},function(t,e,r){t.exports=r(33)},function(t,e,r){"use strict";var n=r(34),i=function(t,e){return new n.Converter(t,e)};i.csv=i,i.Converter=n.Converter,t.exports=i},function(t,e,r){"use strict";(function(t){var n=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=r(36),s=r(50),a=r(51),u=i(r(15)),c=r(52),l=r(105),f=function(e){function i(r,n){void 0===n&&(n={});var i=e.call(this,n)||this;return i.options=n,i.params=s.mergeParams(r),i.runtime=a.initParseRuntime(i),i.result=new l.Result(i),i.processor=new c.ProcessorLocal(i),i.once("error",function(e){t(function(){i.result.processError(e),i.emit("done",e)})}),i.once("done",function(){i.processor.destroy()}),i}return n(i,e),i.prototype.preRawData=function(t){return this.runtime.preRawDataHook=t,this},i.prototype.preFileLine=function(t){return this.runtime.preFileLineHook=t,this},i.prototype.subscribe=function(t,e,r){return this.parseRuntime.subscribe={onNext:t,onError:e,onCompleted:r},this},i.prototype.fromFile=function(t,e){var n=this,i=r(!function(){var t=new Error("Cannot find module 'fs'");throw t.code="MODULE_NOT_FOUND",t}());return i.exists(t,function(r){r?i.createReadStream(t,e).pipe(n):n.emit("error",new Error("File does not exist. Check to make sure the file path to your csv is correct."))}),this},i.prototype.fromStream=function(t){return t.pipe(this),this},i.prototype.fromString=function(t){t.toString();var e=new o.Readable,r=0;return e._read=function(e){if(r>=t.length)this.push(null);else{var n=t.substr(r,e);this.push(n),r+=e}},this.fromStream(e)},i.prototype.then=function(t,e){var r=this;return new u.default(function(n,i){r.parseRuntime.then={onfulfilled:function(e){n(t?t(e):e)},onrejected:function(t){e?n(e(t)):i(t)}}})},Object.defineProperty(i.prototype,"parseParam",{get:function(){return this.params},enumerable:!0,configurable:!0}),Object.defineProperty(i.prototype,"parseRuntime",{get:function(){return this.runtime},enumerable:!0,configurable:!0}),i.prototype._transform=function(t,e,r){var n=this;this.processor.process(t).then(function(t){if(t.length>0)return n.runtime.started=!0,n.result.processResult(t)}).then(function(){n.emit("drained"),r()},function(t){n.runtime.hasError=!0,n.runtime.error=t,n.emit("error",t),r()})},i.prototype._flush=function(t){var e=this;this.processor.flush().then(function(t){if(t.length>0)return e.result.processResult(t)}).then(function(){e.processEnd(t)},function(r){e.emit("error",r),t()})},i.prototype.processEnd=function(t){this.result.endProcess(),this.emit("done"),t()},Object.defineProperty(i.prototype,"parsedLineNumber",{get:function(){return this.runtime.parsedLineNumber},enumerable:!0,configurable:!0}),i}(o.Transform);e.Converter=f}).call(this,r(11).setImmediate)},function(t,e,r){(function(t,e){!function(t,r){"use strict";if(!t.setImmediate){var n,i=1,o={},s=!1,a=t.document,u=Object.getPrototypeOf&&Object.getPrototypeOf(t);u=u&&u.setTimeout?u:t,"[object process]"==={}.toString.call(t.process)?n=function(t){e.nextTick(function(){l(t)})}:function(){if(t.postMessage&&!t.importScripts){var e=!0,r=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=r,e}}()?function(){var e="setImmediate$"+Math.random()+"$",r=function(r){r.source===t&&"string"==typeof r.data&&0===r.data.indexOf(e)&&l(+r.data.slice(e.length))};t.addEventListener?t.addEventListener("message",r,!1):t.attachEvent("onmessage",r),n=function(r){t.postMessage(e+r,"*")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){l(t.data)},n=function(e){t.port2.postMessage(e)}}():a&&"onreadystatechange"in a.createElement("script")?function(){var t=a.documentElement;n=function(e){var r=a.createElement("script");r.onreadystatechange=function(){l(e),r.onreadystatechange=null,t.removeChild(r),r=null},t.appendChild(r)}}():n=function(t){setTimeout(l,0,t)},u.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),r=0;r0?n-4:n,f=0;f>16&255,a[u++]=e>>8&255,a[u++]=255&e;return 2===s&&(e=i[t.charCodeAt(f)]<<2|i[t.charCodeAt(f+1)]>>4,a[u++]=255&e),1===s&&(e=i[t.charCodeAt(f)]<<10|i[t.charCodeAt(f+1)]<<4|i[t.charCodeAt(f+2)]>>2,a[u++]=e>>8&255,a[u++]=255&e),a},e.fromByteArray=function(t){for(var e,r=t.length,i=r%3,o=[],s=0,a=r-i;sa?a:s+16383));return 1===i?(e=t[r-1],o.push(n[e>>2]+n[e<<4&63]+"==")):2===i&&(e=(t[r-2]<<8)+t[r-1],o.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"=")),o.join("")};for(var n=[],i=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,u=s.length;a0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function l(t){return n[t>>18&63]+n[t>>12&63]+n[t>>6&63]+n[63&t]}function f(t,e,r){for(var n,i=[],o=e;o>1,l=-7,f=r?i-1:0,h=r?-1:1,p=t[e+f];for(f+=h,o=p&(1<<-l)-1,p>>=-l,l+=a;l>0;o=256*o+t[e+f],f+=h,l-=8);for(s=o&(1<<-l)-1,o>>=-l,l+=n;l>0;s=256*s+t[e+f],f+=h,l-=8);if(0===o)o=1-c;else{if(o===u)return s?NaN:1/0*(p?-1:1);s+=Math.pow(2,n),o-=c}return(p?-1:1)*s*Math.pow(2,o-n)},e.write=function(t,e,r,n,i,o){var s,a,u,c=8*o-i-1,l=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:o-1,d=n?1:-1,_=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=l):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),(e+=s+f>=1?h/u:h*Math.pow(2,1-f))*u>=2&&(s++,u/=2),s+f>=l?(a=0,s=l):s+f>=1?(a=(e*u-1)*Math.pow(2,i),s+=f):(a=e*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;t[r+p]=255&a,p+=d,a/=256,i-=8);for(s=s<0;t[r+p]=255&s,p+=d,s/=256,c-=8);t[r+p-d]|=128*_}},function(t,e){var r={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==r.call(t)}},function(t,e){},function(t,e,r){"use strict";var n=r(7).Buffer,i=r(43);function o(t,e,r){t.copy(e,r)}t.exports=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.head=null,this.tail=null,this.length=0}return t.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},t.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},t.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},t.prototype.clear=function(){this.head=this.tail=null,this.length=0},t.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},t.prototype.concat=function(t){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var e=n.allocUnsafe(t>>>0),r=this.head,i=0;r;)o(r.data,e,i),i+=r.data.length,r=r.next;return e},t}(),i&&i.inspect&&i.inspect.custom&&(t.exports.prototype[i.inspect.custom]=function(){var t=i.inspect({length:this.length});return this.constructor.name+" "+t})},function(t,e){},function(t,e,r){(function(e){function r(t){try{if(!e.localStorage)return!1}catch(t){return!1}var r=e.localStorage[t];return null!=r&&"true"===String(r).toLowerCase()}t.exports=function(t,e){if(r("noDeprecation"))return t;var n=!1;return function(){if(!n){if(r("throwDeprecation"))throw new Error(e);r("traceDeprecation")?console.trace(e):console.warn(e),n=!0}return t.apply(this,arguments)}}}).call(this,r(0))},function(t,e,r){"use strict";t.exports=o;var n=r(27),i=r(5);function o(t){if(!(this instanceof o))return new o(t);n.call(this,t)}i.inherits=r(2),i.inherits(o,n),o.prototype._transform=function(t,e,r){r(null,t)}},function(t,e,r){t.exports=r(14)},function(t,e,r){t.exports=r(1)},function(t,e,r){t.exports=r(13).Transform},function(t,e,r){t.exports=r(13).PassThrough},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.mergeParams=function(t){var e={delimiter:",",ignoreColumns:void 0,includeColumns:void 0,quote:'"',trim:!0,checkType:!1,ignoreEmpty:!1,noheader:!1,headers:void 0,flatKeys:!1,maxRowLength:0,checkColumn:!1,escape:'"',colParser:{},eol:void 0,alwaysSplitAtEOL:!1,output:"json",nullObject:!1,downstreamFormat:"line",needEmitAll:!0};for(var r in t||(t={}),t)t.hasOwnProperty(r)&&(Array.isArray(t[r])?e[r]=[].concat(t[r]):e[r]=t[r]);return e}},function(t,e,r){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.initParseRuntime=function(t){var e=t.parseParam,r={needProcessIgnoreColumn:!1,needProcessIncludeColumn:!1,selectedColumns:void 0,ended:!1,hasError:!1,error:void 0,delimiter:t.parseParam.delimiter,eol:t.parseParam.eol,columnConv:[],headerType:[],headerTitle:[],headerFlag:[],headers:void 0,started:!1,parsedLineNumber:0,columnValueSetter:[]};return e.ignoreColumns&&(r.needProcessIgnoreColumn=!0),e.includeColumns&&(r.needProcessIncludeColumn=!0),r}},function(t,e,r){"use strict";(function(t){var n=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};return function(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=r(53),s=i(r(15)),a=r(54),u=i(r(16)),c=r(57),l=r(28),f=r(58),h=i(r(59)),p=i(r(29)),d=function(e){function r(){var t=null!==e&&e.apply(this,arguments)||this;return t.rowSplit=new f.RowSplit(t.converter),t.eolEmitted=!1,t._needEmitEol=void 0,t.headEmitted=!1,t._needEmitHead=void 0,t}return n(r,e),r.prototype.flush=function(){var t=this;if(this.runtime.csvLineBuffer&&this.runtime.csvLineBuffer.length>0){var e=this.runtime.csvLineBuffer;return this.runtime.csvLineBuffer=void 0,this.process(e,!0).then(function(e){return t.runtime.csvLineBuffer&&t.runtime.csvLineBuffer.length>0?s.default.reject(p.default.unclosed_quote(t.runtime.parsedLineNumber,t.runtime.csvLineBuffer.toString())):s.default.resolve(e)})}return s.default.resolve([])},r.prototype.destroy=function(){return s.default.resolve()},Object.defineProperty(r.prototype,"needEmitEol",{get:function(){return void 0===this._needEmitEol&&(this._needEmitEol=this.converter.listeners("eol").length>0),this._needEmitEol},enumerable:!0,configurable:!0}),Object.defineProperty(r.prototype,"needEmitHead",{get:function(){return void 0===this._needEmitHead&&(this._needEmitHead=this.converter.listeners("header").length>0),this._needEmitHead},enumerable:!0,configurable:!0}),r.prototype.process=function(t,e){var r,n=this;return void 0===e&&(e=!1),r=e?t.toString():a.prepareData(t,this.converter.parseRuntime),s.default.resolve().then(function(){return n.runtime.preRawDataHook?n.runtime.preRawDataHook(r):r}).then(function(t){return t&&t.length>0?n.processCSV(t,e):s.default.resolve([])})},r.prototype.processCSV=function(t,e){var r=this,n=this.params,i=this.runtime;i.eol||u.default(t,i),this.needEmitEol&&!this.eolEmitted&&i.eol&&(this.converter.emit("eol",i.eol),this.eolEmitted=!0),n.ignoreEmpty&&!i.started&&(t=l.trimLeft(t));var o=c.stringToLines(t,i);return e?(o.lines.push(o.partial),o.partial=""):this.prependLeftBuf(l.bufFromString(o.partial)),o.lines.length>0?(i.preFileLineHook?this.runPreLineHook(o.lines):s.default.resolve(o.lines)).then(function(t){return i.started||r.runtime.headers?r.processCSVBody(t):r.processDataWithHead(t)}):s.default.resolve([])},r.prototype.processDataWithHead=function(t){if(this.params.noheader)this.params.headers?this.runtime.headers=this.params.headers:this.runtime.headers=[];else{for(var e="",r=[];t.length;){var n=e+t.shift(),i=this.rowSplit.parse(n);if(i.closed){r=i.cells,e="";break}e=n+u.default(n,this.runtime)}if(this.prependLeftBuf(l.bufFromString(e)),0===r.length)return[];this.params.headers?this.runtime.headers=this.params.headers:this.runtime.headers=r}return(this.runtime.needProcessIgnoreColumn||this.runtime.needProcessIncludeColumn)&&this.filterHeader(),this.needEmitHead&&!this.headEmitted&&(this.converter.emit("header",this.runtime.headers),this.headEmitted=!0),this.processCSVBody(t)},r.prototype.filterHeader=function(){if(this.runtime.selectedColumns=[],this.runtime.headers){for(var t=this.runtime.headers,e=0;e=e.length)i();else if(r.preFileLineHook){var o=e[n],s=r.preFileLineHook(o,r.parsedLineNumber+n);if(n++,s&&s.then)s.then(function(o){e[n-1]=o,t(e,r,n,i)});else{for(e[n-1]=s;n0?t.concat([r.csvLineBuffer,e]):e}(e,r);r.csvLineBuffer=void 0;var o=function(t,e){var r=t.length-1;if(0!=(128&t[r])){for(;128==(192&t[r]);)r--;r--}return r!=t.length-1?(e.csvLineBuffer=t.slice(r+1),t.slice(0,r+1)):t}(n,r).toString("utf8");return!1===r.started?i.default(o):o}}).call(this,r(3).Buffer)},function(t,e,r){"use strict";(function(e){var n=r(56);t.exports=function(t){return"string"==typeof t&&65279===t.charCodeAt(0)?t.slice(1):e.isBuffer(t)&&n(t)&&239===t[0]&&187===t[1]&&191===t[2]?t.slice(3):t}}).call(this,r(3).Buffer)},function(t,e){t.exports=function(t){for(var e=0;e0),this._needEmitDelimiter},enumerable:!0,configurable:!0}),t.prototype.parse=function(t){if(0===t.length||this.conv.parseParam.ignoreEmpty&&0===t.trim().length)return{cells:[],closed:!0};var e=this.quote,r=this.trim;this.escape,(this.conv.parseRuntime.delimiter instanceof Array||"auto"===this.conv.parseRuntime.delimiter.toLowerCase())&&(this.conv.parseRuntime.delimiter=this.getDelimiter(t)),this.needEmitDelimiter&&!this.delimiterEmitted&&(this.conv.emit("delimiter",this.conv.parseRuntime.delimiter),this.delimiterEmitted=!0);var n=this.conv.parseRuntime.delimiter,i=t.split(n);if("off"===e){if(r)for(var o=0;or&&(n=e,r=i)}),n},t.prototype.isQuoteOpen=function(t){var e=this.quote,r=this.escape;return t[0]===e&&(t[1]!==e||t[1]===r&&(t[2]===e||2===t.length))},t.prototype.isQuoteClose=function(t){var e=this.quote,r=this.escape;this.conv.parseParam.trim&&(t=o.trimRight(t));for(var n=0,i=t.length-1;t[i]===e||t[i]===r;)i--,n++;return n%2!=0},t.prototype.escapeQuote=function(t){var e="es|"+this.quote+"|"+this.escape;void 0===this.cachedRegExp[e]&&(this.cachedRegExp[e]=new RegExp("\\"+this.escape+"\\"+this.quote,"g"));var r=this.cachedRegExp[e];return t.replace(r,this.quote)},t.prototype.parseMultiLines=function(t){for(var e=[],r="";t.length;){var n=r+t.shift(),s=this.parse(n);0===s.cells.length&&this.conv.parseParam.ignoreEmpty||(s.closed||this.conv.parseParam.alwaysSplitAtEOL?(this.conv.parseRuntime.selectedColumns?e.push(o.filterArray(s.cells,this.conv.parseRuntime.selectedColumns)):e.push(s.cells),r=""):r=n+(i.default(n,this.conv.parseRuntime)||"\n"))}return{rowsCells:e,partial:r}},t}();e.RowSplit=a},function(t,e,r){"use strict";var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var i=n(r(29)),o=n(r(60)),s=/^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;function a(t,e,r){if(e.parseParam.checkColumn&&e.parseRuntime.headers&&t.length!==e.parseRuntime.headers.length)throw i.default.column_mismatched(e.parseRuntime.parsedLineNumber+r);return function(t,e,r){for(var n=!1,i={},o=0,s=t.length;o-1){for(var o=e.split("."),s=!0;o.length>0;)if(0===o.shift().length){s=!1;break}!s||n.parseParam.colParser[e]&&n.parseParam.colParser[e].flat?n.parseRuntime.columnValueSetter[i]=f:n.parseRuntime.columnValueSetter[i]=h}else n.parseRuntime.columnValueSetter[i]=f;!0===n.parseParam.nullObject&&"null"===r&&(r=null),n.parseRuntime.columnValueSetter[i](t,e,r)}function f(t,e,r){t[e]=r}function h(t,e,r){o.default(t,e,r)}function p(t,e,r,n){return n.parseRuntime.headerType[r]?n.parseRuntime.headerType[r]:e.indexOf("number#!")>-1?n.parseRuntime.headerType[r]=d:e.indexOf("string#!")>-1?n.parseRuntime.headerType[r]=_:n.parseParam.checkType?n.parseRuntime.headerType[r]=v:n.parseRuntime.headerType[r]=_}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function _(t){return t.toString()}function v(t){var e=t.trim();return""===e?_(t):s.test(e)?d(t):5===e.length&&"false"===e.toLowerCase()||4===e.length&&"true"===e.toLowerCase()?function(t){var e=t.trim();return 5!==e.length||"false"!==e.toLowerCase()}(t):"{"===e[0]&&"}"===e[e.length-1]||"["===e[0]&&"]"===e[e.length-1]?function(t){try{return JSON.parse(t)}catch(e){return t}}(t):_(t)}},function(t,e,r){var n=r(61);t.exports=function(t,e,r){return null==t?t:n(t,e,r)}},function(t,e,r){var n=r(62),i=r(74),o=r(103),s=r(20),a=r(104);t.exports=function(t,e,r,u){if(!s(t))return t;for(var c=-1,l=(e=i(e,t)).length,f=l-1,h=t;null!=h&&++c-1}},function(t,e,r){var n=r(9);t.exports=function(t,e){var r=this.__data__,i=n(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}},function(t,e,r){var n=r(17)(r(19),"Map");t.exports=n},function(t,e,r){var n=r(10);t.exports=function(t){var e=n(this,t).delete(t);return this.size-=e?1:0,e}},function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},function(t,e,r){var n=r(10);t.exports=function(t){return n(this,t).get(t)}},function(t,e,r){var n=r(10);t.exports=function(t){return n(this,t).has(t)}},function(t,e,r){var n=r(10);t.exports=function(t,e){var r=n(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}},function(t,e,r){var n=r(101);t.exports=function(t){return null==t?"":n(t)}},function(t,e,r){var n=r(18),i=r(102),o=r(21),s=r(22),a=n?n.prototype:void 0,u=a?a.toString:void 0;t.exports=function t(e){if("string"==typeof e)return e;if(o(e))return i(e,t)+"";if(s(e))return u?u.call(e):"";var r=e+"";return"0"==r&&1/e==-1/0?"-0":r}},function(t,e){t.exports=function(t,e){for(var r=-1,n=null==t?0:t.length,i=Array(n);++r-1&&t%1==0&&t0||this.converter.listeners("readable").length>0),this._needPushDownstream},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"needEmitAll",{get:function(){return!!this.converter.parseRuntime.then&&this.converter.parseParam.needEmitAll},enumerable:!0,configurable:!0}),t.prototype.processResult=function(t){var e=this,r=this.converter.parseRuntime.parsedLineNumber;return this.needPushDownstream&&"array"===this.converter.parseParam.downstreamFormat&&0===r&&a(this.converter,"["+o.EOL),new i.default(function(r,n){e.needEmitLine?function t(e,r,n,i,o){if(n>=e.length)o();else if(r.parseRuntime.subscribe&&r.parseRuntime.subscribe.onNext){var s=r.parseRuntime.subscribe.onNext,u=e[n],c=s(u,r.parseRuntime.parsedLineNumber+n);if(n++,c&&c.then)c.then(function(){!function(e,r,n,i,o,s,u){o&&a(n,u),t(e,n,i,o,s)}(e,0,r,n,i,o,u)},o);else{for(i&&a(r,u);n141 Commits / 70357++ / 66412-- +77.05% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Matthias Lienau](https://github.com/atufkas) +9 Commits / 74++ / 45-- +04.92% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Keita Akutsu](https://github.com/kakts) +4 Commits / 821++ / 784-- +02.19% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Ron Korving](https://github.com/ronkorving) +3 Commits / 3++ / 3-- +01.64% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Sean Lang](https://github.com/slang800) +2 Commits / 2++ / 1-- +01.09% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[null](https://github.com/nbelakovski) +2 Commits / 2++ / 2-- +01.09% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Blake Blackshear](https://github.com/blakeblackshear) +2 Commits / 8++ / 8-- +01.09% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Dimitri Kennedy](https://github.com/roodboi) +2 Commits / 3++ / 3-- +01.09% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Jimi Ford](https://github.com/JimiHFord) +1 Commits / 5++ / 5-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Alec Fenichel](https://github.com/fenichelar) +1 Commits / 1++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Bruce Johnson](https://github.com/brucejo75) +1 Commits / 36++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Zsolt R. Molnar](https://github.com/molnarzs) +1 Commits / 40++ / 2-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Ionică Bizău (Johnny B.)](https://github.com/IonicaBizau) +1 Commits / 98++ / 86-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[null](https://github.com/markwithers) +1 Commits / 1++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Trang](https://github.com/trangtungn) +1 Commits / 6++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[null](https://github.com/jondayft) +1 Commits / 18++ / 0-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Robert Porter](https://github.com/colarob) +1 Commits / 64++ / 21-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Bert Verhelst](https://github.com/bertyhell) +1 Commits / 17++ / 0-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Jeff Johnson](https://github.com/jeffcjohnson) +1 Commits / 1++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Richard Pringle](https://github.com/richardpringle) +1 Commits / 1++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[José Expósito](https://github.com/JoseExposito) +1 Commits / 9++ / 3-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Daniel Cohen](https://github.com/dcohenb) +1 Commits / 1++ / 6-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Jessica Good](https://github.com/jessicagood) +1 Commits / 8++ / 5-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Amila Welihinda](https://github.com/amilajack) +1 Commits / 2++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Dane Petersen](https://github.com/thegreatsunra) +1 Commits / 18920++ / 8429-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+[Hocine Moukaideche](https://github.com/Off76) +1 Commits / 1++ / 1-- +00.55% ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

+###### [Generated](https://github.com/jakeleboeuf/contributor) on Sat Sep 30 2017 19:56:19 GMT+0100 (IST) \ No newline at end of file diff --git a/node_modules/csvtojson/coverage/CSVError.test.ts.html b/node_modules/csvtojson/coverage/CSVError.test.ts.html new file mode 100644 index 0000000..4d49457 --- /dev/null +++ b/node_modules/csvtojson/coverage/CSVError.test.ts.html @@ -0,0 +1,84 @@ + + + + Code coverage report for CSVError.test.ts + + + + + + + +
+
+

+ All files CSVError.test.ts +

+
+
+ 100% + Statements + 1/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 1/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6  +  +1x +  +  + 
import CSVError from "./CSVError";
+import assert from "assert";
+describe("CSVError",()=>{
+  it ("should toString()",()=>{
+  })
+})
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/CSVError.ts.html b/node_modules/csvtojson/coverage/CSVError.ts.html new file mode 100644 index 0000000..f6e3ccf --- /dev/null +++ b/node_modules/csvtojson/coverage/CSVError.ts.html @@ -0,0 +1,153 @@ + + + + Code coverage report for CSVError.ts + + + + + + + +
+
+

+ All files CSVError.ts +

+
+
+ 94.12% + Statements + 16/17 +
+
+ 75% + Branches + 3/4 +
+
+ 83.33% + Functions + 5/6 +
+
+ 93.75% + Lines + 15/16 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +1x +1x +2x +  +1x +5x +  +1x +1x +  +  +8x +8x +8x +  +8x +8x +  +1x +  +  +  +  +  +  +  +1x + 
var util = require("util");
+export default class CSVError extends Error {
+  static column_mismatched(index: number, extra?: string) {
+    return new CSVError("column_mismatched", index, extra);
+  }
+  static unclosed_quote(index: number, extra?: string) {
+    return new CSVError("unclosed_quote", index, extra);
+  }
+  static fromJSON(obj) {
+    return new CSVError(obj.err, obj.line, obj.extra);
+  }
+  constructor(
+    public err: string,
+    public line: number,
+    public extra?: string
+  ) {
+    super("Error: " + err + ". JSON Line number: " + line + (extra ? " near: " + extra : ""));
+    this.name = "CSV Parse Error";
+  }
+  toJSON() {
+    return {
+      err: this.err,
+      line: this.line,
+      extra: this.extra
+    }
+  }
+ 
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/Converter.ts.html b/node_modules/csvtojson/coverage/Converter.ts.html new file mode 100644 index 0000000..c542c80 --- /dev/null +++ b/node_modules/csvtojson/coverage/Converter.ts.html @@ -0,0 +1,618 @@ + + + + Code coverage report for Converter.ts + + + + + + + +
+
+

+ All files Converter.ts +

+
+
+ 100% + Statements + 98/98 +
+
+ 100% + Branches + 18/18 +
+
+ 100% + Functions + 29/29 +
+
+ 100% + Lines + 92/92 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +1841x +1x +1x +1x +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +3x +3x +  +1x +2x +2x +  +1x +  +  +  +34x +  +  +  +  +34x +  +8x +8x +  +  +  +  +  +  +8x +8x +7x +7x +  +1x +  +  +8x +  +1x +46x +46x +  +1x +30x +30x +30x +30x +65x +30x +  +35x +35x +35x +  +  +30x +  +86x +86x +86x +  +79x +78x +  +1x +  +  +  +5x +4x +  +1x +  +  +  +  +  +1x +166228x +  +1x +442655x +  +  +  +  +  +356x +120x +120x +120x +120x +120x +37x +  +83x +  +120x +  +  +9x +9x +9x +  +  +  +120x +113x +  +  +120x +  +217x +217x +  +215x +81x +81x +  +  +  +215x +215x +  +2x +2x +2x +2x +  +  +110x +110x +  +104x +66x +  +  +  +104x +  +5x +5x +  +  +1x +104x +104x +104x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Transform, TransformOptions, Readable } from "stream";
+import { CSVParseParam, mergeParams } from "./Parameters";
+import { ParseRuntime, initParseRuntime } from "./ParseRuntime";
+import P from "bluebird";
+import { stringToLines } from "./fileline";
+import { map } from "lodash/map";
+import { RowSplit, RowSplitResult } from "./rowSplit";
+import getEol from "./getEol";
+import lineToJson, { JSONResult } from "./lineToJson";
+import { Processor, ProcessLineResult } from "./Processor";
+import { ProcessorFork } from "./ProcessFork";
+import { ProcessorLocal } from "./ProcessorLocal";
+import { Result } from "./Result";
+import CSVError from "./CSVError";
+import { bufFromString } from "./util";
+export class Converter extends Transform {
+  preRawData(onRawData: PreRawDataCallback):Converter {
+    this.runtime.preRawDataHook = onRawData;
+    return this;
+  }
+  preFileLine(onFileLine: PreFileLineCallback):Converter {
+    this.runtime.preFileLineHook = onFileLine;
+    return this;
+  }
+  subscribe(
+    onNext?: (data: any, lineNumber: number) => void | PromiseLike<void>,
+    onError?: (err: CSVError) => void,
+    onCompleted?: () => void): Converter {
+    this.parseRuntime.subscribe = {
+      onNext,
+      onError,
+      onCompleted
+    }
+    return this;
+  }
+  fromFile(filePath: string, options?: string | CreateReadStreamOption | undefined): Converter {
+    const fs = require("fs");
+    // var rs = null;
+    // this.wrapCallback(cb, function () {
+    //   if (rs && rs.destroy) {
+    //     rs.destroy();
+    //   }
+    // });
+    fs.exists(filePath, (exist) => {
+      if (exist) {
+        const rs = fs.createReadStream(filePath, options);
+        rs.pipe(this);
+      } else {
+        this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct."));
+      }
+    });
+    return this;
+  }
+  fromStream(readStream: Readable): Converter {
+    readStream.pipe(this);
+    return this;
+  }
+  fromString(csvString: string): Converter {
+    const csv = csvString.toString();
+    const read = new Readable();
+    let idx = 0;
+    read._read = function (size) {
+      if (idx >= csvString.length) {
+        this.push(null);
+      } else {
+        const str = csvString.substr(idx, size);
+        this.push(str);
+        idx += size;
+      }
+    }
+    return this.fromStream(read);
+  }
+  then<TResult1 = any[], TResult2 = never>(onfulfilled?: (value: any[]) => TResult1 | PromiseLike<TResult1>, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>): PromiseLike<TResult1 | TResult2> {
+    return new P((resolve, reject) => {
+      this.parseRuntime.then = {
+        onfulfilled: (value: any[]) => {
+          if (onfulfilled) {
+            resolve(onfulfilled(value));
+          } else {
+            resolve(value as any);
+          }
+        },
+        onrejected: (err: Error) => {
+          if (onrejected) {
+            resolve(onrejected(err));
+          } else {
+            reject(err);
+          }
+        }
+      }
+    });
+  }
+  public get parseParam(): CSVParseParam {
+    return this.params;
+  }
+  public get parseRuntime(): ParseRuntime {
+    return this.runtime;
+  }
+  private params: CSVParseParam;
+  private runtime: ParseRuntime;
+  private processor: Processor;
+  private result: Result;
+  constructor(param?: Partial<CSVParseParam>, public options: TransformOptions = {}) {
+    super(options);
+    this.params = mergeParams(param);
+    this.runtime = initParseRuntime(this);
+    this.result = new Result(this);
+    if (this.params.fork) {
+      this.processor = new ProcessorFork(this);
+    } else {
+      this.processor = new ProcessorLocal(this);
+    }
+    this.once("error", (err: any) => {
+      // console.log("BBB");
+      
+      setTimeout(() => {
+        this.result.processError(err);
+        this.emit("done", err);
+      },0);
+ 
+    });
+    this.once("done",()=>{
+      this.processor.destroy();
+    })
+ 
+    return this;
+  }
+  _transform(chunk: any, encoding: string, cb: Function) {
+    this.processor.process(chunk)
+      .then((result) => {
+        if (result.length > 0) {
+          this.runtime.started = true;
+          return this.result.processResult(result);
+        }
+      })
+      .then(() => {
+        this.emit("drained");
+        cb();
+      }, (error) => {
+        this.runtime.hasError = true;
+        this.runtime.error = error;
+        this.emit("error", error);
+        cb();
+      });
+  }
+  _flush(cb: Function) {
+    this.processor.flush()
+    .then((data)=>{
+      if (data.length>0){
+        return this.result.processResult(data);
+      }
+    })
+    .then(()=>{
+      this.processEnd(cb);
+    },(err)=>{
+      this.emit("error",err);
+      cb();
+    })
+  }
+  private processEnd(cb) {
+    this.result.endProcess();
+    this.emit("done");
+    cb();
+  }
+  get parsedLineNumber(): number {
+    return this.runtime.parsedLineNumber;
+  }
+}
+export interface CreateReadStreamOption {
+  flags?: string;
+  encoding?: string;
+  fd?: number;
+  mode?: number;
+  autoClose?: boolean;
+  start?: number;
+  end?: number;
+  highWaterMark?: number;
+}
+export type CallBack = (err: Error, data: Array<any>) => void;
+ 
+ 
+export type PreFileLineCallback = (line: string, lineNumber: number) => string | PromiseLike<string>;
+export type PreRawDataCallback = (csvString: string) => string | PromiseLike<string>;
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/Parameters.ts.html b/node_modules/csvtojson/coverage/Parameters.ts.html new file mode 100644 index 0000000..5d684e7 --- /dev/null +++ b/node_modules/csvtojson/coverage/Parameters.ts.html @@ -0,0 +1,420 @@ + + + + Code coverage report for Parameters.ts + + + + + + + +
+
+

+ All files Parameters.ts +

+
+
+ 100% + Statements + 10/10 +
+
+ 83.33% + Branches + 5/6 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 10/10 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +83x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +83x +30x +  +83x +62x +62x +6x +  +56x +  +  +  +83x +  +  + 
export interface CSVParseParam {
+  /**
+   *   delimiter used for seperating columns. Use "auto" if delimiter is unknown in advance, in this case, delimiter will be auto-detected (by best attempt). Use an array to give a list of potential delimiters e.g. [",","|","$"]. default: ","
+   */
+  delimiter: string | string[];
+  /**
+   *  This parameter instructs the parser to ignore columns as specified by an array of column indexes or header names. Example: [1,3,5,"title","age"] will ignore columns 1, 3, 5, title column and age column and will not return them in the JSON output
+   */
+  ignoreColumns?: RegExp;
+  /**
+   *  This parameter instructs the parser to include only those columns as specified by an array of column indexes or header names. Example: [0,2,3,"name"] will parse and include only columns 0, 2, 3, and column with header "name" in the JSON output.
+   */
+  includeColumns?: RegExp;
+  /**
+   *  If a column contains delimiter, it is able to use quote character to surround the column content. e.g. "hello, world" wont be split into two columns while parsing. Set to "off" will ignore all quotes. default: " (double quote)
+   */
+  quote: string;
+  /**
+   *  Indicate if parser trim off spaces surrounding column content. e.g. " content " will be trimmed to "content". Default: true
+   */
+  trim: boolean;
+  /**
+   *  This parameter turns on and off whether check field type. Default is false. 
+   */
+  checkType: boolean;
+  /**
+   *  Ignore the empty value in CSV columns. If a column value is not given, set this to true to skip them. Default: false.
+   */
+  ignoreEmpty: boolean;
+  /**
+   *  Delegate parsing work to another process.
+   */
+  fork: boolean;
+  /**
+   *  Indicating csv data has no header row and first row is data row. Default is false.
+   */
+  noheader: boolean;
+  /**
+   *  An array to specify the headers of CSV data. If --noheader is false, this value will override CSV header row. Default: null. Example: ["my field","name"].
+   */
+  headers?: string[];
+  /**
+   *  Don't interpret dots (.) and square brackets in header fields as nested object or array identifiers at all (treat them like regular characters for JSON field identifiers). Default: false.
+   */
+  flatKeys: boolean;
+  /**
+   *  the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0
+   */
+  maxRowLength: number;
+  /**
+   *  whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false
+   */
+  checkColumn: boolean;
+  /**
+   *  escape character used in quoted column. Default is double quote (") according to RFC4108. Change to back slash (\) or other chars for your own case.
+   */
+  escape: string;
+  /**
+   *   Allows override parsing logic for a specific column. It accepts a JSON object with fields like: headName: <String | Function> . e.g. {field1:'number'} will use built-in number parser to convert value of the field1 column to number. Another example {"name":nameProcessFunc} will use specified function to parse the value.
+   */
+  colParser: {
+    [key: string]: string | CellParser | ColumnParam
+  };
+  /**
+   *  End of line character. If omitted, parser will attempt to retrieve it from the first chunks of CSV data
+   */
+  eol?: string;
+  /**
+   *  Always interpret each line (as defined by eol) as a row. This will prevent eol characters from being used within a row (even inside a quoted field). This ensures that misplaced quotes only break on row, and not all ensuing rows.
+   */
+  alwaysSplitAtEOL: boolean;
+  output: "json" | "csv" | "line";
+}
+ 
+export type CellParser = (item: string, head: string, resultRow: any, row: string[], columnIndex: number) => any;
+ 
+export interface ColumnParam {
+  flat?: boolean;
+  cellParser?: string | CellParser;
+}
+ 
+export function mergeParams(params?: Partial<CSVParseParam>): CSVParseParam {
+  const defaultParam: CSVParseParam = {
+    delimiter: ',',
+    ignoreColumns: undefined,
+    includeColumns: undefined,
+    quote: '"',
+    trim: true,
+    checkType: false,
+    ignoreEmpty: false,
+    fork: false,
+    noheader: false,
+    headers: undefined,
+    flatKeys: false,
+    maxRowLength: 0,
+    checkColumn: false,
+    escape: '"',
+    colParser: {},
+    eol: undefined,
+    alwaysSplitAtEOL: false,
+    output: "json"
+  }
+  if (!params) {
+    params = {};
+  }
+  for (let key in params) {
+    Eif (params.hasOwnProperty(key)) {
+      if (Array.isArray(params[key])) {
+        defaultParam[key] = [].concat(params[key]);
+      } else {
+        defaultParam[key] = params[key];
+      }
+    }
+  }
+  return defaultParam;
+}
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/ParseRuntime.ts.html b/node_modules/csvtojson/coverage/ParseRuntime.ts.html new file mode 100644 index 0000000..b6fe267 --- /dev/null +++ b/node_modules/csvtojson/coverage/ParseRuntime.ts.html @@ -0,0 +1,336 @@ + + + + Code coverage report for ParseRuntime.ts + + + + + + + +
+
+

+ All files ParseRuntime.ts +

+
+
+ 100% + Statements + 8/8 +
+
+ 100% + Branches + 4/4 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 8/8 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +83x +83x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +83x +2x +  +83x +4x +  +83x + 
import { CSVParseParam, CellParser } from "./Parameters";
+import { Converter, PreRawDataCallback, PreFileLineCallback } from "./Converter";
+import { ChildProcess } from "child_process";
+import CSVError from "./CSVError";
+ 
+export interface ParseRuntime {
+  /**
+   * If need convert ignoreColumn from column name(string) to column index (number). Parser needs column index.
+   */
+  needProcessIgnoreColumn: boolean;
+  /**
+   * If need convert includeColumn from column name(string) to column index (number). Parser needs column index.
+   */
+  needProcessIncludeColumn: boolean;
+  /**
+   * the indexes of columns to reserve, undefined means reserve all, [] means hide all
+   */
+  selectedColumns?: number[];
+  ended: boolean;
+  hasError: boolean;
+  error?: Error;
+  /**
+   * Inferred delimiter
+   */
+  delimiter: string | string[];
+  /**
+   * Inferred eol
+   */
+  eol?: string;
+  /**
+   * Converter function for a column. Populated at runtime.
+   */
+  columnConv: (CellParser | null)[],
+  headerType: any[],
+  headerTitle: string[],
+  headerFlag: any[],
+  /**
+   * Inferred headers
+   */
+  headers?: any[],
+  csvLineBuffer?: Buffer,
+  
+  /**
+   * after first chunk of data being processed and emitted, started will become true.
+   */
+  started: boolean,
+  preRawDataHook?: PreRawDataCallback,
+  preFileLineHook?: PreFileLineCallback,
+  parsedLineNumber: number,
+ 
+  columnValueSetter: Function[];
+  subscribe?: {
+    onNext?: (data: any, lineNumber:number) => void | PromiseLike<void>;
+    onError?: (err: CSVError) => void;
+    onCompleted?: () => void;
+  };
+  then?: {
+    onfulfilled: (value: any[]) => any;
+    onrejected: (err: Error) => any;
+  }
+ 
+}
+export function initParseRuntime(converter: Converter): ParseRuntime {
+  const params = converter.parseParam;
+  const rtn: ParseRuntime = {
+    needProcessIgnoreColumn: false,
+    needProcessIncludeColumn: false,
+    selectedColumns: undefined,
+    ended: false,
+    hasError: false,
+    error: undefined,
+    delimiter: converter.parseParam.delimiter,
+    eol: converter.parseParam.eol,
+    columnConv: [],
+    headerType: [],
+    headerTitle: [],
+    headerFlag: [],
+    headers: undefined,
+    started: false,
+    parsedLineNumber: 0,
+    columnValueSetter: [],
+  }
+  if (params.ignoreColumns) {
+    rtn.needProcessIgnoreColumn = true;
+  }
+  if (params.includeColumns) {
+    rtn.needProcessIncludeColumn = true;
+  }
+  return rtn;
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/ProcessFork.ts.html b/node_modules/csvtojson/coverage/ProcessFork.ts.html new file mode 100644 index 0000000..e0bd0b3 --- /dev/null +++ b/node_modules/csvtojson/coverage/ProcessFork.ts.html @@ -0,0 +1,489 @@ + + + + Code coverage report for ProcessFork.ts + + + + + + + +
+
+

+ All files ProcessFork.ts +

+
+
+ 100% + Statements + 78/78 +
+
+ 86.67% + Branches + 26/30 +
+
+ 100% + Functions + 15/15 +
+
+ 100% + Lines + 73/73 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +1411x +1x +  +  +1x +  +  +  +1x +  +1x +37x +37x +  +37x +37x +37x +  +  +1x +37x +37x +  +  +37x +37x +37x +37x +  +37x +37x +37x +  +  +37x +  +1x +37x +37x +1x +  +  +  +  +37x +3x +  +  +  +  +37x +  +37x +37x +  +  +  +37x +145x +37x +108x +36x +2x +  +72x +36x +4x +  +36x +  +36x +  +  +  +37x +  +2886x +2886x +  +  +37x +  +1x +  +  +  +1x +  +121x +121x +  +121x +  +1x +2886x +2886x +2886x +2886x +2886x +3x +  +2883x +  +  +2886x +13554x +13554x +2883x +  +10671x +10671x +  +10671x +10671x +  +  +  +85x +85x +  +85x +  +85x +  +85x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x
import { Processor, ProcessLineResult } from "./Processor";
+import P from "bluebird"
+import { Converter } from "./Converter";
+import { ChildProcess } from "child_process";
+import { CSVParseParam, mergeParams } from "./Parameters";
+import { ParseRuntime } from "./ParseRuntime";
+import { Readable, Writable } from "stream";
+import { bufFromString, emptyBuffer } from "./util";
+import CSVError from "./CSVError";
+ 
+export class ProcessorFork extends Processor {
+  flush(): P<ProcessLineResult[]> {
+    return new P((resolve, reject) => {
+      // console.log("flush");
+      this.finalChunk = true;
+      this.next = resolve;
+      this.childProcess.stdin.end();
+    });
+  }
+  destroy(): P<void> {
+    this.childProcess.kill();
+    return P.resolve();
+  }
+  childProcess: ChildProcess;
+  inited: boolean = false;
+  private resultBuf: ProcessLineResult[] = [];
+  private leftChunk: string = "";
+  private finalChunk: boolean = false;
+  private next?: (result: ProcessLineResult[]) => any;
+  constructor(protected converter: Converter) {
+    super(converter);
+    this.childProcess = require("child_process").spawn(process.execPath, [__dirname + "/../v2/worker.js"], {
+      stdio: ["pipe", "pipe", "pipe", "ipc"]
+    });
+    this.initWorker();
+  }
+  private prepareParam(param:CSVParseParam):any{
+    const clone:any=mergeParams(param);
+    if (clone.ignoreColumns){
+      clone.ignoreColumns={
+        source:clone.ignoreColumns.source,
+        flags:clone.ignoreColumns.flags
+      }
+    }
+    if (clone.includeColumns){
+      clone.includeColumns={
+        source:clone.includeColumns.source,
+        flags:clone.includeColumns.flags
+      }
+    }
+    return clone;
+  }
+  private initWorker() {
+    this.childProcess.send({
+      cmd: "init",
+      params: this.prepareParam(this.converter.parseParam)
+    } as InitMessage);
+    this.childProcess.on("message", (msg: Message) => {
+      if (msg.cmd === "inited") {
+        this.inited = true;
+      } else if (msg.cmd === "eol") {
+        if (this.converter.listeners("eol").length > 0){
+          this.converter.emit("eol",(msg as StringMessage).value);
+        }
+      }else if (msg.cmd === "header") {
+        if (this.converter.listeners("header").length > 0){
+          this.converter.emit("header",(msg as StringMessage).value);
+        }
+      }else Eif (msg.cmd === "done"){
+ 
+        this.flushResult();
+      }
+ 
+    });
+    this.childProcess.stdout.on("data", (data) => {
+      // console.log("stdout", data.toString());
+      const res = data.toString();
+      this.appendBuf(res);
+ 
+    });
+    this.childProcess.stderr.on("data", (data) => {
+      // console.log("stderr", data.toString());
+      this.converter.emit("error", CSVError.fromJSON(JSON.parse(data.toString())));
+    });
+ 
+  }
+  private flushResult() {
+    // console.log("flush result", this.resultBuf.length);
+    Eif (this.next) {
+      this.next(this.resultBuf);
+    }
+    this.resultBuf = [];
+  }
+  private appendBuf(data: string) {
+    const res = this.leftChunk + data;
+    const list = res.split("\n");
+    let counter = 0;
+    const lastBit = list[list.length - 1];
+    if (lastBit !== "") {
+      this.leftChunk = list.pop() || "";
+    } else {
+      this.leftChunk = "";
+    }
+ 
+    while (list.length) {
+      let item = list.shift() || "";
+      if (item.length === 0 ) {
+        continue;
+      }
+      Eif (this.params.output !== "line") {
+        item = JSON.parse(item);
+      }
+      this.resultBuf.push(item);
+      counter++;
+    }
+  }
+ 
+  process(chunk: Buffer): P<ProcessLineResult[]> {
+    return new P((resolve, reject) => {
+      // console.log("chunk", chunk.length);
+      this.next = resolve;
+      // this.appendReadBuf(chunk);
+      this.childProcess.stdin.write(chunk, () => {
+        // console.log("chunk callback");
+        this.flushResult();
+      });
+    });
+  }
+}
+ 
+export interface Message {
+  cmd: string
+}
+ 
+export interface InitMessage extends Message {
+  params: any;
+}
+export interface StringMessage extends Message {
+  value: string
+}
+export const EOM = "\x03";
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/Processor.ts.html b/node_modules/csvtojson/coverage/Processor.ts.html new file mode 100644 index 0000000..7659fbe --- /dev/null +++ b/node_modules/csvtojson/coverage/Processor.ts.html @@ -0,0 +1,123 @@ + + + + Code coverage report for Processor.ts + + + + + + + +
+
+

+ All files Processor.ts +

+
+
+ 100% + Statements + 6/6 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +  +  +  +  +1x +  +  +123x +123x +123x +  +  +  +  +1x +  + 
import { Converter } from "./Converter";
+import P from "bluebird";
+import { JSONResult } from "./lineToJson";
+import { CSVParseParam } from "./Parameters";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+export abstract class Processor {
+  protected params: CSVParseParam;
+  protected runtime: ParseRuntime;
+  constructor(protected converter: Converter) {
+    this.params = converter.parseParam;
+    this.runtime = converter.parseRuntime;
+  }
+  abstract process(chunk: Buffer,finalChunk?:boolean): P<ProcessLineResult[]>
+  abstract destroy():P<void>;
+  abstract flush(): P<ProcessLineResult[]>;
+}
+export type ProcessLineResult = string | string[] | JSONResult;
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/ProcessorLocal.test.ts.html b/node_modules/csvtojson/coverage/ProcessorLocal.test.ts.html new file mode 100644 index 0000000..64ed5de --- /dev/null +++ b/node_modules/csvtojson/coverage/ProcessorLocal.test.ts.html @@ -0,0 +1,189 @@ + + + + Code coverage report for ProcessorLocal.test.ts + + + + + + + +
+
+

+ All files ProcessorLocal.test.ts +

+
+
+ 100% + Statements + 31/31 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 6/6 +
+
+ 100% + Lines + 29/29 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +411x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +  +1x +  +1x +1x +1x +1x +  +1x +1x +1x +  +1x +  +  +  +  + 
import {ProcessorLocal} from "./ProcessorLocal";
+import { Converter } from "./Converter";
+import P from "bluebird";
+import {readFileSync} from "fs";
+import path from "path";
+import assert from "assert";
+import { JSONResult } from "./lineToJson";
+const dataDir=path.join(__dirname,"../test/data/");
+describe("ProcessLocal",()=>{
+  it ("should process csv chunks and output json",async function (){
+    const processor=new ProcessorLocal(new Converter());
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    const lines=await processor.process(data);
+    assert(lines.length === 2);
+    const line0=lines[0] as JSONResult;
+    assert.equal(line0.fieldA.title,"Food Factory");
+    assert.equal(line0.fieldA.children.length,2);
+    assert.equal(line0.fieldA.children[1].employee[0].name,"Tim");
+  })
+  it ("should process csv chunks and output csv rows",async function (){
+    const processor=new ProcessorLocal(new Converter({output:"line"}));
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    const lines=await processor.process(data);
+    
+    assert(lines.length === 2);
+  })
+  it ("should return empty array if preRawHook removed the data",()=>{
+    const conv=new Converter();
+    conv.preRawData((str)=>{
+      return "";
+    });
+    const processor=new ProcessorLocal(conv);
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    return processor.process(data)
+    .then((list)=>{
+      assert.equal(list.length,0);
+    })
+  })
+})
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/ProcessorLocal.ts.html b/node_modules/csvtojson/coverage/ProcessorLocal.ts.html new file mode 100644 index 0000000..9ca3768 --- /dev/null +++ b/node_modules/csvtojson/coverage/ProcessorLocal.ts.html @@ -0,0 +1,870 @@ + + + + Code coverage report for ProcessorLocal.ts + + + + + + + +
+
+

+ All files ProcessorLocal.ts +

+
+
+ 98.09% + Statements + 154/157 +
+
+ 93.75% + Branches + 90/96 +
+
+ 100% + Functions + 20/20 +
+
+ 97.99% + Lines + 146/149 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +2681x +1x +1x +1x +1x +1x +1x +1x +  +1x +  +86x +73x +73x +36x +36x +36x +  +36x +5x +  +31x +  +  +  +37x +  +  +1x +76x +  +86x +86x +86x +1x +170x +76x +  +170x +  +86x +86x +1x +75x +75x +  +75x +  +  +306x +  +171x +36x +  +135x +  +  +171x +  +171x +5x +  +166x +  +  +  +171x +170x +  +1x +  +  +  +170x +170x +170x +170x +113x +  +170x +2x +2x +  +  +170x +1x +  +170x +170x +134x +  +36x +36x +  +170x +122x +122x +3x +  +119x +  +122x +122x +  +  +76x +  +46x +  +  +  +  +  +  +48x +  +  +  +1x +76x +8x +4x +  +4x +  +  +68x +68x +68x +68x +68x +68x +67x +67x +67x +  +1x +  +  +68x +  +68x +1x +  +67x +2x +  +65x +  +  +75x +5x +  +75x +4x +4x +  +75x +  +1x +5x +5x +5x +5x +25x +8x +3x +1x +  +2x +  +  +5x +  +17x +17x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +1x +121x +1x +  +120x +120x +120x +2x +  +118x +  +  +  +  +  +  +  +  +  +1x +322x +322x +154x +  +168x +  +  +  +  +3x +3x +3x +3x +  +  +3x +  +  +  +  +1x +  +  +  +  +5x +2x +  +3x +3x +3x +3x +3x +2x +2x +2x +  +  +1x +1x +1x +1x +  +1x +  +  +  +  +  + 
import { Processor, ProcessLineResult } from "./Processor";
+import P from "bluebird";
+import { prepareData } from "./dataClean";
+import getEol from "./getEol";
+import { stringToLines } from "./fileline";
+import { bufFromString, filterArray } from "./util";
+import { RowSplit } from "./rowSplit";
+import lineToJson from "./lineToJson";
+import { ParseRuntime } from "./ParseRuntime";
+import CSVError from "./CSVError";
+ 
+export class ProcessorLocal extends Processor {
+  flush(): P<ProcessLineResult[]> {
+    if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
+      const buf = this.runtime.csvLineBuffer;
+      this.runtime.csvLineBuffer = undefined;
+      return this.process(buf, true)
+        .then((res) => {
+          if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
+            return P.reject(CSVError.unclosed_quote(this.runtime.parsedLineNumber, this.runtime.csvLineBuffer.toString()))
+          } else {
+            return P.resolve(res);
+          }
+        })
+    } else {
+      return P.resolve([]);
+    }
+  }
+  destroy(): P<void> {
+    return P.resolve();
+  }
+  private rowSplit: RowSplit = new RowSplit(this.converter);
+  private eolEmitted = false;
+  private _needEmitEol?: boolean = undefined;
+  private get needEmitEol() {
+    if (this._needEmitEol === undefined) {
+      this._needEmitEol = this.converter.listeners("eol").length > 0;
+    }
+    return this._needEmitEol;
+  }
+  private headEmitted = false;
+  private _needEmitHead?: boolean = undefined;
+  private get needEmitHead() {
+    Eif (this._needEmitHead === undefined) {
+      this._needEmitHead = this.converter.listeners("header").length > 0;
+    }
+    return this._needEmitHead;
+ 
+  }
+  process(chunk: Buffer, finalChunk = false): P<ProcessLineResult[]> {
+    let csvString: string;
+    if (finalChunk) {
+      csvString = chunk.toString();
+    } else {
+      csvString = prepareData(chunk, this.converter.parseRuntime);
+ 
+    }
+    return P.resolve()
+      .then(() => {
+        if (this.runtime.preRawDataHook) {
+          return this.runtime.preRawDataHook(csvString);
+        } else {
+          return csvString;
+        }
+      })
+      .then((csv) => {
+        if (csv && csv.length > 0) {
+          return this.processCSV(csv, finalChunk);
+        } else {
+          return P.resolve([]);
+        }
+      })
+  }
+  private processCSV(csv: string, finalChunk: boolean): P<ProcessLineResult[]> {
+    const params = this.params;
+    const runtime = this.runtime;
+    if (!runtime.eol) {
+      getEol(csv, runtime);
+    }
+    if (this.needEmitEol && !this.eolEmitted && runtime.eol) {
+      this.converter.emit("eol", runtime.eol);
+      this.eolEmitted = true;
+    }
+    // trim csv file has initial blank lines.
+    if (params.ignoreEmpty && !runtime.started) {
+      csv = csv.trimLeft();
+    }
+    const stringToLineResult = stringToLines(csv, runtime);
+    if (!finalChunk) {
+      this.prependLeftBuf(bufFromString(stringToLineResult.partial));
+    } else {
+      stringToLineResult.lines.push(stringToLineResult.partial);
+      stringToLineResult.partial = "";
+    }
+    if (stringToLineResult.lines.length > 0) {
+      let prom: P<string[]>;
+      if (runtime.preFileLineHook) {
+        prom = this.runPreLineHook(stringToLineResult.lines);
+      } else {
+        prom = P.resolve(stringToLineResult.lines);
+      }
+      return prom.then((lines) => {
+        if (!runtime.started
+          && !this.runtime.headers
+        ) {
+          return this.processDataWithHead(lines);
+        } else {
+          return this.processCSVBody(lines);
+        }
+ 
+      })
+ 
+    } else {
+ 
+      return P.resolve([]);
+    }
+ 
+  }
+  private processDataWithHead(lines: string[]): ProcessLineResult[] {
+    if (this.params.noheader) {
+      if (this.params.headers) {
+        this.runtime.headers = this.params.headers;
+      } else {
+        this.runtime.headers = [];
+      }
+    } else {
+      let left = "";
+      let headerRow: string[] = [];
+      while (lines.length) {
+        const line = left + lines.shift();
+        const row = this.rowSplit.parse(line);
+        if (row.closed) {
+          headerRow = row.cells;
+          left = "";
+          break;
+        } else {
+          left = line + getEol(line, this.runtime);
+        }
+      }
+      this.prependLeftBuf(bufFromString(left));
+ 
+      if (headerRow.length === 0) {
+        return [];
+      }
+      if (this.params.headers) {
+        this.runtime.headers = this.params.headers;
+      } else {
+        this.runtime.headers = headerRow;
+      }
+    }
+    if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) {
+      this.filterHeader();
+    }
+    if (this.needEmitHead && !this.headEmitted) {
+      this.converter.emit("header", this.runtime.headers);
+      this.headEmitted = true;
+    }
+    return this.processCSVBody(lines);
+  }
+  private filterHeader() {
+    this.runtime.selectedColumns = [];
+    Eif (this.runtime.headers) {
+      const headers = this.runtime.headers;
+      for (let i = 0; i < headers.length; i++) {
+        if (this.params.ignoreColumns) {
+          if (this.params.ignoreColumns.test(headers[i])) {
+            if (this.params.includeColumns && this.params.includeColumns.test(headers[i])) {
+              this.runtime.selectedColumns.push(i);
+            } else {
+              continue;
+            }
+          } else {
+            this.runtime.selectedColumns.push(i);
+          }
+        } else Eif (this.params.includeColumns) {
+          if (this.params.includeColumns.test(headers[i])) {
+            this.runtime.selectedColumns.push(i);
+          }
+        } else {
+          this.runtime.selectedColumns.push(i);
+        }
+        // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){
+        //   this.runtime.selectedColumns.push(i);
+        // }else{
+        //   if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){
+        //     continue;
+        //   }else{
+        //     if (this.params.ignoreColumns && !this.params.includeColumns){
+        //       this.runtime.selectedColumns.push(i);
+        //     }
+ 
+        //   }
+        // }
+      }
+      this.runtime.headers = filterArray(this.runtime.headers, this.runtime.selectedColumns);
+    }
+ 
+  }
+  private processCSVBody(lines: string[]): ProcessLineResult[] {
+    if (this.params.output === "line") {
+      return lines;
+    } else {
+      const result = this.rowSplit.parseMultiLines(lines);
+      this.prependLeftBuf(bufFromString(result.partial));
+      if (this.params.output === "csv") {
+        return result.rowsCells;
+      } else {
+        return lineToJson(result.rowsCells, this.converter);
+      }
+    }
+ 
+    // var jsonArr = linesToJson(lines.lines, params, this.recordNum);
+    // this.processResult(jsonArr);
+    // this.lastIndex += jsonArr.length;
+    // this.recordNum += jsonArr.length;
+  }
+ 
+  private prependLeftBuf(buf: Buffer) {
+    Eif (buf) {
+      if (this.runtime.csvLineBuffer) {
+        this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]);
+      } else {
+        this.runtime.csvLineBuffer = buf;
+      }
+    }
+ 
+  }
+  private runPreLineHook(lines: string[]): P<string[]> {
+    return new P((resolve, reject) => {
+      processLineHook(lines, this.runtime, 0, (err) => {
+        Iif (err) {
+          reject(err);
+        } else {
+          resolve(lines);
+        }
+      })
+    });
+  }
+}
+ 
+function processLineHook(lines: string[], runtime: ParseRuntime, offset: number,
+  cb: (err?) => void
+) {
+  if (offset >= lines.length) {
+    cb();
+  } else {
+    Eif (runtime.preFileLineHook) {
+      const line = lines[offset];
+      const res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset);
+      offset++;
+      if (res && (res as PromiseLike<string>).then) {
+        (res as PromiseLike<string>).then((value) => {
+          lines[offset - 1] = value;
+          processLineHook(lines, runtime, offset, cb);
+        });
+      } else {
+        lines[offset - 1] = res as string;
+        while (offset < lines.length) {
+          lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset) as string;
+          offset++;
+        }
+        cb();
+      }
+    } else {
+      cb();
+    }
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/Result.ts.html b/node_modules/csvtojson/coverage/Result.ts.html new file mode 100644 index 0000000..2b9b9dd --- /dev/null +++ b/node_modules/csvtojson/coverage/Result.ts.html @@ -0,0 +1,516 @@ + + + + Code coverage report for Result.ts + + + + + + + +
+
+

+ All files Result.ts +

+
+
+ 94.37% + Statements + 67/71 +
+
+ 88.68% + Branches + 47/53 +
+
+ 100% + Functions + 15/15 +
+
+ 94.2% + Lines + 65/69 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150  +  +1x +  +  +1x +1x +147x +  +  +1x +158x +106x +  +158x +  +1x +251x +  +120x +120x +147x +147x +  +147x +147x +54x +  +  +  +  +  +54x +  +  +54x +54x +  +  +  +  +93x +93x +  +  +  +1x +147x +114x +  +147x +  +1x +9x +  +  +9x +5x +  +  +1x +104x +79x +79x +  +  +104x +  +  +  +1x +  +  +  +  +  +  +  +  +  +58x +3x +  +55x +44x +44x +44x +44x +  +44x +4x +4x +  +  +  +40x +1x +  +40x +15896x +15896x +15896x +15896x +1x +  +  +40x +  +  +  +  +  +  +  +  +  +11x +11x +15874x +15874x +  +  +  +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +4x +  +  +15876x +10584x +  +5292x +  + 
import { Converter } from "./Converter";
+import { ProcessLineResult } from "./Processor";
+import P from "bluebird";
+import CSVError from "./CSVError";
+ 
+export class Result {
+  private get needEmitLine(): boolean {
+    return !!this.converter.parseRuntime.subscribe && !!this.converter.parseRuntime.subscribe.onNext || this.needPushDownstream
+  }
+  private _needPushDownstream?: boolean;
+  private get needPushDownstream(): boolean {
+    if (this._needPushDownstream === undefined) {
+      this._needPushDownstream = this.converter.listeners("data").length > 0 || this.converter.listeners("readable").length > 0;
+    }
+    return this._needPushDownstream;
+  }
+  private get needEmitAll(): boolean {
+    return !!this.converter.parseRuntime.then;
+  }
+  private finalResult: any[] = [];
+  constructor(private converter: Converter) { }
+  processResult(resultLines: ProcessLineResult[]): P<any> {
+    const startPos = this.converter.parseRuntime.parsedLineNumber;
+    // let prom: P<any>;
+    return new P((resolve, reject) => {
+      if (this.needEmitLine) {
+        processLineByLine(
+          resultLines,
+          this.converter,
+          0,
+          this.needPushDownstream,
+          (err) => {
+            Iif (err) {
+              reject(err);
+            } else {
+              this.appendFinalResult(resultLines);
+              resolve();
+            }
+          },
+        )
+      } else {
+        this.appendFinalResult(resultLines);
+        resolve();
+      }
+    })
+  }
+  appendFinalResult(lines: any[]) {
+    if (this.needEmitAll) {
+      this.finalResult = this.finalResult.concat(lines);
+    }
+    this.converter.parseRuntime.parsedLineNumber += lines.length;
+  }
+  processError(err: CSVError) {
+    Iif (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onError) {
+      this.converter.parseRuntime.subscribe.onError(err);
+    }
+    if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onrejected) {
+      this.converter.parseRuntime.then.onrejected(err);
+    }
+  }
+  endProcess() {
+    if (this.needEmitAll) {
+      Eif (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onfulfilled) {
+        this.converter.parseRuntime.then.onfulfilled(this.finalResult);
+      }
+    }
+    Iif (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onCompleted) {
+      this.converter.parseRuntime.subscribe.onCompleted();
+    }
+  }
+}
+ 
+function processLineByLine(
+  lines: ProcessLineResult[],
+ 
+  conv: Converter,
+  offset: number,
+  needPushDownstream: boolean,
+  cb: (err?) => void,
+) {
+  if (offset >= lines.length) {
+    cb();
+  } else {
+    if (conv.parseRuntime.subscribe && conv.parseRuntime.subscribe.onNext) {
+      const hook = conv.parseRuntime.subscribe.onNext;
+      const nextLine = lines[offset];
+      const res = hook(nextLine, conv.parseRuntime.parsedLineNumber + offset);
+      offset++;
+      // if (isAsync === undefined) {
+      if (res && res.then) {
+        res.then(function () {
+          processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine);
+        }, cb);
+      } else {
+        // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false);
+        if (needPushDownstream){
+          pushDownstream(conv,nextLine);
+        }
+        while (offset<lines.length){
+          const line=lines[offset];
+          hook(line, conv.parseRuntime.parsedLineNumber + offset);
+          offset++;
+          if (needPushDownstream){
+            pushDownstream(conv,line);
+          }
+        }
+        cb();
+      }
+      // } else if (isAsync === true) {
+      //   (res as PromiseLike<void>).then(function () {
+      //     processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, true);
+      //   }, cb);
+      // } else if (isAsync === false) {
+      //   processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false);
+      // }
+    } else {
+      Eif (needPushDownstream) {
+        while (offset<lines.length) {
+          const line = lines[offset++];
+          pushDownstream(conv, line);
+        }
+        
+      }
+      cb();
+    }
+ 
+  }
+}
+ 
+function processRecursive(
+  lines: ProcessLineResult[],
+  hook: (data: any, lineNumber: number) => void | PromiseLike<void>,
+  conv: Converter,
+  offset: number,
+  needPushDownstream: boolean,
+  cb: (err?) => void,
+  res: ProcessLineResult,
+) {
+  Iif (needPushDownstream) {
+    pushDownstream(conv, res);
+  }
+  processLineByLine(lines, conv, offset, needPushDownstream, cb);
+}
+function pushDownstream(conv: Converter, res: ProcessLineResult) {
+  if (typeof res === "object" && !conv.options.objectMode) {
+    conv.push(JSON.stringify(res) + "\n", "utf8");
+  } else {
+    conv.push(res);
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/Worker.ts.html b/node_modules/csvtojson/coverage/Worker.ts.html new file mode 100644 index 0000000..d151a6d --- /dev/null +++ b/node_modules/csvtojson/coverage/Worker.ts.html @@ -0,0 +1,87 @@ + + + + Code coverage report for Worker.ts + + + + + + + +
+
+

+ All files Worker.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
import { Converter } from "./Converter";
+ 
+export class Worker {
+  constructor(converter: Converter) {
+ 
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/base.css b/node_modules/csvtojson/coverage/base.css new file mode 100644 index 0000000..7090209 --- /dev/null +++ b/node_modules/csvtojson/coverage/base.css @@ -0,0 +1,223 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } + +.medium .chart { border:1px solid #666; } +.medium .cover-fill { background: #666; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } +.medium { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/node_modules/csvtojson/coverage/block-navigation.js b/node_modules/csvtojson/coverage/block-navigation.js new file mode 100644 index 0000000..0c71903 --- /dev/null +++ b/node_modules/csvtojson/coverage/block-navigation.js @@ -0,0 +1,63 @@ +var jumpToCode = (function init () { + // Classes of code we would like to highlight + var missingCoverageClasses = [ '.cbranch-no', '.cstat-no', '.fstat-no' ]; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = notSelector + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements.item(currentIndex).classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index) + .scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if (typeof currentIndex === 'number' && currentIndex < (missingCoverageElements.length - 1)) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +}()); +window.addEventListener('keydown', jumpToCode); diff --git a/node_modules/csvtojson/coverage/csv2json/Gruntfile.js.html b/node_modules/csvtojson/coverage/csv2json/Gruntfile.js.html new file mode 100644 index 0000000..68710d9 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/Gruntfile.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/Gruntfile.js + + + + + + + +
+
+

+ All files / csv2json Gruntfile.js +

+
+
+ 0% + Statements + 0/8 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/8 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/Gruntfile.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/Gruntfile.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/Gruntfile.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/Gruntfile.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/bin/benchmark.js.html b/node_modules/csvtojson/coverage/csv2json/bin/benchmark.js.html new file mode 100644 index 0000000..2e5b135 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/bin/benchmark.js.html @@ -0,0 +1,210 @@ + + + + Code coverage report for csv2json/bin/benchmark.js + + + + + + + +
+
+

+ All files / csv2json/bin benchmark.js +

+
+
+ 0% + Statements + 0/29 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/5 +
+
+ 0% + Lines + 0/29 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+var path = process.argv[2];
+var fs = require('fs');
+if (!fs.existsSync(path)) {
+  console.log("Run: benchmark [csvpath]");
+  console.log("File not found: ", path);
+  process.exit(1);
+}
+function testCSVLine(coreNum, checkType, cb){
+  console.log("WorkerNum:", coreNum, "Check Type: ", checkType);
+  var Converter = require("../libs/core/Converter");
+  var rs = fs.createReadStream(path);
+  var converter = new Converter({
+    workerNum: coreNum,
+    checkType: checkType,
+    constructResult: false
+    // fork:true
+  });
+  var totalLines = 0;
+  var secLines = 0;
+  converter.on("data", function() {
+    totalLines++;
+    secLines++;
+  });
+  converter.on("end", function() {
+    clearInterval(timer);
+    console.log("");
+    var t = new Date() - start;
+    console.log("Time elapsed: ", t, " ms");
+    console.log("Total lines: " + totalLines);
+    console.log("Average Speed: " + Math.round(totalLines / t * 1000) + " Lines / Sec");
+    cb();
+  });
+  var timer = setInterval(function() {
+    process.stdout.write("\r" + secLines + " CSV Lines/Sec");
+    secLines = 0;
+  }, 1000);
+  var start = new Date();
+ 
+  var stream = rs.pipe(converter);
+}
+ 
+// testCSVLine(1,false,false,function(){
+  testCSVLine(4,true,function(){
+ 
+  });
+// });
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/bin/csvtojson.js.html b/node_modules/csvtojson/coverage/csv2json/bin/csvtojson.js.html new file mode 100644 index 0000000..51400fc --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/bin/csvtojson.js.html @@ -0,0 +1,552 @@ + + + + Code coverage report for csv2json/bin/csvtojson.js + + + + + + + +
+
+

+ All files / csv2json/bin csvtojson.js +

+
+
+ 0% + Statements + 0/96 +
+
+ 0% + Branches + 0/56 +
+
+ 0% + Functions + 0/9 +
+
+ 0% + Lines + 0/96 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
function csvtojson() {
+  var Converter = require("../libs/core/Converter.js");
+  var fs = require("fs");
+  var options = require("./options.json");
+  var cmds = options.commands;
+  var opts = options.options;
+  var exps = options.examples;
+  var pkg = require("../package.json");
+  /**
+   *{
+    "cmd": "parse", command to run
+    "options": {}, options to passe to the command
+    "inputStream": process.stdin // input stream for the command. default is stdin. can be a file read stream.
+  };
+   *
+   */
+  var parsedCmd;
+ 
+  function _showHelp(errno) {
+    var key;
+    errno = typeof errno === "number" ? errno : 0;
+    console.log("csvtojson: Convert csv to JSON format");
+    console.log("version:", pkg.version);
+    console.log("Usage: csvtojson [<command>] [<options>] filepath\n");
+    console.log("Commands: ");
+    for (key in cmds) {
+      if (cmds.hasOwnProperty(key)) {
+        console.log("\t%s: %s", key, cmds[key]);
+      }
+    }
+    console.log("Options: ");
+    for (key in opts) {
+      if (opts.hasOwnProperty(key)) {
+        console.log("\t%s: %s", key, opts[key].desc);
+      }
+    }
+    console.log("Examples: ");
+    for (var i = 0; i < exps.length; i++) {
+      console.log("\t%s", exps[i]);
+    }
+    process.exit(errno);
+  }
+ 
+  function parse() {
+    var is = parsedCmd.inputStream;
+    parsedCmd.options.constructResult = false;
+    if (parsedCmd.options.toArrayString === undefined) {
+      parsedCmd.options.toArrayString = true;
+    }
+    if (parsedCmd.options.maxRowLength === undefined) {
+      parsedCmd.options.maxRowLength = 10240;
+    }
+    if (is === process.stdin && is.isTTY) {
+      console.log("Please specify csv file path or pipe the csv data through.\n");
+      _showHelp(1);
+    }
+    if (parsedCmd.options.delimiter === "\\t" ){
+      parsedCmd.options.delimiter="\t";
+    }
+    var conv = new Converter(parsedCmd.options);
+    conv.on("error", function (err, pos) {
+      if (!parsedCmd.options.quiet) {
+        console.error("csvtojson got an error: ", err);
+        if (pos) {
+          console.error("The error happens at following line: ");
+          console.log(pos);
+        }
+      }
+      process.exit(1);
+    });
+    is.pipe(conv).pipe(process.stdout);
+    // is.pipe(conv);
+  }
+ 
+  function run(cmd, options) {
+    if (cmd === "parse") {
+      parse();
+    } else if (cmd === "version") {
+      console.log(pkg.version);
+    } else {
+      console.log("unknown command %s.", cmd);
+      _showHelp(1);
+    }
+  }
+ 
+  function commandParser() {
+    var parsedCmd = {
+      "cmd": "parse",
+      "options": {},
+      "inputStream": process.stdin
+    };
+ 
+    function parseObject(val, optional) {
+      try {
+        return JSON.parse(val);
+      } catch (e) {
+        if (optional) {
+          return val;
+        } else {
+          console.error(e);
+          process.exit(1);
+        }
+      }
+    }
+ 
+    function parseBool(str, optName) {
+      str = str.toLowerCase();
+      if (str === "true" || str === "y") {
+        return true;
+      } else if (str === "false" || str === "n") {
+        return false;
+      }
+      console.log("Unknown boolean value %s for parameter %s.", str, optName);
+      _showHelp(1);
+    }
+    process.argv.slice(2).forEach(function (item) {
+      if (item.indexOf("--") > -1) {
+        var itemArr = item.split("=");
+        var optName = itemArr[0];
+        var key, val, type;
+        if (!opts[optName]) {
+          console.log("Option %s not supported.", optName);
+          _showHelp(1);
+        }
+        key = optName.replace('--', '');
+        val = itemArr[1] || '';
+        type = opts[optName].type;
+        if (type === "string") {
+          parsedCmd.options[key] = val.toString();
+        } else if (type === "boolean") {
+          parsedCmd.options[key] = parseBool(val, optName);
+        } else if (type === "number") {
+          parsedCmd.options[key] = parseFloat(val);
+        } else if (type === "object") {
+          parsedCmd.options[key] = parseObject(val, false);
+        } else if (type === "~object") {
+          parsedCmd.options[key] = parseObject(val, true);
+        } else {
+          throw ({
+            name: "UnimplementedException",
+            message: "Option type parsing not implemented. See bin/options.json"
+          });
+        }
+      } else if (cmds[item]) {
+        parsedCmd.cmd = item;
+      } else if (fs.existsSync(item)) {
+        parsedCmd.inputStream = fs.createReadStream(item);
+      } else {
+        console.log("unknown parameter %s.", item);
+      }
+    });
+    return parsedCmd;
+  }
+  process.stdin.setEncoding('utf8');
+  parsedCmd = commandParser();
+  run(parsedCmd.cmd, parsedCmd.options);
+}
+module.exports = csvtojson;
+if (!module.parent) {
+  csvtojson();
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/bin/genCsv.js.html b/node_modules/csvtojson/coverage/csv2json/bin/genCsv.js.html new file mode 100644 index 0000000..576ad49 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/bin/genCsv.js.html @@ -0,0 +1,165 @@ + + + + Code coverage report for csv2json/bin/genCsv.js + + + + + + + +
+
+

+ All files / csv2json/bin genCsv.js +

+
+
+ 0% + Statements + 0/23 +
+
+ 0% + Branches + 0/8 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/23 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+var minimist = require("minimist");
+var argv = process.argv;
+argv.shift();
+argv.shift();
+var args = minimist(argv);
+var headers = ["name", "header1", "file2", "description", "header2", "field2", "header3"];
+ 
+if (args.headers) {
+  headers = JSON.parse(args.headers);
+}
+var rowNum = args.row ? args.row : 10000;
+var chars = args.chars ? args.chars : "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+var maxLength = parseInt(args.max ? args.max : "15");
+console.log(headers.join(","));
+for (var i = 0; i < rowNum; i++) {
+  var row = [];
+  for (var j = 0; j < headers.length; j++) {
+    row.push(genWord());
+  }
+  console.log(row.join(","));
+}
+ 
+function genWord() {
+  var len = Math.round(Math.random() * maxLength);
+  var rtn = "";
+  for (var i = 0; i < len; i++) {
+    var pos = Math.round(Math.random() * chars.length);
+    rtn += chars[pos];
+  }
+  return rtn;
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/bin/index.html b/node_modules/csvtojson/coverage/csv2json/bin/index.html new file mode 100644 index 0000000..d74a8cf --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/bin/index.html @@ -0,0 +1,123 @@ + + + + Code coverage report for csv2json/bin + + + + + + + +
+
+

+ All files csv2json/bin +

+
+
+ 0% + Statements + 0/148 +
+
+ 0% + Branches + 0/66 +
+
+ 0% + Functions + 0/15 +
+
+ 0% + Lines + 0/148 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
benchmark.js
0%0/290%0/20%0/50%0/29
csvtojson.js
0%0/960%0/560%0/90%0/96
genCsv.js
0%0/230%0/80%0/10%0/23
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/browser_index.js.html b/node_modules/csvtojson/coverage/csv2json/browser_index.js.html new file mode 100644 index 0000000..5b49cc2 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/browser_index.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/browser_index.js + + + + + + + +
+
+

+ All files / csv2json browser_index.js +

+
+
+ 0% + Statements + 0/3 +
+
+ 0% + Branches + 0/2 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/browser_index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/browser_index.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/browser_index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/browser_index.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/dist/csvtojson.js.html b/node_modules/csvtojson/coverage/csv2json/dist/csvtojson.js.html new file mode 100644 index 0000000..e312748 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/dist/csvtojson.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/dist/csvtojson.js + + + + + + + +
+
+

+ All files / csv2json/dist csvtojson.js +

+
+
+ 0% + Statements + 0/8755 +
+
+ 0% + Branches + 0/6057 +
+
+ 0% + Functions + 0/1477 +
+
+ 0% + Lines + 0/8543 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/dist/csvtojson.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/dist/csvtojson.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/dist/csvtojson.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/dist/csvtojson.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/dist/csvtojson.min.js.html b/node_modules/csvtojson/coverage/csv2json/dist/csvtojson.min.js.html new file mode 100644 index 0000000..7db970e --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/dist/csvtojson.min.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/dist/csvtojson.min.js + + + + + + + +
+
+

+ All files / csv2json/dist csvtojson.min.js +

+
+
+ 0% + Statements + 0/5007 +
+
+ 0% + Branches + 0/5826 +
+
+ 0% + Functions + 0/1473 +
+
+ 0% + Lines + 0/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/dist/csvtojson.min.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/dist/csvtojson.min.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/dist/csvtojson.min.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/dist/csvtojson.min.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/dist/index.html b/node_modules/csvtojson/coverage/csv2json/dist/index.html new file mode 100644 index 0000000..152974c --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/dist/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for csv2json/dist + + + + + + + +
+
+

+ All files csv2json/dist +

+
+
+ 0% + Statements + 0/13762 +
+
+ 0% + Branches + 0/11883 +
+
+ 0% + Functions + 0/2950 +
+
+ 0% + Lines + 0/8549 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
csvtojson.js
0%0/87550%0/60570%0/14770%0/8543
csvtojson.min.js
0%0/50070%0/58260%0/14730%0/6
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/index.html b/node_modules/csvtojson/coverage/csv2json/index.html new file mode 100644 index 0000000..ae92411 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/index.html @@ -0,0 +1,123 @@ + + + + Code coverage report for csv2json + + + + + + + +
+
+

+ All files csv2json +

+
+
+ 0% + Statements + 0/12 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/12 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Gruntfile.js
0%0/8100%0/00%0/10%0/8
browser_index.js
0%0/30%0/2100%0/00%0/3
index.js
0%0/1100%0/0100%0/00%0/1
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/index.js.html b/node_modules/csvtojson/coverage/csv2json/index.js.html new file mode 100644 index 0000000..d2b4e59 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/index.js.html @@ -0,0 +1,69 @@ + + + + Code coverage report for csv2json/index.js + + + + + + + +
+
+

+ All files / csv2json index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 
module.exports=require("./build");
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/CSVError.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/CSVError.js.html new file mode 100644 index 0000000..a993e79 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/CSVError.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/CSVError.js + + + + + + + +
+
+

+ All files / csv2json/libs/core CSVError.js +

+
+
+ 0% + Statements + 0/17 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/5 +
+
+ 0% + Lines + 0/17 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/CSVError.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/CSVError.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/CSVError.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/CSVError.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/Converter.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/Converter.js.html new file mode 100644 index 0000000..cc528e5 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/Converter.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/Converter.js + + + + + + + +
+
+

+ All files / csv2json/libs/core Converter.js +

+
+
+ 0% + Statements + 0/375 +
+
+ 0% + Branches + 0/226 +
+
+ 0% + Functions + 0/43 +
+
+ 0% + Lines + 0/374 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/Converter.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/Converter.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/Converter.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/Converter.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/csvline.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/csvline.js.html new file mode 100644 index 0000000..bdc0bb7 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/csvline.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/csvline.js + + + + + + + +
+
+

+ All files / csv2json/libs/core csvline.js +

+
+
+ 0% + Statements + 0/13 +
+
+ 0% + Branches + 0/6 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/csvline.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/csvline.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/csvline.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/csvline.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/dataToCSVLine.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/dataToCSVLine.js.html new file mode 100644 index 0000000..1fa9005 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/dataToCSVLine.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/dataToCSVLine.js + + + + + + + +
+
+

+ All files / csv2json/libs/core dataToCSVLine.js +

+
+
+ 0% + Statements + 0/7 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/dataToCSVLine.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/dataToCSVLine.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/dataToCSVLine.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/dataToCSVLine.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defParam.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defParam.js.html new file mode 100644 index 0000000..ed250b9 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defParam.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defParam.js + + + + + + + +
+
+

+ All files / csv2json/libs/core defParam.js +

+
+
+ 0% + Statements + 0/23 +
+
+ 0% + Branches + 0/22 +
+
+ 0% + Functions + 0/3 +
+
+ 0% + Lines + 0/22 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defParam.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defParam.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defParam.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defParam.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/index.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/index.html new file mode 100644 index 0000000..65c8353 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/index.html @@ -0,0 +1,162 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers + + + + + + + +
+
+

+ All files csv2json/libs/core/defaultParsers +

+
+
+ 0% + Statements + 0/63 +
+
+ 0% + Branches + 0/40 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/63 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/1100%0/0100%0/00%0/1
parser_array.js
0%0/50%0/20%0/10%0/5
parser_flat.js
0%0/4100%0/00%0/10%0/4
parser_json.js
0%0/390%0/340%0/20%0/39
parser_jsonarray.js
0%0/130%0/40%0/10%0/13
parser_omit.js
0%0/1100%0/00%0/10%0/1
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/index.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/index.js.html new file mode 100644 index 0000000..74602c4 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/index.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/index.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/index.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_array.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_array.js.html new file mode 100644 index 0000000..5f6c3a4 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_array.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_array.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_array.js +

+
+
+ 0% + Statements + 0/5 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_array.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_array.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_array.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_array.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_flat.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_flat.js.html new file mode 100644 index 0000000..0397ee3 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_flat.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_flat.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_flat.js +

+
+
+ 0% + Statements + 0/4 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_flat.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_flat.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_flat.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_flat.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_json.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_json.js.html new file mode 100644 index 0000000..c50b266 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_json.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_json.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_json.js +

+
+
+ 0% + Statements + 0/39 +
+
+ 0% + Branches + 0/34 +
+
+ 0% + Functions + 0/2 +
+
+ 0% + Lines + 0/39 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_json.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_json.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_json.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_json.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_jsonarray.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_jsonarray.js.html new file mode 100644 index 0000000..63ddec2 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_jsonarray.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_jsonarray.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_jsonarray.js +

+
+
+ 0% + Statements + 0/13 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_jsonarray.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_jsonarray.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_jsonarray.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_jsonarray.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_omit.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_omit.js.html new file mode 100644 index 0000000..cf3c0d1 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/defaultParsers/parser_omit.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_omit.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_omit.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_omit.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_omit.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_omit.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_omit.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/fileLineToCSVLine.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/fileLineToCSVLine.js.html new file mode 100644 index 0000000..93544a6 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/fileLineToCSVLine.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/fileLineToCSVLine.js + + + + + + + +
+
+

+ All files / csv2json/libs/core fileLineToCSVLine.js +

+
+
+ 0% + Statements + 0/5 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/fileLineToCSVLine.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/fileLineToCSVLine.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/fileLineToCSVLine.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/fileLineToCSVLine.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/fileline.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/fileline.js.html new file mode 100644 index 0000000..991417d --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/fileline.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/fileline.js + + + + + + + +
+
+

+ All files / csv2json/libs/core fileline.js +

+
+
+ 0% + Statements + 0/6 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/fileline.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/fileline.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/fileline.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/fileline.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/filterRow.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/filterRow.js.html new file mode 100644 index 0000000..ee0732e --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/filterRow.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/filterRow.js + + + + + + + +
+
+

+ All files / csv2json/libs/core filterRow.js +

+
+
+ 0% + Statements + 0/12 +
+
+ 0% + Branches + 0/12 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/12 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/filterRow.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/filterRow.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/filterRow.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/filterRow.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/getDelimiter.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/getDelimiter.js.html new file mode 100644 index 0000000..2952297 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/getDelimiter.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/getDelimiter.js + + + + + + + +
+
+

+ All files / csv2json/libs/core getDelimiter.js +

+
+
+ 0% + Statements + 0/15 +
+
+ 0% + Branches + 0/6 +
+
+ 0% + Functions + 0/2 +
+
+ 0% + Lines + 0/15 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/getDelimiter.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/getDelimiter.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/getDelimiter.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/getDelimiter.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/getEol.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/getEol.js.html new file mode 100644 index 0000000..f70412e --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/getEol.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/getEol.js + + + + + + + +
+
+

+ All files / csv2json/libs/core getEol.js +

+
+
+ 0% + Statements + 0/14 +
+
+ 0% + Branches + 0/12 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/14 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/getEol.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/getEol.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/getEol.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/getEol.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/index.html b/node_modules/csvtojson/coverage/csv2json/libs/core/index.html new file mode 100644 index 0000000..63f56b6 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/index.html @@ -0,0 +1,305 @@ + + + + Code coverage report for csv2json/libs/core + + + + + + + +
+
+

+ All files csv2json/libs/core +

+
+
+ 0% + Statements + 0/911 +
+
+ 0% + Branches + 0/503 +
+
+ 0% + Functions + 0/125 +
+
+ 0% + Lines + 0/909 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CSVError.js
0%0/170%0/20%0/50%0/17
Converter.js
0%0/3750%0/2260%0/430%0/374
csvline.js
0%0/130%0/60%0/10%0/13
dataToCSVLine.js
0%0/7100%0/00%0/10%0/7
defParam.js
0%0/230%0/220%0/30%0/22
fileLineToCSVLine.js
0%0/5100%0/00%0/10%0/5
fileline.js
0%0/6100%0/00%0/10%0/6
filterRow.js
0%0/120%0/120%0/10%0/12
getDelimiter.js
0%0/150%0/60%0/20%0/15
getEol.js
0%0/140%0/120%0/10%0/14
index.js
0%0/3100%0/00%0/10%0/3
linesToJson.js
0%0/1210%0/880%0/160%0/121
parser.js
0%0/720%0/490%0/100%0/72
parserMgr.js
0%0/340%0/140%0/100%0/34
rowSplit.js
0%0/700%0/350%0/50%0/70
worker.js
0%0/450%0/130%0/60%0/45
workerMgr.js
0%0/790%0/180%0/180%0/79
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/index.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/index.js.html new file mode 100644 index 0000000..32cfa42 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/index.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/core index.js +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/index.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/index.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/linesToJson.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/linesToJson.js.html new file mode 100644 index 0000000..a5cefec --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/linesToJson.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/linesToJson.js + + + + + + + +
+
+

+ All files / csv2json/libs/core linesToJson.js +

+
+
+ 0% + Statements + 0/121 +
+
+ 0% + Branches + 0/88 +
+
+ 0% + Functions + 0/16 +
+
+ 0% + Lines + 0/121 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/linesToJson.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/linesToJson.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/linesToJson.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/linesToJson.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/parser.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/parser.js.html new file mode 100644 index 0000000..761dba4 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/parser.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/parser.js + + + + + + + +
+
+

+ All files / csv2json/libs/core parser.js +

+
+
+ 0% + Statements + 0/72 +
+
+ 0% + Branches + 0/49 +
+
+ 0% + Functions + 0/10 +
+
+ 0% + Lines + 0/72 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/parser.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/parser.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/parser.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/parser.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/parserMgr.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/parserMgr.js.html new file mode 100644 index 0000000..05dd268 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/parserMgr.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/parserMgr.js + + + + + + + +
+
+

+ All files / csv2json/libs/core parserMgr.js +

+
+
+ 0% + Statements + 0/34 +
+
+ 0% + Branches + 0/14 +
+
+ 0% + Functions + 0/10 +
+
+ 0% + Lines + 0/34 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/parserMgr.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/parserMgr.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/parserMgr.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/parserMgr.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/rowSplit.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/rowSplit.js.html new file mode 100644 index 0000000..732d36b --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/rowSplit.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/rowSplit.js + + + + + + + +
+
+

+ All files / csv2json/libs/core rowSplit.js +

+
+
+ 0% + Statements + 0/70 +
+
+ 0% + Branches + 0/35 +
+
+ 0% + Functions + 0/5 +
+
+ 0% + Lines + 0/70 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/rowSplit.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/rowSplit.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/rowSplit.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/rowSplit.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/worker.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/worker.js.html new file mode 100644 index 0000000..cd7920e --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/worker.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/worker.js + + + + + + + +
+
+

+ All files / csv2json/libs/core worker.js +

+
+
+ 0% + Statements + 0/45 +
+
+ 0% + Branches + 0/13 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/45 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/worker.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/worker.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/worker.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/worker.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/core/workerMgr.js.html b/node_modules/csvtojson/coverage/csv2json/libs/core/workerMgr.js.html new file mode 100644 index 0000000..f244c0c --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/core/workerMgr.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/core/workerMgr.js + + + + + + + +
+
+

+ All files / csv2json/libs/core workerMgr.js +

+
+
+ 0% + Statements + 0/79 +
+
+ 0% + Branches + 0/18 +
+
+ 0% + Functions + 0/18 +
+
+ 0% + Lines + 0/79 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/workerMgr.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/workerMgr.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/core/workerMgr.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/core/workerMgr.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/csv2json.js.html b/node_modules/csvtojson/coverage/csv2json/libs/csv2json.js.html new file mode 100644 index 0000000..2767bed --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/csv2json.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/csv2json.js + + + + + + + +
+
+

+ All files / csv2json/libs csv2json.js +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/csv2json.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/csv2json.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/csv2json.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/csv2json.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/index.html b/node_modules/csvtojson/coverage/csv2json/libs/index.html new file mode 100644 index 0000000..5e4e51a --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for csv2json/libs + + + + + + + +
+
+

+ All files csv2json/libs +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
csv2json.js
0%0/3100%0/0100%0/00%0/3
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/index.html b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/index.html new file mode 100644 index 0000000..d7c40e9 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for csv2json/libs/interfaces/cli + + + + + + + +
+
+

+ All files csv2json/libs/interfaces/cli +

+
+
+ 0% + Statements + 0/24 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/24 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/1100%0/0100%0/00%0/1
main.js
0%0/230%0/40%0/60%0/23
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/index.js.html b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/index.js.html new file mode 100644 index 0000000..88adb37 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/index.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/interfaces/cli/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/interfaces/cli index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/interfaces/cli/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/interfaces/cli/index.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/interfaces/cli/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/interfaces/cli/index.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/main.js.html b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/main.js.html new file mode 100644 index 0000000..d667a31 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/cli/main.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/interfaces/cli/main.js + + + + + + + +
+
+

+ All files / csv2json/libs/interfaces/cli main.js +

+
+
+ 0% + Statements + 0/23 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/23 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/interfaces/cli/main.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/interfaces/cli/main.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/interfaces/cli/main.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/interfaces/cli/main.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/interfaces/index.html b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/index.html new file mode 100644 index 0000000..34e85bd --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for csv2json/libs/interfaces + + + + + + + +
+
+

+ All files csv2json/libs/interfaces +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/1100%0/0100%0/00%0/1
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/libs/interfaces/index.js.html b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/index.js.html new file mode 100644 index 0000000..3b14064 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/libs/interfaces/index.js.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/libs/interfaces/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/interfaces index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/interfaces/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/interfaces/index.js')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/libs/interfaces/index.js(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/libs/interfaces/index.js')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/CSVError.ts.html b/node_modules/csvtojson/coverage/csv2json/src/CSVError.ts.html new file mode 100644 index 0000000..c603aa8 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/CSVError.ts.html @@ -0,0 +1,138 @@ + + + + Code coverage report for csv2json/src/CSVError.ts + + + + + + + +
+
+

+ All files / csv2json/src CSVError.ts +

+
+
+ 88.24% + Statements + 15/17 +
+
+ 75% + Branches + 3/4 +
+
+ 66.67% + Functions + 4/6 +
+
+ 87.5% + Lines + 14/16 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +241x +1x +1x +2x +  +1x +4x +  +1x +  +  +  +6x +6x +6x +  +6x +6x +  +1x +  +  +1x + 
var util = require("util");
+export default class CSVError extends Error{
+  static column_mismatched(index:number, extra?:string){
+    return new CSVError("column_mismatched", index, extra);
+  }
+  static unclosed_quote(index:number, extra?:string){
+    return new CSVError("unclosed_quote", index, extra);
+  }
+  static fromArray(arr:any[]){
+    return new CSVError(arr[0],arr[1],arr[2]);
+  }
+  constructor(
+    public err:string,
+    public line:number,
+    public extra?: string
+  ){
+    super("Error: " + err + ". JSON Line number: " + line + (extra ? " near: " + extra : ""));
+    this.name="CSV Parse Error";
+  }
+  toString(){
+    return JSON.stringify([this.err, this.line, this.extra]);  
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/Converter.ts.html b/node_modules/csvtojson/coverage/csv2json/src/Converter.ts.html new file mode 100644 index 0000000..7b45a00 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/Converter.ts.html @@ -0,0 +1,636 @@ + + + + Code coverage report for csv2json/src/Converter.ts + + + + + + + +
+
+

+ All files / csv2json/src Converter.ts +

+
+
+ 94% + Statements + 94/100 +
+
+ 84.62% + Branches + 22/26 +
+
+ 96.43% + Functions + 27/28 +
+
+ 93.62% + Lines + 88/94 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +1901x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +  +1x +1x +2x +  +1x +1x +  +1x +  +  +  +17x +  +  +  +  +17x +  +5x +5x +  +  +  +  +  +  +5x +5x +5x +5x +  +  +  +  +5x +  +1x +25x +25x +  +1x +16x +16x +16x +16x +37x +16x +  +21x +21x +21x +  +  +16x +  +49x +49x +49x +  +46x +46x +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +1x +165734x +  +1x +436312x +  +  +  +  +  +217x +73x +73x +73x +73x +73x +  +  +73x +  +73x +  +6x +6x +6x +  +  +  +  +73x +  +124x +124x +  +122x +70x +70x +  +  +  +122x +  +2x +2x +2x +2x +  +  +65x +65x +28x +28x +28x +  +28x +24x +  +  +  +28x +4x +  +24x +  +  +  +  +  +  +  +  +37x +  +  +1x +61x +61x +61x +  +1x +4x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Transform, TransformOptions, Readable } from "stream";
+import { CSVParseParam, mergeParams } from "./Parameters";
+import { ParseRuntime, initParseRuntime } from "./ParseRuntime";
+import P from "bluebird";
+import { Worker } from "./Worker";
+import { stringToLines } from "./fileline";
+import { map } from "lodash/map";
+import { RowSplit, RowSplitResult } from "./rowSplit";
+import getEol from "./getEol";
+import lineToJson, { JSONResult } from "./lineToJson";
+import { Processor, ProcessLineResult } from "./Processor";
+import { ProcessorFork } from "./ProcessFork";
+import { ProcessorLocal } from "./ProcessorLocal";
+import { Result } from "./Result";
+import CSVError from "./CSVError";
+import { bufFromString } from "./util";
+export class Converter extends Transform {
+  preRawData(onRawData: PreRawDataCallback) {
+    this.runtime.preRawDataHook = onRawData;
+  }
+  preFileLine(onFileLine: PreFileLineCallback) {
+    this.runtime.preFileLineHook = onFileLine;
+  }
+  subscribe(
+    onNext?: (data: any, lineNumber: number) => void | PromiseLike<void>,
+    onError?: (err: CSVError) => void,
+    onCompleted?: () => void): Converter {
+    this.parseRuntime.subscribe = {
+      onNext,
+      onError,
+      onCompleted
+    }
+    return this;
+  }
+  fromFile(filePath: string, options?: string | CreateReadStreamOption | undefined): Converter {
+    const fs = require("fs");
+    // var rs = null;
+    // this.wrapCallback(cb, function () {
+    //   if (rs && rs.destroy) {
+    //     rs.destroy();
+    //   }
+    // });
+    fs.exists(filePath, (exist) => {
+      Eif (exist) {
+        const rs = fs.createReadStream(filePath, options);
+        rs.pipe(this);
+      } else {
+        this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct."));
+      }
+    });
+    return this;
+  }
+  fromStream(readStream: Readable): Converter {
+    readStream.pipe(this);
+    return this;
+  }
+  fromString(csvString: string): Converter {
+    const csv = csvString.toString();
+    const read = new Readable();
+    let idx = 0;
+    read._read = function (size) {
+      if (idx >= csvString.length) {
+        this.push(null);
+      } else {
+        const str = csvString.substr(idx, size);
+        this.push(str);
+        idx += size;
+      }
+    }
+    return this.fromStream(read);
+  }
+  then<TResult1 = any[], TResult2 = never>(onfulfilled?: (value: any[]) => TResult1 | PromiseLike<TResult1>, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>): PromiseLike<TResult1 | TResult2> {
+    return new P((resolve, reject) => {
+      this.parseRuntime.then = {
+        onfulfilled: (value: any[]) => {
+          Eif (onfulfilled) {
+            resolve(onfulfilled(value));
+          } else {
+            resolve(value as any);
+          }
+        },
+        onrejected: (err: Error) => {
+          Eif (onrejected) {
+            resolve(onrejected(err));
+          } else {
+            reject(err);
+          }
+        }
+      }
+    });
+  }
+  public get parseParam(): CSVParseParam {
+    return this.params;
+  }
+  public get parseRuntime(): ParseRuntime {
+    return this.runtime;
+  }
+  private params: CSVParseParam;
+  private runtime: ParseRuntime;
+  private processor: Processor;
+  private result: Result;
+  constructor(param?: Partial<CSVParseParam>, public options: TransformOptions = {}) {
+    super(options);
+    this.params = mergeParams(param);
+    this.runtime = initParseRuntime(this);
+    this.result = new Result(this);
+    Iif (this.params.fork) {
+      this.processor = new ProcessorFork(this);
+    } else {
+      this.processor = new ProcessorLocal(this);
+    }
+    this.once("error", (err: any) => {
+      // console.log("BBB");
+      this.result.processError(err);
+      setTimeout(() => {
+        this.emit("done", err);
+      },0);
+ 
+    });
+ 
+    return this;
+  }
+  _transform(chunk: any, encoding: string, cb: Function) {
+    this.processor.process(chunk)
+      .then((result) => {
+        if (result.length > 0) {
+          this.runtime.started = true;
+          return this.result.processResult(result);
+        }
+      })
+      .then(() => {
+        cb();
+      }, (error) => {
+        this.runtime.hasError = true;
+        this.runtime.error = error;
+        this.emit("error", error);
+        cb();
+      });
+  }
+  _flush(cb: Function) {
+    if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
+      const buf = this.runtime.csvLineBuffer;
+      this.runtime.csvLineBuffer = undefined;
+      this.processor.process(buf, true)
+        .then((result) => {
+          if (result.length > 0) {
+            return this.result.processResult(result);
+          }
+        })
+        .then(() => {
+          if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
+            this.emit("error", CSVError.unclosed_quote(this.parsedLineNumber, this.runtime.csvLineBuffer.toString()));
+          } else {
+            this.processEnd(cb);
+          }
+          // cb();
+ 
+        }, (err) => {
+          this.emit("error", err);
+          cb();
+        })
+    } else {
+      this.processEnd(cb);
+    }
+  }
+  private processEnd(cb) {
+    this.result.endProcess();
+    this.emit("done");
+    cb();
+  }
+  get parsedLineNumber(): number {
+    return this.runtime.parsedLineNumber;
+  }
+}
+export interface CreateReadStreamOption {
+  flags?: string;
+  encoding?: string;
+  fd?: number;
+  mode?: number;
+  autoClose?: boolean;
+  start?: number;
+  end?: number;
+  highWaterMark?: number;
+}
+export type CallBack = (err: Error, data: Array<any>) => void;
+ 
+ 
+export type PreFileLineCallback = (line: string, lineNumber: number) => string | PromiseLike<string>;
+export type PreRawDataCallback = (csvString: string) => string | PromiseLike<string>;
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/Processor.ts.html b/node_modules/csvtojson/coverage/csv2json/src/Processor.ts.html new file mode 100644 index 0000000..474a104 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/Processor.ts.html @@ -0,0 +1,117 @@ + + + + Code coverage report for csv2json/src/Processor.ts + + + + + + + +
+
+

+ All files / csv2json/src Processor.ts +

+
+
+ 100% + Statements + 6/6 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +  +  +  +  +  +1x +  +  +75x +75x +75x +  +  +1x +  + 
import { Converter } from "./Converter";
+import P from "bluebird";
+import { JSONResult } from "./lineToJson";
+import { CSVParseParam } from "./Parameters";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+export abstract class Processor {
+  protected params: CSVParseParam;
+  protected runtime: ParseRuntime;
+  constructor(protected converter: Converter) {
+    this.params = converter.parseParam;
+    this.runtime = converter.parseRuntime;
+  }
+  abstract process(chunk: Buffer,finalChunk?:boolean): P<ProcessLineResult[]>
+}
+export type ProcessLineResult = string | string[] | JSONResult;
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/ProcessorLocal.test.ts.html b/node_modules/csvtojson/coverage/csv2json/src/ProcessorLocal.test.ts.html new file mode 100644 index 0000000..8ef7a4b --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/ProcessorLocal.test.ts.html @@ -0,0 +1,153 @@ + + + + Code coverage report for csv2json/src/ProcessorLocal.test.ts + + + + + + + +
+
+

+ All files / csv2json/src ProcessorLocal.test.ts +

+
+
+ 100% + Statements + 23/23 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 3/3 +
+
+ 100% + Lines + 21/21 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +  +1x +  +  +  + 
import {ProcessorLocal} from "./ProcessorLocal";
+import { Converter } from "./Converter";
+import P from "bluebird";
+import {readFileSync} from "fs";
+import path from "path";
+import assert from "assert";
+import { JSONResult } from "./lineToJson";
+const dataDir=path.join(__dirname,"../test/data/");
+describe("ProcessLocal",()=>{
+  it ("should process csv chunks and output json",async function (){
+    const processor=new ProcessorLocal(new Converter());
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    const lines=await processor.process(data);
+    assert(lines.length === 2);
+    const line0=lines[0] as JSONResult;
+    assert.equal(line0.fieldA.title,"Food Factory");
+    assert.equal(line0.fieldA.children.length,2);
+    assert.equal(line0.fieldA.children[1].employee[0].name,"Tim");
+  })
+  it ("should process csv chunks and output csv rows",async function (){
+    const processor=new ProcessorLocal(new Converter({output:"line"}));
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    const lines=await processor.process(data);
+    
+    assert(lines.length === 2);
+  })
+})
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/ProcessorLocal.ts.html b/node_modules/csvtojson/coverage/csv2json/src/ProcessorLocal.ts.html new file mode 100644 index 0000000..5bd262f --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/ProcessorLocal.ts.html @@ -0,0 +1,810 @@ + + + + Code coverage report for csv2json/src/ProcessorLocal.ts + + + + + + + +
+
+

+ All files / csv2json/src ProcessorLocal.ts +

+
+
+ 93.75% + Statements + 135/144 +
+
+ 87.5% + Branches + 77/88 +
+
+ 94.12% + Functions + 16/17 +
+
+ 93.43% + Lines + 128/137 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +2481x +1x +1x +1x +1x +1x +1x +1x +  +  +75x +75x +75x +75x +1x +154x +68x +  +154x +  +75x +75x +1x +67x +67x +  +67x +  +  +280x +  +154x +28x +  +126x +  +  +154x +  +154x +4x +  +150x +  +  +  +154x +154x +  +  +  +  +  +154x +154x +154x +154x +105x +  +154x +2x +2x +  +  +154x +1x +  +154x +154x +126x +  +28x +28x +  +154x +106x +106x +1x +  +105x +  +106x +106x +  +  +68x +  +38x +  +  +  +  +  +  +48x +  +  +  +1x +68x +8x +4x +  +4x +  +  +60x +60x +60x +60x +60x +60x +59x +59x +59x +  +1x +  +  +60x +  +60x +1x +  +59x +2x +  +57x +  +  +67x +4x +  +67x +4x +4x +  +67x +  +1x +4x +4x +4x +4x +22x +5x +1x +  +  +1x +  +  +4x +  +17x +17x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +1x +105x +1x +  +104x +104x +104x +2x +  +102x +  +  +  +  +  +  +  +  +  +1x +290x +290x +138x +  +152x +  +  +  +  +1x +1x +1x +1x +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +  +1x +  +  +  +  +  + 
import { Processor, ProcessLineResult } from "./Processor";
+import P from "bluebird";
+import { prepareData } from "./dataClean";
+import getEol from "./getEol";
+import { stringToLines } from "./fileline";
+import { bufFromString, filterArray } from "./util";
+import { RowSplit } from "./rowSplit";
+import lineToJson from "./lineToJson";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+export class ProcessorLocal extends Processor {
+  private rowSplit: RowSplit = new RowSplit(this.converter);
+  private eolEmitted = false;
+  private _needEmitEol?: boolean = undefined;
+  private get needEmitEol() {
+    if (this._needEmitEol === undefined) {
+      this._needEmitEol = this.converter.listeners("eol").length > 0;
+    }
+    return this._needEmitEol;
+  }
+  private headEmitted = false;
+  private _needEmitHead?: boolean = undefined;
+  private get needEmitHead() {
+    Eif (this._needEmitHead === undefined) {
+      this._needEmitHead = this.converter.listeners("header").length > 0;
+    }
+    return this._needEmitHead;
+ 
+  }
+  process(chunk: Buffer, finalChunk = false): P<ProcessLineResult[]> {
+    let csvString: string;
+    if (finalChunk) {
+      csvString = chunk.toString();
+    } else {
+      csvString = prepareData(chunk, this.converter.parseRuntime);
+ 
+    }
+    return P.resolve()
+      .then(() => {
+        if (this.runtime.preRawDataHook) {
+          return this.runtime.preRawDataHook(csvString);
+        } else {
+          return csvString;
+        }
+      })
+      .then((csv) => {
+        Eif (csv && csv.length > 0) {
+          return this.processCSV(csv, finalChunk);
+        } else {
+          return P.resolve([]);
+        }
+      })
+  }
+  private processCSV(csv: string, finalChunk: boolean): P<ProcessLineResult[]> {
+    const params = this.params;
+    const runtime = this.runtime;
+    if (!runtime.eol) {
+      getEol(csv, runtime);
+    }
+    if (this.needEmitEol && !this.eolEmitted && runtime.eol) {
+      this.converter.emit("eol", runtime.eol);
+      this.eolEmitted = true;
+    }
+    // trim csv file has initial blank lines.
+    if (params.ignoreEmpty && !runtime.started) {
+      csv = csv.trimLeft();
+    }
+    const stringToLineResult = stringToLines(csv, runtime);
+    if (!finalChunk) {
+      this.prependLeftBuf(bufFromString(stringToLineResult.partial));
+    } else {
+      stringToLineResult.lines.push(stringToLineResult.partial);
+      stringToLineResult.partial = "";
+    }
+    if (stringToLineResult.lines.length > 0) {
+      let prom: P<string[]>;
+      if (runtime.preFileLineHook) {
+        prom = this.runPreLineHook(stringToLineResult.lines);
+      } else {
+        prom = P.resolve(stringToLineResult.lines);
+      }
+      return prom.then((lines) => {
+        if (!runtime.started
+          && !this.runtime.headers
+        ) {
+          return this.processDataWithHead(lines);
+        } else {
+          return this.processCSVBody(lines);
+        }
+ 
+      })
+ 
+    } else {
+ 
+      return P.resolve([]);
+    }
+ 
+  }
+  private processDataWithHead(lines: string[]): ProcessLineResult[] {
+    if (this.params.noheader) {
+      if (this.params.headers) {
+        this.runtime.headers = this.params.headers;
+      } else {
+        this.runtime.headers = [];
+      }
+    } else {
+      let left = "";
+      let headerRow: string[] = [];
+      while (lines.length) {
+        const line = left + lines.shift();
+        const row = this.rowSplit.parse(line);
+        if (row.closed) {
+          headerRow = row.cells;
+          left = "";
+          break;
+        } else {
+          left = line + getEol(line, this.runtime);
+        }
+      }
+      this.prependLeftBuf(bufFromString(left));
+ 
+      if (headerRow.length === 0) {
+        return [];
+      }
+      if (this.params.headers) {
+        this.runtime.headers = this.params.headers;
+      } else {
+        this.runtime.headers = headerRow;
+      }
+    }
+    if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) {
+      this.filterHeader();
+    }
+    if (this.needEmitHead && !this.headEmitted) {
+      this.converter.emit("header", this.runtime.headers);
+      this.headEmitted = true;
+    }
+    return this.processCSVBody(lines);
+  }
+  private filterHeader() {
+    this.runtime.selectedColumns = [];
+    Eif (this.runtime.headers) {
+      const headers = this.runtime.headers;
+      for (let i = 0; i < headers.length; i++) {
+        if (this.params.ignoreColumns) {
+          if (this.params.ignoreColumns.test(headers[i])) {
+            Iif (this.params.includeColumns && this.params.includeColumns.test(headers[i])) {
+              this.runtime.selectedColumns.push(i);
+            } else {
+              continue;
+            }
+          } else {
+            this.runtime.selectedColumns.push(i);
+          }
+        } else Eif (this.params.includeColumns) {
+          if (this.params.includeColumns.test(headers[i])) {
+            this.runtime.selectedColumns.push(i);
+          }
+        } else {
+          this.runtime.selectedColumns.push(i);
+        }
+        // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){
+        //   this.runtime.selectedColumns.push(i);
+        // }else{
+        //   if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){
+        //     continue;
+        //   }else{
+        //     if (this.params.ignoreColumns && !this.params.includeColumns){
+        //       this.runtime.selectedColumns.push(i);
+        //     }
+ 
+        //   }
+        // }
+      }
+      this.runtime.headers = filterArray(this.runtime.headers, this.runtime.selectedColumns);
+    }
+ 
+  }
+  private processCSVBody(lines: string[]): ProcessLineResult[] {
+    if (this.params.output === "line") {
+      return lines;
+    } else {
+      const result = this.rowSplit.parseMultiLines(lines);
+      this.prependLeftBuf(bufFromString(result.partial));
+      if (this.params.output === "csv") {
+        return result.rowsCells;
+      } else {
+        return lineToJson(result.rowsCells, this.converter);
+      }
+    }
+ 
+    // var jsonArr = linesToJson(lines.lines, params, this.recordNum);
+    // this.processResult(jsonArr);
+    // this.lastIndex += jsonArr.length;
+    // this.recordNum += jsonArr.length;
+  }
+ 
+  private prependLeftBuf(buf: Buffer) {
+    Eif (buf) {
+      if (this.runtime.csvLineBuffer) {
+        this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]);
+      } else {
+        this.runtime.csvLineBuffer = buf;
+      }
+    }
+ 
+  }
+  private runPreLineHook(lines: string[]): P<string[]> {
+    return new P((resolve,reject)=>{
+      processLineHook(lines,this.runtime,0,(err)=>{
+        Iif (err){
+          reject(err);
+        }else{
+          resolve(lines);
+        }
+      })
+    });
+  }
+}
+ 
+function processLineHook(lines: string[], runtime: ParseRuntime, offset: number,
+  cb: (err?) => void
+) {
+  Iif (lines.length === 0) {
+    cb();
+  } else {
+    Eif (runtime.preFileLineHook) {
+      const line = lines[offset];
+      const res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset);
+      offset++;
+      Iif (res && (res as PromiseLike<string>).then) {
+        (res as PromiseLike<string>).then((value) => {
+          lines[offset - 1] = value;
+          processLineHook(lines, runtime, offset, cb);
+        });
+      } else {
+        lines[offset - 1] = res as string;
+        while (offset < lines.length) {
+          lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset) as string;
+          offset++;
+        }
+        cb();
+      }
+    } else {
+      cb();
+    }
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/Result.ts.html b/node_modules/csvtojson/coverage/csv2json/src/Result.ts.html new file mode 100644 index 0000000..709be52 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/Result.ts.html @@ -0,0 +1,516 @@ + + + + Code coverage report for csv2json/src/Result.ts + + + + + + + +
+
+

+ All files / csv2json/src Result.ts +

+
+
+ 87.32% + Statements + 62/71 +
+
+ 79.25% + Branches + 42/53 +
+
+ 86.67% + Functions + 13/15 +
+
+ 86.96% + Lines + 60/69 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150  +  +1x +  +  +1x +1x +94x +  +  +1x +102x +63x +  +102x +  +1x +155x +  +73x +73x +94x +94x +  +94x +94x +31x +  +  +  +  +  +31x +  +  +31x +31x +  +  +  +  +63x +63x +  +  +  +1x +94x +73x +  +94x +  +1x +6x +  +  +6x +2x +  +  +1x +61x +46x +46x +  +  +61x +  +  +  +1x +  +  +  +  +  +  +  +  +  +31x +  +  +31x +23x +23x +23x +23x +  +23x +  +  +  +  +  +23x +1x +  +23x +10592x +10592x +10592x +10592x +1x +  +  +23x +  +  +  +  +  +  +  +  +  +8x +8x +10584x +10584x +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10586x +10584x +  +2x +  + 
import { Converter } from "./Converter";
+import { ProcessLineResult } from "./Processor";
+import P from "bluebird";
+import CSVError from "./CSVError";
+ 
+export class Result {
+  private get needEmitLine(): boolean {
+    return !!this.converter.parseRuntime.subscribe && !!this.converter.parseRuntime.subscribe.onNext || this.needPushDownstream
+  }
+  private _needPushDownstream?: boolean;
+  private get needPushDownstream(): boolean {
+    if (this._needPushDownstream === undefined) {
+      this._needPushDownstream = this.converter.listeners("data").length > 0 || this.converter.listeners("readable").length > 0;
+    }
+    return this._needPushDownstream;
+  }
+  private get needEmitAll(): boolean {
+    return !!this.converter.parseRuntime.then;
+  }
+  private finalResult: any[] = [];
+  constructor(private converter: Converter) { }
+  processResult(resultLines: ProcessLineResult[]): P<any> {
+    const startPos = this.converter.parseRuntime.parsedLineNumber;
+    // let prom: P<any>;
+    return new P((resolve, reject) => {
+      if (this.needEmitLine) {
+        processLineByLine(
+          resultLines,
+          this.converter,
+          0,
+          this.needPushDownstream,
+          (err) => {
+            Iif (err) {
+              reject(err);
+            } else {
+              this.appendFinalResult(resultLines);
+              resolve();
+            }
+          },
+        )
+      } else {
+        this.appendFinalResult(resultLines);
+        resolve();
+      }
+    })
+  }
+  appendFinalResult(lines: any[]) {
+    if (this.needEmitAll) {
+      this.finalResult = this.finalResult.concat(lines);
+    }
+    this.converter.parseRuntime.parsedLineNumber += lines.length;
+  }
+  processError(err: CSVError) {
+    Iif (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onError) {
+      this.converter.parseRuntime.subscribe.onError(err);
+    }
+    if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onrejected) {
+      this.converter.parseRuntime.then.onrejected(err);
+    }
+  }
+  endProcess() {
+    if (this.needEmitAll) {
+      Eif (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onfulfilled) {
+        this.converter.parseRuntime.then.onfulfilled(this.finalResult);
+      }
+    }
+    Iif (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onCompleted) {
+      this.converter.parseRuntime.subscribe.onCompleted();
+    }
+  }
+}
+ 
+function processLineByLine(
+  lines: ProcessLineResult[],
+ 
+  conv: Converter,
+  offset: number,
+  needPushDownstream: boolean,
+  cb: (err?) => void,
+) {
+  Iif (lines.length === 0) {
+    cb();
+  } else {
+    if (conv.parseRuntime.subscribe && conv.parseRuntime.subscribe.onNext) {
+      const hook = conv.parseRuntime.subscribe.onNext;
+      const nextLine = lines[offset];
+      const res = hook(nextLine, conv.parseRuntime.parsedLineNumber + offset);
+      offset++;
+      // if (isAsync === undefined) {
+      Iif (res && res.then) {
+        res.then(function () {
+          processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine);
+        }, cb);
+      } else {
+        // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false);
+        if (needPushDownstream){
+          pushDownstream(conv,nextLine);
+        }
+        while (offset<lines.length){
+          const line=lines[offset];
+          hook(line, conv.parseRuntime.parsedLineNumber + offset);
+          offset++;
+          if (needPushDownstream){
+            pushDownstream(conv,line);
+          }
+        }
+        cb();
+      }
+      // } else if (isAsync === true) {
+      //   (res as PromiseLike<void>).then(function () {
+      //     processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, true);
+      //   }, cb);
+      // } else if (isAsync === false) {
+      //   processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false);
+      // }
+    } else {
+      Eif (needPushDownstream) {
+        while (offset<lines.length) {
+          const line = lines[offset++];
+          pushDownstream(conv, line);
+        }
+        
+      }
+      cb();
+    }
+ 
+  }
+}
+ 
+function processRecursive(
+  lines: ProcessLineResult[],
+  hook: (data: any, lineNumber: number) => void | PromiseLike<void>,
+  conv: Converter,
+  offset: number,
+  needPushDownstream: boolean,
+  cb: (err?) => void,
+  res: ProcessLineResult,
+) {
+  if (needPushDownstream) {
+    pushDownstream(conv, res);
+  }
+  processLineByLine(lines, conv, offset, needPushDownstream, cb);
+}
+function pushDownstream(conv: Converter, res: ProcessLineResult) {
+  if (typeof res === "object" && !conv.options.objectMode) {
+    conv.push(JSON.stringify(res) + "\n", "utf8");
+  } else {
+    conv.push(res);
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/Worker.ts.html b/node_modules/csvtojson/coverage/csv2json/src/Worker.ts.html new file mode 100644 index 0000000..09ce1f6 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/Worker.ts.html @@ -0,0 +1,87 @@ + + + + Code coverage report for csv2json/src/Worker.ts + + + + + + + +
+
+

+ All files / csv2json/src Worker.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
import { Converter } from "./Converter";
+ 
+export class Worker {
+  constructor(converter: Converter) {
+ 
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/dataClean.ts.html b/node_modules/csvtojson/coverage/csv2json/src/dataClean.ts.html new file mode 100644 index 0000000..e065b8f --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/dataClean.ts.html @@ -0,0 +1,255 @@ + + + + Code coverage report for csv2json/src/dataClean.ts + + + + + + + +
+
+

+ All files / csv2json/src dataClean.ts +

+
+
+ 100% + Statements + 7/7 +
+
+ 75% + Branches + 3/4 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 7/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +1x +126x +126x +  +126x +  +  +  +  +  +126x +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +126x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+import stripBom from "strip-bom";
+/**
+ * For each data chunk coming to parser:
+ * 1. append the data to the buffer that is left from last chunk
+ * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer.
+ * 3. stripBom 
+ */
+export function prepareData(chunk: Buffer, runtime: ParseRuntime): string {
+  const workChunk = concatLeftChunk(chunk, runtime);
+  runtime.csvLineBuffer = undefined;
+  const cleanCSVString = cleanUtf8Split(workChunk, runtime).toString("utf8");
+  if (runtime.started === false) {
+    return stripBom(cleanCSVString);
+  } else {
+    return cleanCSVString;
+  }
+}I
+/**
+ *  append data to buffer that is left form last chunk
+ */
+function concatLeftChunk(chunk: Buffer, runtime: ParseRuntime): Buffer {
+  if (runtime.csvLineBuffer && runtime.csvLineBuffer.length > 0) {
+    return Buffer.concat([runtime.csvLineBuffer, chunk]);
+  } else {
+    return chunk;
+  }
+}
+/**
+ * check if utf8 chars being split, if does, stripe the bytes and add to left buffer.
+ */
+function cleanUtf8Split(chunk: Buffer, runtime: ParseRuntime): Buffer {
+  let idx = chunk.length - 1;
+  /**
+   * From Keyang:
+   * The code below is to check if a single utf8 char (which could be multiple bytes) being split.
+   * If the char being split, the buffer from two chunk needs to be concat
+   * check how utf8 being encoded to understand the code below. 
+   * If anyone has any better way to do this, please let me know.
+   */
+  if ((chunk[idx] & 1 << 7) != 0) {
+    while ((chunk[idx] & 3 << 6) === 128) {
+      idx--;
+    }
+    idx--;
+  }
+  if (idx != chunk.length - 1) {
+    runtime.csvLineBuffer = chunk.slice(idx + 1);
+    return chunk.slice(0, idx + 1)
+    // var _cb=cb;
+    // var self=this;
+    // cb=function(){
+    //   if (self._csvLineBuffer){
+    //     self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]);
+    //   }else{
+    //     self._csvLineBuffer=left;
+    //   }
+    //   _cb();
+    // }
+  } else {
+    return chunk;
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/fileline.test.ts.html b/node_modules/csvtojson/coverage/csv2json/src/fileline.test.ts.html new file mode 100644 index 0000000..3cfaa95 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/fileline.test.ts.html @@ -0,0 +1,111 @@ + + + + Code coverage report for csv2json/src/fileline.test.ts + + + + + + + +
+
+

+ All files / csv2json/src fileline.test.ts +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 4/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15  +  +1x +  +  +1x +1x +1x +  +  +  +  +  +  + 
import {stringToLines} from "./fileline";
+import { mergeParams } from "./Parameters";
+import { Converter } from "./Converter";
+var assert = require("assert");
+describe("fileline function", function() {
+  it ("should convert data to multiple lines ", function() {
+    const conv=new Converter();
+    var data = "abcde\nefef";
+    var result = stringToLines(data, conv.parseRuntime);
+    assert.equal(result.lines.length, 1);
+    assert.equal(result.partial, "efef");
+    assert.equal(result.lines[0], "abcde");
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/fileline.ts.html b/node_modules/csvtojson/coverage/csv2json/src/fileline.ts.html new file mode 100644 index 0000000..a5f64ed --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/fileline.ts.html @@ -0,0 +1,141 @@ + + + + Code coverage report for csv2json/src/fileline.ts + + + + + + + +
+
+

+ All files / csv2json/src fileline.ts +

+
+
+ 100% + Statements + 2/2 +
+
+ 100% + Branches + 2/2 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 2/2 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+import getEol from "./getEol";
+// const getEol = require("./getEol");
+/**
+ * convert data chunk to file lines array
+ * @param  {string} data  data chunk as utf8 string
+ * @param  {object} param Converter param object
+ * @return {Object}   {lines:[line1,line2...],partial:String}
+ */
+export function stringToLines(data: string, param: ParseRuntime): StringToLinesResult {
+  const eol = getEol(data, param);
+  const lines = data.split(eol);
+  const partial = lines.pop() || "";
+  return { lines: lines, partial: partial };
+};
+ 
+ 
+export interface StringToLinesResult {
+  lines: Fileline[],
+  /**
+   * last line which could be incomplete line.
+   */
+  partial: string
+}
+export type Fileline = string;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/getEol.ts.html b/node_modules/csvtojson/coverage/csv2json/src/getEol.ts.html new file mode 100644 index 0000000..343647b --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/getEol.ts.html @@ -0,0 +1,132 @@ + + + + Code coverage report for csv2json/src/getEol.ts + + + + + + + +
+
+

+ All files / csv2json/src getEol.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 3/3 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+//return first eol found from a data chunk.
+export default function (data: string, param: ParseRuntime): string {
+  if (!param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          param.eol = "\r\n";
+          break;
+        } else if (data[i + 1]) {
+          param.eol = "\r";
+          break;
+        } 
+      } else if (data[i] === "\n") {
+        param.eol = "\n";
+        break;
+      }
+    }
+  }
+  return param.eol || "\n";
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/index.html b/node_modules/csvtojson/coverage/csv2json/src/index.html new file mode 100644 index 0000000..9c4554d --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/index.html @@ -0,0 +1,305 @@ + + + + Code coverage report for csv2json/src + + + + + + + +
+
+

+ All files csv2json/src +

+
+
+ 93.69% + Statements + 594/634 +
+
+ 86.56% + Branches + 277/320 +
+
+ 91% + Functions + 91/100 +
+
+ 93.47% + Lines + 573/613 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CSVError.ts
88.24%15/1775%3/466.67%4/687.5%14/16
Converter.ts
94%94/10084.62%22/2696.43%27/2893.62%88/94
Processor.ts
100%6/6100%0/0100%2/2100%5/5
ProcessorLocal.test.ts
100%23/23100%0/0100%3/3100%21/21
ProcessorLocal.ts
93.75%135/14487.5%77/8894.12%16/1793.43%128/137
Result.ts
87.32%62/7179.25%42/5386.67%13/1586.96%60/69
Worker.ts
0%0/00%0/00%0/10%0/0
dataClean.ts
100%7/775%3/4100%1/1100%7/7
fileline.test.ts
100%4/4100%0/0100%0/0100%4/4
fileline.ts
100%2/2100%2/2100%0/0100%2/2
getEol.ts
0%0/00%3/30%0/00%0/0
index.ts
100%5/5100%0/0100%1/1100%5/5
lineToJson.ts
91.92%91/9986.75%72/8392.86%13/1491.92%91/99
rowSplit.test.ts
100%31/31100%0/0100%0/0100%31/31
rowSplit.ts
95.08%116/12294.55%52/5591.67%11/1295.04%115/121
test.ts
0%0/00%0/00%0/00%0/0
util.ts
100%3/350%1/2100%0/0100%2/2
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/index.ts.html b/node_modules/csvtojson/coverage/csv2json/src/index.ts.html new file mode 100644 index 0000000..4559d23 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/index.ts.html @@ -0,0 +1,93 @@ + + + + Code coverage report for csv2json/src/index.ts + + + + + + + +
+
+

+ All files / csv2json/src index.ts +

+
+
+ 100% + Statements + 5/5 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9  +  +1x +1x +15x +  +  +1x +1x
import { TransformOptions } from "stream";
+import { CSVParseParam } from "./Parameters";
+import { Converter } from "./Converter";
+const helper = function (param?: Partial<CSVParseParam>, options?: TransformOptions): Converter {
+  return new Converter(param, options);
+}
+ 
+helper["Converter"] = Converter;
+export =helper;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/lineToJson.ts.html b/node_modules/csvtojson/coverage/csv2json/src/lineToJson.ts.html new file mode 100644 index 0000000..db476bc --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/lineToJson.ts.html @@ -0,0 +1,660 @@ + + + + Code coverage report for csv2json/src/lineToJson.ts + + + + + + + +
+
+

+ All files / csv2json/src lineToJson.ts +

+
+
+ 91.92% + Statements + 91/99 +
+
+ 86.75% + Branches + 72/83 +
+
+ 92.86% + Functions + 13/14 +
+
+ 91.92% + Lines + 91/99 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198  +1x +  +1x +  +  +1x +  +1x +102x +102x +32101x +32099x +32090x +  +  +100x +  +  +  +  +  +  +  +32101x +2x +  +  +32099x +32099x +32099x +32090x +  +9x +  +  +  +  +32099x +32099x +  +32099x +65788x +  +65788x +7x +  +65781x +  +65781x +65781x +50x +  +65781x +65781x +6x +6x +6x +  +  +  +  +  +  +65775x +75x +75x +  +65775x +65775x +  +  +  +32099x +32090x +  +9x +  +  +  +1x +  +  +  +  +  +65781x +65243x +  +538x +538x +533x +  +5x +1x +  +5x +4x +4x +4x +4x +  +  +  +1x +1x +  +  +  +  +  +  +65781x +538x +3x +  +535x +103x +1x +  +102x +  +  +432x +  +  +  +65781x +  +  +  +  +64992x +  +  +789x +  +  +  +  +75x +9x +66x +  +66x +  +66x +66x +  +  +  +  +  +  +13x +13x +  +  +13x +  +  +  +60x +  +  +  +75x +75x +13x +  +62x +13x +49x +2x +47x +5x +  +42x +  +  +  +  +2x +2x +  +  +2x +  +  +  +  +5x +5x +  +  +  +  + 
import { Converter } from "./Converter";
+import CSVError from "./CSVError";
+import { CellParser, ColumnParam } from "./Parameters";
+import set from "lodash/set";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+ 
+export default function (csvRows: string[][], conv: Converter): JSONResult[] {
+  const res: JSONResult[] = [];
+  for (let i = 0, len = csvRows.length; i < len; i++) {
+    const r = processRow(csvRows[i], conv, i);
+    if (r) {
+      res.push(r);
+    }
+  }
+  return res;
+};
+export type JSONResult = {
+  [key: string]: any
+}
+ 
+function processRow(row: string[], conv: Converter, index): JSONResult | null {
+ 
+  if (conv.parseParam.checkColumn && conv.parseRuntime.headers && row.length !== conv.parseRuntime.headers.length) {
+    throw (CSVError.column_mismatched(conv.parseRuntime.parsedLineNumber + index))
+  }
+ 
+  const headRow = conv.parseRuntime.headers || [];
+  const resultRow = convertRowToJson(row, headRow, conv);
+  if (resultRow) {
+    return resultRow;
+  } else {
+    return null;
+  }
+}
+ 
+function convertRowToJson(row: string[], headRow: string[], conv: Converter): { [key: string]: any } | null {
+  let hasValue = false;
+  const resultRow = {};
+  
+  for (let i = 0, len = row.length; i < len; i++) {
+    let item = row[i];
+ 
+    if (conv.parseParam.ignoreEmpty && item === '') {
+      continue;
+    }
+    hasValue = true;
+ 
+    let head = headRow[i];
+    if (!head || head === "") {
+      head = headRow[i] = "field" + (i + 1);
+    }
+    const convFunc = getConvFunc(head, i, conv);
+    if (convFunc) {
+      const convRes = convFunc(item, head, resultRow, row, i);
+      Eif (convRes !== undefined) {
+        setPath(resultRow, head, convRes, conv,i);
+      }
+    } else {
+      // var flag = getFlag(head, i, param);
+      // if (flag === 'omit') {
+      //   continue;
+      // }
+      if (conv.parseParam.checkType) {
+        const convertFunc = checkType(item, head, i, conv);
+        item = convertFunc(item);
+      }
+      Eif (item !== undefined) {
+        setPath(resultRow, head, item, conv,i);
+      }
+    }
+  }
+  if (hasValue) {
+    return resultRow;
+  } else {
+    return null;
+  }
+}
+ 
+const builtInConv: { [key: string]: CellParser } = {
+  "string": stringType,
+  "number": numberType,
+  "omit": function () { }
+}
+function getConvFunc(head: string, i: number, conv: Converter): CellParser | null {
+  if (conv.parseRuntime.columnConv[i] !== undefined) {
+    return conv.parseRuntime.columnConv[i];
+  } else {
+    let flag = conv.parseParam.colParser[head];
+    if (flag === undefined) {
+      return conv.parseRuntime.columnConv[i] = null;
+    }
+    if (typeof flag === "object") {
+      flag = (flag as ColumnParam).cellParser || "string";
+    }
+    if (typeof flag === "string") {
+      flag = flag.trim().toLowerCase();
+      const builtInFunc = builtInConv[flag];
+      Eif (builtInFunc) {
+        return conv.parseRuntime.columnConv[i] = builtInFunc;
+      } else {
+        return conv.parseRuntime.columnConv[i] = null;
+      }
+    } else Eif (typeof flag === "function") {
+      return conv.parseRuntime.columnConv[i] = flag;
+    } else {
+      return conv.parseRuntime.columnConv[i] = null;
+    }
+  }
+}
+function setPath(resultJson: any, head: string, value: any, conv: Converter,headIdx:number) {
+  if (!conv.parseRuntime.columnValueSetter[headIdx]) {
+    if (conv.parseParam.flatKeys) {
+      conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+    } else {
+      if (head.indexOf(".") > -1) {
+        if (conv.parseParam.colParser[head] && (conv.parseParam.colParser[head] as ColumnParam).flat) {
+          conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+        } else {
+          conv.parseRuntime.columnValueSetter[headIdx] = jsonSetter;
+        }
+      } else {
+        conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+      }
+    }
+  }
+  conv.parseRuntime.columnValueSetter[headIdx](resultJson, head, value);
+  // flatSetter(resultJson, head, value);
+ 
+}
+function flatSetter(resultJson: any, head: string, value: any) {
+  resultJson[head] = value;
+}
+function jsonSetter(resultJson: any, head: string, value: any) {
+  set(resultJson, head, value);
+}
+ 
+ 
+function checkType(item: string, head: string, headIdx: number, conv: Converter): Function {
+  if (conv.parseRuntime.headerType[headIdx]) {
+    return conv.parseRuntime.headerType[headIdx];
+  } else Iif (head.indexOf('number#!') > -1) {
+    return conv.parseRuntime.headerType[headIdx] = numberType;
+  } else Iif (head.indexOf('string#!') > -1) {
+    return conv.parseRuntime.headerType[headIdx] = stringType;
+  } else Eif (conv.parseParam.checkType) {
+    return conv.parseRuntime.headerType[headIdx] = dynamicType;
+  } else {
+    return conv.parseRuntime.headerType[headIdx] = stringType;
+  }
+}
+ 
+function numberType(item) {
+  var rtn = parseFloat(item);
+  Iif (isNaN(rtn)) {
+    return item;
+  }
+  return rtn;
+}
+ 
+function stringType(item: string): string {
+  return item.toString();
+}
+ 
+function dynamicType(item) {
+  var trimed = item.trim();
+  if (trimed === "") {
+    return stringType(item);
+  }
+  if (numReg.test(trimed)) {
+    return numberType(item);
+  } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") {
+    return booleanType(item);
+  } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") {
+    return jsonType(item);
+  } else {
+    return stringType(item);
+  }
+}
+ 
+function booleanType(item) {
+  var trimed = item.trim();
+  Iif (trimed.length === 5 && trimed.toLowerCase() === "false") {
+    return false;
+  } else {
+    return true;
+  }
+}
+ 
+function jsonType(item) {
+  try {
+    return JSON.parse(item);
+  } catch (e) {
+    return item;
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/rowSplit.test.ts.html b/node_modules/csvtojson/coverage/csv2json/src/rowSplit.test.ts.html new file mode 100644 index 0000000..3124c1c --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/rowSplit.test.ts.html @@ -0,0 +1,399 @@ + + + + Code coverage report for csv2json/src/rowSplit.test.ts + + + + + + + +
+
+

+ All files / csv2json/src rowSplit.test.ts +

+
+
+ 100% + Statements + 31/31 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 31/31 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +1111x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +  +1x +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +1x +  +1x +  +  +  +1x +3x +1x +  +1x +  +  +  +1x +1x +  +1x + 
import { RowSplit, MultipleRowResult, RowSplitResult } from "./rowSplit";
+import { Converter } from "./Converter";
+const assert = require("assert");
+ 
+describe("Test delimiters", function () {
+  const getDelimiter = (str, opt: { delimiter: string | string[] }): string => {
+    return RowSplit.prototype["getDelimiter"].call({
+      conv: {
+        parseParam: {
+          delimiter: opt.delimiter
+        }
+      }
+    }, str);
+  }
+ 
+  it("should return the explicitly specified delimiter", function () {
+    var delimiter = ";";
+    var rowStr = "a;b;c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: ";" });
+    assert.equal(returnedDelimiter, delimiter);
+  });
+ 
+  it("should return the autodetected delimiter if 'auto' specified", function () {
+    var rowStr = "a;b;c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
+    assert(returnedDelimiter === ";");
+  });
+ 
+  it("should return the ',' delimiter if delimiter cannot be specified, in case of 'auto'", function () {
+    var rowStr = "abc";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
+    assert(returnedDelimiter === ",");
+  });
+ 
+  it("should accetp an array with potential delimiters", function () {
+    var rowStr = "a$b$c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: [",", ";", "$"] });
+    assert(returnedDelimiter === '$');
+  });
+});
+ 
+describe("ParseMultiLine function", function () {
+  const rowSplit = new RowSplit(new Converter());
+  const func = (lines: string[]): MultipleRowResult => {
+    return rowSplit.parseMultiLines(lines);
+  }
+  it("should convert lines to csv lines", function () {
+    var lines = [
+      "a,b,c,d",
+      "hello,world,csvtojson,abc",
+      "1,2,3,4"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 3);
+    assert.equal(res.partial, "");
+  });
+ 
+  it("should process line breaks", function () {
+    var lines = [
+      "a,b,c",
+      '15",hello,"ab',
+      "cde\"",
+      "\"b\"\"b\",cc,dd"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 3);
+    assert.equal(res.rowsCells[1][0], "15\"");
+    assert.equal(res.rowsCells[1][2], "ab\ncde");
+    assert.equal(res.rowsCells[2][0], "b\"b");
+    assert.equal(res.partial, "");
+  });
+ 
+  it("should return partial if line not closed", function () {
+    var lines = [
+      "a,b,c",
+      '15",hello,"ab',
+      "d,e,f"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 1);
+    assert.equal(res.partial, "15\",hello,\"ab\nd,e,f\n");
+  });
+});
+ 
+describe("RowSplit.parse function", function () {
+  const rowSplit = new RowSplit(new Converter());
+  const func = (str): RowSplitResult => {
+    return rowSplit.parse(str);
+  }
+  it("should split complete csv line", function () {
+    var str = "hello,world,csvtojson,awesome";
+    var res = func(str);
+    assert.equal(res.cells.length, 4);
+    assert.equal(res.closed, true);
+  });
+ 
+  it("should split incomplete csv line", function () {
+    var str = "hello,world,\"csvtojson,awesome";
+    var res = func(str);
+    assert.equal(res.closed, false);
+  });
+ 
+  it("should allow multiple line", function () {
+    var str = "\"he\"llo\",world,\"csvtojson,a\"\nwesome\"";
+    var res = func(str);
+    assert.equal(res.closed, true);
+    assert.equal(res.cells[2], 'csvtojson,a"\nwesome');
+  });
+ 
+});
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/rowSplit.ts.html b/node_modules/csvtojson/coverage/csv2json/src/rowSplit.ts.html new file mode 100644 index 0000000..3a5b0de --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/rowSplit.ts.html @@ -0,0 +1,666 @@ + + + + Code coverage report for csv2json/src/rowSplit.ts + + + + + + + +
+
+

+ All files / csv2json/src rowSplit.ts +

+
+
+ 95.08% + Statements + 116/122 +
+
+ 94.55% + Branches + 52/55 +
+
+ 91.67% + Functions + 11/12 +
+
+ 95.04% + Lines + 115/121 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200  +  +  +1x +1x +  +1x +1x +  +  +  +77x +77x +77x +1x +32192x +70x +  +32192x +  +77x +77x +77x +77x +  +1x +32200x +8x +  +32192x +32192x +32192x +32192x +4x +  +  +32192x +2x +2x +  +32192x +32192x +32192x +  +  +32192x +  +  +  +1x +32192x +32192x +32192x +32192x +66757x +66757x +66625x +  +66757x +66757x +66643x +158x +158x +107x +107x +107x +107x +  +51x +51x +51x +  +  +66485x +66473x +  +66485x +66485x +  +  +114x +26x +26x +26x +26x +26x +26x +  +26x +26x +  +88x +  +  +  +  +  +  +  +  +32192x +  +1x +  +8x +6x +2x +1x +  +1x +  +7x +7x +7x +33x +33x +13x +13x +  +  +7x +  +1x +66643x +66643x +66643x +  +  +  +1x +272x +272x +272x +266x +  +272x +272x +272x +191x +191x +  +272x +  +  +1x +  +  +  +  +  +  +  +  +  +1x +133x +133x +25x +  +133x +  +133x +  +1x +107x +107x +107x +32137x +32137x +32137x +32116x +18x +  +32098x +  +  +32116x +  +21x +  +  +107x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CSVParseParam } from "./Parameters";
+import { Converter } from "./Converter";
+import { Fileline } from "./fileline";
+import getEol from "./getEol";
+import { filterArray } from "./util";
+ 
+const defaulDelimiters = [",", "|", "\t", ";", ":"];
+export class RowSplit {
+  private quote: string;
+  private trim: boolean;
+  private escape: string;
+  private cachedRegExp: { [key: string]: RegExp } = {};
+  private delimiterEmitted = false;
+  private _needEmitDelimiter?: boolean = undefined;
+  private get needEmitDelimiter() {
+    if (this._needEmitDelimiter === undefined) {
+      this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0;
+    }
+    return this._needEmitDelimiter;
+  }
+  constructor(private conv: Converter) {
+    this.quote = conv.parseParam.quote;
+    this.trim = conv.parseParam.trim;
+    this.escape = conv.parseParam.escape;
+  }
+  parse(fileline: Fileline): RowSplitResult {
+    if (fileline === "") {
+      return { cells: [], closed: true };
+    }
+    const quote = this.quote;
+    const trim = this.trim;
+    const escape = this.escape;
+    if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") {
+      this.conv.parseRuntime.delimiter = this.getDelimiter(fileline);
+ 
+    }
+    if (this.needEmitDelimiter && !this.delimiterEmitted) {
+      this.conv.emit("delimiter", this.conv.parseRuntime.delimiter);
+      this.delimiterEmitted = true;
+    }
+    const delimiter = this.conv.parseRuntime.delimiter;
+    const rowArr = fileline.split(delimiter);
+    Iif (quote === "off") {
+      return { cells: rowArr, closed: true };
+    } else {
+      return this.toCSVRow(rowArr, trim, quote, delimiter);
+    }
+ 
+  }
+  private toCSVRow(rowArr: string[], trim: boolean, quote: string, delimiter: string): RowSplitResult {
+    const row: string[] = [];
+    let inquote = false;
+    let quoteBuff = '';
+    for (let i = 0, rowLen = rowArr.length; i < rowLen; i++) {
+      let e = rowArr[i];
+      if (!inquote && trim) {
+        e = e.trimLeft();
+      }
+      const len = e.length;
+      if (!inquote) {
+        if (this.isQuoteOpen(e)) { //quote open
+          e = e.substr(1);
+          if (this.isQuoteClose(e)) { //quote close
+            e = e.substring(0, e.lastIndexOf(quote));
+            e = this.escapeQuote(e);
+            row.push(e);
+            continue;
+          } else {
+            inquote = true;
+            quoteBuff += e;
+            continue;
+          }
+        } else {
+          if (trim) {
+            e = e.trimRight();
+          }
+          row.push(e);
+          continue;
+        }
+      } else { //previous quote not closed
+        if (this.isQuoteClose(e)) { //close double quote
+          inquote = false;
+          e = e.substr(0, len - 1);
+          quoteBuff += delimiter + e;
+          quoteBuff = this.escapeQuote(quoteBuff);
+          Eif (trim) {
+            quoteBuff = quoteBuff.trimRight();
+          }
+          row.push(quoteBuff);
+          quoteBuff = "";
+        } else {
+          quoteBuff += delimiter + e;
+        }
+      }
+    }
+ 
+    // if (!inquote && param._needFilterRow) {
+    //   row = filterRow(row, param);
+    // }
+ 
+    return { cells: row, closed: !inquote };
+  }
+  private getDelimiter(fileline: Fileline): string {
+    let checker;
+    if (this.conv.parseParam.delimiter === "auto") {
+      checker = defaulDelimiters;
+    } else if (this.conv.parseParam.delimiter instanceof Array) {
+      checker = this.conv.parseParam.delimiter;
+    } else {
+      return this.conv.parseParam.delimiter;
+    }
+    let count = 0;
+    let rtn = ",";
+    checker.forEach(function (delim) {
+      const delimCount = fileline.split(delim).length;
+      if (delimCount > count) {
+        rtn = delim;
+        count = delimCount;
+      }
+    });
+    return rtn;
+  }
+  private isQuoteOpen(str: string): boolean {
+    const quote = this.quote;
+    const escape = this.escape;
+    return str[0] === quote && (
+      str[1] !== quote ||
+      str[1] === escape && (str[2] === quote || str.length === 2));
+  }
+  private isQuoteClose(str: string): boolean {
+    const quote = this.quote;
+    const escape = this.escape;
+    if (this.conv.parseParam.trim) {
+      str = str.trimRight();
+    }
+    let count = 0;
+    let idx = str.length - 1;
+    while (str[idx] === quote || str[idx] === escape) {
+      idx--;
+      count++;
+    }
+    return count % 2 !== 0;
+  }
+ 
+  private twoDoubleQuote(str: string): string {
+    var twoQuote = this.quote + this.quote;
+    var curIndex = -1;
+    while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
+      str = str.substring(0, curIndex) + str.substring(++curIndex);
+    }
+    return str;
+  }
+ 
+ 
+  private escapeQuote(segment: string): string {
+    const key = "es|" + this.quote + "|" + this.escape;
+    if (this.cachedRegExp[key] === undefined) {
+      this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g');
+    }
+    const regExp = this.cachedRegExp[key];
+    // console.log(regExp,segment);
+    return segment.replace(regExp, this.quote);
+  }
+  parseMultiLines(lines: Fileline[]): MultipleRowResult {
+    const csvLines: string[][] = [];
+    let left = "";
+    while (lines.length) {
+      const line = left + lines.shift();
+      const row = this.parse(line);
+      if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) {
+        if (this.conv.parseRuntime.selectedColumns) {
+          csvLines.push(filterArray(row.cells, this.conv.parseRuntime.selectedColumns));
+        } else {
+          csvLines.push(row.cells);
+        }
+ 
+        left = "";
+      } else {
+        left = line + (getEol(line, this.conv.parseRuntime) || "\n");
+      }
+    }
+    return { rowsCells: csvLines, partial: left };
+  }
+}
+export interface MultipleRowResult {
+  rowsCells: string[][];
+  partial: string;
+}
+export interface RowSplitResult {
+  /**
+   * csv row array. ["a","b","c"]
+   */
+  cells: string[],
+  /**
+   * if the passed fileline is a complete row
+   */
+  closed: boolean
+}
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/test.ts.html b/node_modules/csvtojson/coverage/csv2json/src/test.ts.html new file mode 100644 index 0000000..217549b --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/test.ts.html @@ -0,0 +1,81 @@ + + + + Code coverage report for csv2json/src/test.ts + + + + + + + +
+
+

+ All files / csv2json/src test.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5  +  +  +  + 
import a from "./index";
+ 
+ 
+// a("sss","CCc");
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/src/util.ts.html b/node_modules/csvtojson/coverage/csv2json/src/util.ts.html new file mode 100644 index 0000000..d79d6d6 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/src/util.ts.html @@ -0,0 +1,120 @@ + + + + Code coverage report for csv2json/src/util.ts + + + + + + + +
+
+

+ All files / csv2json/src util.ts +

+
+
+ 100% + Statements + 3/3 +
+
+ 50% + Branches + 1/2 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 2/2 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18290x +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  + 
export function bufFromString(str: string): Buffer {
+  const length = Buffer.byteLength(str);
+  const buffer = Buffer.allocUnsafe
+    ? Buffer.allocUnsafe(length)
+    : new Buffer(length);
+  buffer.write(str);
+  return buffer;
+}
+ 
+export function filterArray(arr: any[], filter: number[]): any[] {
+  const rtn: any[] = [];
+  for (let i = 0; i < arr.length; i++) {
+    if (filter.indexOf(i) > -1) {
+      rtn.push(arr[i]);
+    }
+  }
+  return rtn;
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/testNew/index.html b/node_modules/csvtojson/coverage/csv2json/testNew/index.html new file mode 100644 index 0000000..826fa8e --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/testNew/index.html @@ -0,0 +1,136 @@ + + + + Code coverage report for csv2json/testNew + + + + + + + +
+
+

+ All files csv2json/testNew +

+
+
+ 98.58% + Statements + 208/211 +
+
+ 100% + Branches + 1/1 +
+
+ 100% + Functions + 22/22 +
+
+ 98.58% + Lines + 208/211 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
testCSVConverter.ts
98.95%94/95100%1/1100%5/598.95%94/95
testCSVConverter2.ts
98%98/100100%0/0100%15/1598%98/100
testCSVConverter3.ts
100%4/4100%0/0100%0/0100%4/4
testErrorHandle.ts
100%12/12100%0/0100%2/2100%12/12
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter.ts.html b/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter.ts.html new file mode 100644 index 0000000..037a84d --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testCSVConverter.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testCSVConverter.ts +

+
+
+ 98.95% + Statements + 94/95 +
+
+ 100% + Branches + 1/1 +
+
+ 100% + Functions + 5/5 +
+
+ 98.95% + Lines + 94/95 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter2.ts.html b/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter2.ts.html new file mode 100644 index 0000000..28fb201 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter2.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testCSVConverter2.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testCSVConverter2.ts +

+
+
+ 98% + Statements + 98/100 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 15/15 +
+
+ 98% + Lines + 98/100 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter3.ts.html b/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter3.ts.html new file mode 100644 index 0000000..907a8b2 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/testNew/testCSVConverter3.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testCSVConverter3.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testCSVConverter3.ts +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 4/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/csv2json/testNew/testErrorHandle.ts.html b/node_modules/csvtojson/coverage/csv2json/testNew/testErrorHandle.ts.html new file mode 100644 index 0000000..17fb472 --- /dev/null +++ b/node_modules/csvtojson/coverage/csv2json/testNew/testErrorHandle.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testErrorHandle.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testErrorHandle.ts +

+
+
+ 100% + Statements + 12/12 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 12/12 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:126:5)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/dataClean.ts.html b/node_modules/csvtojson/coverage/dataClean.ts.html new file mode 100644 index 0000000..6205f11 --- /dev/null +++ b/node_modules/csvtojson/coverage/dataClean.ts.html @@ -0,0 +1,255 @@ + + + + Code coverage report for dataClean.ts + + + + + + + +
+
+

+ All files dataClean.ts +

+
+
+ 100% + Statements + 7/7 +
+
+ 75% + Branches + 3/4 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 7/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +1x +135x +135x +  +135x +  +  +  +  +  +135x +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +135x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+import stripBom from "strip-bom";
+/**
+ * For each data chunk coming to parser:
+ * 1. append the data to the buffer that is left from last chunk
+ * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer.
+ * 3. stripBom 
+ */
+export function prepareData(chunk: Buffer, runtime: ParseRuntime): string {
+  const workChunk = concatLeftChunk(chunk, runtime);
+  runtime.csvLineBuffer = undefined;
+  const cleanCSVString = cleanUtf8Split(workChunk, runtime).toString("utf8");
+  if (runtime.started === false) {
+    return stripBom(cleanCSVString);
+  } else {
+    return cleanCSVString;
+  }
+}I
+/**
+ *  append data to buffer that is left form last chunk
+ */
+function concatLeftChunk(chunk: Buffer, runtime: ParseRuntime): Buffer {
+  if (runtime.csvLineBuffer && runtime.csvLineBuffer.length > 0) {
+    return Buffer.concat([runtime.csvLineBuffer, chunk]);
+  } else {
+    return chunk;
+  }
+}
+/**
+ * check if utf8 chars being split, if does, stripe the bytes and add to left buffer.
+ */
+function cleanUtf8Split(chunk: Buffer, runtime: ParseRuntime): Buffer {
+  let idx = chunk.length - 1;
+  /**
+   * From Keyang:
+   * The code below is to check if a single utf8 char (which could be multiple bytes) being split.
+   * If the char being split, the buffer from two chunk needs to be concat
+   * check how utf8 being encoded to understand the code below. 
+   * If anyone has any better way to do this, please let me know.
+   */
+  if ((chunk[idx] & 1 << 7) != 0) {
+    while ((chunk[idx] & 3 << 6) === 128) {
+      idx--;
+    }
+    idx--;
+  }
+  if (idx != chunk.length - 1) {
+    runtime.csvLineBuffer = chunk.slice(idx + 1);
+    return chunk.slice(0, idx + 1)
+    // var _cb=cb;
+    // var self=this;
+    // cb=function(){
+    //   if (self._csvLineBuffer){
+    //     self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]);
+    //   }else{
+    //     self._csvLineBuffer=left;
+    //   }
+    //   _cb();
+    // }
+  } else {
+    return chunk;
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/fileline.test.ts.html b/node_modules/csvtojson/coverage/fileline.test.ts.html new file mode 100644 index 0000000..2ab3abb --- /dev/null +++ b/node_modules/csvtojson/coverage/fileline.test.ts.html @@ -0,0 +1,111 @@ + + + + Code coverage report for fileline.test.ts + + + + + + + +
+
+

+ All files fileline.test.ts +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 4/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15  +  +1x +  +  +1x +1x +1x +  +  +  +  +  +  + 
import {stringToLines} from "./fileline";
+import { mergeParams } from "./Parameters";
+import { Converter } from "./Converter";
+var assert = require("assert");
+describe("fileline function", function() {
+  it ("should convert data to multiple lines ", function() {
+    const conv=new Converter();
+    var data = "abcde\nefef";
+    var result = stringToLines(data, conv.parseRuntime);
+    assert.equal(result.lines.length, 1);
+    assert.equal(result.partial, "efef");
+    assert.equal(result.lines[0], "abcde");
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/fileline.ts.html b/node_modules/csvtojson/coverage/fileline.ts.html new file mode 100644 index 0000000..aa267aa --- /dev/null +++ b/node_modules/csvtojson/coverage/fileline.ts.html @@ -0,0 +1,141 @@ + + + + Code coverage report for fileline.ts + + + + + + + +
+
+

+ All files fileline.ts +

+
+
+ 100% + Statements + 2/2 +
+
+ 100% + Branches + 2/2 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 2/2 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+import getEol from "./getEol";
+// const getEol = require("./getEol");
+/**
+ * convert data chunk to file lines array
+ * @param  {string} data  data chunk as utf8 string
+ * @param  {object} param Converter param object
+ * @return {Object}   {lines:[line1,line2...],partial:String}
+ */
+export function stringToLines(data: string, param: ParseRuntime): StringToLinesResult {
+  const eol = getEol(data, param);
+  const lines = data.split(eol);
+  const partial = lines.pop() || "";
+  return { lines: lines, partial: partial };
+};
+ 
+ 
+export interface StringToLinesResult {
+  lines: Fileline[],
+  /**
+   * last line which could be incomplete line.
+   */
+  partial: string
+}
+export type Fileline = string;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/getEol.ts.html b/node_modules/csvtojson/coverage/getEol.ts.html new file mode 100644 index 0000000..6e1c162 --- /dev/null +++ b/node_modules/csvtojson/coverage/getEol.ts.html @@ -0,0 +1,132 @@ + + + + Code coverage report for getEol.ts + + + + + + + +
+
+

+ All files getEol.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 3/3 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+//return first eol found from a data chunk.
+export default function (data: string, param: ParseRuntime): string {
+  if (!param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          param.eol = "\r\n";
+          break;
+        } else if (data[i + 1]) {
+          param.eol = "\r";
+          break;
+        } 
+      } else if (data[i] === "\n") {
+        param.eol = "\n";
+        break;
+      }
+    }
+  }
+  return param.eol || "\n";
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/index.html b/node_modules/csvtojson/coverage/index.html new file mode 100644 index 0000000..c47d138 --- /dev/null +++ b/node_modules/csvtojson/coverage/index.html @@ -0,0 +1,305 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ All files +

+
+
+ 97.95% + Statements + 715/730 +
+
+ 91.24% + Branches + 323/354 +
+
+ 99.17% + Functions + 120/121 +
+
+ 97.87% + Lines + 688/703 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CSVError.test.ts
100%1/1100%0/0100%1/1100%1/1
CSVError.ts
94.12%16/1775%3/483.33%5/693.75%15/16
Converter.ts
100%98/98100%18/18100%29/29100%92/92
ProcessFork.ts
100%78/7886.67%26/30100%15/15100%73/73
Processor.ts
100%6/6100%0/0100%2/2100%5/5
ProcessorLocal.test.ts
100%31/31100%0/0100%6/6100%29/29
ProcessorLocal.ts
98.09%154/15793.75%90/96100%20/2097.99%146/149
Result.ts
94.37%67/7188.68%47/53100%15/1594.2%65/69
dataClean.ts
100%7/775%3/4100%1/1100%7/7
fileline.test.ts
100%4/4100%0/0100%0/0100%4/4
fileline.ts
100%2/2100%2/2100%0/0100%2/2
getEol.ts
0%0/00%3/30%0/00%0/0
index.ts
100%5/5100%0/0100%1/1100%5/5
lineToJson.ts
93.94%93/9991.57%76/83100%14/1493.94%93/99
rowSplit.test.ts
100%31/31100%0/0100%0/0100%31/31
rowSplit.ts
100%119/11994.74%54/57100%11/11100%118/118
util.ts
75%3/425%1/4100%0/066.67%2/3
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/index.ts.html b/node_modules/csvtojson/coverage/index.ts.html new file mode 100644 index 0000000..5e6ac42 --- /dev/null +++ b/node_modules/csvtojson/coverage/index.ts.html @@ -0,0 +1,93 @@ + + + + Code coverage report for index.ts + + + + + + + +
+
+

+ All files index.ts +

+
+
+ 100% + Statements + 5/5 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9  +  +1x +1x +35x +  +  +1x +1x
import { TransformOptions } from "stream";
+import { CSVParseParam } from "./Parameters";
+import { Converter } from "./Converter";
+const helper = function (param?: Partial<CSVParseParam>, options?: TransformOptions): Converter {
+  return new Converter(param, options);
+}
+ 
+helper["Converter"] = Converter;
+export =helper;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/base.css b/node_modules/csvtojson/coverage/lcov-report/base.css new file mode 100644 index 0000000..7090209 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/base.css @@ -0,0 +1,223 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } + +.medium .chart { border:1px solid #666; } +.medium .cover-fill { background: #666; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } +.medium { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/node_modules/csvtojson/coverage/lcov-report/block-navigation.js b/node_modules/csvtojson/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..0c71903 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/block-navigation.js @@ -0,0 +1,63 @@ +var jumpToCode = (function init () { + // Classes of code we would like to highlight + var missingCoverageClasses = [ '.cbranch-no', '.cstat-no', '.fstat-no' ]; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = notSelector + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements.item(currentIndex).classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index) + .scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if (typeof currentIndex === 'number' && currentIndex < (missingCoverageElements.length - 1)) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +}()); +window.addEventListener('keydown', jumpToCode); diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/Gruntfile.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/Gruntfile.js.html new file mode 100644 index 0000000..6fb1b30 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/Gruntfile.js.html @@ -0,0 +1,330 @@ + + + + Code coverage report for csv2json/Gruntfile.js + + + + + + + +
+
+

+ All files / csv2json Gruntfile.js +

+
+
+ 0% + Statements + 0/8 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/8 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/*
+	GRUNT instructions
+	1. ensure you have dependencies installed run `npm install` in the root directory of the repo to get dev dependencies
+	2. run `grunt` in root dir of the repo in a shell to get the watcher started
+		The watcher looks at files. When a file is added or changed it passes the file through jshint
+	3. run `grunt test` to execute all unit tests and get output
+	4. run `grunt jshint` to pass all files through linter
+ 
+	MADGE instructions
+	1. run `npm install -g madge` to get madge executable
+	2. Insure graphviz is installed and the bin folder is in your path.
+	3. run `madge -x "node_modules|util|stream|os|assert|fs|http" -i graph.png ./` to generate graph.png
+		which is the dependency graph for the current build.
+*/
+ 
+module.exports = function(grunt) {
+  require('load-grunt-tasks')(grunt);
+  grunt.loadTasks('./devops/grunt-wiki');
+  var files = ['Gruntfile.js', 'libs/**/*.js', 'libs/**/**/*.js', 'test/*.js', 'bin/csvtojson',
+    'bin/csvtojson.js', 'devops/*.js'
+  ];
+  grunt.initConfig({
+    uglify: {
+      client: {
+        options: {
+          mangle: true,
+          banner: "/*Automatically Generated. Do not modify.*/\n"
+        },
+        src: "./dist/csvtojson.js",
+        dest: "./dist/csvtojson.min.js",
+      }
+    },
+    browserify: {
+      dist: {
+        src: "./browser_index.js",
+        dest: "./dist/csvtojson.js"
+      }
+    },
+    jshint: {
+      all: {
+        src: files,
+        options: {
+          'globals': { // false makes global variable readonly true is read/write
+            'describe': false,
+            'it': false
+          },
+          // see the docs for full list of options http://jshint.com/docs/options/
+          'bitwise': true,
+          'curly': true,
+          'eqeqeq': true,
+          'forin': true,
+          'freeze': true,
+          'funcscope': true,
+          'futurehostile': true,
+          'latedef': false,
+          'maxcomplexity': 10, // arbitrary but anything over 10 quickly becomes hard to think about
+          'maxdepth': 3, // also arbitrary. Deeply nested functions should be refactored to use helper functions.
+          'maxparams': 4, // arbitrary. Consider using an object literal instead of list of params.
+          'nocomma': true,
+          //'nonew': true, // In the future when all objects are refactored to avoid new.
+          //'strict': true, // in the future when all functions are closer to adhering to strict.
+          'notypeof': true,
+          'undef': true,
+          'unused': true,
+          'node': true // defines node globals
+        }
+      }
+    },
+    mochaTest: {
+      test: {
+        src: [files[3]]
+      }
+    },
+    watch: {
+      files: files,
+      tasks: ['newer:jshint:all', 'mochaTest'],
+      options: {
+        spawn: false,
+        event: ['changed', 'added']
+      }
+    },
+    wiki: {},
+  });
+  grunt.registerTask('default', ['watch']);
+  grunt.registerTask('test', ['mochaTest']);
+  grunt.registerTask("build:browser",["browserify:dist","uglify:client"]);
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/benchmark.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/benchmark.js.html new file mode 100644 index 0000000..31deaab --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/benchmark.js.html @@ -0,0 +1,210 @@ + + + + Code coverage report for csv2json/bin/benchmark.js + + + + + + + +
+
+

+ All files / csv2json/bin benchmark.js +

+
+
+ 0% + Statements + 0/29 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/5 +
+
+ 0% + Lines + 0/29 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+var path = process.argv[2];
+var fs = require('fs');
+if (!fs.existsSync(path)) {
+  console.log("Run: benchmark [csvpath]");
+  console.log("File not found: ", path);
+  process.exit(1);
+}
+function testCSVLine(coreNum, checkType, cb){
+  console.log("WorkerNum:", coreNum, "Check Type: ", checkType);
+  var Converter = require("../libs/core/Converter");
+  var rs = fs.createReadStream(path);
+  var converter = new Converter({
+    workerNum: coreNum,
+    checkType: checkType,
+    constructResult: false
+    // fork:true
+  });
+  var totalLines = 0;
+  var secLines = 0;
+  converter.on("data", function() {
+    totalLines++;
+    secLines++;
+  });
+  converter.on("end", function() {
+    clearInterval(timer);
+    console.log("");
+    var t = new Date() - start;
+    console.log("Time elapsed: ", t, " ms");
+    console.log("Total lines: " + totalLines);
+    console.log("Average Speed: " + Math.round(totalLines / t * 1000) + " Lines / Sec");
+    cb();
+  });
+  var timer = setInterval(function() {
+    process.stdout.write("\r" + secLines + " CSV Lines/Sec");
+    secLines = 0;
+  }, 1000);
+  var start = new Date();
+ 
+  var stream = rs.pipe(converter);
+}
+ 
+// testCSVLine(1,false,false,function(){
+  testCSVLine(4,true,function(){
+ 
+  });
+// });
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/csvtojson.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/csvtojson.js.html new file mode 100644 index 0000000..18f33e0 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/csvtojson.js.html @@ -0,0 +1,552 @@ + + + + Code coverage report for csv2json/bin/csvtojson.js + + + + + + + +
+
+

+ All files / csv2json/bin csvtojson.js +

+
+
+ 0% + Statements + 0/96 +
+
+ 0% + Branches + 0/56 +
+
+ 0% + Functions + 0/9 +
+
+ 0% + Lines + 0/96 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
function csvtojson() {
+  var Converter = require("../libs/core/Converter.js");
+  var fs = require("fs");
+  var options = require("./options.json");
+  var cmds = options.commands;
+  var opts = options.options;
+  var exps = options.examples;
+  var pkg = require("../package.json");
+  /**
+   *{
+    "cmd": "parse", command to run
+    "options": {}, options to passe to the command
+    "inputStream": process.stdin // input stream for the command. default is stdin. can be a file read stream.
+  };
+   *
+   */
+  var parsedCmd;
+ 
+  function _showHelp(errno) {
+    var key;
+    errno = typeof errno === "number" ? errno : 0;
+    console.log("csvtojson: Convert csv to JSON format");
+    console.log("version:", pkg.version);
+    console.log("Usage: csvtojson [<command>] [<options>] filepath\n");
+    console.log("Commands: ");
+    for (key in cmds) {
+      if (cmds.hasOwnProperty(key)) {
+        console.log("\t%s: %s", key, cmds[key]);
+      }
+    }
+    console.log("Options: ");
+    for (key in opts) {
+      if (opts.hasOwnProperty(key)) {
+        console.log("\t%s: %s", key, opts[key].desc);
+      }
+    }
+    console.log("Examples: ");
+    for (var i = 0; i < exps.length; i++) {
+      console.log("\t%s", exps[i]);
+    }
+    process.exit(errno);
+  }
+ 
+  function parse() {
+    var is = parsedCmd.inputStream;
+    parsedCmd.options.constructResult = false;
+    if (parsedCmd.options.toArrayString === undefined) {
+      parsedCmd.options.toArrayString = true;
+    }
+    if (parsedCmd.options.maxRowLength === undefined) {
+      parsedCmd.options.maxRowLength = 10240;
+    }
+    if (is === process.stdin && is.isTTY) {
+      console.log("Please specify csv file path or pipe the csv data through.\n");
+      _showHelp(1);
+    }
+    if (parsedCmd.options.delimiter === "\\t" ){
+      parsedCmd.options.delimiter="\t";
+    }
+    var conv = new Converter(parsedCmd.options);
+    conv.on("error", function (err, pos) {
+      if (!parsedCmd.options.quiet) {
+        console.error("csvtojson got an error: ", err);
+        if (pos) {
+          console.error("The error happens at following line: ");
+          console.log(pos);
+        }
+      }
+      process.exit(1);
+    });
+    is.pipe(conv).pipe(process.stdout);
+    // is.pipe(conv);
+  }
+ 
+  function run(cmd, options) {
+    if (cmd === "parse") {
+      parse();
+    } else if (cmd === "version") {
+      console.log(pkg.version);
+    } else {
+      console.log("unknown command %s.", cmd);
+      _showHelp(1);
+    }
+  }
+ 
+  function commandParser() {
+    var parsedCmd = {
+      "cmd": "parse",
+      "options": {},
+      "inputStream": process.stdin
+    };
+ 
+    function parseObject(val, optional) {
+      try {
+        return JSON.parse(val);
+      } catch (e) {
+        if (optional) {
+          return val;
+        } else {
+          console.error(e);
+          process.exit(1);
+        }
+      }
+    }
+ 
+    function parseBool(str, optName) {
+      str = str.toLowerCase();
+      if (str === "true" || str === "y") {
+        return true;
+      } else if (str === "false" || str === "n") {
+        return false;
+      }
+      console.log("Unknown boolean value %s for parameter %s.", str, optName);
+      _showHelp(1);
+    }
+    process.argv.slice(2).forEach(function (item) {
+      if (item.indexOf("--") > -1) {
+        var itemArr = item.split("=");
+        var optName = itemArr[0];
+        var key, val, type;
+        if (!opts[optName]) {
+          console.log("Option %s not supported.", optName);
+          _showHelp(1);
+        }
+        key = optName.replace('--', '');
+        val = itemArr[1] || '';
+        type = opts[optName].type;
+        if (type === "string") {
+          parsedCmd.options[key] = val.toString();
+        } else if (type === "boolean") {
+          parsedCmd.options[key] = parseBool(val, optName);
+        } else if (type === "number") {
+          parsedCmd.options[key] = parseFloat(val);
+        } else if (type === "object") {
+          parsedCmd.options[key] = parseObject(val, false);
+        } else if (type === "~object") {
+          parsedCmd.options[key] = parseObject(val, true);
+        } else {
+          throw ({
+            name: "UnimplementedException",
+            message: "Option type parsing not implemented. See bin/options.json"
+          });
+        }
+      } else if (cmds[item]) {
+        parsedCmd.cmd = item;
+      } else if (fs.existsSync(item)) {
+        parsedCmd.inputStream = fs.createReadStream(item);
+      } else {
+        console.log("unknown parameter %s.", item);
+      }
+    });
+    return parsedCmd;
+  }
+  process.stdin.setEncoding('utf8');
+  parsedCmd = commandParser();
+  run(parsedCmd.cmd, parsedCmd.options);
+}
+module.exports = csvtojson;
+if (!module.parent) {
+  csvtojson();
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/genCsv.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/genCsv.js.html new file mode 100644 index 0000000..b80c8c7 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/genCsv.js.html @@ -0,0 +1,165 @@ + + + + Code coverage report for csv2json/bin/genCsv.js + + + + + + + +
+
+

+ All files / csv2json/bin genCsv.js +

+
+
+ 0% + Statements + 0/23 +
+
+ 0% + Branches + 0/8 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/23 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
#!/usr/bin/env node
+var minimist = require("minimist");
+var argv = process.argv;
+argv.shift();
+argv.shift();
+var args = minimist(argv);
+var headers = ["name", "header1", "file2", "description", "header2", "field2", "header3"];
+ 
+if (args.headers) {
+  headers = JSON.parse(args.headers);
+}
+var rowNum = args.row ? args.row : 10000;
+var chars = args.chars ? args.chars : "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+var maxLength = parseInt(args.max ? args.max : "15");
+console.log(headers.join(","));
+for (var i = 0; i < rowNum; i++) {
+  var row = [];
+  for (var j = 0; j < headers.length; j++) {
+    row.push(genWord());
+  }
+  console.log(row.join(","));
+}
+ 
+function genWord() {
+  var len = Math.round(Math.random() * maxLength);
+  var rtn = "";
+  for (var i = 0; i < len; i++) {
+    var pos = Math.round(Math.random() * chars.length);
+    rtn += chars[pos];
+  }
+  return rtn;
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/index.html new file mode 100644 index 0000000..5025793 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/bin/index.html @@ -0,0 +1,123 @@ + + + + Code coverage report for csv2json/bin + + + + + + + +
+
+

+ All files csv2json/bin +

+
+
+ 0% + Statements + 0/148 +
+
+ 0% + Branches + 0/66 +
+
+ 0% + Functions + 0/15 +
+
+ 0% + Lines + 0/148 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
benchmark.js
0%0/290%0/20%0/50%0/29
csvtojson.js
0%0/960%0/560%0/90%0/96
genCsv.js
0%0/230%0/80%0/10%0/23
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/browser_index.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/browser_index.js.html new file mode 100644 index 0000000..ce18c03 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/browser_index.js.html @@ -0,0 +1,81 @@ + + + + Code coverage report for csv2json/browser_index.js + + + + + + + +
+
+

+ All files / csv2json browser_index.js +

+
+
+ 0% + Statements + 0/3 +
+
+ 0% + Branches + 0/2 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5  +  +  +  + 
if (window){
+  window.csvtojson=require("./index.js");
+  window.csvtojson.version=require("./package.json").version;
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/csvtojson.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/csvtojson.js.html new file mode 100644 index 0000000..e3ca6ef --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/csvtojson.js.html @@ -0,0 +1,84849 @@ + + + + Code coverage report for csv2json/dist/csvtojson.js + + + + + + + +
+
+

+ All files / csv2json/dist csvtojson.js +

+
+
+ 0% + Statements + 0/8755 +
+
+ 0% + Branches + 0/6057 +
+
+ 0% + Functions + 0/1477 +
+
+ 0% + Lines + 0/8543 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +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 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330 +1331 +1332 +1333 +1334 +1335 +1336 +1337 +1338 +1339 +1340 +1341 +1342 +1343 +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353 +1354 +1355 +1356 +1357 +1358 +1359 +1360 +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371 +1372 +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401 +1402 +1403 +1404 +1405 +1406 +1407 +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425 +1426 +1427 +1428 +1429 +1430 +1431 +1432 +1433 +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449 +1450 +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496 +1497 +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538 +1539 +1540 +1541 +1542 +1543 +1544 +1545 +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564 +1565 +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575 +1576 +1577 +1578 +1579 +1580 +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591 +1592 +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602 +1603 +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613 +1614 +1615 +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630 +1631 +1632 +1633 +1634 +1635 +1636 +1637 +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647 +1648 +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657 +1658 +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678 +1679 +1680 +1681 +1682 +1683 +1684 +1685 +1686 +1687 +1688 +1689 +1690 +1691 +1692 +1693 +1694 +1695 +1696 +1697 +1698 +1699 +1700 +1701 +1702 +1703 +1704 +1705 +1706 +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716 +1717 +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730 +1731 +1732 +1733 +1734 +1735 +1736 +1737 +1738 +1739 +1740 +1741 +1742 +1743 +1744 +1745 +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787 +1788 +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +1830 +1831 +1832 +1833 +1834 +1835 +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874 +1875 +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884 +1885 +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906 +1907 +1908 +1909 +1910 +1911 +1912 +1913 +1914 +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933 +1934 +1935 +1936 +1937 +1938 +1939 +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955 +1956 +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974 +1975 +1976 +1977 +1978 +1979 +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991 +1992 +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039 +2040 +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056 +2057 +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072 +2073 +2074 +2075 +2076 +2077 +2078 +2079 +2080 +2081 +2082 +2083 +2084 +2085 +2086 +2087 +2088 +2089 +2090 +2091 +2092 +2093 +2094 +2095 +2096 +2097 +2098 +2099 +2100 +2101 +2102 +2103 +2104 +2105 +2106 +2107 +2108 +2109 +2110 +2111 +2112 +2113 +2114 +2115 +2116 +2117 +2118 +2119 +2120 +2121 +2122 +2123 +2124 +2125 +2126 +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135 +2136 +2137 +2138 +2139 +2140 +2141 +2142 +2143 +2144 +2145 +2146 +2147 +2148 +2149 +2150 +2151 +2152 +2153 +2154 +2155 +2156 +2157 +2158 +2159 +2160 +2161 +2162 +2163 +2164 +2165 +2166 +2167 +2168 +2169 +2170 +2171 +2172 +2173 +2174 +2175 +2176 +2177 +2178 +2179 +2180 +2181 +2182 +2183 +2184 +2185 +2186 +2187 +2188 +2189 +2190 +2191 +2192 +2193 +2194 +2195 +2196 +2197 +2198 +2199 +2200 +2201 +2202 +2203 +2204 +2205 +2206 +2207 +2208 +2209 +2210 +2211 +2212 +2213 +2214 +2215 +2216 +2217 +2218 +2219 +2220 +2221 +2222 +2223 +2224 +2225 +2226 +2227 +2228 +2229 +2230 +2231 +2232 +2233 +2234 +2235 +2236 +2237 +2238 +2239 +2240 +2241 +2242 +2243 +2244 +2245 +2246 +2247 +2248 +2249 +2250 +2251 +2252 +2253 +2254 +2255 +2256 +2257 +2258 +2259 +2260 +2261 +2262 +2263 +2264 +2265 +2266 +2267 +2268 +2269 +2270 +2271 +2272 +2273 +2274 +2275 +2276 +2277 +2278 +2279 +2280 +2281 +2282 +2283 +2284 +2285 +2286 +2287 +2288 +2289 +2290 +2291 +2292 +2293 +2294 +2295 +2296 +2297 +2298 +2299 +2300 +2301 +2302 +2303 +2304 +2305 +2306 +2307 +2308 +2309 +2310 +2311 +2312 +2313 +2314 +2315 +2316 +2317 +2318 +2319 +2320 +2321 +2322 +2323 +2324 +2325 +2326 +2327 +2328 +2329 +2330 +2331 +2332 +2333 +2334 +2335 +2336 +2337 +2338 +2339 +2340 +2341 +2342 +2343 +2344 +2345 +2346 +2347 +2348 +2349 +2350 +2351 +2352 +2353 +2354 +2355 +2356 +2357 +2358 +2359 +2360 +2361 +2362 +2363 +2364 +2365 +2366 +2367 +2368 +2369 +2370 +2371 +2372 +2373 +2374 +2375 +2376 +2377 +2378 +2379 +2380 +2381 +2382 +2383 +2384 +2385 +2386 +2387 +2388 +2389 +2390 +2391 +2392 +2393 +2394 +2395 +2396 +2397 +2398 +2399 +2400 +2401 +2402 +2403 +2404 +2405 +2406 +2407 +2408 +2409 +2410 +2411 +2412 +2413 +2414 +2415 +2416 +2417 +2418 +2419 +2420 +2421 +2422 +2423 +2424 +2425 +2426 +2427 +2428 +2429 +2430 +2431 +2432 +2433 +2434 +2435 +2436 +2437 +2438 +2439 +2440 +2441 +2442 +2443 +2444 +2445 +2446 +2447 +2448 +2449 +2450 +2451 +2452 +2453 +2454 +2455 +2456 +2457 +2458 +2459 +2460 +2461 +2462 +2463 +2464 +2465 +2466 +2467 +2468 +2469 +2470 +2471 +2472 +2473 +2474 +2475 +2476 +2477 +2478 +2479 +2480 +2481 +2482 +2483 +2484 +2485 +2486 +2487 +2488 +2489 +2490 +2491 +2492 +2493 +2494 +2495 +2496 +2497 +2498 +2499 +2500 +2501 +2502 +2503 +2504 +2505 +2506 +2507 +2508 +2509 +2510 +2511 +2512 +2513 +2514 +2515 +2516 +2517 +2518 +2519 +2520 +2521 +2522 +2523 +2524 +2525 +2526 +2527 +2528 +2529 +2530 +2531 +2532 +2533 +2534 +2535 +2536 +2537 +2538 +2539 +2540 +2541 +2542 +2543 +2544 +2545 +2546 +2547 +2548 +2549 +2550 +2551 +2552 +2553 +2554 +2555 +2556 +2557 +2558 +2559 +2560 +2561 +2562 +2563 +2564 +2565 +2566 +2567 +2568 +2569 +2570 +2571 +2572 +2573 +2574 +2575 +2576 +2577 +2578 +2579 +2580 +2581 +2582 +2583 +2584 +2585 +2586 +2587 +2588 +2589 +2590 +2591 +2592 +2593 +2594 +2595 +2596 +2597 +2598 +2599 +2600 +2601 +2602 +2603 +2604 +2605 +2606 +2607 +2608 +2609 +2610 +2611 +2612 +2613 +2614 +2615 +2616 +2617 +2618 +2619 +2620 +2621 +2622 +2623 +2624 +2625 +2626 +2627 +2628 +2629 +2630 +2631 +2632 +2633 +2634 +2635 +2636 +2637 +2638 +2639 +2640 +2641 +2642 +2643 +2644 +2645 +2646 +2647 +2648 +2649 +2650 +2651 +2652 +2653 +2654 +2655 +2656 +2657 +2658 +2659 +2660 +2661 +2662 +2663 +2664 +2665 +2666 +2667 +2668 +2669 +2670 +2671 +2672 +2673 +2674 +2675 +2676 +2677 +2678 +2679 +2680 +2681 +2682 +2683 +2684 +2685 +2686 +2687 +2688 +2689 +2690 +2691 +2692 +2693 +2694 +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716 +2717 +2718 +2719 +2720 +2721 +2722 +2723 +2724 +2725 +2726 +2727 +2728 +2729 +2730 +2731 +2732 +2733 +2734 +2735 +2736 +2737 +2738 +2739 +2740 +2741 +2742 +2743 +2744 +2745 +2746 +2747 +2748 +2749 +2750 +2751 +2752 +2753 +2754 +2755 +2756 +2757 +2758 +2759 +2760 +2761 +2762 +2763 +2764 +2765 +2766 +2767 +2768 +2769 +2770 +2771 +2772 +2773 +2774 +2775 +2776 +2777 +2778 +2779 +2780 +2781 +2782 +2783 +2784 +2785 +2786 +2787 +2788 +2789 +2790 +2791 +2792 +2793 +2794 +2795 +2796 +2797 +2798 +2799 +2800 +2801 +2802 +2803 +2804 +2805 +2806 +2807 +2808 +2809 +2810 +2811 +2812 +2813 +2814 +2815 +2816 +2817 +2818 +2819 +2820 +2821 +2822 +2823 +2824 +2825 +2826 +2827 +2828 +2829 +2830 +2831 +2832 +2833 +2834 +2835 +2836 +2837 +2838 +2839 +2840 +2841 +2842 +2843 +2844 +2845 +2846 +2847 +2848 +2849 +2850 +2851 +2852 +2853 +2854 +2855 +2856 +2857 +2858 +2859 +2860 +2861 +2862 +2863 +2864 +2865 +2866 +2867 +2868 +2869 +2870 +2871 +2872 +2873 +2874 +2875 +2876 +2877 +2878 +2879 +2880 +2881 +2882 +2883 +2884 +2885 +2886 +2887 +2888 +2889 +2890 +2891 +2892 +2893 +2894 +2895 +2896 +2897 +2898 +2899 +2900 +2901 +2902 +2903 +2904 +2905 +2906 +2907 +2908 +2909 +2910 +2911 +2912 +2913 +2914 +2915 +2916 +2917 +2918 +2919 +2920 +2921 +2922 +2923 +2924 +2925 +2926 +2927 +2928 +2929 +2930 +2931 +2932 +2933 +2934 +2935 +2936 +2937 +2938 +2939 +2940 +2941 +2942 +2943 +2944 +2945 +2946 +2947 +2948 +2949 +2950 +2951 +2952 +2953 +2954 +2955 +2956 +2957 +2958 +2959 +2960 +2961 +2962 +2963 +2964 +2965 +2966 +2967 +2968 +2969 +2970 +2971 +2972 +2973 +2974 +2975 +2976 +2977 +2978 +2979 +2980 +2981 +2982 +2983 +2984 +2985 +2986 +2987 +2988 +2989 +2990 +2991 +2992 +2993 +2994 +2995 +2996 +2997 +2998 +2999 +3000 +3001 +3002 +3003 +3004 +3005 +3006 +3007 +3008 +3009 +3010 +3011 +3012 +3013 +3014 +3015 +3016 +3017 +3018 +3019 +3020 +3021 +3022 +3023 +3024 +3025 +3026 +3027 +3028 +3029 +3030 +3031 +3032 +3033 +3034 +3035 +3036 +3037 +3038 +3039 +3040 +3041 +3042 +3043 +3044 +3045 +3046 +3047 +3048 +3049 +3050 +3051 +3052 +3053 +3054 +3055 +3056 +3057 +3058 +3059 +3060 +3061 +3062 +3063 +3064 +3065 +3066 +3067 +3068 +3069 +3070 +3071 +3072 +3073 +3074 +3075 +3076 +3077 +3078 +3079 +3080 +3081 +3082 +3083 +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +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 +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 +3344 +3345 +3346 +3347 +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364 +3365 +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373 +3374 +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389 +3390 +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +3430 +3431 +3432 +3433 +3434 +3435 +3436 +3437 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +3446 +3447 +3448 +3449 +3450 +3451 +3452 +3453 +3454 +3455 +3456 +3457 +3458 +3459 +3460 +3461 +3462 +3463 +3464 +3465 +3466 +3467 +3468 +3469 +3470 +3471 +3472 +3473 +3474 +3475 +3476 +3477 +3478 +3479 +3480 +3481 +3482 +3483 +3484 +3485 +3486 +3487 +3488 +3489 +3490 +3491 +3492 +3493 +3494 +3495 +3496 +3497 +3498 +3499 +3500 +3501 +3502 +3503 +3504 +3505 +3506 +3507 +3508 +3509 +3510 +3511 +3512 +3513 +3514 +3515 +3516 +3517 +3518 +3519 +3520 +3521 +3522 +3523 +3524 +3525 +3526 +3527 +3528 +3529 +3530 +3531 +3532 +3533 +3534 +3535 +3536 +3537 +3538 +3539 +3540 +3541 +3542 +3543 +3544 +3545 +3546 +3547 +3548 +3549 +3550 +3551 +3552 +3553 +3554 +3555 +3556 +3557 +3558 +3559 +3560 +3561 +3562 +3563 +3564 +3565 +3566 +3567 +3568 +3569 +3570 +3571 +3572 +3573 +3574 +3575 +3576 +3577 +3578 +3579 +3580 +3581 +3582 +3583 +3584 +3585 +3586 +3587 +3588 +3589 +3590 +3591 +3592 +3593 +3594 +3595 +3596 +3597 +3598 +3599 +3600 +3601 +3602 +3603 +3604 +3605 +3606 +3607 +3608 +3609 +3610 +3611 +3612 +3613 +3614 +3615 +3616 +3617 +3618 +3619 +3620 +3621 +3622 +3623 +3624 +3625 +3626 +3627 +3628 +3629 +3630 +3631 +3632 +3633 +3634 +3635 +3636 +3637 +3638 +3639 +3640 +3641 +3642 +3643 +3644 +3645 +3646 +3647 +3648 +3649 +3650 +3651 +3652 +3653 +3654 +3655 +3656 +3657 +3658 +3659 +3660 +3661 +3662 +3663 +3664 +3665 +3666 +3667 +3668 +3669 +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +3682 +3683 +3684 +3685 +3686 +3687 +3688 +3689 +3690 +3691 +3692 +3693 +3694 +3695 +3696 +3697 +3698 +3699 +3700 +3701 +3702 +3703 +3704 +3705 +3706 +3707 +3708 +3709 +3710 +3711 +3712 +3713 +3714 +3715 +3716 +3717 +3718 +3719 +3720 +3721 +3722 +3723 +3724 +3725 +3726 +3727 +3728 +3729 +3730 +3731 +3732 +3733 +3734 +3735 +3736 +3737 +3738 +3739 +3740 +3741 +3742 +3743 +3744 +3745 +3746 +3747 +3748 +3749 +3750 +3751 +3752 +3753 +3754 +3755 +3756 +3757 +3758 +3759 +3760 +3761 +3762 +3763 +3764 +3765 +3766 +3767 +3768 +3769 +3770 +3771 +3772 +3773 +3774 +3775 +3776 +3777 +3778 +3779 +3780 +3781 +3782 +3783 +3784 +3785 +3786 +3787 +3788 +3789 +3790 +3791 +3792 +3793 +3794 +3795 +3796 +3797 +3798 +3799 +3800 +3801 +3802 +3803 +3804 +3805 +3806 +3807 +3808 +3809 +3810 +3811 +3812 +3813 +3814 +3815 +3816 +3817 +3818 +3819 +3820 +3821 +3822 +3823 +3824 +3825 +3826 +3827 +3828 +3829 +3830 +3831 +3832 +3833 +3834 +3835 +3836 +3837 +3838 +3839 +3840 +3841 +3842 +3843 +3844 +3845 +3846 +3847 +3848 +3849 +3850 +3851 +3852 +3853 +3854 +3855 +3856 +3857 +3858 +3859 +3860 +3861 +3862 +3863 +3864 +3865 +3866 +3867 +3868 +3869 +3870 +3871 +3872 +3873 +3874 +3875 +3876 +3877 +3878 +3879 +3880 +3881 +3882 +3883 +3884 +3885 +3886 +3887 +3888 +3889 +3890 +3891 +3892 +3893 +3894 +3895 +3896 +3897 +3898 +3899 +3900 +3901 +3902 +3903 +3904 +3905 +3906 +3907 +3908 +3909 +3910 +3911 +3912 +3913 +3914 +3915 +3916 +3917 +3918 +3919 +3920 +3921 +3922 +3923 +3924 +3925 +3926 +3927 +3928 +3929 +3930 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +3938 +3939 +3940 +3941 +3942 +3943 +3944 +3945 +3946 +3947 +3948 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +3957 +3958 +3959 +3960 +3961 +3962 +3963 +3964 +3965 +3966 +3967 +3968 +3969 +3970 +3971 +3972 +3973 +3974 +3975 +3976 +3977 +3978 +3979 +3980 +3981 +3982 +3983 +3984 +3985 +3986 +3987 +3988 +3989 +3990 +3991 +3992 +3993 +3994 +3995 +3996 +3997 +3998 +3999 +4000 +4001 +4002 +4003 +4004 +4005 +4006 +4007 +4008 +4009 +4010 +4011 +4012 +4013 +4014 +4015 +4016 +4017 +4018 +4019 +4020 +4021 +4022 +4023 +4024 +4025 +4026 +4027 +4028 +4029 +4030 +4031 +4032 +4033 +4034 +4035 +4036 +4037 +4038 +4039 +4040 +4041 +4042 +4043 +4044 +4045 +4046 +4047 +4048 +4049 +4050 +4051 +4052 +4053 +4054 +4055 +4056 +4057 +4058 +4059 +4060 +4061 +4062 +4063 +4064 +4065 +4066 +4067 +4068 +4069 +4070 +4071 +4072 +4073 +4074 +4075 +4076 +4077 +4078 +4079 +4080 +4081 +4082 +4083 +4084 +4085 +4086 +4087 +4088 +4089 +4090 +4091 +4092 +4093 +4094 +4095 +4096 +4097 +4098 +4099 +4100 +4101 +4102 +4103 +4104 +4105 +4106 +4107 +4108 +4109 +4110 +4111 +4112 +4113 +4114 +4115 +4116 +4117 +4118 +4119 +4120 +4121 +4122 +4123 +4124 +4125 +4126 +4127 +4128 +4129 +4130 +4131 +4132 +4133 +4134 +4135 +4136 +4137 +4138 +4139 +4140 +4141 +4142 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +4150 +4151 +4152 +4153 +4154 +4155 +4156 +4157 +4158 +4159 +4160 +4161 +4162 +4163 +4164 +4165 +4166 +4167 +4168 +4169 +4170 +4171 +4172 +4173 +4174 +4175 +4176 +4177 +4178 +4179 +4180 +4181 +4182 +4183 +4184 +4185 +4186 +4187 +4188 +4189 +4190 +4191 +4192 +4193 +4194 +4195 +4196 +4197 +4198 +4199 +4200 +4201 +4202 +4203 +4204 +4205 +4206 +4207 +4208 +4209 +4210 +4211 +4212 +4213 +4214 +4215 +4216 +4217 +4218 +4219 +4220 +4221 +4222 +4223 +4224 +4225 +4226 +4227 +4228 +4229 +4230 +4231 +4232 +4233 +4234 +4235 +4236 +4237 +4238 +4239 +4240 +4241 +4242 +4243 +4244 +4245 +4246 +4247 +4248 +4249 +4250 +4251 +4252 +4253 +4254 +4255 +4256 +4257 +4258 +4259 +4260 +4261 +4262 +4263 +4264 +4265 +4266 +4267 +4268 +4269 +4270 +4271 +4272 +4273 +4274 +4275 +4276 +4277 +4278 +4279 +4280 +4281 +4282 +4283 +4284 +4285 +4286 +4287 +4288 +4289 +4290 +4291 +4292 +4293 +4294 +4295 +4296 +4297 +4298 +4299 +4300 +4301 +4302 +4303 +4304 +4305 +4306 +4307 +4308 +4309 +4310 +4311 +4312 +4313 +4314 +4315 +4316 +4317 +4318 +4319 +4320 +4321 +4322 +4323 +4324 +4325 +4326 +4327 +4328 +4329 +4330 +4331 +4332 +4333 +4334 +4335 +4336 +4337 +4338 +4339 +4340 +4341 +4342 +4343 +4344 +4345 +4346 +4347 +4348 +4349 +4350 +4351 +4352 +4353 +4354 +4355 +4356 +4357 +4358 +4359 +4360 +4361 +4362 +4363 +4364 +4365 +4366 +4367 +4368 +4369 +4370 +4371 +4372 +4373 +4374 +4375 +4376 +4377 +4378 +4379 +4380 +4381 +4382 +4383 +4384 +4385 +4386 +4387 +4388 +4389 +4390 +4391 +4392 +4393 +4394 +4395 +4396 +4397 +4398 +4399 +4400 +4401 +4402 +4403 +4404 +4405 +4406 +4407 +4408 +4409 +4410 +4411 +4412 +4413 +4414 +4415 +4416 +4417 +4418 +4419 +4420 +4421 +4422 +4423 +4424 +4425 +4426 +4427 +4428 +4429 +4430 +4431 +4432 +4433 +4434 +4435 +4436 +4437 +4438 +4439 +4440 +4441 +4442 +4443 +4444 +4445 +4446 +4447 +4448 +4449 +4450 +4451 +4452 +4453 +4454 +4455 +4456 +4457 +4458 +4459 +4460 +4461 +4462 +4463 +4464 +4465 +4466 +4467 +4468 +4469 +4470 +4471 +4472 +4473 +4474 +4475 +4476 +4477 +4478 +4479 +4480 +4481 +4482 +4483 +4484 +4485 +4486 +4487 +4488 +4489 +4490 +4491 +4492 +4493 +4494 +4495 +4496 +4497 +4498 +4499 +4500 +4501 +4502 +4503 +4504 +4505 +4506 +4507 +4508 +4509 +4510 +4511 +4512 +4513 +4514 +4515 +4516 +4517 +4518 +4519 +4520 +4521 +4522 +4523 +4524 +4525 +4526 +4527 +4528 +4529 +4530 +4531 +4532 +4533 +4534 +4535 +4536 +4537 +4538 +4539 +4540 +4541 +4542 +4543 +4544 +4545 +4546 +4547 +4548 +4549 +4550 +4551 +4552 +4553 +4554 +4555 +4556 +4557 +4558 +4559 +4560 +4561 +4562 +4563 +4564 +4565 +4566 +4567 +4568 +4569 +4570 +4571 +4572 +4573 +4574 +4575 +4576 +4577 +4578 +4579 +4580 +4581 +4582 +4583 +4584 +4585 +4586 +4587 +4588 +4589 +4590 +4591 +4592 +4593 +4594 +4595 +4596 +4597 +4598 +4599 +4600 +4601 +4602 +4603 +4604 +4605 +4606 +4607 +4608 +4609 +4610 +4611 +4612 +4613 +4614 +4615 +4616 +4617 +4618 +4619 +4620 +4621 +4622 +4623 +4624 +4625 +4626 +4627 +4628 +4629 +4630 +4631 +4632 +4633 +4634 +4635 +4636 +4637 +4638 +4639 +4640 +4641 +4642 +4643 +4644 +4645 +4646 +4647 +4648 +4649 +4650 +4651 +4652 +4653 +4654 +4655 +4656 +4657 +4658 +4659 +4660 +4661 +4662 +4663 +4664 +4665 +4666 +4667 +4668 +4669 +4670 +4671 +4672 +4673 +4674 +4675 +4676 +4677 +4678 +4679 +4680 +4681 +4682 +4683 +4684 +4685 +4686 +4687 +4688 +4689 +4690 +4691 +4692 +4693 +4694 +4695 +4696 +4697 +4698 +4699 +4700 +4701 +4702 +4703 +4704 +4705 +4706 +4707 +4708 +4709 +4710 +4711 +4712 +4713 +4714 +4715 +4716 +4717 +4718 +4719 +4720 +4721 +4722 +4723 +4724 +4725 +4726 +4727 +4728 +4729 +4730 +4731 +4732 +4733 +4734 +4735 +4736 +4737 +4738 +4739 +4740 +4741 +4742 +4743 +4744 +4745 +4746 +4747 +4748 +4749 +4750 +4751 +4752 +4753 +4754 +4755 +4756 +4757 +4758 +4759 +4760 +4761 +4762 +4763 +4764 +4765 +4766 +4767 +4768 +4769 +4770 +4771 +4772 +4773 +4774 +4775 +4776 +4777 +4778 +4779 +4780 +4781 +4782 +4783 +4784 +4785 +4786 +4787 +4788 +4789 +4790 +4791 +4792 +4793 +4794 +4795 +4796 +4797 +4798 +4799 +4800 +4801 +4802 +4803 +4804 +4805 +4806 +4807 +4808 +4809 +4810 +4811 +4812 +4813 +4814 +4815 +4816 +4817 +4818 +4819 +4820 +4821 +4822 +4823 +4824 +4825 +4826 +4827 +4828 +4829 +4830 +4831 +4832 +4833 +4834 +4835 +4836 +4837 +4838 +4839 +4840 +4841 +4842 +4843 +4844 +4845 +4846 +4847 +4848 +4849 +4850 +4851 +4852 +4853 +4854 +4855 +4856 +4857 +4858 +4859 +4860 +4861 +4862 +4863 +4864 +4865 +4866 +4867 +4868 +4869 +4870 +4871 +4872 +4873 +4874 +4875 +4876 +4877 +4878 +4879 +4880 +4881 +4882 +4883 +4884 +4885 +4886 +4887 +4888 +4889 +4890 +4891 +4892 +4893 +4894 +4895 +4896 +4897 +4898 +4899 +4900 +4901 +4902 +4903 +4904 +4905 +4906 +4907 +4908 +4909 +4910 +4911 +4912 +4913 +4914 +4915 +4916 +4917 +4918 +4919 +4920 +4921 +4922 +4923 +4924 +4925 +4926 +4927 +4928 +4929 +4930 +4931 +4932 +4933 +4934 +4935 +4936 +4937 +4938 +4939 +4940 +4941 +4942 +4943 +4944 +4945 +4946 +4947 +4948 +4949 +4950 +4951 +4952 +4953 +4954 +4955 +4956 +4957 +4958 +4959 +4960 +4961 +4962 +4963 +4964 +4965 +4966 +4967 +4968 +4969 +4970 +4971 +4972 +4973 +4974 +4975 +4976 +4977 +4978 +4979 +4980 +4981 +4982 +4983 +4984 +4985 +4986 +4987 +4988 +4989 +4990 +4991 +4992 +4993 +4994 +4995 +4996 +4997 +4998 +4999 +5000 +5001 +5002 +5003 +5004 +5005 +5006 +5007 +5008 +5009 +5010 +5011 +5012 +5013 +5014 +5015 +5016 +5017 +5018 +5019 +5020 +5021 +5022 +5023 +5024 +5025 +5026 +5027 +5028 +5029 +5030 +5031 +5032 +5033 +5034 +5035 +5036 +5037 +5038 +5039 +5040 +5041 +5042 +5043 +5044 +5045 +5046 +5047 +5048 +5049 +5050 +5051 +5052 +5053 +5054 +5055 +5056 +5057 +5058 +5059 +5060 +5061 +5062 +5063 +5064 +5065 +5066 +5067 +5068 +5069 +5070 +5071 +5072 +5073 +5074 +5075 +5076 +5077 +5078 +5079 +5080 +5081 +5082 +5083 +5084 +5085 +5086 +5087 +5088 +5089 +5090 +5091 +5092 +5093 +5094 +5095 +5096 +5097 +5098 +5099 +5100 +5101 +5102 +5103 +5104 +5105 +5106 +5107 +5108 +5109 +5110 +5111 +5112 +5113 +5114 +5115 +5116 +5117 +5118 +5119 +5120 +5121 +5122 +5123 +5124 +5125 +5126 +5127 +5128 +5129 +5130 +5131 +5132 +5133 +5134 +5135 +5136 +5137 +5138 +5139 +5140 +5141 +5142 +5143 +5144 +5145 +5146 +5147 +5148 +5149 +5150 +5151 +5152 +5153 +5154 +5155 +5156 +5157 +5158 +5159 +5160 +5161 +5162 +5163 +5164 +5165 +5166 +5167 +5168 +5169 +5170 +5171 +5172 +5173 +5174 +5175 +5176 +5177 +5178 +5179 +5180 +5181 +5182 +5183 +5184 +5185 +5186 +5187 +5188 +5189 +5190 +5191 +5192 +5193 +5194 +5195 +5196 +5197 +5198 +5199 +5200 +5201 +5202 +5203 +5204 +5205 +5206 +5207 +5208 +5209 +5210 +5211 +5212 +5213 +5214 +5215 +5216 +5217 +5218 +5219 +5220 +5221 +5222 +5223 +5224 +5225 +5226 +5227 +5228 +5229 +5230 +5231 +5232 +5233 +5234 +5235 +5236 +5237 +5238 +5239 +5240 +5241 +5242 +5243 +5244 +5245 +5246 +5247 +5248 +5249 +5250 +5251 +5252 +5253 +5254 +5255 +5256 +5257 +5258 +5259 +5260 +5261 +5262 +5263 +5264 +5265 +5266 +5267 +5268 +5269 +5270 +5271 +5272 +5273 +5274 +5275 +5276 +5277 +5278 +5279 +5280 +5281 +5282 +5283 +5284 +5285 +5286 +5287 +5288 +5289 +5290 +5291 +5292 +5293 +5294 +5295 +5296 +5297 +5298 +5299 +5300 +5301 +5302 +5303 +5304 +5305 +5306 +5307 +5308 +5309 +5310 +5311 +5312 +5313 +5314 +5315 +5316 +5317 +5318 +5319 +5320 +5321 +5322 +5323 +5324 +5325 +5326 +5327 +5328 +5329 +5330 +5331 +5332 +5333 +5334 +5335 +5336 +5337 +5338 +5339 +5340 +5341 +5342 +5343 +5344 +5345 +5346 +5347 +5348 +5349 +5350 +5351 +5352 +5353 +5354 +5355 +5356 +5357 +5358 +5359 +5360 +5361 +5362 +5363 +5364 +5365 +5366 +5367 +5368 +5369 +5370 +5371 +5372 +5373 +5374 +5375 +5376 +5377 +5378 +5379 +5380 +5381 +5382 +5383 +5384 +5385 +5386 +5387 +5388 +5389 +5390 +5391 +5392 +5393 +5394 +5395 +5396 +5397 +5398 +5399 +5400 +5401 +5402 +5403 +5404 +5405 +5406 +5407 +5408 +5409 +5410 +5411 +5412 +5413 +5414 +5415 +5416 +5417 +5418 +5419 +5420 +5421 +5422 +5423 +5424 +5425 +5426 +5427 +5428 +5429 +5430 +5431 +5432 +5433 +5434 +5435 +5436 +5437 +5438 +5439 +5440 +5441 +5442 +5443 +5444 +5445 +5446 +5447 +5448 +5449 +5450 +5451 +5452 +5453 +5454 +5455 +5456 +5457 +5458 +5459 +5460 +5461 +5462 +5463 +5464 +5465 +5466 +5467 +5468 +5469 +5470 +5471 +5472 +5473 +5474 +5475 +5476 +5477 +5478 +5479 +5480 +5481 +5482 +5483 +5484 +5485 +5486 +5487 +5488 +5489 +5490 +5491 +5492 +5493 +5494 +5495 +5496 +5497 +5498 +5499 +5500 +5501 +5502 +5503 +5504 +5505 +5506 +5507 +5508 +5509 +5510 +5511 +5512 +5513 +5514 +5515 +5516 +5517 +5518 +5519 +5520 +5521 +5522 +5523 +5524 +5525 +5526 +5527 +5528 +5529 +5530 +5531 +5532 +5533 +5534 +5535 +5536 +5537 +5538 +5539 +5540 +5541 +5542 +5543 +5544 +5545 +5546 +5547 +5548 +5549 +5550 +5551 +5552 +5553 +5554 +5555 +5556 +5557 +5558 +5559 +5560 +5561 +5562 +5563 +5564 +5565 +5566 +5567 +5568 +5569 +5570 +5571 +5572 +5573 +5574 +5575 +5576 +5577 +5578 +5579 +5580 +5581 +5582 +5583 +5584 +5585 +5586 +5587 +5588 +5589 +5590 +5591 +5592 +5593 +5594 +5595 +5596 +5597 +5598 +5599 +5600 +5601 +5602 +5603 +5604 +5605 +5606 +5607 +5608 +5609 +5610 +5611 +5612 +5613 +5614 +5615 +5616 +5617 +5618 +5619 +5620 +5621 +5622 +5623 +5624 +5625 +5626 +5627 +5628 +5629 +5630 +5631 +5632 +5633 +5634 +5635 +5636 +5637 +5638 +5639 +5640 +5641 +5642 +5643 +5644 +5645 +5646 +5647 +5648 +5649 +5650 +5651 +5652 +5653 +5654 +5655 +5656 +5657 +5658 +5659 +5660 +5661 +5662 +5663 +5664 +5665 +5666 +5667 +5668 +5669 +5670 +5671 +5672 +5673 +5674 +5675 +5676 +5677 +5678 +5679 +5680 +5681 +5682 +5683 +5684 +5685 +5686 +5687 +5688 +5689 +5690 +5691 +5692 +5693 +5694 +5695 +5696 +5697 +5698 +5699 +5700 +5701 +5702 +5703 +5704 +5705 +5706 +5707 +5708 +5709 +5710 +5711 +5712 +5713 +5714 +5715 +5716 +5717 +5718 +5719 +5720 +5721 +5722 +5723 +5724 +5725 +5726 +5727 +5728 +5729 +5730 +5731 +5732 +5733 +5734 +5735 +5736 +5737 +5738 +5739 +5740 +5741 +5742 +5743 +5744 +5745 +5746 +5747 +5748 +5749 +5750 +5751 +5752 +5753 +5754 +5755 +5756 +5757 +5758 +5759 +5760 +5761 +5762 +5763 +5764 +5765 +5766 +5767 +5768 +5769 +5770 +5771 +5772 +5773 +5774 +5775 +5776 +5777 +5778 +5779 +5780 +5781 +5782 +5783 +5784 +5785 +5786 +5787 +5788 +5789 +5790 +5791 +5792 +5793 +5794 +5795 +5796 +5797 +5798 +5799 +5800 +5801 +5802 +5803 +5804 +5805 +5806 +5807 +5808 +5809 +5810 +5811 +5812 +5813 +5814 +5815 +5816 +5817 +5818 +5819 +5820 +5821 +5822 +5823 +5824 +5825 +5826 +5827 +5828 +5829 +5830 +5831 +5832 +5833 +5834 +5835 +5836 +5837 +5838 +5839 +5840 +5841 +5842 +5843 +5844 +5845 +5846 +5847 +5848 +5849 +5850 +5851 +5852 +5853 +5854 +5855 +5856 +5857 +5858 +5859 +5860 +5861 +5862 +5863 +5864 +5865 +5866 +5867 +5868 +5869 +5870 +5871 +5872 +5873 +5874 +5875 +5876 +5877 +5878 +5879 +5880 +5881 +5882 +5883 +5884 +5885 +5886 +5887 +5888 +5889 +5890 +5891 +5892 +5893 +5894 +5895 +5896 +5897 +5898 +5899 +5900 +5901 +5902 +5903 +5904 +5905 +5906 +5907 +5908 +5909 +5910 +5911 +5912 +5913 +5914 +5915 +5916 +5917 +5918 +5919 +5920 +5921 +5922 +5923 +5924 +5925 +5926 +5927 +5928 +5929 +5930 +5931 +5932 +5933 +5934 +5935 +5936 +5937 +5938 +5939 +5940 +5941 +5942 +5943 +5944 +5945 +5946 +5947 +5948 +5949 +5950 +5951 +5952 +5953 +5954 +5955 +5956 +5957 +5958 +5959 +5960 +5961 +5962 +5963 +5964 +5965 +5966 +5967 +5968 +5969 +5970 +5971 +5972 +5973 +5974 +5975 +5976 +5977 +5978 +5979 +5980 +5981 +5982 +5983 +5984 +5985 +5986 +5987 +5988 +5989 +5990 +5991 +5992 +5993 +5994 +5995 +5996 +5997 +5998 +5999 +6000 +6001 +6002 +6003 +6004 +6005 +6006 +6007 +6008 +6009 +6010 +6011 +6012 +6013 +6014 +6015 +6016 +6017 +6018 +6019 +6020 +6021 +6022 +6023 +6024 +6025 +6026 +6027 +6028 +6029 +6030 +6031 +6032 +6033 +6034 +6035 +6036 +6037 +6038 +6039 +6040 +6041 +6042 +6043 +6044 +6045 +6046 +6047 +6048 +6049 +6050 +6051 +6052 +6053 +6054 +6055 +6056 +6057 +6058 +6059 +6060 +6061 +6062 +6063 +6064 +6065 +6066 +6067 +6068 +6069 +6070 +6071 +6072 +6073 +6074 +6075 +6076 +6077 +6078 +6079 +6080 +6081 +6082 +6083 +6084 +6085 +6086 +6087 +6088 +6089 +6090 +6091 +6092 +6093 +6094 +6095 +6096 +6097 +6098 +6099 +6100 +6101 +6102 +6103 +6104 +6105 +6106 +6107 +6108 +6109 +6110 +6111 +6112 +6113 +6114 +6115 +6116 +6117 +6118 +6119 +6120 +6121 +6122 +6123 +6124 +6125 +6126 +6127 +6128 +6129 +6130 +6131 +6132 +6133 +6134 +6135 +6136 +6137 +6138 +6139 +6140 +6141 +6142 +6143 +6144 +6145 +6146 +6147 +6148 +6149 +6150 +6151 +6152 +6153 +6154 +6155 +6156 +6157 +6158 +6159 +6160 +6161 +6162 +6163 +6164 +6165 +6166 +6167 +6168 +6169 +6170 +6171 +6172 +6173 +6174 +6175 +6176 +6177 +6178 +6179 +6180 +6181 +6182 +6183 +6184 +6185 +6186 +6187 +6188 +6189 +6190 +6191 +6192 +6193 +6194 +6195 +6196 +6197 +6198 +6199 +6200 +6201 +6202 +6203 +6204 +6205 +6206 +6207 +6208 +6209 +6210 +6211 +6212 +6213 +6214 +6215 +6216 +6217 +6218 +6219 +6220 +6221 +6222 +6223 +6224 +6225 +6226 +6227 +6228 +6229 +6230 +6231 +6232 +6233 +6234 +6235 +6236 +6237 +6238 +6239 +6240 +6241 +6242 +6243 +6244 +6245 +6246 +6247 +6248 +6249 +6250 +6251 +6252 +6253 +6254 +6255 +6256 +6257 +6258 +6259 +6260 +6261 +6262 +6263 +6264 +6265 +6266 +6267 +6268 +6269 +6270 +6271 +6272 +6273 +6274 +6275 +6276 +6277 +6278 +6279 +6280 +6281 +6282 +6283 +6284 +6285 +6286 +6287 +6288 +6289 +6290 +6291 +6292 +6293 +6294 +6295 +6296 +6297 +6298 +6299 +6300 +6301 +6302 +6303 +6304 +6305 +6306 +6307 +6308 +6309 +6310 +6311 +6312 +6313 +6314 +6315 +6316 +6317 +6318 +6319 +6320 +6321 +6322 +6323 +6324 +6325 +6326 +6327 +6328 +6329 +6330 +6331 +6332 +6333 +6334 +6335 +6336 +6337 +6338 +6339 +6340 +6341 +6342 +6343 +6344 +6345 +6346 +6347 +6348 +6349 +6350 +6351 +6352 +6353 +6354 +6355 +6356 +6357 +6358 +6359 +6360 +6361 +6362 +6363 +6364 +6365 +6366 +6367 +6368 +6369 +6370 +6371 +6372 +6373 +6374 +6375 +6376 +6377 +6378 +6379 +6380 +6381 +6382 +6383 +6384 +6385 +6386 +6387 +6388 +6389 +6390 +6391 +6392 +6393 +6394 +6395 +6396 +6397 +6398 +6399 +6400 +6401 +6402 +6403 +6404 +6405 +6406 +6407 +6408 +6409 +6410 +6411 +6412 +6413 +6414 +6415 +6416 +6417 +6418 +6419 +6420 +6421 +6422 +6423 +6424 +6425 +6426 +6427 +6428 +6429 +6430 +6431 +6432 +6433 +6434 +6435 +6436 +6437 +6438 +6439 +6440 +6441 +6442 +6443 +6444 +6445 +6446 +6447 +6448 +6449 +6450 +6451 +6452 +6453 +6454 +6455 +6456 +6457 +6458 +6459 +6460 +6461 +6462 +6463 +6464 +6465 +6466 +6467 +6468 +6469 +6470 +6471 +6472 +6473 +6474 +6475 +6476 +6477 +6478 +6479 +6480 +6481 +6482 +6483 +6484 +6485 +6486 +6487 +6488 +6489 +6490 +6491 +6492 +6493 +6494 +6495 +6496 +6497 +6498 +6499 +6500 +6501 +6502 +6503 +6504 +6505 +6506 +6507 +6508 +6509 +6510 +6511 +6512 +6513 +6514 +6515 +6516 +6517 +6518 +6519 +6520 +6521 +6522 +6523 +6524 +6525 +6526 +6527 +6528 +6529 +6530 +6531 +6532 +6533 +6534 +6535 +6536 +6537 +6538 +6539 +6540 +6541 +6542 +6543 +6544 +6545 +6546 +6547 +6548 +6549 +6550 +6551 +6552 +6553 +6554 +6555 +6556 +6557 +6558 +6559 +6560 +6561 +6562 +6563 +6564 +6565 +6566 +6567 +6568 +6569 +6570 +6571 +6572 +6573 +6574 +6575 +6576 +6577 +6578 +6579 +6580 +6581 +6582 +6583 +6584 +6585 +6586 +6587 +6588 +6589 +6590 +6591 +6592 +6593 +6594 +6595 +6596 +6597 +6598 +6599 +6600 +6601 +6602 +6603 +6604 +6605 +6606 +6607 +6608 +6609 +6610 +6611 +6612 +6613 +6614 +6615 +6616 +6617 +6618 +6619 +6620 +6621 +6622 +6623 +6624 +6625 +6626 +6627 +6628 +6629 +6630 +6631 +6632 +6633 +6634 +6635 +6636 +6637 +6638 +6639 +6640 +6641 +6642 +6643 +6644 +6645 +6646 +6647 +6648 +6649 +6650 +6651 +6652 +6653 +6654 +6655 +6656 +6657 +6658 +6659 +6660 +6661 +6662 +6663 +6664 +6665 +6666 +6667 +6668 +6669 +6670 +6671 +6672 +6673 +6674 +6675 +6676 +6677 +6678 +6679 +6680 +6681 +6682 +6683 +6684 +6685 +6686 +6687 +6688 +6689 +6690 +6691 +6692 +6693 +6694 +6695 +6696 +6697 +6698 +6699 +6700 +6701 +6702 +6703 +6704 +6705 +6706 +6707 +6708 +6709 +6710 +6711 +6712 +6713 +6714 +6715 +6716 +6717 +6718 +6719 +6720 +6721 +6722 +6723 +6724 +6725 +6726 +6727 +6728 +6729 +6730 +6731 +6732 +6733 +6734 +6735 +6736 +6737 +6738 +6739 +6740 +6741 +6742 +6743 +6744 +6745 +6746 +6747 +6748 +6749 +6750 +6751 +6752 +6753 +6754 +6755 +6756 +6757 +6758 +6759 +6760 +6761 +6762 +6763 +6764 +6765 +6766 +6767 +6768 +6769 +6770 +6771 +6772 +6773 +6774 +6775 +6776 +6777 +6778 +6779 +6780 +6781 +6782 +6783 +6784 +6785 +6786 +6787 +6788 +6789 +6790 +6791 +6792 +6793 +6794 +6795 +6796 +6797 +6798 +6799 +6800 +6801 +6802 +6803 +6804 +6805 +6806 +6807 +6808 +6809 +6810 +6811 +6812 +6813 +6814 +6815 +6816 +6817 +6818 +6819 +6820 +6821 +6822 +6823 +6824 +6825 +6826 +6827 +6828 +6829 +6830 +6831 +6832 +6833 +6834 +6835 +6836 +6837 +6838 +6839 +6840 +6841 +6842 +6843 +6844 +6845 +6846 +6847 +6848 +6849 +6850 +6851 +6852 +6853 +6854 +6855 +6856 +6857 +6858 +6859 +6860 +6861 +6862 +6863 +6864 +6865 +6866 +6867 +6868 +6869 +6870 +6871 +6872 +6873 +6874 +6875 +6876 +6877 +6878 +6879 +6880 +6881 +6882 +6883 +6884 +6885 +6886 +6887 +6888 +6889 +6890 +6891 +6892 +6893 +6894 +6895 +6896 +6897 +6898 +6899 +6900 +6901 +6902 +6903 +6904 +6905 +6906 +6907 +6908 +6909 +6910 +6911 +6912 +6913 +6914 +6915 +6916 +6917 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6928 +6929 +6930 +6931 +6932 +6933 +6934 +6935 +6936 +6937 +6938 +6939 +6940 +6941 +6942 +6943 +6944 +6945 +6946 +6947 +6948 +6949 +6950 +6951 +6952 +6953 +6954 +6955 +6956 +6957 +6958 +6959 +6960 +6961 +6962 +6963 +6964 +6965 +6966 +6967 +6968 +6969 +6970 +6971 +6972 +6973 +6974 +6975 +6976 +6977 +6978 +6979 +6980 +6981 +6982 +6983 +6984 +6985 +6986 +6987 +6988 +6989 +6990 +6991 +6992 +6993 +6994 +6995 +6996 +6997 +6998 +6999 +7000 +7001 +7002 +7003 +7004 +7005 +7006 +7007 +7008 +7009 +7010 +7011 +7012 +7013 +7014 +7015 +7016 +7017 +7018 +7019 +7020 +7021 +7022 +7023 +7024 +7025 +7026 +7027 +7028 +7029 +7030 +7031 +7032 +7033 +7034 +7035 +7036 +7037 +7038 +7039 +7040 +7041 +7042 +7043 +7044 +7045 +7046 +7047 +7048 +7049 +7050 +7051 +7052 +7053 +7054 +7055 +7056 +7057 +7058 +7059 +7060 +7061 +7062 +7063 +7064 +7065 +7066 +7067 +7068 +7069 +7070 +7071 +7072 +7073 +7074 +7075 +7076 +7077 +7078 +7079 +7080 +7081 +7082 +7083 +7084 +7085 +7086 +7087 +7088 +7089 +7090 +7091 +7092 +7093 +7094 +7095 +7096 +7097 +7098 +7099 +7100 +7101 +7102 +7103 +7104 +7105 +7106 +7107 +7108 +7109 +7110 +7111 +7112 +7113 +7114 +7115 +7116 +7117 +7118 +7119 +7120 +7121 +7122 +7123 +7124 +7125 +7126 +7127 +7128 +7129 +7130 +7131 +7132 +7133 +7134 +7135 +7136 +7137 +7138 +7139 +7140 +7141 +7142 +7143 +7144 +7145 +7146 +7147 +7148 +7149 +7150 +7151 +7152 +7153 +7154 +7155 +7156 +7157 +7158 +7159 +7160 +7161 +7162 +7163 +7164 +7165 +7166 +7167 +7168 +7169 +7170 +7171 +7172 +7173 +7174 +7175 +7176 +7177 +7178 +7179 +7180 +7181 +7182 +7183 +7184 +7185 +7186 +7187 +7188 +7189 +7190 +7191 +7192 +7193 +7194 +7195 +7196 +7197 +7198 +7199 +7200 +7201 +7202 +7203 +7204 +7205 +7206 +7207 +7208 +7209 +7210 +7211 +7212 +7213 +7214 +7215 +7216 +7217 +7218 +7219 +7220 +7221 +7222 +7223 +7224 +7225 +7226 +7227 +7228 +7229 +7230 +7231 +7232 +7233 +7234 +7235 +7236 +7237 +7238 +7239 +7240 +7241 +7242 +7243 +7244 +7245 +7246 +7247 +7248 +7249 +7250 +7251 +7252 +7253 +7254 +7255 +7256 +7257 +7258 +7259 +7260 +7261 +7262 +7263 +7264 +7265 +7266 +7267 +7268 +7269 +7270 +7271 +7272 +7273 +7274 +7275 +7276 +7277 +7278 +7279 +7280 +7281 +7282 +7283 +7284 +7285 +7286 +7287 +7288 +7289 +7290 +7291 +7292 +7293 +7294 +7295 +7296 +7297 +7298 +7299 +7300 +7301 +7302 +7303 +7304 +7305 +7306 +7307 +7308 +7309 +7310 +7311 +7312 +7313 +7314 +7315 +7316 +7317 +7318 +7319 +7320 +7321 +7322 +7323 +7324 +7325 +7326 +7327 +7328 +7329 +7330 +7331 +7332 +7333 +7334 +7335 +7336 +7337 +7338 +7339 +7340 +7341 +7342 +7343 +7344 +7345 +7346 +7347 +7348 +7349 +7350 +7351 +7352 +7353 +7354 +7355 +7356 +7357 +7358 +7359 +7360 +7361 +7362 +7363 +7364 +7365 +7366 +7367 +7368 +7369 +7370 +7371 +7372 +7373 +7374 +7375 +7376 +7377 +7378 +7379 +7380 +7381 +7382 +7383 +7384 +7385 +7386 +7387 +7388 +7389 +7390 +7391 +7392 +7393 +7394 +7395 +7396 +7397 +7398 +7399 +7400 +7401 +7402 +7403 +7404 +7405 +7406 +7407 +7408 +7409 +7410 +7411 +7412 +7413 +7414 +7415 +7416 +7417 +7418 +7419 +7420 +7421 +7422 +7423 +7424 +7425 +7426 +7427 +7428 +7429 +7430 +7431 +7432 +7433 +7434 +7435 +7436 +7437 +7438 +7439 +7440 +7441 +7442 +7443 +7444 +7445 +7446 +7447 +7448 +7449 +7450 +7451 +7452 +7453 +7454 +7455 +7456 +7457 +7458 +7459 +7460 +7461 +7462 +7463 +7464 +7465 +7466 +7467 +7468 +7469 +7470 +7471 +7472 +7473 +7474 +7475 +7476 +7477 +7478 +7479 +7480 +7481 +7482 +7483 +7484 +7485 +7486 +7487 +7488 +7489 +7490 +7491 +7492 +7493 +7494 +7495 +7496 +7497 +7498 +7499 +7500 +7501 +7502 +7503 +7504 +7505 +7506 +7507 +7508 +7509 +7510 +7511 +7512 +7513 +7514 +7515 +7516 +7517 +7518 +7519 +7520 +7521 +7522 +7523 +7524 +7525 +7526 +7527 +7528 +7529 +7530 +7531 +7532 +7533 +7534 +7535 +7536 +7537 +7538 +7539 +7540 +7541 +7542 +7543 +7544 +7545 +7546 +7547 +7548 +7549 +7550 +7551 +7552 +7553 +7554 +7555 +7556 +7557 +7558 +7559 +7560 +7561 +7562 +7563 +7564 +7565 +7566 +7567 +7568 +7569 +7570 +7571 +7572 +7573 +7574 +7575 +7576 +7577 +7578 +7579 +7580 +7581 +7582 +7583 +7584 +7585 +7586 +7587 +7588 +7589 +7590 +7591 +7592 +7593 +7594 +7595 +7596 +7597 +7598 +7599 +7600 +7601 +7602 +7603 +7604 +7605 +7606 +7607 +7608 +7609 +7610 +7611 +7612 +7613 +7614 +7615 +7616 +7617 +7618 +7619 +7620 +7621 +7622 +7623 +7624 +7625 +7626 +7627 +7628 +7629 +7630 +7631 +7632 +7633 +7634 +7635 +7636 +7637 +7638 +7639 +7640 +7641 +7642 +7643 +7644 +7645 +7646 +7647 +7648 +7649 +7650 +7651 +7652 +7653 +7654 +7655 +7656 +7657 +7658 +7659 +7660 +7661 +7662 +7663 +7664 +7665 +7666 +7667 +7668 +7669 +7670 +7671 +7672 +7673 +7674 +7675 +7676 +7677 +7678 +7679 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7830 +7831 +7832 +7833 +7834 +7835 +7836 +7837 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7936 +7937 +7938 +7939 +7940 +7941 +7942 +7943 +7944 +7945 +7946 +7947 +7948 +7949 +7950 +7951 +7952 +7953 +7954 +7955 +7956 +7957 +7958 +7959 +7960 +7961 +7962 +7963 +7964 +7965 +7966 +7967 +7968 +7969 +7970 +7971 +7972 +7973 +7974 +7975 +7976 +7977 +7978 +7979 +7980 +7981 +7982 +7983 +7984 +7985 +7986 +7987 +7988 +7989 +7990 +7991 +7992 +7993 +7994 +7995 +7996 +7997 +7998 +7999 +8000 +8001 +8002 +8003 +8004 +8005 +8006 +8007 +8008 +8009 +8010 +8011 +8012 +8013 +8014 +8015 +8016 +8017 +8018 +8019 +8020 +8021 +8022 +8023 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8033 +8034 +8035 +8036 +8037 +8038 +8039 +8040 +8041 +8042 +8043 +8044 +8045 +8046 +8047 +8048 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8063 +8064 +8065 +8066 +8067 +8068 +8069 +8070 +8071 +8072 +8073 +8074 +8075 +8076 +8077 +8078 +8079 +8080 +8081 +8082 +8083 +8084 +8085 +8086 +8087 +8088 +8089 +8090 +8091 +8092 +8093 +8094 +8095 +8096 +8097 +8098 +8099 +8100 +8101 +8102 +8103 +8104 +8105 +8106 +8107 +8108 +8109 +8110 +8111 +8112 +8113 +8114 +8115 +8116 +8117 +8118 +8119 +8120 +8121 +8122 +8123 +8124 +8125 +8126 +8127 +8128 +8129 +8130 +8131 +8132 +8133 +8134 +8135 +8136 +8137 +8138 +8139 +8140 +8141 +8142 +8143 +8144 +8145 +8146 +8147 +8148 +8149 +8150 +8151 +8152 +8153 +8154 +8155 +8156 +8157 +8158 +8159 +8160 +8161 +8162 +8163 +8164 +8165 +8166 +8167 +8168 +8169 +8170 +8171 +8172 +8173 +8174 +8175 +8176 +8177 +8178 +8179 +8180 +8181 +8182 +8183 +8184 +8185 +8186 +8187 +8188 +8189 +8190 +8191 +8192 +8193 +8194 +8195 +8196 +8197 +8198 +8199 +8200 +8201 +8202 +8203 +8204 +8205 +8206 +8207 +8208 +8209 +8210 +8211 +8212 +8213 +8214 +8215 +8216 +8217 +8218 +8219 +8220 +8221 +8222 +8223 +8224 +8225 +8226 +8227 +8228 +8229 +8230 +8231 +8232 +8233 +8234 +8235 +8236 +8237 +8238 +8239 +8240 +8241 +8242 +8243 +8244 +8245 +8246 +8247 +8248 +8249 +8250 +8251 +8252 +8253 +8254 +8255 +8256 +8257 +8258 +8259 +8260 +8261 +8262 +8263 +8264 +8265 +8266 +8267 +8268 +8269 +8270 +8271 +8272 +8273 +8274 +8275 +8276 +8277 +8278 +8279 +8280 +8281 +8282 +8283 +8284 +8285 +8286 +8287 +8288 +8289 +8290 +8291 +8292 +8293 +8294 +8295 +8296 +8297 +8298 +8299 +8300 +8301 +8302 +8303 +8304 +8305 +8306 +8307 +8308 +8309 +8310 +8311 +8312 +8313 +8314 +8315 +8316 +8317 +8318 +8319 +8320 +8321 +8322 +8323 +8324 +8325 +8326 +8327 +8328 +8329 +8330 +8331 +8332 +8333 +8334 +8335 +8336 +8337 +8338 +8339 +8340 +8341 +8342 +8343 +8344 +8345 +8346 +8347 +8348 +8349 +8350 +8351 +8352 +8353 +8354 +8355 +8356 +8357 +8358 +8359 +8360 +8361 +8362 +8363 +8364 +8365 +8366 +8367 +8368 +8369 +8370 +8371 +8372 +8373 +8374 +8375 +8376 +8377 +8378 +8379 +8380 +8381 +8382 +8383 +8384 +8385 +8386 +8387 +8388 +8389 +8390 +8391 +8392 +8393 +8394 +8395 +8396 +8397 +8398 +8399 +8400 +8401 +8402 +8403 +8404 +8405 +8406 +8407 +8408 +8409 +8410 +8411 +8412 +8413 +8414 +8415 +8416 +8417 +8418 +8419 +8420 +8421 +8422 +8423 +8424 +8425 +8426 +8427 +8428 +8429 +8430 +8431 +8432 +8433 +8434 +8435 +8436 +8437 +8438 +8439 +8440 +8441 +8442 +8443 +8444 +8445 +8446 +8447 +8448 +8449 +8450 +8451 +8452 +8453 +8454 +8455 +8456 +8457 +8458 +8459 +8460 +8461 +8462 +8463 +8464 +8465 +8466 +8467 +8468 +8469 +8470 +8471 +8472 +8473 +8474 +8475 +8476 +8477 +8478 +8479 +8480 +8481 +8482 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8491 +8492 +8493 +8494 +8495 +8496 +8497 +8498 +8499 +8500 +8501 +8502 +8503 +8504 +8505 +8506 +8507 +8508 +8509 +8510 +8511 +8512 +8513 +8514 +8515 +8516 +8517 +8518 +8519 +8520 +8521 +8522 +8523 +8524 +8525 +8526 +8527 +8528 +8529 +8530 +8531 +8532 +8533 +8534 +8535 +8536 +8537 +8538 +8539 +8540 +8541 +8542 +8543 +8544 +8545 +8546 +8547 +8548 +8549 +8550 +8551 +8552 +8553 +8554 +8555 +8556 +8557 +8558 +8559 +8560 +8561 +8562 +8563 +8564 +8565 +8566 +8567 +8568 +8569 +8570 +8571 +8572 +8573 +8574 +8575 +8576 +8577 +8578 +8579 +8580 +8581 +8582 +8583 +8584 +8585 +8586 +8587 +8588 +8589 +8590 +8591 +8592 +8593 +8594 +8595 +8596 +8597 +8598 +8599 +8600 +8601 +8602 +8603 +8604 +8605 +8606 +8607 +8608 +8609 +8610 +8611 +8612 +8613 +8614 +8615 +8616 +8617 +8618 +8619 +8620 +8621 +8622 +8623 +8624 +8625 +8626 +8627 +8628 +8629 +8630 +8631 +8632 +8633 +8634 +8635 +8636 +8637 +8638 +8639 +8640 +8641 +8642 +8643 +8644 +8645 +8646 +8647 +8648 +8649 +8650 +8651 +8652 +8653 +8654 +8655 +8656 +8657 +8658 +8659 +8660 +8661 +8662 +8663 +8664 +8665 +8666 +8667 +8668 +8669 +8670 +8671 +8672 +8673 +8674 +8675 +8676 +8677 +8678 +8679 +8680 +8681 +8682 +8683 +8684 +8685 +8686 +8687 +8688 +8689 +8690 +8691 +8692 +8693 +8694 +8695 +8696 +8697 +8698 +8699 +8700 +8701 +8702 +8703 +8704 +8705 +8706 +8707 +8708 +8709 +8710 +8711 +8712 +8713 +8714 +8715 +8716 +8717 +8718 +8719 +8720 +8721 +8722 +8723 +8724 +8725 +8726 +8727 +8728 +8729 +8730 +8731 +8732 +8733 +8734 +8735 +8736 +8737 +8738 +8739 +8740 +8741 +8742 +8743 +8744 +8745 +8746 +8747 +8748 +8749 +8750 +8751 +8752 +8753 +8754 +8755 +8756 +8757 +8758 +8759 +8760 +8761 +8762 +8763 +8764 +8765 +8766 +8767 +8768 +8769 +8770 +8771 +8772 +8773 +8774 +8775 +8776 +8777 +8778 +8779 +8780 +8781 +8782 +8783 +8784 +8785 +8786 +8787 +8788 +8789 +8790 +8791 +8792 +8793 +8794 +8795 +8796 +8797 +8798 +8799 +8800 +8801 +8802 +8803 +8804 +8805 +8806 +8807 +8808 +8809 +8810 +8811 +8812 +8813 +8814 +8815 +8816 +8817 +8818 +8819 +8820 +8821 +8822 +8823 +8824 +8825 +8826 +8827 +8828 +8829 +8830 +8831 +8832 +8833 +8834 +8835 +8836 +8837 +8838 +8839 +8840 +8841 +8842 +8843 +8844 +8845 +8846 +8847 +8848 +8849 +8850 +8851 +8852 +8853 +8854 +8855 +8856 +8857 +8858 +8859 +8860 +8861 +8862 +8863 +8864 +8865 +8866 +8867 +8868 +8869 +8870 +8871 +8872 +8873 +8874 +8875 +8876 +8877 +8878 +8879 +8880 +8881 +8882 +8883 +8884 +8885 +8886 +8887 +8888 +8889 +8890 +8891 +8892 +8893 +8894 +8895 +8896 +8897 +8898 +8899 +8900 +8901 +8902 +8903 +8904 +8905 +8906 +8907 +8908 +8909 +8910 +8911 +8912 +8913 +8914 +8915 +8916 +8917 +8918 +8919 +8920 +8921 +8922 +8923 +8924 +8925 +8926 +8927 +8928 +8929 +8930 +8931 +8932 +8933 +8934 +8935 +8936 +8937 +8938 +8939 +8940 +8941 +8942 +8943 +8944 +8945 +8946 +8947 +8948 +8949 +8950 +8951 +8952 +8953 +8954 +8955 +8956 +8957 +8958 +8959 +8960 +8961 +8962 +8963 +8964 +8965 +8966 +8967 +8968 +8969 +8970 +8971 +8972 +8973 +8974 +8975 +8976 +8977 +8978 +8979 +8980 +8981 +8982 +8983 +8984 +8985 +8986 +8987 +8988 +8989 +8990 +8991 +8992 +8993 +8994 +8995 +8996 +8997 +8998 +8999 +9000 +9001 +9002 +9003 +9004 +9005 +9006 +9007 +9008 +9009 +9010 +9011 +9012 +9013 +9014 +9015 +9016 +9017 +9018 +9019 +9020 +9021 +9022 +9023 +9024 +9025 +9026 +9027 +9028 +9029 +9030 +9031 +9032 +9033 +9034 +9035 +9036 +9037 +9038 +9039 +9040 +9041 +9042 +9043 +9044 +9045 +9046 +9047 +9048 +9049 +9050 +9051 +9052 +9053 +9054 +9055 +9056 +9057 +9058 +9059 +9060 +9061 +9062 +9063 +9064 +9065 +9066 +9067 +9068 +9069 +9070 +9071 +9072 +9073 +9074 +9075 +9076 +9077 +9078 +9079 +9080 +9081 +9082 +9083 +9084 +9085 +9086 +9087 +9088 +9089 +9090 +9091 +9092 +9093 +9094 +9095 +9096 +9097 +9098 +9099 +9100 +9101 +9102 +9103 +9104 +9105 +9106 +9107 +9108 +9109 +9110 +9111 +9112 +9113 +9114 +9115 +9116 +9117 +9118 +9119 +9120 +9121 +9122 +9123 +9124 +9125 +9126 +9127 +9128 +9129 +9130 +9131 +9132 +9133 +9134 +9135 +9136 +9137 +9138 +9139 +9140 +9141 +9142 +9143 +9144 +9145 +9146 +9147 +9148 +9149 +9150 +9151 +9152 +9153 +9154 +9155 +9156 +9157 +9158 +9159 +9160 +9161 +9162 +9163 +9164 +9165 +9166 +9167 +9168 +9169 +9170 +9171 +9172 +9173 +9174 +9175 +9176 +9177 +9178 +9179 +9180 +9181 +9182 +9183 +9184 +9185 +9186 +9187 +9188 +9189 +9190 +9191 +9192 +9193 +9194 +9195 +9196 +9197 +9198 +9199 +9200 +9201 +9202 +9203 +9204 +9205 +9206 +9207 +9208 +9209 +9210 +9211 +9212 +9213 +9214 +9215 +9216 +9217 +9218 +9219 +9220 +9221 +9222 +9223 +9224 +9225 +9226 +9227 +9228 +9229 +9230 +9231 +9232 +9233 +9234 +9235 +9236 +9237 +9238 +9239 +9240 +9241 +9242 +9243 +9244 +9245 +9246 +9247 +9248 +9249 +9250 +9251 +9252 +9253 +9254 +9255 +9256 +9257 +9258 +9259 +9260 +9261 +9262 +9263 +9264 +9265 +9266 +9267 +9268 +9269 +9270 +9271 +9272 +9273 +9274 +9275 +9276 +9277 +9278 +9279 +9280 +9281 +9282 +9283 +9284 +9285 +9286 +9287 +9288 +9289 +9290 +9291 +9292 +9293 +9294 +9295 +9296 +9297 +9298 +9299 +9300 +9301 +9302 +9303 +9304 +9305 +9306 +9307 +9308 +9309 +9310 +9311 +9312 +9313 +9314 +9315 +9316 +9317 +9318 +9319 +9320 +9321 +9322 +9323 +9324 +9325 +9326 +9327 +9328 +9329 +9330 +9331 +9332 +9333 +9334 +9335 +9336 +9337 +9338 +9339 +9340 +9341 +9342 +9343 +9344 +9345 +9346 +9347 +9348 +9349 +9350 +9351 +9352 +9353 +9354 +9355 +9356 +9357 +9358 +9359 +9360 +9361 +9362 +9363 +9364 +9365 +9366 +9367 +9368 +9369 +9370 +9371 +9372 +9373 +9374 +9375 +9376 +9377 +9378 +9379 +9380 +9381 +9382 +9383 +9384 +9385 +9386 +9387 +9388 +9389 +9390 +9391 +9392 +9393 +9394 +9395 +9396 +9397 +9398 +9399 +9400 +9401 +9402 +9403 +9404 +9405 +9406 +9407 +9408 +9409 +9410 +9411 +9412 +9413 +9414 +9415 +9416 +9417 +9418 +9419 +9420 +9421 +9422 +9423 +9424 +9425 +9426 +9427 +9428 +9429 +9430 +9431 +9432 +9433 +9434 +9435 +9436 +9437 +9438 +9439 +9440 +9441 +9442 +9443 +9444 +9445 +9446 +9447 +9448 +9449 +9450 +9451 +9452 +9453 +9454 +9455 +9456 +9457 +9458 +9459 +9460 +9461 +9462 +9463 +9464 +9465 +9466 +9467 +9468 +9469 +9470 +9471 +9472 +9473 +9474 +9475 +9476 +9477 +9478 +9479 +9480 +9481 +9482 +9483 +9484 +9485 +9486 +9487 +9488 +9489 +9490 +9491 +9492 +9493 +9494 +9495 +9496 +9497 +9498 +9499 +9500 +9501 +9502 +9503 +9504 +9505 +9506 +9507 +9508 +9509 +9510 +9511 +9512 +9513 +9514 +9515 +9516 +9517 +9518 +9519 +9520 +9521 +9522 +9523 +9524 +9525 +9526 +9527 +9528 +9529 +9530 +9531 +9532 +9533 +9534 +9535 +9536 +9537 +9538 +9539 +9540 +9541 +9542 +9543 +9544 +9545 +9546 +9547 +9548 +9549 +9550 +9551 +9552 +9553 +9554 +9555 +9556 +9557 +9558 +9559 +9560 +9561 +9562 +9563 +9564 +9565 +9566 +9567 +9568 +9569 +9570 +9571 +9572 +9573 +9574 +9575 +9576 +9577 +9578 +9579 +9580 +9581 +9582 +9583 +9584 +9585 +9586 +9587 +9588 +9589 +9590 +9591 +9592 +9593 +9594 +9595 +9596 +9597 +9598 +9599 +9600 +9601 +9602 +9603 +9604 +9605 +9606 +9607 +9608 +9609 +9610 +9611 +9612 +9613 +9614 +9615 +9616 +9617 +9618 +9619 +9620 +9621 +9622 +9623 +9624 +9625 +9626 +9627 +9628 +9629 +9630 +9631 +9632 +9633 +9634 +9635 +9636 +9637 +9638 +9639 +9640 +9641 +9642 +9643 +9644 +9645 +9646 +9647 +9648 +9649 +9650 +9651 +9652 +9653 +9654 +9655 +9656 +9657 +9658 +9659 +9660 +9661 +9662 +9663 +9664 +9665 +9666 +9667 +9668 +9669 +9670 +9671 +9672 +9673 +9674 +9675 +9676 +9677 +9678 +9679 +9680 +9681 +9682 +9683 +9684 +9685 +9686 +9687 +9688 +9689 +9690 +9691 +9692 +9693 +9694 +9695 +9696 +9697 +9698 +9699 +9700 +9701 +9702 +9703 +9704 +9705 +9706 +9707 +9708 +9709 +9710 +9711 +9712 +9713 +9714 +9715 +9716 +9717 +9718 +9719 +9720 +9721 +9722 +9723 +9724 +9725 +9726 +9727 +9728 +9729 +9730 +9731 +9732 +9733 +9734 +9735 +9736 +9737 +9738 +9739 +9740 +9741 +9742 +9743 +9744 +9745 +9746 +9747 +9748 +9749 +9750 +9751 +9752 +9753 +9754 +9755 +9756 +9757 +9758 +9759 +9760 +9761 +9762 +9763 +9764 +9765 +9766 +9767 +9768 +9769 +9770 +9771 +9772 +9773 +9774 +9775 +9776 +9777 +9778 +9779 +9780 +9781 +9782 +9783 +9784 +9785 +9786 +9787 +9788 +9789 +9790 +9791 +9792 +9793 +9794 +9795 +9796 +9797 +9798 +9799 +9800 +9801 +9802 +9803 +9804 +9805 +9806 +9807 +9808 +9809 +9810 +9811 +9812 +9813 +9814 +9815 +9816 +9817 +9818 +9819 +9820 +9821 +9822 +9823 +9824 +9825 +9826 +9827 +9828 +9829 +9830 +9831 +9832 +9833 +9834 +9835 +9836 +9837 +9838 +9839 +9840 +9841 +9842 +9843 +9844 +9845 +9846 +9847 +9848 +9849 +9850 +9851 +9852 +9853 +9854 +9855 +9856 +9857 +9858 +9859 +9860 +9861 +9862 +9863 +9864 +9865 +9866 +9867 +9868 +9869 +9870 +9871 +9872 +9873 +9874 +9875 +9876 +9877 +9878 +9879 +9880 +9881 +9882 +9883 +9884 +9885 +9886 +9887 +9888 +9889 +9890 +9891 +9892 +9893 +9894 +9895 +9896 +9897 +9898 +9899 +9900 +9901 +9902 +9903 +9904 +9905 +9906 +9907 +9908 +9909 +9910 +9911 +9912 +9913 +9914 +9915 +9916 +9917 +9918 +9919 +9920 +9921 +9922 +9923 +9924 +9925 +9926 +9927 +9928 +9929 +9930 +9931 +9932 +9933 +9934 +9935 +9936 +9937 +9938 +9939 +9940 +9941 +9942 +9943 +9944 +9945 +9946 +9947 +9948 +9949 +9950 +9951 +9952 +9953 +9954 +9955 +9956 +9957 +9958 +9959 +9960 +9961 +9962 +9963 +9964 +9965 +9966 +9967 +9968 +9969 +9970 +9971 +9972 +9973 +9974 +9975 +9976 +9977 +9978 +9979 +9980 +9981 +9982 +9983 +9984 +9985 +9986 +9987 +9988 +9989 +9990 +9991 +9992 +9993 +9994 +9995 +9996 +9997 +9998 +9999 +10000 +10001 +10002 +10003 +10004 +10005 +10006 +10007 +10008 +10009 +10010 +10011 +10012 +10013 +10014 +10015 +10016 +10017 +10018 +10019 +10020 +10021 +10022 +10023 +10024 +10025 +10026 +10027 +10028 +10029 +10030 +10031 +10032 +10033 +10034 +10035 +10036 +10037 +10038 +10039 +10040 +10041 +10042 +10043 +10044 +10045 +10046 +10047 +10048 +10049 +10050 +10051 +10052 +10053 +10054 +10055 +10056 +10057 +10058 +10059 +10060 +10061 +10062 +10063 +10064 +10065 +10066 +10067 +10068 +10069 +10070 +10071 +10072 +10073 +10074 +10075 +10076 +10077 +10078 +10079 +10080 +10081 +10082 +10083 +10084 +10085 +10086 +10087 +10088 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10102 +10103 +10104 +10105 +10106 +10107 +10108 +10109 +10110 +10111 +10112 +10113 +10114 +10115 +10116 +10117 +10118 +10119 +10120 +10121 +10122 +10123 +10124 +10125 +10126 +10127 +10128 +10129 +10130 +10131 +10132 +10133 +10134 +10135 +10136 +10137 +10138 +10139 +10140 +10141 +10142 +10143 +10144 +10145 +10146 +10147 +10148 +10149 +10150 +10151 +10152 +10153 +10154 +10155 +10156 +10157 +10158 +10159 +10160 +10161 +10162 +10163 +10164 +10165 +10166 +10167 +10168 +10169 +10170 +10171 +10172 +10173 +10174 +10175 +10176 +10177 +10178 +10179 +10180 +10181 +10182 +10183 +10184 +10185 +10186 +10187 +10188 +10189 +10190 +10191 +10192 +10193 +10194 +10195 +10196 +10197 +10198 +10199 +10200 +10201 +10202 +10203 +10204 +10205 +10206 +10207 +10208 +10209 +10210 +10211 +10212 +10213 +10214 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10224 +10225 +10226 +10227 +10228 +10229 +10230 +10231 +10232 +10233 +10234 +10235 +10236 +10237 +10238 +10239 +10240 +10241 +10242 +10243 +10244 +10245 +10246 +10247 +10248 +10249 +10250 +10251 +10252 +10253 +10254 +10255 +10256 +10257 +10258 +10259 +10260 +10261 +10262 +10263 +10264 +10265 +10266 +10267 +10268 +10269 +10270 +10271 +10272 +10273 +10274 +10275 +10276 +10277 +10278 +10279 +10280 +10281 +10282 +10283 +10284 +10285 +10286 +10287 +10288 +10289 +10290 +10291 +10292 +10293 +10294 +10295 +10296 +10297 +10298 +10299 +10300 +10301 +10302 +10303 +10304 +10305 +10306 +10307 +10308 +10309 +10310 +10311 +10312 +10313 +10314 +10315 +10316 +10317 +10318 +10319 +10320 +10321 +10322 +10323 +10324 +10325 +10326 +10327 +10328 +10329 +10330 +10331 +10332 +10333 +10334 +10335 +10336 +10337 +10338 +10339 +10340 +10341 +10342 +10343 +10344 +10345 +10346 +10347 +10348 +10349 +10350 +10351 +10352 +10353 +10354 +10355 +10356 +10357 +10358 +10359 +10360 +10361 +10362 +10363 +10364 +10365 +10366 +10367 +10368 +10369 +10370 +10371 +10372 +10373 +10374 +10375 +10376 +10377 +10378 +10379 +10380 +10381 +10382 +10383 +10384 +10385 +10386 +10387 +10388 +10389 +10390 +10391 +10392 +10393 +10394 +10395 +10396 +10397 +10398 +10399 +10400 +10401 +10402 +10403 +10404 +10405 +10406 +10407 +10408 +10409 +10410 +10411 +10412 +10413 +10414 +10415 +10416 +10417 +10418 +10419 +10420 +10421 +10422 +10423 +10424 +10425 +10426 +10427 +10428 +10429 +10430 +10431 +10432 +10433 +10434 +10435 +10436 +10437 +10438 +10439 +10440 +10441 +10442 +10443 +10444 +10445 +10446 +10447 +10448 +10449 +10450 +10451 +10452 +10453 +10454 +10455 +10456 +10457 +10458 +10459 +10460 +10461 +10462 +10463 +10464 +10465 +10466 +10467 +10468 +10469 +10470 +10471 +10472 +10473 +10474 +10475 +10476 +10477 +10478 +10479 +10480 +10481 +10482 +10483 +10484 +10485 +10486 +10487 +10488 +10489 +10490 +10491 +10492 +10493 +10494 +10495 +10496 +10497 +10498 +10499 +10500 +10501 +10502 +10503 +10504 +10505 +10506 +10507 +10508 +10509 +10510 +10511 +10512 +10513 +10514 +10515 +10516 +10517 +10518 +10519 +10520 +10521 +10522 +10523 +10524 +10525 +10526 +10527 +10528 +10529 +10530 +10531 +10532 +10533 +10534 +10535 +10536 +10537 +10538 +10539 +10540 +10541 +10542 +10543 +10544 +10545 +10546 +10547 +10548 +10549 +10550 +10551 +10552 +10553 +10554 +10555 +10556 +10557 +10558 +10559 +10560 +10561 +10562 +10563 +10564 +10565 +10566 +10567 +10568 +10569 +10570 +10571 +10572 +10573 +10574 +10575 +10576 +10577 +10578 +10579 +10580 +10581 +10582 +10583 +10584 +10585 +10586 +10587 +10588 +10589 +10590 +10591 +10592 +10593 +10594 +10595 +10596 +10597 +10598 +10599 +10600 +10601 +10602 +10603 +10604 +10605 +10606 +10607 +10608 +10609 +10610 +10611 +10612 +10613 +10614 +10615 +10616 +10617 +10618 +10619 +10620 +10621 +10622 +10623 +10624 +10625 +10626 +10627 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10649 +10650 +10651 +10652 +10653 +10654 +10655 +10656 +10657 +10658 +10659 +10660 +10661 +10662 +10663 +10664 +10665 +10666 +10667 +10668 +10669 +10670 +10671 +10672 +10673 +10674 +10675 +10676 +10677 +10678 +10679 +10680 +10681 +10682 +10683 +10684 +10685 +10686 +10687 +10688 +10689 +10690 +10691 +10692 +10693 +10694 +10695 +10696 +10697 +10698 +10699 +10700 +10701 +10702 +10703 +10704 +10705 +10706 +10707 +10708 +10709 +10710 +10711 +10712 +10713 +10714 +10715 +10716 +10717 +10718 +10719 +10720 +10721 +10722 +10723 +10724 +10725 +10726 +10727 +10728 +10729 +10730 +10731 +10732 +10733 +10734 +10735 +10736 +10737 +10738 +10739 +10740 +10741 +10742 +10743 +10744 +10745 +10746 +10747 +10748 +10749 +10750 +10751 +10752 +10753 +10754 +10755 +10756 +10757 +10758 +10759 +10760 +10761 +10762 +10763 +10764 +10765 +10766 +10767 +10768 +10769 +10770 +10771 +10772 +10773 +10774 +10775 +10776 +10777 +10778 +10779 +10780 +10781 +10782 +10783 +10784 +10785 +10786 +10787 +10788 +10789 +10790 +10791 +10792 +10793 +10794 +10795 +10796 +10797 +10798 +10799 +10800 +10801 +10802 +10803 +10804 +10805 +10806 +10807 +10808 +10809 +10810 +10811 +10812 +10813 +10814 +10815 +10816 +10817 +10818 +10819 +10820 +10821 +10822 +10823 +10824 +10825 +10826 +10827 +10828 +10829 +10830 +10831 +10832 +10833 +10834 +10835 +10836 +10837 +10838 +10839 +10840 +10841 +10842 +10843 +10844 +10845 +10846 +10847 +10848 +10849 +10850 +10851 +10852 +10853 +10854 +10855 +10856 +10857 +10858 +10859 +10860 +10861 +10862 +10863 +10864 +10865 +10866 +10867 +10868 +10869 +10870 +10871 +10872 +10873 +10874 +10875 +10876 +10877 +10878 +10879 +10880 +10881 +10882 +10883 +10884 +10885 +10886 +10887 +10888 +10889 +10890 +10891 +10892 +10893 +10894 +10895 +10896 +10897 +10898 +10899 +10900 +10901 +10902 +10903 +10904 +10905 +10906 +10907 +10908 +10909 +10910 +10911 +10912 +10913 +10914 +10915 +10916 +10917 +10918 +10919 +10920 +10921 +10922 +10923 +10924 +10925 +10926 +10927 +10928 +10929 +10930 +10931 +10932 +10933 +10934 +10935 +10936 +10937 +10938 +10939 +10940 +10941 +10942 +10943 +10944 +10945 +10946 +10947 +10948 +10949 +10950 +10951 +10952 +10953 +10954 +10955 +10956 +10957 +10958 +10959 +10960 +10961 +10962 +10963 +10964 +10965 +10966 +10967 +10968 +10969 +10970 +10971 +10972 +10973 +10974 +10975 +10976 +10977 +10978 +10979 +10980 +10981 +10982 +10983 +10984 +10985 +10986 +10987 +10988 +10989 +10990 +10991 +10992 +10993 +10994 +10995 +10996 +10997 +10998 +10999 +11000 +11001 +11002 +11003 +11004 +11005 +11006 +11007 +11008 +11009 +11010 +11011 +11012 +11013 +11014 +11015 +11016 +11017 +11018 +11019 +11020 +11021 +11022 +11023 +11024 +11025 +11026 +11027 +11028 +11029 +11030 +11031 +11032 +11033 +11034 +11035 +11036 +11037 +11038 +11039 +11040 +11041 +11042 +11043 +11044 +11045 +11046 +11047 +11048 +11049 +11050 +11051 +11052 +11053 +11054 +11055 +11056 +11057 +11058 +11059 +11060 +11061 +11062 +11063 +11064 +11065 +11066 +11067 +11068 +11069 +11070 +11071 +11072 +11073 +11074 +11075 +11076 +11077 +11078 +11079 +11080 +11081 +11082 +11083 +11084 +11085 +11086 +11087 +11088 +11089 +11090 +11091 +11092 +11093 +11094 +11095 +11096 +11097 +11098 +11099 +11100 +11101 +11102 +11103 +11104 +11105 +11106 +11107 +11108 +11109 +11110 +11111 +11112 +11113 +11114 +11115 +11116 +11117 +11118 +11119 +11120 +11121 +11122 +11123 +11124 +11125 +11126 +11127 +11128 +11129 +11130 +11131 +11132 +11133 +11134 +11135 +11136 +11137 +11138 +11139 +11140 +11141 +11142 +11143 +11144 +11145 +11146 +11147 +11148 +11149 +11150 +11151 +11152 +11153 +11154 +11155 +11156 +11157 +11158 +11159 +11160 +11161 +11162 +11163 +11164 +11165 +11166 +11167 +11168 +11169 +11170 +11171 +11172 +11173 +11174 +11175 +11176 +11177 +11178 +11179 +11180 +11181 +11182 +11183 +11184 +11185 +11186 +11187 +11188 +11189 +11190 +11191 +11192 +11193 +11194 +11195 +11196 +11197 +11198 +11199 +11200 +11201 +11202 +11203 +11204 +11205 +11206 +11207 +11208 +11209 +11210 +11211 +11212 +11213 +11214 +11215 +11216 +11217 +11218 +11219 +11220 +11221 +11222 +11223 +11224 +11225 +11226 +11227 +11228 +11229 +11230 +11231 +11232 +11233 +11234 +11235 +11236 +11237 +11238 +11239 +11240 +11241 +11242 +11243 +11244 +11245 +11246 +11247 +11248 +11249 +11250 +11251 +11252 +11253 +11254 +11255 +11256 +11257 +11258 +11259 +11260 +11261 +11262 +11263 +11264 +11265 +11266 +11267 +11268 +11269 +11270 +11271 +11272 +11273 +11274 +11275 +11276 +11277 +11278 +11279 +11280 +11281 +11282 +11283 +11284 +11285 +11286 +11287 +11288 +11289 +11290 +11291 +11292 +11293 +11294 +11295 +11296 +11297 +11298 +11299 +11300 +11301 +11302 +11303 +11304 +11305 +11306 +11307 +11308 +11309 +11310 +11311 +11312 +11313 +11314 +11315 +11316 +11317 +11318 +11319 +11320 +11321 +11322 +11323 +11324 +11325 +11326 +11327 +11328 +11329 +11330 +11331 +11332 +11333 +11334 +11335 +11336 +11337 +11338 +11339 +11340 +11341 +11342 +11343 +11344 +11345 +11346 +11347 +11348 +11349 +11350 +11351 +11352 +11353 +11354 +11355 +11356 +11357 +11358 +11359 +11360 +11361 +11362 +11363 +11364 +11365 +11366 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11374 +11375 +11376 +11377 +11378 +11379 +11380 +11381 +11382 +11383 +11384 +11385 +11386 +11387 +11388 +11389 +11390 +11391 +11392 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11493 +11494 +11495 +11496 +11497 +11498 +11499 +11500 +11501 +11502 +11503 +11504 +11505 +11506 +11507 +11508 +11509 +11510 +11511 +11512 +11513 +11514 +11515 +11516 +11517 +11518 +11519 +11520 +11521 +11522 +11523 +11524 +11525 +11526 +11527 +11528 +11529 +11530 +11531 +11532 +11533 +11534 +11535 +11536 +11537 +11538 +11539 +11540 +11541 +11542 +11543 +11544 +11545 +11546 +11547 +11548 +11549 +11550 +11551 +11552 +11553 +11554 +11555 +11556 +11557 +11558 +11559 +11560 +11561 +11562 +11563 +11564 +11565 +11566 +11567 +11568 +11569 +11570 +11571 +11572 +11573 +11574 +11575 +11576 +11577 +11578 +11579 +11580 +11581 +11582 +11583 +11584 +11585 +11586 +11587 +11588 +11589 +11590 +11591 +11592 +11593 +11594 +11595 +11596 +11597 +11598 +11599 +11600 +11601 +11602 +11603 +11604 +11605 +11606 +11607 +11608 +11609 +11610 +11611 +11612 +11613 +11614 +11615 +11616 +11617 +11618 +11619 +11620 +11621 +11622 +11623 +11624 +11625 +11626 +11627 +11628 +11629 +11630 +11631 +11632 +11633 +11634 +11635 +11636 +11637 +11638 +11639 +11640 +11641 +11642 +11643 +11644 +11645 +11646 +11647 +11648 +11649 +11650 +11651 +11652 +11653 +11654 +11655 +11656 +11657 +11658 +11659 +11660 +11661 +11662 +11663 +11664 +11665 +11666 +11667 +11668 +11669 +11670 +11671 +11672 +11673 +11674 +11675 +11676 +11677 +11678 +11679 +11680 +11681 +11682 +11683 +11684 +11685 +11686 +11687 +11688 +11689 +11690 +11691 +11692 +11693 +11694 +11695 +11696 +11697 +11698 +11699 +11700 +11701 +11702 +11703 +11704 +11705 +11706 +11707 +11708 +11709 +11710 +11711 +11712 +11713 +11714 +11715 +11716 +11717 +11718 +11719 +11720 +11721 +11722 +11723 +11724 +11725 +11726 +11727 +11728 +11729 +11730 +11731 +11732 +11733 +11734 +11735 +11736 +11737 +11738 +11739 +11740 +11741 +11742 +11743 +11744 +11745 +11746 +11747 +11748 +11749 +11750 +11751 +11752 +11753 +11754 +11755 +11756 +11757 +11758 +11759 +11760 +11761 +11762 +11763 +11764 +11765 +11766 +11767 +11768 +11769 +11770 +11771 +11772 +11773 +11774 +11775 +11776 +11777 +11778 +11779 +11780 +11781 +11782 +11783 +11784 +11785 +11786 +11787 +11788 +11789 +11790 +11791 +11792 +11793 +11794 +11795 +11796 +11797 +11798 +11799 +11800 +11801 +11802 +11803 +11804 +11805 +11806 +11807 +11808 +11809 +11810 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11818 +11819 +11820 +11821 +11822 +11823 +11824 +11825 +11826 +11827 +11828 +11829 +11830 +11831 +11832 +11833 +11834 +11835 +11836 +11837 +11838 +11839 +11840 +11841 +11842 +11843 +11844 +11845 +11846 +11847 +11848 +11849 +11850 +11851 +11852 +11853 +11854 +11855 +11856 +11857 +11858 +11859 +11860 +11861 +11862 +11863 +11864 +11865 +11866 +11867 +11868 +11869 +11870 +11871 +11872 +11873 +11874 +11875 +11876 +11877 +11878 +11879 +11880 +11881 +11882 +11883 +11884 +11885 +11886 +11887 +11888 +11889 +11890 +11891 +11892 +11893 +11894 +11895 +11896 +11897 +11898 +11899 +11900 +11901 +11902 +11903 +11904 +11905 +11906 +11907 +11908 +11909 +11910 +11911 +11912 +11913 +11914 +11915 +11916 +11917 +11918 +11919 +11920 +11921 +11922 +11923 +11924 +11925 +11926 +11927 +11928 +11929 +11930 +11931 +11932 +11933 +11934 +11935 +11936 +11937 +11938 +11939 +11940 +11941 +11942 +11943 +11944 +11945 +11946 +11947 +11948 +11949 +11950 +11951 +11952 +11953 +11954 +11955 +11956 +11957 +11958 +11959 +11960 +11961 +11962 +11963 +11964 +11965 +11966 +11967 +11968 +11969 +11970 +11971 +11972 +11973 +11974 +11975 +11976 +11977 +11978 +11979 +11980 +11981 +11982 +11983 +11984 +11985 +11986 +11987 +11988 +11989 +11990 +11991 +11992 +11993 +11994 +11995 +11996 +11997 +11998 +11999 +12000 +12001 +12002 +12003 +12004 +12005 +12006 +12007 +12008 +12009 +12010 +12011 +12012 +12013 +12014 +12015 +12016 +12017 +12018 +12019 +12020 +12021 +12022 +12023 +12024 +12025 +12026 +12027 +12028 +12029 +12030 +12031 +12032 +12033 +12034 +12035 +12036 +12037 +12038 +12039 +12040 +12041 +12042 +12043 +12044 +12045 +12046 +12047 +12048 +12049 +12050 +12051 +12052 +12053 +12054 +12055 +12056 +12057 +12058 +12059 +12060 +12061 +12062 +12063 +12064 +12065 +12066 +12067 +12068 +12069 +12070 +12071 +12072 +12073 +12074 +12075 +12076 +12077 +12078 +12079 +12080 +12081 +12082 +12083 +12084 +12085 +12086 +12087 +12088 +12089 +12090 +12091 +12092 +12093 +12094 +12095 +12096 +12097 +12098 +12099 +12100 +12101 +12102 +12103 +12104 +12105 +12106 +12107 +12108 +12109 +12110 +12111 +12112 +12113 +12114 +12115 +12116 +12117 +12118 +12119 +12120 +12121 +12122 +12123 +12124 +12125 +12126 +12127 +12128 +12129 +12130 +12131 +12132 +12133 +12134 +12135 +12136 +12137 +12138 +12139 +12140 +12141 +12142 +12143 +12144 +12145 +12146 +12147 +12148 +12149 +12150 +12151 +12152 +12153 +12154 +12155 +12156 +12157 +12158 +12159 +12160 +12161 +12162 +12163 +12164 +12165 +12166 +12167 +12168 +12169 +12170 +12171 +12172 +12173 +12174 +12175 +12176 +12177 +12178 +12179 +12180 +12181 +12182 +12183 +12184 +12185 +12186 +12187 +12188 +12189 +12190 +12191 +12192 +12193 +12194 +12195 +12196 +12197 +12198 +12199 +12200 +12201 +12202 +12203 +12204 +12205 +12206 +12207 +12208 +12209 +12210 +12211 +12212 +12213 +12214 +12215 +12216 +12217 +12218 +12219 +12220 +12221 +12222 +12223 +12224 +12225 +12226 +12227 +12228 +12229 +12230 +12231 +12232 +12233 +12234 +12235 +12236 +12237 +12238 +12239 +12240 +12241 +12242 +12243 +12244 +12245 +12246 +12247 +12248 +12249 +12250 +12251 +12252 +12253 +12254 +12255 +12256 +12257 +12258 +12259 +12260 +12261 +12262 +12263 +12264 +12265 +12266 +12267 +12268 +12269 +12270 +12271 +12272 +12273 +12274 +12275 +12276 +12277 +12278 +12279 +12280 +12281 +12282 +12283 +12284 +12285 +12286 +12287 +12288 +12289 +12290 +12291 +12292 +12293 +12294 +12295 +12296 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12306 +12307 +12308 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12316 +12317 +12318 +12319 +12320 +12321 +12322 +12323 +12324 +12325 +12326 +12327 +12328 +12329 +12330 +12331 +12332 +12333 +12334 +12335 +12336 +12337 +12338 +12339 +12340 +12341 +12342 +12343 +12344 +12345 +12346 +12347 +12348 +12349 +12350 +12351 +12352 +12353 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12363 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12388 +12389 +12390 +12391 +12392 +12393 +12394 +12395 +12396 +12397 +12398 +12399 +12400 +12401 +12402 +12403 +12404 +12405 +12406 +12407 +12408 +12409 +12410 +12411 +12412 +12413 +12414 +12415 +12416 +12417 +12418 +12419 +12420 +12421 +12422 +12423 +12424 +12425 +12426 +12427 +12428 +12429 +12430 +12431 +12432 +12433 +12434 +12435 +12436 +12437 +12438 +12439 +12440 +12441 +12442 +12443 +12444 +12445 +12446 +12447 +12448 +12449 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12459 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12484 +12485 +12486 +12487 +12488 +12489 +12490 +12491 +12492 +12493 +12494 +12495 +12496 +12497 +12498 +12499 +12500 +12501 +12502 +12503 +12504 +12505 +12506 +12507 +12508 +12509 +12510 +12511 +12512 +12513 +12514 +12515 +12516 +12517 +12518 +12519 +12520 +12521 +12522 +12523 +12524 +12525 +12526 +12527 +12528 +12529 +12530 +12531 +12532 +12533 +12534 +12535 +12536 +12537 +12538 +12539 +12540 +12541 +12542 +12543 +12544 +12545 +12546 +12547 +12548 +12549 +12550 +12551 +12552 +12553 +12554 +12555 +12556 +12557 +12558 +12559 +12560 +12561 +12562 +12563 +12564 +12565 +12566 +12567 +12568 +12569 +12570 +12571 +12572 +12573 +12574 +12575 +12576 +12577 +12578 +12579 +12580 +12581 +12582 +12583 +12584 +12585 +12586 +12587 +12588 +12589 +12590 +12591 +12592 +12593 +12594 +12595 +12596 +12597 +12598 +12599 +12600 +12601 +12602 +12603 +12604 +12605 +12606 +12607 +12608 +12609 +12610 +12611 +12612 +12613 +12614 +12615 +12616 +12617 +12618 +12619 +12620 +12621 +12622 +12623 +12624 +12625 +12626 +12627 +12628 +12629 +12630 +12631 +12632 +12633 +12634 +12635 +12636 +12637 +12638 +12639 +12640 +12641 +12642 +12643 +12644 +12645 +12646 +12647 +12648 +12649 +12650 +12651 +12652 +12653 +12654 +12655 +12656 +12657 +12658 +12659 +12660 +12661 +12662 +12663 +12664 +12665 +12666 +12667 +12668 +12669 +12670 +12671 +12672 +12673 +12674 +12675 +12676 +12677 +12678 +12679 +12680 +12681 +12682 +12683 +12684 +12685 +12686 +12687 +12688 +12689 +12690 +12691 +12692 +12693 +12694 +12695 +12696 +12697 +12698 +12699 +12700 +12701 +12702 +12703 +12704 +12705 +12706 +12707 +12708 +12709 +12710 +12711 +12712 +12713 +12714 +12715 +12716 +12717 +12718 +12719 +12720 +12721 +12722 +12723 +12724 +12725 +12726 +12727 +12728 +12729 +12730 +12731 +12732 +12733 +12734 +12735 +12736 +12737 +12738 +12739 +12740 +12741 +12742 +12743 +12744 +12745 +12746 +12747 +12748 +12749 +12750 +12751 +12752 +12753 +12754 +12755 +12756 +12757 +12758 +12759 +12760 +12761 +12762 +12763 +12764 +12765 +12766 +12767 +12768 +12769 +12770 +12771 +12772 +12773 +12774 +12775 +12776 +12777 +12778 +12779 +12780 +12781 +12782 +12783 +12784 +12785 +12786 +12787 +12788 +12789 +12790 +12791 +12792 +12793 +12794 +12795 +12796 +12797 +12798 +12799 +12800 +12801 +12802 +12803 +12804 +12805 +12806 +12807 +12808 +12809 +12810 +12811 +12812 +12813 +12814 +12815 +12816 +12817 +12818 +12819 +12820 +12821 +12822 +12823 +12824 +12825 +12826 +12827 +12828 +12829 +12830 +12831 +12832 +12833 +12834 +12835 +12836 +12837 +12838 +12839 +12840 +12841 +12842 +12843 +12844 +12845 +12846 +12847 +12848 +12849 +12850 +12851 +12852 +12853 +12854 +12855 +12856 +12857 +12858 +12859 +12860 +12861 +12862 +12863 +12864 +12865 +12866 +12867 +12868 +12869 +12870 +12871 +12872 +12873 +12874 +12875 +12876 +12877 +12878 +12879 +12880 +12881 +12882 +12883 +12884 +12885 +12886 +12887 +12888 +12889 +12890 +12891 +12892 +12893 +12894 +12895 +12896 +12897 +12898 +12899 +12900 +12901 +12902 +12903 +12904 +12905 +12906 +12907 +12908 +12909 +12910 +12911 +12912 +12913 +12914 +12915 +12916 +12917 +12918 +12919 +12920 +12921 +12922 +12923 +12924 +12925 +12926 +12927 +12928 +12929 +12930 +12931 +12932 +12933 +12934 +12935 +12936 +12937 +12938 +12939 +12940 +12941 +12942 +12943 +12944 +12945 +12946 +12947 +12948 +12949 +12950 +12951 +12952 +12953 +12954 +12955 +12956 +12957 +12958 +12959 +12960 +12961 +12962 +12963 +12964 +12965 +12966 +12967 +12968 +12969 +12970 +12971 +12972 +12973 +12974 +12975 +12976 +12977 +12978 +12979 +12980 +12981 +12982 +12983 +12984 +12985 +12986 +12987 +12988 +12989 +12990 +12991 +12992 +12993 +12994 +12995 +12996 +12997 +12998 +12999 +13000 +13001 +13002 +13003 +13004 +13005 +13006 +13007 +13008 +13009 +13010 +13011 +13012 +13013 +13014 +13015 +13016 +13017 +13018 +13019 +13020 +13021 +13022 +13023 +13024 +13025 +13026 +13027 +13028 +13029 +13030 +13031 +13032 +13033 +13034 +13035 +13036 +13037 +13038 +13039 +13040 +13041 +13042 +13043 +13044 +13045 +13046 +13047 +13048 +13049 +13050 +13051 +13052 +13053 +13054 +13055 +13056 +13057 +13058 +13059 +13060 +13061 +13062 +13063 +13064 +13065 +13066 +13067 +13068 +13069 +13070 +13071 +13072 +13073 +13074 +13075 +13076 +13077 +13078 +13079 +13080 +13081 +13082 +13083 +13084 +13085 +13086 +13087 +13088 +13089 +13090 +13091 +13092 +13093 +13094 +13095 +13096 +13097 +13098 +13099 +13100 +13101 +13102 +13103 +13104 +13105 +13106 +13107 +13108 +13109 +13110 +13111 +13112 +13113 +13114 +13115 +13116 +13117 +13118 +13119 +13120 +13121 +13122 +13123 +13124 +13125 +13126 +13127 +13128 +13129 +13130 +13131 +13132 +13133 +13134 +13135 +13136 +13137 +13138 +13139 +13140 +13141 +13142 +13143 +13144 +13145 +13146 +13147 +13148 +13149 +13150 +13151 +13152 +13153 +13154 +13155 +13156 +13157 +13158 +13159 +13160 +13161 +13162 +13163 +13164 +13165 +13166 +13167 +13168 +13169 +13170 +13171 +13172 +13173 +13174 +13175 +13176 +13177 +13178 +13179 +13180 +13181 +13182 +13183 +13184 +13185 +13186 +13187 +13188 +13189 +13190 +13191 +13192 +13193 +13194 +13195 +13196 +13197 +13198 +13199 +13200 +13201 +13202 +13203 +13204 +13205 +13206 +13207 +13208 +13209 +13210 +13211 +13212 +13213 +13214 +13215 +13216 +13217 +13218 +13219 +13220 +13221 +13222 +13223 +13224 +13225 +13226 +13227 +13228 +13229 +13230 +13231 +13232 +13233 +13234 +13235 +13236 +13237 +13238 +13239 +13240 +13241 +13242 +13243 +13244 +13245 +13246 +13247 +13248 +13249 +13250 +13251 +13252 +13253 +13254 +13255 +13256 +13257 +13258 +13259 +13260 +13261 +13262 +13263 +13264 +13265 +13266 +13267 +13268 +13269 +13270 +13271 +13272 +13273 +13274 +13275 +13276 +13277 +13278 +13279 +13280 +13281 +13282 +13283 +13284 +13285 +13286 +13287 +13288 +13289 +13290 +13291 +13292 +13293 +13294 +13295 +13296 +13297 +13298 +13299 +13300 +13301 +13302 +13303 +13304 +13305 +13306 +13307 +13308 +13309 +13310 +13311 +13312 +13313 +13314 +13315 +13316 +13317 +13318 +13319 +13320 +13321 +13322 +13323 +13324 +13325 +13326 +13327 +13328 +13329 +13330 +13331 +13332 +13333 +13334 +13335 +13336 +13337 +13338 +13339 +13340 +13341 +13342 +13343 +13344 +13345 +13346 +13347 +13348 +13349 +13350 +13351 +13352 +13353 +13354 +13355 +13356 +13357 +13358 +13359 +13360 +13361 +13362 +13363 +13364 +13365 +13366 +13367 +13368 +13369 +13370 +13371 +13372 +13373 +13374 +13375 +13376 +13377 +13378 +13379 +13380 +13381 +13382 +13383 +13384 +13385 +13386 +13387 +13388 +13389 +13390 +13391 +13392 +13393 +13394 +13395 +13396 +13397 +13398 +13399 +13400 +13401 +13402 +13403 +13404 +13405 +13406 +13407 +13408 +13409 +13410 +13411 +13412 +13413 +13414 +13415 +13416 +13417 +13418 +13419 +13420 +13421 +13422 +13423 +13424 +13425 +13426 +13427 +13428 +13429 +13430 +13431 +13432 +13433 +13434 +13435 +13436 +13437 +13438 +13439 +13440 +13441 +13442 +13443 +13444 +13445 +13446 +13447 +13448 +13449 +13450 +13451 +13452 +13453 +13454 +13455 +13456 +13457 +13458 +13459 +13460 +13461 +13462 +13463 +13464 +13465 +13466 +13467 +13468 +13469 +13470 +13471 +13472 +13473 +13474 +13475 +13476 +13477 +13478 +13479 +13480 +13481 +13482 +13483 +13484 +13485 +13486 +13487 +13488 +13489 +13490 +13491 +13492 +13493 +13494 +13495 +13496 +13497 +13498 +13499 +13500 +13501 +13502 +13503 +13504 +13505 +13506 +13507 +13508 +13509 +13510 +13511 +13512 +13513 +13514 +13515 +13516 +13517 +13518 +13519 +13520 +13521 +13522 +13523 +13524 +13525 +13526 +13527 +13528 +13529 +13530 +13531 +13532 +13533 +13534 +13535 +13536 +13537 +13538 +13539 +13540 +13541 +13542 +13543 +13544 +13545 +13546 +13547 +13548 +13549 +13550 +13551 +13552 +13553 +13554 +13555 +13556 +13557 +13558 +13559 +13560 +13561 +13562 +13563 +13564 +13565 +13566 +13567 +13568 +13569 +13570 +13571 +13572 +13573 +13574 +13575 +13576 +13577 +13578 +13579 +13580 +13581 +13582 +13583 +13584 +13585 +13586 +13587 +13588 +13589 +13590 +13591 +13592 +13593 +13594 +13595 +13596 +13597 +13598 +13599 +13600 +13601 +13602 +13603 +13604 +13605 +13606 +13607 +13608 +13609 +13610 +13611 +13612 +13613 +13614 +13615 +13616 +13617 +13618 +13619 +13620 +13621 +13622 +13623 +13624 +13625 +13626 +13627 +13628 +13629 +13630 +13631 +13632 +13633 +13634 +13635 +13636 +13637 +13638 +13639 +13640 +13641 +13642 +13643 +13644 +13645 +13646 +13647 +13648 +13649 +13650 +13651 +13652 +13653 +13654 +13655 +13656 +13657 +13658 +13659 +13660 +13661 +13662 +13663 +13664 +13665 +13666 +13667 +13668 +13669 +13670 +13671 +13672 +13673 +13674 +13675 +13676 +13677 +13678 +13679 +13680 +13681 +13682 +13683 +13684 +13685 +13686 +13687 +13688 +13689 +13690 +13691 +13692 +13693 +13694 +13695 +13696 +13697 +13698 +13699 +13700 +13701 +13702 +13703 +13704 +13705 +13706 +13707 +13708 +13709 +13710 +13711 +13712 +13713 +13714 +13715 +13716 +13717 +13718 +13719 +13720 +13721 +13722 +13723 +13724 +13725 +13726 +13727 +13728 +13729 +13730 +13731 +13732 +13733 +13734 +13735 +13736 +13737 +13738 +13739 +13740 +13741 +13742 +13743 +13744 +13745 +13746 +13747 +13748 +13749 +13750 +13751 +13752 +13753 +13754 +13755 +13756 +13757 +13758 +13759 +13760 +13761 +13762 +13763 +13764 +13765 +13766 +13767 +13768 +13769 +13770 +13771 +13772 +13773 +13774 +13775 +13776 +13777 +13778 +13779 +13780 +13781 +13782 +13783 +13784 +13785 +13786 +13787 +13788 +13789 +13790 +13791 +13792 +13793 +13794 +13795 +13796 +13797 +13798 +13799 +13800 +13801 +13802 +13803 +13804 +13805 +13806 +13807 +13808 +13809 +13810 +13811 +13812 +13813 +13814 +13815 +13816 +13817 +13818 +13819 +13820 +13821 +13822 +13823 +13824 +13825 +13826 +13827 +13828 +13829 +13830 +13831 +13832 +13833 +13834 +13835 +13836 +13837 +13838 +13839 +13840 +13841 +13842 +13843 +13844 +13845 +13846 +13847 +13848 +13849 +13850 +13851 +13852 +13853 +13854 +13855 +13856 +13857 +13858 +13859 +13860 +13861 +13862 +13863 +13864 +13865 +13866 +13867 +13868 +13869 +13870 +13871 +13872 +13873 +13874 +13875 +13876 +13877 +13878 +13879 +13880 +13881 +13882 +13883 +13884 +13885 +13886 +13887 +13888 +13889 +13890 +13891 +13892 +13893 +13894 +13895 +13896 +13897 +13898 +13899 +13900 +13901 +13902 +13903 +13904 +13905 +13906 +13907 +13908 +13909 +13910 +13911 +13912 +13913 +13914 +13915 +13916 +13917 +13918 +13919 +13920 +13921 +13922 +13923 +13924 +13925 +13926 +13927 +13928 +13929 +13930 +13931 +13932 +13933 +13934 +13935 +13936 +13937 +13938 +13939 +13940 +13941 +13942 +13943 +13944 +13945 +13946 +13947 +13948 +13949 +13950 +13951 +13952 +13953 +13954 +13955 +13956 +13957 +13958 +13959 +13960 +13961 +13962 +13963 +13964 +13965 +13966 +13967 +13968 +13969 +13970 +13971 +13972 +13973 +13974 +13975 +13976 +13977 +13978 +13979 +13980 +13981 +13982 +13983 +13984 +13985 +13986 +13987 +13988 +13989 +13990 +13991 +13992 +13993 +13994 +13995 +13996 +13997 +13998 +13999 +14000 +14001 +14002 +14003 +14004 +14005 +14006 +14007 +14008 +14009 +14010 +14011 +14012 +14013 +14014 +14015 +14016 +14017 +14018 +14019 +14020 +14021 +14022 +14023 +14024 +14025 +14026 +14027 +14028 +14029 +14030 +14031 +14032 +14033 +14034 +14035 +14036 +14037 +14038 +14039 +14040 +14041 +14042 +14043 +14044 +14045 +14046 +14047 +14048 +14049 +14050 +14051 +14052 +14053 +14054 +14055 +14056 +14057 +14058 +14059 +14060 +14061 +14062 +14063 +14064 +14065 +14066 +14067 +14068 +14069 +14070 +14071 +14072 +14073 +14074 +14075 +14076 +14077 +14078 +14079 +14080 +14081 +14082 +14083 +14084 +14085 +14086 +14087 +14088 +14089 +14090 +14091 +14092 +14093 +14094 +14095 +14096 +14097 +14098 +14099 +14100 +14101 +14102 +14103 +14104 +14105 +14106 +14107 +14108 +14109 +14110 +14111 +14112 +14113 +14114 +14115 +14116 +14117 +14118 +14119 +14120 +14121 +14122 +14123 +14124 +14125 +14126 +14127 +14128 +14129 +14130 +14131 +14132 +14133 +14134 +14135 +14136 +14137 +14138 +14139 +14140 +14141 +14142 +14143 +14144 +14145 +14146 +14147 +14148 +14149 +14150 +14151 +14152 +14153 +14154 +14155 +14156 +14157 +14158 +14159 +14160 +14161 +14162 +14163 +14164 +14165 +14166 +14167 +14168 +14169 +14170 +14171 +14172 +14173 +14174 +14175 +14176 +14177 +14178 +14179 +14180 +14181 +14182 +14183 +14184 +14185 +14186 +14187 +14188 +14189 +14190 +14191 +14192 +14193 +14194 +14195 +14196 +14197 +14198 +14199 +14200 +14201 +14202 +14203 +14204 +14205 +14206 +14207 +14208 +14209 +14210 +14211 +14212 +14213 +14214 +14215 +14216 +14217 +14218 +14219 +14220 +14221 +14222 +14223 +14224 +14225 +14226 +14227 +14228 +14229 +14230 +14231 +14232 +14233 +14234 +14235 +14236 +14237 +14238 +14239 +14240 +14241 +14242 +14243 +14244 +14245 +14246 +14247 +14248 +14249 +14250 +14251 +14252 +14253 +14254 +14255 +14256 +14257 +14258 +14259 +14260 +14261 +14262 +14263 +14264 +14265 +14266 +14267 +14268 +14269 +14270 +14271 +14272 +14273 +14274 +14275 +14276 +14277 +14278 +14279 +14280 +14281 +14282 +14283 +14284 +14285 +14286 +14287 +14288 +14289 +14290 +14291 +14292 +14293 +14294 +14295 +14296 +14297 +14298 +14299 +14300 +14301 +14302 +14303 +14304 +14305 +14306 +14307 +14308 +14309 +14310 +14311 +14312 +14313 +14314 +14315 +14316 +14317 +14318 +14319 +14320 +14321 +14322 +14323 +14324 +14325 +14326 +14327 +14328 +14329 +14330 +14331 +14332 +14333 +14334 +14335 +14336 +14337 +14338 +14339 +14340 +14341 +14342 +14343 +14344 +14345 +14346 +14347 +14348 +14349 +14350 +14351 +14352 +14353 +14354 +14355 +14356 +14357 +14358 +14359 +14360 +14361 +14362 +14363 +14364 +14365 +14366 +14367 +14368 +14369 +14370 +14371 +14372 +14373 +14374 +14375 +14376 +14377 +14378 +14379 +14380 +14381 +14382 +14383 +14384 +14385 +14386 +14387 +14388 +14389 +14390 +14391 +14392 +14393 +14394 +14395 +14396 +14397 +14398 +14399 +14400 +14401 +14402 +14403 +14404 +14405 +14406 +14407 +14408 +14409 +14410 +14411 +14412 +14413 +14414 +14415 +14416 +14417 +14418 +14419 +14420 +14421 +14422 +14423 +14424 +14425 +14426 +14427 +14428 +14429 +14430 +14431 +14432 +14433 +14434 +14435 +14436 +14437 +14438 +14439 +14440 +14441 +14442 +14443 +14444 +14445 +14446 +14447 +14448 +14449 +14450 +14451 +14452 +14453 +14454 +14455 +14456 +14457 +14458 +14459 +14460 +14461 +14462 +14463 +14464 +14465 +14466 +14467 +14468 +14469 +14470 +14471 +14472 +14473 +14474 +14475 +14476 +14477 +14478 +14479 +14480 +14481 +14482 +14483 +14484 +14485 +14486 +14487 +14488 +14489 +14490 +14491 +14492 +14493 +14494 +14495 +14496 +14497 +14498 +14499 +14500 +14501 +14502 +14503 +14504 +14505 +14506 +14507 +14508 +14509 +14510 +14511 +14512 +14513 +14514 +14515 +14516 +14517 +14518 +14519 +14520 +14521 +14522 +14523 +14524 +14525 +14526 +14527 +14528 +14529 +14530 +14531 +14532 +14533 +14534 +14535 +14536 +14537 +14538 +14539 +14540 +14541 +14542 +14543 +14544 +14545 +14546 +14547 +14548 +14549 +14550 +14551 +14552 +14553 +14554 +14555 +14556 +14557 +14558 +14559 +14560 +14561 +14562 +14563 +14564 +14565 +14566 +14567 +14568 +14569 +14570 +14571 +14572 +14573 +14574 +14575 +14576 +14577 +14578 +14579 +14580 +14581 +14582 +14583 +14584 +14585 +14586 +14587 +14588 +14589 +14590 +14591 +14592 +14593 +14594 +14595 +14596 +14597 +14598 +14599 +14600 +14601 +14602 +14603 +14604 +14605 +14606 +14607 +14608 +14609 +14610 +14611 +14612 +14613 +14614 +14615 +14616 +14617 +14618 +14619 +14620 +14621 +14622 +14623 +14624 +14625 +14626 +14627 +14628 +14629 +14630 +14631 +14632 +14633 +14634 +14635 +14636 +14637 +14638 +14639 +14640 +14641 +14642 +14643 +14644 +14645 +14646 +14647 +14648 +14649 +14650 +14651 +14652 +14653 +14654 +14655 +14656 +14657 +14658 +14659 +14660 +14661 +14662 +14663 +14664 +14665 +14666 +14667 +14668 +14669 +14670 +14671 +14672 +14673 +14674 +14675 +14676 +14677 +14678 +14679 +14680 +14681 +14682 +14683 +14684 +14685 +14686 +14687 +14688 +14689 +14690 +14691 +14692 +14693 +14694 +14695 +14696 +14697 +14698 +14699 +14700 +14701 +14702 +14703 +14704 +14705 +14706 +14707 +14708 +14709 +14710 +14711 +14712 +14713 +14714 +14715 +14716 +14717 +14718 +14719 +14720 +14721 +14722 +14723 +14724 +14725 +14726 +14727 +14728 +14729 +14730 +14731 +14732 +14733 +14734 +14735 +14736 +14737 +14738 +14739 +14740 +14741 +14742 +14743 +14744 +14745 +14746 +14747 +14748 +14749 +14750 +14751 +14752 +14753 +14754 +14755 +14756 +14757 +14758 +14759 +14760 +14761 +14762 +14763 +14764 +14765 +14766 +14767 +14768 +14769 +14770 +14771 +14772 +14773 +14774 +14775 +14776 +14777 +14778 +14779 +14780 +14781 +14782 +14783 +14784 +14785 +14786 +14787 +14788 +14789 +14790 +14791 +14792 +14793 +14794 +14795 +14796 +14797 +14798 +14799 +14800 +14801 +14802 +14803 +14804 +14805 +14806 +14807 +14808 +14809 +14810 +14811 +14812 +14813 +14814 +14815 +14816 +14817 +14818 +14819 +14820 +14821 +14822 +14823 +14824 +14825 +14826 +14827 +14828 +14829 +14830 +14831 +14832 +14833 +14834 +14835 +14836 +14837 +14838 +14839 +14840 +14841 +14842 +14843 +14844 +14845 +14846 +14847 +14848 +14849 +14850 +14851 +14852 +14853 +14854 +14855 +14856 +14857 +14858 +14859 +14860 +14861 +14862 +14863 +14864 +14865 +14866 +14867 +14868 +14869 +14870 +14871 +14872 +14873 +14874 +14875 +14876 +14877 +14878 +14879 +14880 +14881 +14882 +14883 +14884 +14885 +14886 +14887 +14888 +14889 +14890 +14891 +14892 +14893 +14894 +14895 +14896 +14897 +14898 +14899 +14900 +14901 +14902 +14903 +14904 +14905 +14906 +14907 +14908 +14909 +14910 +14911 +14912 +14913 +14914 +14915 +14916 +14917 +14918 +14919 +14920 +14921 +14922 +14923 +14924 +14925 +14926 +14927 +14928 +14929 +14930 +14931 +14932 +14933 +14934 +14935 +14936 +14937 +14938 +14939 +14940 +14941 +14942 +14943 +14944 +14945 +14946 +14947 +14948 +14949 +14950 +14951 +14952 +14953 +14954 +14955 +14956 +14957 +14958 +14959 +14960 +14961 +14962 +14963 +14964 +14965 +14966 +14967 +14968 +14969 +14970 +14971 +14972 +14973 +14974 +14975 +14976 +14977 +14978 +14979 +14980 +14981 +14982 +14983 +14984 +14985 +14986 +14987 +14988 +14989 +14990 +14991 +14992 +14993 +14994 +14995 +14996 +14997 +14998 +14999 +15000 +15001 +15002 +15003 +15004 +15005 +15006 +15007 +15008 +15009 +15010 +15011 +15012 +15013 +15014 +15015 +15016 +15017 +15018 +15019 +15020 +15021 +15022 +15023 +15024 +15025 +15026 +15027 +15028 +15029 +15030 +15031 +15032 +15033 +15034 +15035 +15036 +15037 +15038 +15039 +15040 +15041 +15042 +15043 +15044 +15045 +15046 +15047 +15048 +15049 +15050 +15051 +15052 +15053 +15054 +15055 +15056 +15057 +15058 +15059 +15060 +15061 +15062 +15063 +15064 +15065 +15066 +15067 +15068 +15069 +15070 +15071 +15072 +15073 +15074 +15075 +15076 +15077 +15078 +15079 +15080 +15081 +15082 +15083 +15084 +15085 +15086 +15087 +15088 +15089 +15090 +15091 +15092 +15093 +15094 +15095 +15096 +15097 +15098 +15099 +15100 +15101 +15102 +15103 +15104 +15105 +15106 +15107 +15108 +15109 +15110 +15111 +15112 +15113 +15114 +15115 +15116 +15117 +15118 +15119 +15120 +15121 +15122 +15123 +15124 +15125 +15126 +15127 +15128 +15129 +15130 +15131 +15132 +15133 +15134 +15135 +15136 +15137 +15138 +15139 +15140 +15141 +15142 +15143 +15144 +15145 +15146 +15147 +15148 +15149 +15150 +15151 +15152 +15153 +15154 +15155 +15156 +15157 +15158 +15159 +15160 +15161 +15162 +15163 +15164 +15165 +15166 +15167 +15168 +15169 +15170 +15171 +15172 +15173 +15174 +15175 +15176 +15177 +15178 +15179 +15180 +15181 +15182 +15183 +15184 +15185 +15186 +15187 +15188 +15189 +15190 +15191 +15192 +15193 +15194 +15195 +15196 +15197 +15198 +15199 +15200 +15201 +15202 +15203 +15204 +15205 +15206 +15207 +15208 +15209 +15210 +15211 +15212 +15213 +15214 +15215 +15216 +15217 +15218 +15219 +15220 +15221 +15222 +15223 +15224 +15225 +15226 +15227 +15228 +15229 +15230 +15231 +15232 +15233 +15234 +15235 +15236 +15237 +15238 +15239 +15240 +15241 +15242 +15243 +15244 +15245 +15246 +15247 +15248 +15249 +15250 +15251 +15252 +15253 +15254 +15255 +15256 +15257 +15258 +15259 +15260 +15261 +15262 +15263 +15264 +15265 +15266 +15267 +15268 +15269 +15270 +15271 +15272 +15273 +15274 +15275 +15276 +15277 +15278 +15279 +15280 +15281 +15282 +15283 +15284 +15285 +15286 +15287 +15288 +15289 +15290 +15291 +15292 +15293 +15294 +15295 +15296 +15297 +15298 +15299 +15300 +15301 +15302 +15303 +15304 +15305 +15306 +15307 +15308 +15309 +15310 +15311 +15312 +15313 +15314 +15315 +15316 +15317 +15318 +15319 +15320 +15321 +15322 +15323 +15324 +15325 +15326 +15327 +15328 +15329 +15330 +15331 +15332 +15333 +15334 +15335 +15336 +15337 +15338 +15339 +15340 +15341 +15342 +15343 +15344 +15345 +15346 +15347 +15348 +15349 +15350 +15351 +15352 +15353 +15354 +15355 +15356 +15357 +15358 +15359 +15360 +15361 +15362 +15363 +15364 +15365 +15366 +15367 +15368 +15369 +15370 +15371 +15372 +15373 +15374 +15375 +15376 +15377 +15378 +15379 +15380 +15381 +15382 +15383 +15384 +15385 +15386 +15387 +15388 +15389 +15390 +15391 +15392 +15393 +15394 +15395 +15396 +15397 +15398 +15399 +15400 +15401 +15402 +15403 +15404 +15405 +15406 +15407 +15408 +15409 +15410 +15411 +15412 +15413 +15414 +15415 +15416 +15417 +15418 +15419 +15420 +15421 +15422 +15423 +15424 +15425 +15426 +15427 +15428 +15429 +15430 +15431 +15432 +15433 +15434 +15435 +15436 +15437 +15438 +15439 +15440 +15441 +15442 +15443 +15444 +15445 +15446 +15447 +15448 +15449 +15450 +15451 +15452 +15453 +15454 +15455 +15456 +15457 +15458 +15459 +15460 +15461 +15462 +15463 +15464 +15465 +15466 +15467 +15468 +15469 +15470 +15471 +15472 +15473 +15474 +15475 +15476 +15477 +15478 +15479 +15480 +15481 +15482 +15483 +15484 +15485 +15486 +15487 +15488 +15489 +15490 +15491 +15492 +15493 +15494 +15495 +15496 +15497 +15498 +15499 +15500 +15501 +15502 +15503 +15504 +15505 +15506 +15507 +15508 +15509 +15510 +15511 +15512 +15513 +15514 +15515 +15516 +15517 +15518 +15519 +15520 +15521 +15522 +15523 +15524 +15525 +15526 +15527 +15528 +15529 +15530 +15531 +15532 +15533 +15534 +15535 +15536 +15537 +15538 +15539 +15540 +15541 +15542 +15543 +15544 +15545 +15546 +15547 +15548 +15549 +15550 +15551 +15552 +15553 +15554 +15555 +15556 +15557 +15558 +15559 +15560 +15561 +15562 +15563 +15564 +15565 +15566 +15567 +15568 +15569 +15570 +15571 +15572 +15573 +15574 +15575 +15576 +15577 +15578 +15579 +15580 +15581 +15582 +15583 +15584 +15585 +15586 +15587 +15588 +15589 +15590 +15591 +15592 +15593 +15594 +15595 +15596 +15597 +15598 +15599 +15600 +15601 +15602 +15603 +15604 +15605 +15606 +15607 +15608 +15609 +15610 +15611 +15612 +15613 +15614 +15615 +15616 +15617 +15618 +15619 +15620 +15621 +15622 +15623 +15624 +15625 +15626 +15627 +15628 +15629 +15630 +15631 +15632 +15633 +15634 +15635 +15636 +15637 +15638 +15639 +15640 +15641 +15642 +15643 +15644 +15645 +15646 +15647 +15648 +15649 +15650 +15651 +15652 +15653 +15654 +15655 +15656 +15657 +15658 +15659 +15660 +15661 +15662 +15663 +15664 +15665 +15666 +15667 +15668 +15669 +15670 +15671 +15672 +15673 +15674 +15675 +15676 +15677 +15678 +15679 +15680 +15681 +15682 +15683 +15684 +15685 +15686 +15687 +15688 +15689 +15690 +15691 +15692 +15693 +15694 +15695 +15696 +15697 +15698 +15699 +15700 +15701 +15702 +15703 +15704 +15705 +15706 +15707 +15708 +15709 +15710 +15711 +15712 +15713 +15714 +15715 +15716 +15717 +15718 +15719 +15720 +15721 +15722 +15723 +15724 +15725 +15726 +15727 +15728 +15729 +15730 +15731 +15732 +15733 +15734 +15735 +15736 +15737 +15738 +15739 +15740 +15741 +15742 +15743 +15744 +15745 +15746 +15747 +15748 +15749 +15750 +15751 +15752 +15753 +15754 +15755 +15756 +15757 +15758 +15759 +15760 +15761 +15762 +15763 +15764 +15765 +15766 +15767 +15768 +15769 +15770 +15771 +15772 +15773 +15774 +15775 +15776 +15777 +15778 +15779 +15780 +15781 +15782 +15783 +15784 +15785 +15786 +15787 +15788 +15789 +15790 +15791 +15792 +15793 +15794 +15795 +15796 +15797 +15798 +15799 +15800 +15801 +15802 +15803 +15804 +15805 +15806 +15807 +15808 +15809 +15810 +15811 +15812 +15813 +15814 +15815 +15816 +15817 +15818 +15819 +15820 +15821 +15822 +15823 +15824 +15825 +15826 +15827 +15828 +15829 +15830 +15831 +15832 +15833 +15834 +15835 +15836 +15837 +15838 +15839 +15840 +15841 +15842 +15843 +15844 +15845 +15846 +15847 +15848 +15849 +15850 +15851 +15852 +15853 +15854 +15855 +15856 +15857 +15858 +15859 +15860 +15861 +15862 +15863 +15864 +15865 +15866 +15867 +15868 +15869 +15870 +15871 +15872 +15873 +15874 +15875 +15876 +15877 +15878 +15879 +15880 +15881 +15882 +15883 +15884 +15885 +15886 +15887 +15888 +15889 +15890 +15891 +15892 +15893 +15894 +15895 +15896 +15897 +15898 +15899 +15900 +15901 +15902 +15903 +15904 +15905 +15906 +15907 +15908 +15909 +15910 +15911 +15912 +15913 +15914 +15915 +15916 +15917 +15918 +15919 +15920 +15921 +15922 +15923 +15924 +15925 +15926 +15927 +15928 +15929 +15930 +15931 +15932 +15933 +15934 +15935 +15936 +15937 +15938 +15939 +15940 +15941 +15942 +15943 +15944 +15945 +15946 +15947 +15948 +15949 +15950 +15951 +15952 +15953 +15954 +15955 +15956 +15957 +15958 +15959 +15960 +15961 +15962 +15963 +15964 +15965 +15966 +15967 +15968 +15969 +15970 +15971 +15972 +15973 +15974 +15975 +15976 +15977 +15978 +15979 +15980 +15981 +15982 +15983 +15984 +15985 +15986 +15987 +15988 +15989 +15990 +15991 +15992 +15993 +15994 +15995 +15996 +15997 +15998 +15999 +16000 +16001 +16002 +16003 +16004 +16005 +16006 +16007 +16008 +16009 +16010 +16011 +16012 +16013 +16014 +16015 +16016 +16017 +16018 +16019 +16020 +16021 +16022 +16023 +16024 +16025 +16026 +16027 +16028 +16029 +16030 +16031 +16032 +16033 +16034 +16035 +16036 +16037 +16038 +16039 +16040 +16041 +16042 +16043 +16044 +16045 +16046 +16047 +16048 +16049 +16050 +16051 +16052 +16053 +16054 +16055 +16056 +16057 +16058 +16059 +16060 +16061 +16062 +16063 +16064 +16065 +16066 +16067 +16068 +16069 +16070 +16071 +16072 +16073 +16074 +16075 +16076 +16077 +16078 +16079 +16080 +16081 +16082 +16083 +16084 +16085 +16086 +16087 +16088 +16089 +16090 +16091 +16092 +16093 +16094 +16095 +16096 +16097 +16098 +16099 +16100 +16101 +16102 +16103 +16104 +16105 +16106 +16107 +16108 +16109 +16110 +16111 +16112 +16113 +16114 +16115 +16116 +16117 +16118 +16119 +16120 +16121 +16122 +16123 +16124 +16125 +16126 +16127 +16128 +16129 +16130 +16131 +16132 +16133 +16134 +16135 +16136 +16137 +16138 +16139 +16140 +16141 +16142 +16143 +16144 +16145 +16146 +16147 +16148 +16149 +16150 +16151 +16152 +16153 +16154 +16155 +16156 +16157 +16158 +16159 +16160 +16161 +16162 +16163 +16164 +16165 +16166 +16167 +16168 +16169 +16170 +16171 +16172 +16173 +16174 +16175 +16176 +16177 +16178 +16179 +16180 +16181 +16182 +16183 +16184 +16185 +16186 +16187 +16188 +16189 +16190 +16191 +16192 +16193 +16194 +16195 +16196 +16197 +16198 +16199 +16200 +16201 +16202 +16203 +16204 +16205 +16206 +16207 +16208 +16209 +16210 +16211 +16212 +16213 +16214 +16215 +16216 +16217 +16218 +16219 +16220 +16221 +16222 +16223 +16224 +16225 +16226 +16227 +16228 +16229 +16230 +16231 +16232 +16233 +16234 +16235 +16236 +16237 +16238 +16239 +16240 +16241 +16242 +16243 +16244 +16245 +16246 +16247 +16248 +16249 +16250 +16251 +16252 +16253 +16254 +16255 +16256 +16257 +16258 +16259 +16260 +16261 +16262 +16263 +16264 +16265 +16266 +16267 +16268 +16269 +16270 +16271 +16272 +16273 +16274 +16275 +16276 +16277 +16278 +16279 +16280 +16281 +16282 +16283 +16284 +16285 +16286 +16287 +16288 +16289 +16290 +16291 +16292 +16293 +16294 +16295 +16296 +16297 +16298 +16299 +16300 +16301 +16302 +16303 +16304 +16305 +16306 +16307 +16308 +16309 +16310 +16311 +16312 +16313 +16314 +16315 +16316 +16317 +16318 +16319 +16320 +16321 +16322 +16323 +16324 +16325 +16326 +16327 +16328 +16329 +16330 +16331 +16332 +16333 +16334 +16335 +16336 +16337 +16338 +16339 +16340 +16341 +16342 +16343 +16344 +16345 +16346 +16347 +16348 +16349 +16350 +16351 +16352 +16353 +16354 +16355 +16356 +16357 +16358 +16359 +16360 +16361 +16362 +16363 +16364 +16365 +16366 +16367 +16368 +16369 +16370 +16371 +16372 +16373 +16374 +16375 +16376 +16377 +16378 +16379 +16380 +16381 +16382 +16383 +16384 +16385 +16386 +16387 +16388 +16389 +16390 +16391 +16392 +16393 +16394 +16395 +16396 +16397 +16398 +16399 +16400 +16401 +16402 +16403 +16404 +16405 +16406 +16407 +16408 +16409 +16410 +16411 +16412 +16413 +16414 +16415 +16416 +16417 +16418 +16419 +16420 +16421 +16422 +16423 +16424 +16425 +16426 +16427 +16428 +16429 +16430 +16431 +16432 +16433 +16434 +16435 +16436 +16437 +16438 +16439 +16440 +16441 +16442 +16443 +16444 +16445 +16446 +16447 +16448 +16449 +16450 +16451 +16452 +16453 +16454 +16455 +16456 +16457 +16458 +16459 +16460 +16461 +16462 +16463 +16464 +16465 +16466 +16467 +16468 +16469 +16470 +16471 +16472 +16473 +16474 +16475 +16476 +16477 +16478 +16479 +16480 +16481 +16482 +16483 +16484 +16485 +16486 +16487 +16488 +16489 +16490 +16491 +16492 +16493 +16494 +16495 +16496 +16497 +16498 +16499 +16500 +16501 +16502 +16503 +16504 +16505 +16506 +16507 +16508 +16509 +16510 +16511 +16512 +16513 +16514 +16515 +16516 +16517 +16518 +16519 +16520 +16521 +16522 +16523 +16524 +16525 +16526 +16527 +16528 +16529 +16530 +16531 +16532 +16533 +16534 +16535 +16536 +16537 +16538 +16539 +16540 +16541 +16542 +16543 +16544 +16545 +16546 +16547 +16548 +16549 +16550 +16551 +16552 +16553 +16554 +16555 +16556 +16557 +16558 +16559 +16560 +16561 +16562 +16563 +16564 +16565 +16566 +16567 +16568 +16569 +16570 +16571 +16572 +16573 +16574 +16575 +16576 +16577 +16578 +16579 +16580 +16581 +16582 +16583 +16584 +16585 +16586 +16587 +16588 +16589 +16590 +16591 +16592 +16593 +16594 +16595 +16596 +16597 +16598 +16599 +16600 +16601 +16602 +16603 +16604 +16605 +16606 +16607 +16608 +16609 +16610 +16611 +16612 +16613 +16614 +16615 +16616 +16617 +16618 +16619 +16620 +16621 +16622 +16623 +16624 +16625 +16626 +16627 +16628 +16629 +16630 +16631 +16632 +16633 +16634 +16635 +16636 +16637 +16638 +16639 +16640 +16641 +16642 +16643 +16644 +16645 +16646 +16647 +16648 +16649 +16650 +16651 +16652 +16653 +16654 +16655 +16656 +16657 +16658 +16659 +16660 +16661 +16662 +16663 +16664 +16665 +16666 +16667 +16668 +16669 +16670 +16671 +16672 +16673 +16674 +16675 +16676 +16677 +16678 +16679 +16680 +16681 +16682 +16683 +16684 +16685 +16686 +16687 +16688 +16689 +16690 +16691 +16692 +16693 +16694 +16695 +16696 +16697 +16698 +16699 +16700 +16701 +16702 +16703 +16704 +16705 +16706 +16707 +16708 +16709 +16710 +16711 +16712 +16713 +16714 +16715 +16716 +16717 +16718 +16719 +16720 +16721 +16722 +16723 +16724 +16725 +16726 +16727 +16728 +16729 +16730 +16731 +16732 +16733 +16734 +16735 +16736 +16737 +16738 +16739 +16740 +16741 +16742 +16743 +16744 +16745 +16746 +16747 +16748 +16749 +16750 +16751 +16752 +16753 +16754 +16755 +16756 +16757 +16758 +16759 +16760 +16761 +16762 +16763 +16764 +16765 +16766 +16767 +16768 +16769 +16770 +16771 +16772 +16773 +16774 +16775 +16776 +16777 +16778 +16779 +16780 +16781 +16782 +16783 +16784 +16785 +16786 +16787 +16788 +16789 +16790 +16791 +16792 +16793 +16794 +16795 +16796 +16797 +16798 +16799 +16800 +16801 +16802 +16803 +16804 +16805 +16806 +16807 +16808 +16809 +16810 +16811 +16812 +16813 +16814 +16815 +16816 +16817 +16818 +16819 +16820 +16821 +16822 +16823 +16824 +16825 +16826 +16827 +16828 +16829 +16830 +16831 +16832 +16833 +16834 +16835 +16836 +16837 +16838 +16839 +16840 +16841 +16842 +16843 +16844 +16845 +16846 +16847 +16848 +16849 +16850 +16851 +16852 +16853 +16854 +16855 +16856 +16857 +16858 +16859 +16860 +16861 +16862 +16863 +16864 +16865 +16866 +16867 +16868 +16869 +16870 +16871 +16872 +16873 +16874 +16875 +16876 +16877 +16878 +16879 +16880 +16881 +16882 +16883 +16884 +16885 +16886 +16887 +16888 +16889 +16890 +16891 +16892 +16893 +16894 +16895 +16896 +16897 +16898 +16899 +16900 +16901 +16902 +16903 +16904 +16905 +16906 +16907 +16908 +16909 +16910 +16911 +16912 +16913 +16914 +16915 +16916 +16917 +16918 +16919 +16920 +16921 +16922 +16923 +16924 +16925 +16926 +16927 +16928 +16929 +16930 +16931 +16932 +16933 +16934 +16935 +16936 +16937 +16938 +16939 +16940 +16941 +16942 +16943 +16944 +16945 +16946 +16947 +16948 +16949 +16950 +16951 +16952 +16953 +16954 +16955 +16956 +16957 +16958 +16959 +16960 +16961 +16962 +16963 +16964 +16965 +16966 +16967 +16968 +16969 +16970 +16971 +16972 +16973 +16974 +16975 +16976 +16977 +16978 +16979 +16980 +16981 +16982 +16983 +16984 +16985 +16986 +16987 +16988 +16989 +16990 +16991 +16992 +16993 +16994 +16995 +16996 +16997 +16998 +16999 +17000 +17001 +17002 +17003 +17004 +17005 +17006 +17007 +17008 +17009 +17010 +17011 +17012 +17013 +17014 +17015 +17016 +17017 +17018 +17019 +17020 +17021 +17022 +17023 +17024 +17025 +17026 +17027 +17028 +17029 +17030 +17031 +17032 +17033 +17034 +17035 +17036 +17037 +17038 +17039 +17040 +17041 +17042 +17043 +17044 +17045 +17046 +17047 +17048 +17049 +17050 +17051 +17052 +17053 +17054 +17055 +17056 +17057 +17058 +17059 +17060 +17061 +17062 +17063 +17064 +17065 +17066 +17067 +17068 +17069 +17070 +17071 +17072 +17073 +17074 +17075 +17076 +17077 +17078 +17079 +17080 +17081 +17082 +17083 +17084 +17085 +17086 +17087 +17088 +17089 +17090 +17091 +17092 +17093 +17094 +17095 +17096 +17097 +17098 +17099 +17100 +17101 +17102 +17103 +17104 +17105 +17106 +17107 +17108 +17109 +17110 +17111 +17112 +17113 +17114 +17115 +17116 +17117 +17118 +17119 +17120 +17121 +17122 +17123 +17124 +17125 +17126 +17127 +17128 +17129 +17130 +17131 +17132 +17133 +17134 +17135 +17136 +17137 +17138 +17139 +17140 +17141 +17142 +17143 +17144 +17145 +17146 +17147 +17148 +17149 +17150 +17151 +17152 +17153 +17154 +17155 +17156 +17157 +17158 +17159 +17160 +17161 +17162 +17163 +17164 +17165 +17166 +17167 +17168 +17169 +17170 +17171 +17172 +17173 +17174 +17175 +17176 +17177 +17178 +17179 +17180 +17181 +17182 +17183 +17184 +17185 +17186 +17187 +17188 +17189 +17190 +17191 +17192 +17193 +17194 +17195 +17196 +17197 +17198 +17199 +17200 +17201 +17202 +17203 +17204 +17205 +17206 +17207 +17208 +17209 +17210 +17211 +17212 +17213 +17214 +17215 +17216 +17217 +17218 +17219 +17220 +17221 +17222 +17223 +17224 +17225 +17226 +17227 +17228 +17229 +17230 +17231 +17232 +17233 +17234 +17235 +17236 +17237 +17238 +17239 +17240 +17241 +17242 +17243 +17244 +17245 +17246 +17247 +17248 +17249 +17250 +17251 +17252 +17253 +17254 +17255 +17256 +17257 +17258 +17259 +17260 +17261 +17262 +17263 +17264 +17265 +17266 +17267 +17268 +17269 +17270 +17271 +17272 +17273 +17274 +17275 +17276 +17277 +17278 +17279 +17280 +17281 +17282 +17283 +17284 +17285 +17286 +17287 +17288 +17289 +17290 +17291 +17292 +17293 +17294 +17295 +17296 +17297 +17298 +17299 +17300 +17301 +17302 +17303 +17304 +17305 +17306 +17307 +17308 +17309 +17310 +17311 +17312 +17313 +17314 +17315 +17316 +17317 +17318 +17319 +17320 +17321 +17322 +17323 +17324 +17325 +17326 +17327 +17328 +17329 +17330 +17331 +17332 +17333 +17334 +17335 +17336 +17337 +17338 +17339 +17340 +17341 +17342 +17343 +17344 +17345 +17346 +17347 +17348 +17349 +17350 +17351 +17352 +17353 +17354 +17355 +17356 +17357 +17358 +17359 +17360 +17361 +17362 +17363 +17364 +17365 +17366 +17367 +17368 +17369 +17370 +17371 +17372 +17373 +17374 +17375 +17376 +17377 +17378 +17379 +17380 +17381 +17382 +17383 +17384 +17385 +17386 +17387 +17388 +17389 +17390 +17391 +17392 +17393 +17394 +17395 +17396 +17397 +17398 +17399 +17400 +17401 +17402 +17403 +17404 +17405 +17406 +17407 +17408 +17409 +17410 +17411 +17412 +17413 +17414 +17415 +17416 +17417 +17418 +17419 +17420 +17421 +17422 +17423 +17424 +17425 +17426 +17427 +17428 +17429 +17430 +17431 +17432 +17433 +17434 +17435 +17436 +17437 +17438 +17439 +17440 +17441 +17442 +17443 +17444 +17445 +17446 +17447 +17448 +17449 +17450 +17451 +17452 +17453 +17454 +17455 +17456 +17457 +17458 +17459 +17460 +17461 +17462 +17463 +17464 +17465 +17466 +17467 +17468 +17469 +17470 +17471 +17472 +17473 +17474 +17475 +17476 +17477 +17478 +17479 +17480 +17481 +17482 +17483 +17484 +17485 +17486 +17487 +17488 +17489 +17490 +17491 +17492 +17493 +17494 +17495 +17496 +17497 +17498 +17499 +17500 +17501 +17502 +17503 +17504 +17505 +17506 +17507 +17508 +17509 +17510 +17511 +17512 +17513 +17514 +17515 +17516 +17517 +17518 +17519 +17520 +17521 +17522 +17523 +17524 +17525 +17526 +17527 +17528 +17529 +17530 +17531 +17532 +17533 +17534 +17535 +17536 +17537 +17538 +17539 +17540 +17541 +17542 +17543 +17544 +17545 +17546 +17547 +17548 +17549 +17550 +17551 +17552 +17553 +17554 +17555 +17556 +17557 +17558 +17559 +17560 +17561 +17562 +17563 +17564 +17565 +17566 +17567 +17568 +17569 +17570 +17571 +17572 +17573 +17574 +17575 +17576 +17577 +17578 +17579 +17580 +17581 +17582 +17583 +17584 +17585 +17586 +17587 +17588 +17589 +17590 +17591 +17592 +17593 +17594 +17595 +17596 +17597 +17598 +17599 +17600 +17601 +17602 +17603 +17604 +17605 +17606 +17607 +17608 +17609 +17610 +17611 +17612 +17613 +17614 +17615 +17616 +17617 +17618 +17619 +17620 +17621 +17622 +17623 +17624 +17625 +17626 +17627 +17628 +17629 +17630 +17631 +17632 +17633 +17634 +17635 +17636 +17637 +17638 +17639 +17640 +17641 +17642 +17643 +17644 +17645 +17646 +17647 +17648 +17649 +17650 +17651 +17652 +17653 +17654 +17655 +17656 +17657 +17658 +17659 +17660 +17661 +17662 +17663 +17664 +17665 +17666 +17667 +17668 +17669 +17670 +17671 +17672 +17673 +17674 +17675 +17676 +17677 +17678 +17679 +17680 +17681 +17682 +17683 +17684 +17685 +17686 +17687 +17688 +17689 +17690 +17691 +17692 +17693 +17694 +17695 +17696 +17697 +17698 +17699 +17700 +17701 +17702 +17703 +17704 +17705 +17706 +17707 +17708 +17709 +17710 +17711 +17712 +17713 +17714 +17715 +17716 +17717 +17718 +17719 +17720 +17721 +17722 +17723 +17724 +17725 +17726 +17727 +17728 +17729 +17730 +17731 +17732 +17733 +17734 +17735 +17736 +17737 +17738 +17739 +17740 +17741 +17742 +17743 +17744 +17745 +17746 +17747 +17748 +17749 +17750 +17751 +17752 +17753 +17754 +17755 +17756 +17757 +17758 +17759 +17760 +17761 +17762 +17763 +17764 +17765 +17766 +17767 +17768 +17769 +17770 +17771 +17772 +17773 +17774 +17775 +17776 +17777 +17778 +17779 +17780 +17781 +17782 +17783 +17784 +17785 +17786 +17787 +17788 +17789 +17790 +17791 +17792 +17793 +17794 +17795 +17796 +17797 +17798 +17799 +17800 +17801 +17802 +17803 +17804 +17805 +17806 +17807 +17808 +17809 +17810 +17811 +17812 +17813 +17814 +17815 +17816 +17817 +17818 +17819 +17820 +17821 +17822 +17823 +17824 +17825 +17826 +17827 +17828 +17829 +17830 +17831 +17832 +17833 +17834 +17835 +17836 +17837 +17838 +17839 +17840 +17841 +17842 +17843 +17844 +17845 +17846 +17847 +17848 +17849 +17850 +17851 +17852 +17853 +17854 +17855 +17856 +17857 +17858 +17859 +17860 +17861 +17862 +17863 +17864 +17865 +17866 +17867 +17868 +17869 +17870 +17871 +17872 +17873 +17874 +17875 +17876 +17877 +17878 +17879 +17880 +17881 +17882 +17883 +17884 +17885 +17886 +17887 +17888 +17889 +17890 +17891 +17892 +17893 +17894 +17895 +17896 +17897 +17898 +17899 +17900 +17901 +17902 +17903 +17904 +17905 +17906 +17907 +17908 +17909 +17910 +17911 +17912 +17913 +17914 +17915 +17916 +17917 +17918 +17919 +17920 +17921 +17922 +17923 +17924 +17925 +17926 +17927 +17928 +17929 +17930 +17931 +17932 +17933 +17934 +17935 +17936 +17937 +17938 +17939 +17940 +17941 +17942 +17943 +17944 +17945 +17946 +17947 +17948 +17949 +17950 +17951 +17952 +17953 +17954 +17955 +17956 +17957 +17958 +17959 +17960 +17961 +17962 +17963 +17964 +17965 +17966 +17967 +17968 +17969 +17970 +17971 +17972 +17973 +17974 +17975 +17976 +17977 +17978 +17979 +17980 +17981 +17982 +17983 +17984 +17985 +17986 +17987 +17988 +17989 +17990 +17991 +17992 +17993 +17994 +17995 +17996 +17997 +17998 +17999 +18000 +18001 +18002 +18003 +18004 +18005 +18006 +18007 +18008 +18009 +18010 +18011 +18012 +18013 +18014 +18015 +18016 +18017 +18018 +18019 +18020 +18021 +18022 +18023 +18024 +18025 +18026 +18027 +18028 +18029 +18030 +18031 +18032 +18033 +18034 +18035 +18036 +18037 +18038 +18039 +18040 +18041 +18042 +18043 +18044 +18045 +18046 +18047 +18048 +18049 +18050 +18051 +18052 +18053 +18054 +18055 +18056 +18057 +18058 +18059 +18060 +18061 +18062 +18063 +18064 +18065 +18066 +18067 +18068 +18069 +18070 +18071 +18072 +18073 +18074 +18075 +18076 +18077 +18078 +18079 +18080 +18081 +18082 +18083 +18084 +18085 +18086 +18087 +18088 +18089 +18090 +18091 +18092 +18093 +18094 +18095 +18096 +18097 +18098 +18099 +18100 +18101 +18102 +18103 +18104 +18105 +18106 +18107 +18108 +18109 +18110 +18111 +18112 +18113 +18114 +18115 +18116 +18117 +18118 +18119 +18120 +18121 +18122 +18123 +18124 +18125 +18126 +18127 +18128 +18129 +18130 +18131 +18132 +18133 +18134 +18135 +18136 +18137 +18138 +18139 +18140 +18141 +18142 +18143 +18144 +18145 +18146 +18147 +18148 +18149 +18150 +18151 +18152 +18153 +18154 +18155 +18156 +18157 +18158 +18159 +18160 +18161 +18162 +18163 +18164 +18165 +18166 +18167 +18168 +18169 +18170 +18171 +18172 +18173 +18174 +18175 +18176 +18177 +18178 +18179 +18180 +18181 +18182 +18183 +18184 +18185 +18186 +18187 +18188 +18189 +18190 +18191 +18192 +18193 +18194 +18195 +18196 +18197 +18198 +18199 +18200 +18201 +18202 +18203 +18204 +18205 +18206 +18207 +18208 +18209 +18210 +18211 +18212 +18213 +18214 +18215 +18216 +18217 +18218 +18219 +18220 +18221 +18222 +18223 +18224 +18225 +18226 +18227 +18228 +18229 +18230 +18231 +18232 +18233 +18234 +18235 +18236 +18237 +18238 +18239 +18240 +18241 +18242 +18243 +18244 +18245 +18246 +18247 +18248 +18249 +18250 +18251 +18252 +18253 +18254 +18255 +18256 +18257 +18258 +18259 +18260 +18261 +18262 +18263 +18264 +18265 +18266 +18267 +18268 +18269 +18270 +18271 +18272 +18273 +18274 +18275 +18276 +18277 +18278 +18279 +18280 +18281 +18282 +18283 +18284 +18285 +18286 +18287 +18288 +18289 +18290 +18291 +18292 +18293 +18294 +18295 +18296 +18297 +18298 +18299 +18300 +18301 +18302 +18303 +18304 +18305 +18306 +18307 +18308 +18309 +18310 +18311 +18312 +18313 +18314 +18315 +18316 +18317 +18318 +18319 +18320 +18321 +18322 +18323 +18324 +18325 +18326 +18327 +18328 +18329 +18330 +18331 +18332 +18333 +18334 +18335 +18336 +18337 +18338 +18339 +18340 +18341 +18342 +18343 +18344 +18345 +18346 +18347 +18348 +18349 +18350 +18351 +18352 +18353 +18354 +18355 +18356 +18357 +18358 +18359 +18360 +18361 +18362 +18363 +18364 +18365 +18366 +18367 +18368 +18369 +18370 +18371 +18372 +18373 +18374 +18375 +18376 +18377 +18378 +18379 +18380 +18381 +18382 +18383 +18384 +18385 +18386 +18387 +18388 +18389 +18390 +18391 +18392 +18393 +18394 +18395 +18396 +18397 +18398 +18399 +18400 +18401 +18402 +18403 +18404 +18405 +18406 +18407 +18408 +18409 +18410 +18411 +18412 +18413 +18414 +18415 +18416 +18417 +18418 +18419 +18420 +18421 +18422 +18423 +18424 +18425 +18426 +18427 +18428 +18429 +18430 +18431 +18432 +18433 +18434 +18435 +18436 +18437 +18438 +18439 +18440 +18441 +18442 +18443 +18444 +18445 +18446 +18447 +18448 +18449 +18450 +18451 +18452 +18453 +18454 +18455 +18456 +18457 +18458 +18459 +18460 +18461 +18462 +18463 +18464 +18465 +18466 +18467 +18468 +18469 +18470 +18471 +18472 +18473 +18474 +18475 +18476 +18477 +18478 +18479 +18480 +18481 +18482 +18483 +18484 +18485 +18486 +18487 +18488 +18489 +18490 +18491 +18492 +18493 +18494 +18495 +18496 +18497 +18498 +18499 +18500 +18501 +18502 +18503 +18504 +18505 +18506 +18507 +18508 +18509 +18510 +18511 +18512 +18513 +18514 +18515 +18516 +18517 +18518 +18519 +18520 +18521 +18522 +18523 +18524 +18525 +18526 +18527 +18528 +18529 +18530 +18531 +18532 +18533 +18534 +18535 +18536 +18537 +18538 +18539 +18540 +18541 +18542 +18543 +18544 +18545 +18546 +18547 +18548 +18549 +18550 +18551 +18552 +18553 +18554 +18555 +18556 +18557 +18558 +18559 +18560 +18561 +18562 +18563 +18564 +18565 +18566 +18567 +18568 +18569 +18570 +18571 +18572 +18573 +18574 +18575 +18576 +18577 +18578 +18579 +18580 +18581 +18582 +18583 +18584 +18585 +18586 +18587 +18588 +18589 +18590 +18591 +18592 +18593 +18594 +18595 +18596 +18597 +18598 +18599 +18600 +18601 +18602 +18603 +18604 +18605 +18606 +18607 +18608 +18609 +18610 +18611 +18612 +18613 +18614 +18615 +18616 +18617 +18618 +18619 +18620 +18621 +18622 +18623 +18624 +18625 +18626 +18627 +18628 +18629 +18630 +18631 +18632 +18633 +18634 +18635 +18636 +18637 +18638 +18639 +18640 +18641 +18642 +18643 +18644 +18645 +18646 +18647 +18648 +18649 +18650 +18651 +18652 +18653 +18654 +18655 +18656 +18657 +18658 +18659 +18660 +18661 +18662 +18663 +18664 +18665 +18666 +18667 +18668 +18669 +18670 +18671 +18672 +18673 +18674 +18675 +18676 +18677 +18678 +18679 +18680 +18681 +18682 +18683 +18684 +18685 +18686 +18687 +18688 +18689 +18690 +18691 +18692 +18693 +18694 +18695 +18696 +18697 +18698 +18699 +18700 +18701 +18702 +18703 +18704 +18705 +18706 +18707 +18708 +18709 +18710 +18711 +18712 +18713 +18714 +18715 +18716 +18717 +18718 +18719 +18720 +18721 +18722 +18723 +18724 +18725 +18726 +18727 +18728 +18729 +18730 +18731 +18732 +18733 +18734 +18735 +18736 +18737 +18738 +18739 +18740 +18741 +18742 +18743 +18744 +18745 +18746 +18747 +18748 +18749 +18750 +18751 +18752 +18753 +18754 +18755 +18756 +18757 +18758 +18759 +18760 +18761 +18762 +18763 +18764 +18765 +18766 +18767 +18768 +18769 +18770 +18771 +18772 +18773 +18774 +18775 +18776 +18777 +18778 +18779 +18780 +18781 +18782 +18783 +18784 +18785 +18786 +18787 +18788 +18789 +18790 +18791 +18792 +18793 +18794 +18795 +18796 +18797 +18798 +18799 +18800 +18801 +18802 +18803 +18804 +18805 +18806 +18807 +18808 +18809 +18810 +18811 +18812 +18813 +18814 +18815 +18816 +18817 +18818 +18819 +18820 +18821 +18822 +18823 +18824 +18825 +18826 +18827 +18828 +18829 +18830 +18831 +18832 +18833 +18834 +18835 +18836 +18837 +18838 +18839 +18840 +18841 +18842 +18843 +18844 +18845 +18846 +18847 +18848 +18849 +18850 +18851 +18852 +18853 +18854 +18855 +18856 +18857 +18858 +18859 +18860 +18861 +18862 +18863 +18864 +18865 +18866 +18867 +18868 +18869 +18870 +18871 +18872 +18873 +18874 +18875 +18876 +18877 +18878 +18879 +18880 +18881 +18882 +18883 +18884 +18885 +18886 +18887 +18888 +18889 +18890 +18891 +18892 +18893 +18894 +18895 +18896 +18897 +18898 +18899 +18900 +18901 +18902 +18903 +18904 +18905 +18906 +18907 +18908 +18909 +18910 +18911 +18912 +18913 +18914 +18915 +18916 +18917 +18918 +18919 +18920 +18921 +18922 +18923 +18924 +18925 +18926 +18927 +18928 +18929 +18930 +18931 +18932 +18933 +18934 +18935 +18936 +18937 +18938 +18939 +18940 +18941 +18942 +18943 +18944 +18945 +18946 +18947 +18948 +18949 +18950 +18951 +18952 +18953 +18954 +18955 +18956 +18957 +18958 +18959 +18960 +18961 +18962 +18963 +18964 +18965 +18966 +18967 +18968 +18969 +18970 +18971 +18972 +18973 +18974 +18975 +18976 +18977 +18978 +18979 +18980 +18981 +18982 +18983 +18984 +18985 +18986 +18987 +18988 +18989 +18990 +18991 +18992 +18993 +18994 +18995 +18996 +18997 +18998 +18999 +19000 +19001 +19002 +19003 +19004 +19005 +19006 +19007 +19008 +19009 +19010 +19011 +19012 +19013 +19014 +19015 +19016 +19017 +19018 +19019 +19020 +19021 +19022 +19023 +19024 +19025 +19026 +19027 +19028 +19029 +19030 +19031 +19032 +19033 +19034 +19035 +19036 +19037 +19038 +19039 +19040 +19041 +19042 +19043 +19044 +19045 +19046 +19047 +19048 +19049 +19050 +19051 +19052 +19053 +19054 +19055 +19056 +19057 +19058 +19059 +19060 +19061 +19062 +19063 +19064 +19065 +19066 +19067 +19068 +19069 +19070 +19071 +19072 +19073 +19074 +19075 +19076 +19077 +19078 +19079 +19080 +19081 +19082 +19083 +19084 +19085 +19086 +19087 +19088 +19089 +19090 +19091 +19092 +19093 +19094 +19095 +19096 +19097 +19098 +19099 +19100 +19101 +19102 +19103 +19104 +19105 +19106 +19107 +19108 +19109 +19110 +19111 +19112 +19113 +19114 +19115 +19116 +19117 +19118 +19119 +19120 +19121 +19122 +19123 +19124 +19125 +19126 +19127 +19128 +19129 +19130 +19131 +19132 +19133 +19134 +19135 +19136 +19137 +19138 +19139 +19140 +19141 +19142 +19143 +19144 +19145 +19146 +19147 +19148 +19149 +19150 +19151 +19152 +19153 +19154 +19155 +19156 +19157 +19158 +19159 +19160 +19161 +19162 +19163 +19164 +19165 +19166 +19167 +19168 +19169 +19170 +19171 +19172 +19173 +19174 +19175 +19176 +19177 +19178 +19179 +19180 +19181 +19182 +19183 +19184 +19185 +19186 +19187 +19188 +19189 +19190 +19191 +19192 +19193 +19194 +19195 +19196 +19197 +19198 +19199 +19200 +19201 +19202 +19203 +19204 +19205 +19206 +19207 +19208 +19209 +19210 +19211 +19212 +19213 +19214 +19215 +19216 +19217 +19218 +19219 +19220 +19221 +19222 +19223 +19224 +19225 +19226 +19227 +19228 +19229 +19230 +19231 +19232 +19233 +19234 +19235 +19236 +19237 +19238 +19239 +19240 +19241 +19242 +19243 +19244 +19245 +19246 +19247 +19248 +19249 +19250 +19251 +19252 +19253 +19254 +19255 +19256 +19257 +19258 +19259 +19260 +19261 +19262 +19263 +19264 +19265 +19266 +19267 +19268 +19269 +19270 +19271 +19272 +19273 +19274 +19275 +19276 +19277 +19278 +19279 +19280 +19281 +19282 +19283 +19284 +19285 +19286 +19287 +19288 +19289 +19290 +19291 +19292 +19293 +19294 +19295 +19296 +19297 +19298 +19299 +19300 +19301 +19302 +19303 +19304 +19305 +19306 +19307 +19308 +19309 +19310 +19311 +19312 +19313 +19314 +19315 +19316 +19317 +19318 +19319 +19320 +19321 +19322 +19323 +19324 +19325 +19326 +19327 +19328 +19329 +19330 +19331 +19332 +19333 +19334 +19335 +19336 +19337 +19338 +19339 +19340 +19341 +19342 +19343 +19344 +19345 +19346 +19347 +19348 +19349 +19350 +19351 +19352 +19353 +19354 +19355 +19356 +19357 +19358 +19359 +19360 +19361 +19362 +19363 +19364 +19365 +19366 +19367 +19368 +19369 +19370 +19371 +19372 +19373 +19374 +19375 +19376 +19377 +19378 +19379 +19380 +19381 +19382 +19383 +19384 +19385 +19386 +19387 +19388 +19389 +19390 +19391 +19392 +19393 +19394 +19395 +19396 +19397 +19398 +19399 +19400 +19401 +19402 +19403 +19404 +19405 +19406 +19407 +19408 +19409 +19410 +19411 +19412 +19413 +19414 +19415 +19416 +19417 +19418 +19419 +19420 +19421 +19422 +19423 +19424 +19425 +19426 +19427 +19428 +19429 +19430 +19431 +19432 +19433 +19434 +19435 +19436 +19437 +19438 +19439 +19440 +19441 +19442 +19443 +19444 +19445 +19446 +19447 +19448 +19449 +19450 +19451 +19452 +19453 +19454 +19455 +19456 +19457 +19458 +19459 +19460 +19461 +19462 +19463 +19464 +19465 +19466 +19467 +19468 +19469 +19470 +19471 +19472 +19473 +19474 +19475 +19476 +19477 +19478 +19479 +19480 +19481 +19482 +19483 +19484 +19485 +19486 +19487 +19488 +19489 +19490 +19491 +19492 +19493 +19494 +19495 +19496 +19497 +19498 +19499 +19500 +19501 +19502 +19503 +19504 +19505 +19506 +19507 +19508 +19509 +19510 +19511 +19512 +19513 +19514 +19515 +19516 +19517 +19518 +19519 +19520 +19521 +19522 +19523 +19524 +19525 +19526 +19527 +19528 +19529 +19530 +19531 +19532 +19533 +19534 +19535 +19536 +19537 +19538 +19539 +19540 +19541 +19542 +19543 +19544 +19545 +19546 +19547 +19548 +19549 +19550 +19551 +19552 +19553 +19554 +19555 +19556 +19557 +19558 +19559 +19560 +19561 +19562 +19563 +19564 +19565 +19566 +19567 +19568 +19569 +19570 +19571 +19572 +19573 +19574 +19575 +19576 +19577 +19578 +19579 +19580 +19581 +19582 +19583 +19584 +19585 +19586 +19587 +19588 +19589 +19590 +19591 +19592 +19593 +19594 +19595 +19596 +19597 +19598 +19599 +19600 +19601 +19602 +19603 +19604 +19605 +19606 +19607 +19608 +19609 +19610 +19611 +19612 +19613 +19614 +19615 +19616 +19617 +19618 +19619 +19620 +19621 +19622 +19623 +19624 +19625 +19626 +19627 +19628 +19629 +19630 +19631 +19632 +19633 +19634 +19635 +19636 +19637 +19638 +19639 +19640 +19641 +19642 +19643 +19644 +19645 +19646 +19647 +19648 +19649 +19650 +19651 +19652 +19653 +19654 +19655 +19656 +19657 +19658 +19659 +19660 +19661 +19662 +19663 +19664 +19665 +19666 +19667 +19668 +19669 +19670 +19671 +19672 +19673 +19674 +19675 +19676 +19677 +19678 +19679 +19680 +19681 +19682 +19683 +19684 +19685 +19686 +19687 +19688 +19689 +19690 +19691 +19692 +19693 +19694 +19695 +19696 +19697 +19698 +19699 +19700 +19701 +19702 +19703 +19704 +19705 +19706 +19707 +19708 +19709 +19710 +19711 +19712 +19713 +19714 +19715 +19716 +19717 +19718 +19719 +19720 +19721 +19722 +19723 +19724 +19725 +19726 +19727 +19728 +19729 +19730 +19731 +19732 +19733 +19734 +19735 +19736 +19737 +19738 +19739 +19740 +19741 +19742 +19743 +19744 +19745 +19746 +19747 +19748 +19749 +19750 +19751 +19752 +19753 +19754 +19755 +19756 +19757 +19758 +19759 +19760 +19761 +19762 +19763 +19764 +19765 +19766 +19767 +19768 +19769 +19770 +19771 +19772 +19773 +19774 +19775 +19776 +19777 +19778 +19779 +19780 +19781 +19782 +19783 +19784 +19785 +19786 +19787 +19788 +19789 +19790 +19791 +19792 +19793 +19794 +19795 +19796 +19797 +19798 +19799 +19800 +19801 +19802 +19803 +19804 +19805 +19806 +19807 +19808 +19809 +19810 +19811 +19812 +19813 +19814 +19815 +19816 +19817 +19818 +19819 +19820 +19821 +19822 +19823 +19824 +19825 +19826 +19827 +19828 +19829 +19830 +19831 +19832 +19833 +19834 +19835 +19836 +19837 +19838 +19839 +19840 +19841 +19842 +19843 +19844 +19845 +19846 +19847 +19848 +19849 +19850 +19851 +19852 +19853 +19854 +19855 +19856 +19857 +19858 +19859 +19860 +19861 +19862 +19863 +19864 +19865 +19866 +19867 +19868 +19869 +19870 +19871 +19872 +19873 +19874 +19875 +19876 +19877 +19878 +19879 +19880 +19881 +19882 +19883 +19884 +19885 +19886 +19887 +19888 +19889 +19890 +19891 +19892 +19893 +19894 +19895 +19896 +19897 +19898 +19899 +19900 +19901 +19902 +19903 +19904 +19905 +19906 +19907 +19908 +19909 +19910 +19911 +19912 +19913 +19914 +19915 +19916 +19917 +19918 +19919 +19920 +19921 +19922 +19923 +19924 +19925 +19926 +19927 +19928 +19929 +19930 +19931 +19932 +19933 +19934 +19935 +19936 +19937 +19938 +19939 +19940 +19941 +19942 +19943 +19944 +19945 +19946 +19947 +19948 +19949 +19950 +19951 +19952 +19953 +19954 +19955 +19956 +19957 +19958 +19959 +19960 +19961 +19962 +19963 +19964 +19965 +19966 +19967 +19968 +19969 +19970 +19971 +19972 +19973 +19974 +19975 +19976 +19977 +19978 +19979 +19980 +19981 +19982 +19983 +19984 +19985 +19986 +19987 +19988 +19989 +19990 +19991 +19992 +19993 +19994 +19995 +19996 +19997 +19998 +19999 +20000 +20001 +20002 +20003 +20004 +20005 +20006 +20007 +20008 +20009 +20010 +20011 +20012 +20013 +20014 +20015 +20016 +20017 +20018 +20019 +20020 +20021 +20022 +20023 +20024 +20025 +20026 +20027 +20028 +20029 +20030 +20031 +20032 +20033 +20034 +20035 +20036 +20037 +20038 +20039 +20040 +20041 +20042 +20043 +20044 +20045 +20046 +20047 +20048 +20049 +20050 +20051 +20052 +20053 +20054 +20055 +20056 +20057 +20058 +20059 +20060 +20061 +20062 +20063 +20064 +20065 +20066 +20067 +20068 +20069 +20070 +20071 +20072 +20073 +20074 +20075 +20076 +20077 +20078 +20079 +20080 +20081 +20082 +20083 +20084 +20085 +20086 +20087 +20088 +20089 +20090 +20091 +20092 +20093 +20094 +20095 +20096 +20097 +20098 +20099 +20100 +20101 +20102 +20103 +20104 +20105 +20106 +20107 +20108 +20109 +20110 +20111 +20112 +20113 +20114 +20115 +20116 +20117 +20118 +20119 +20120 +20121 +20122 +20123 +20124 +20125 +20126 +20127 +20128 +20129 +20130 +20131 +20132 +20133 +20134 +20135 +20136 +20137 +20138 +20139 +20140 +20141 +20142 +20143 +20144 +20145 +20146 +20147 +20148 +20149 +20150 +20151 +20152 +20153 +20154 +20155 +20156 +20157 +20158 +20159 +20160 +20161 +20162 +20163 +20164 +20165 +20166 +20167 +20168 +20169 +20170 +20171 +20172 +20173 +20174 +20175 +20176 +20177 +20178 +20179 +20180 +20181 +20182 +20183 +20184 +20185 +20186 +20187 +20188 +20189 +20190 +20191 +20192 +20193 +20194 +20195 +20196 +20197 +20198 +20199 +20200 +20201 +20202 +20203 +20204 +20205 +20206 +20207 +20208 +20209 +20210 +20211 +20212 +20213 +20214 +20215 +20216 +20217 +20218 +20219 +20220 +20221 +20222 +20223 +20224 +20225 +20226 +20227 +20228 +20229 +20230 +20231 +20232 +20233 +20234 +20235 +20236 +20237 +20238 +20239 +20240 +20241 +20242 +20243 +20244 +20245 +20246 +20247 +20248 +20249 +20250 +20251 +20252 +20253 +20254 +20255 +20256 +20257 +20258 +20259 +20260 +20261 +20262 +20263 +20264 +20265 +20266 +20267 +20268 +20269 +20270 +20271 +20272 +20273 +20274 +20275 +20276 +20277 +20278 +20279 +20280 +20281 +20282 +20283 +20284 +20285 +20286 +20287 +20288 +20289 +20290 +20291 +20292 +20293 +20294 +20295 +20296 +20297 +20298 +20299 +20300 +20301 +20302 +20303 +20304 +20305 +20306 +20307 +20308 +20309 +20310 +20311 +20312 +20313 +20314 +20315 +20316 +20317 +20318 +20319 +20320 +20321 +20322 +20323 +20324 +20325 +20326 +20327 +20328 +20329 +20330 +20331 +20332 +20333 +20334 +20335 +20336 +20337 +20338 +20339 +20340 +20341 +20342 +20343 +20344 +20345 +20346 +20347 +20348 +20349 +20350 +20351 +20352 +20353 +20354 +20355 +20356 +20357 +20358 +20359 +20360 +20361 +20362 +20363 +20364 +20365 +20366 +20367 +20368 +20369 +20370 +20371 +20372 +20373 +20374 +20375 +20376 +20377 +20378 +20379 +20380 +20381 +20382 +20383 +20384 +20385 +20386 +20387 +20388 +20389 +20390 +20391 +20392 +20393 +20394 +20395 +20396 +20397 +20398 +20399 +20400 +20401 +20402 +20403 +20404 +20405 +20406 +20407 +20408 +20409 +20410 +20411 +20412 +20413 +20414 +20415 +20416 +20417 +20418 +20419 +20420 +20421 +20422 +20423 +20424 +20425 +20426 +20427 +20428 +20429 +20430 +20431 +20432 +20433 +20434 +20435 +20436 +20437 +20438 +20439 +20440 +20441 +20442 +20443 +20444 +20445 +20446 +20447 +20448 +20449 +20450 +20451 +20452 +20453 +20454 +20455 +20456 +20457 +20458 +20459 +20460 +20461 +20462 +20463 +20464 +20465 +20466 +20467 +20468 +20469 +20470 +20471 +20472 +20473 +20474 +20475 +20476 +20477 +20478 +20479 +20480 +20481 +20482 +20483 +20484 +20485 +20486 +20487 +20488 +20489 +20490 +20491 +20492 +20493 +20494 +20495 +20496 +20497 +20498 +20499 +20500 +20501 +20502 +20503 +20504 +20505 +20506 +20507 +20508 +20509 +20510 +20511 +20512 +20513 +20514 +20515 +20516 +20517 +20518 +20519 +20520 +20521 +20522 +20523 +20524 +20525 +20526 +20527 +20528 +20529 +20530 +20531 +20532 +20533 +20534 +20535 +20536 +20537 +20538 +20539 +20540 +20541 +20542 +20543 +20544 +20545 +20546 +20547 +20548 +20549 +20550 +20551 +20552 +20553 +20554 +20555 +20556 +20557 +20558 +20559 +20560 +20561 +20562 +20563 +20564 +20565 +20566 +20567 +20568 +20569 +20570 +20571 +20572 +20573 +20574 +20575 +20576 +20577 +20578 +20579 +20580 +20581 +20582 +20583 +20584 +20585 +20586 +20587 +20588 +20589 +20590 +20591 +20592 +20593 +20594 +20595 +20596 +20597 +20598 +20599 +20600 +20601 +20602 +20603 +20604 +20605 +20606 +20607 +20608 +20609 +20610 +20611 +20612 +20613 +20614 +20615 +20616 +20617 +20618 +20619 +20620 +20621 +20622 +20623 +20624 +20625 +20626 +20627 +20628 +20629 +20630 +20631 +20632 +20633 +20634 +20635 +20636 +20637 +20638 +20639 +20640 +20641 +20642 +20643 +20644 +20645 +20646 +20647 +20648 +20649 +20650 +20651 +20652 +20653 +20654 +20655 +20656 +20657 +20658 +20659 +20660 +20661 +20662 +20663 +20664 +20665 +20666 +20667 +20668 +20669 +20670 +20671 +20672 +20673 +20674 +20675 +20676 +20677 +20678 +20679 +20680 +20681 +20682 +20683 +20684 +20685 +20686 +20687 +20688 +20689 +20690 +20691 +20692 +20693 +20694 +20695 +20696 +20697 +20698 +20699 +20700 +20701 +20702 +20703 +20704 +20705 +20706 +20707 +20708 +20709 +20710 +20711 +20712 +20713 +20714 +20715 +20716 +20717 +20718 +20719 +20720 +20721 +20722 +20723 +20724 +20725 +20726 +20727 +20728 +20729 +20730 +20731 +20732 +20733 +20734 +20735 +20736 +20737 +20738 +20739 +20740 +20741 +20742 +20743 +20744 +20745 +20746 +20747 +20748 +20749 +20750 +20751 +20752 +20753 +20754 +20755 +20756 +20757 +20758 +20759 +20760 +20761 +20762 +20763 +20764 +20765 +20766 +20767 +20768 +20769 +20770 +20771 +20772 +20773 +20774 +20775 +20776 +20777 +20778 +20779 +20780 +20781 +20782 +20783 +20784 +20785 +20786 +20787 +20788 +20789 +20790 +20791 +20792 +20793 +20794 +20795 +20796 +20797 +20798 +20799 +20800 +20801 +20802 +20803 +20804 +20805 +20806 +20807 +20808 +20809 +20810 +20811 +20812 +20813 +20814 +20815 +20816 +20817 +20818 +20819 +20820 +20821 +20822 +20823 +20824 +20825 +20826 +20827 +20828 +20829 +20830 +20831 +20832 +20833 +20834 +20835 +20836 +20837 +20838 +20839 +20840 +20841 +20842 +20843 +20844 +20845 +20846 +20847 +20848 +20849 +20850 +20851 +20852 +20853 +20854 +20855 +20856 +20857 +20858 +20859 +20860 +20861 +20862 +20863 +20864 +20865 +20866 +20867 +20868 +20869 +20870 +20871 +20872 +20873 +20874 +20875 +20876 +20877 +20878 +20879 +20880 +20881 +20882 +20883 +20884 +20885 +20886 +20887 +20888 +20889 +20890 +20891 +20892 +20893 +20894 +20895 +20896 +20897 +20898 +20899 +20900 +20901 +20902 +20903 +20904 +20905 +20906 +20907 +20908 +20909 +20910 +20911 +20912 +20913 +20914 +20915 +20916 +20917 +20918 +20919 +20920 +20921 +20922 +20923 +20924 +20925 +20926 +20927 +20928 +20929 +20930 +20931 +20932 +20933 +20934 +20935 +20936 +20937 +20938 +20939 +20940 +20941 +20942 +20943 +20944 +20945 +20946 +20947 +20948 +20949 +20950 +20951 +20952 +20953 +20954 +20955 +20956 +20957 +20958 +20959 +20960 +20961 +20962 +20963 +20964 +20965 +20966 +20967 +20968 +20969 +20970 +20971 +20972 +20973 +20974 +20975 +20976 +20977 +20978 +20979 +20980 +20981 +20982 +20983 +20984 +20985 +20986 +20987 +20988 +20989 +20990 +20991 +20992 +20993 +20994 +20995 +20996 +20997 +20998 +20999 +21000 +21001 +21002 +21003 +21004 +21005 +21006 +21007 +21008 +21009 +21010 +21011 +21012 +21013 +21014 +21015 +21016 +21017 +21018 +21019 +21020 +21021 +21022 +21023 +21024 +21025 +21026 +21027 +21028 +21029 +21030 +21031 +21032 +21033 +21034 +21035 +21036 +21037 +21038 +21039 +21040 +21041 +21042 +21043 +21044 +21045 +21046 +21047 +21048 +21049 +21050 +21051 +21052 +21053 +21054 +21055 +21056 +21057 +21058 +21059 +21060 +21061 +21062 +21063 +21064 +21065 +21066 +21067 +21068 +21069 +21070 +21071 +21072 +21073 +21074 +21075 +21076 +21077 +21078 +21079 +21080 +21081 +21082 +21083 +21084 +21085 +21086 +21087 +21088 +21089 +21090 +21091 +21092 +21093 +21094 +21095 +21096 +21097 +21098 +21099 +21100 +21101 +21102 +21103 +21104 +21105 +21106 +21107 +21108 +21109 +21110 +21111 +21112 +21113 +21114 +21115 +21116 +21117 +21118 +21119 +21120 +21121 +21122 +21123 +21124 +21125 +21126 +21127 +21128 +21129 +21130 +21131 +21132 +21133 +21134 +21135 +21136 +21137 +21138 +21139 +21140 +21141 +21142 +21143 +21144 +21145 +21146 +21147 +21148 +21149 +21150 +21151 +21152 +21153 +21154 +21155 +21156 +21157 +21158 +21159 +21160 +21161 +21162 +21163 +21164 +21165 +21166 +21167 +21168 +21169 +21170 +21171 +21172 +21173 +21174 +21175 +21176 +21177 +21178 +21179 +21180 +21181 +21182 +21183 +21184 +21185 +21186 +21187 +21188 +21189 +21190 +21191 +21192 +21193 +21194 +21195 +21196 +21197 +21198 +21199 +21200 +21201 +21202 +21203 +21204 +21205 +21206 +21207 +21208 +21209 +21210 +21211 +21212 +21213 +21214 +21215 +21216 +21217 +21218 +21219 +21220 +21221 +21222 +21223 +21224 +21225 +21226 +21227 +21228 +21229 +21230 +21231 +21232 +21233 +21234 +21235 +21236 +21237 +21238 +21239 +21240 +21241 +21242 +21243 +21244 +21245 +21246 +21247 +21248 +21249 +21250 +21251 +21252 +21253 +21254 +21255 +21256 +21257 +21258 +21259 +21260 +21261 +21262 +21263 +21264 +21265 +21266 +21267 +21268 +21269 +21270 +21271 +21272 +21273 +21274 +21275 +21276 +21277 +21278 +21279 +21280 +21281 +21282 +21283 +21284 +21285 +21286 +21287 +21288 +21289 +21290 +21291 +21292 +21293 +21294 +21295 +21296 +21297 +21298 +21299 +21300 +21301 +21302 +21303 +21304 +21305 +21306 +21307 +21308 +21309 +21310 +21311 +21312 +21313 +21314 +21315 +21316 +21317 +21318 +21319 +21320 +21321 +21322 +21323 +21324 +21325 +21326 +21327 +21328 +21329 +21330 +21331 +21332 +21333 +21334 +21335 +21336 +21337 +21338 +21339 +21340 +21341 +21342 +21343 +21344 +21345 +21346 +21347 +21348 +21349 +21350 +21351 +21352 +21353 +21354 +21355 +21356 +21357 +21358 +21359 +21360 +21361 +21362 +21363 +21364 +21365 +21366 +21367 +21368 +21369 +21370 +21371 +21372 +21373 +21374 +21375 +21376 +21377 +21378 +21379 +21380 +21381 +21382 +21383 +21384 +21385 +21386 +21387 +21388 +21389 +21390 +21391 +21392 +21393 +21394 +21395 +21396 +21397 +21398 +21399 +21400 +21401 +21402 +21403 +21404 +21405 +21406 +21407 +21408 +21409 +21410 +21411 +21412 +21413 +21414 +21415 +21416 +21417 +21418 +21419 +21420 +21421 +21422 +21423 +21424 +21425 +21426 +21427 +21428 +21429 +21430 +21431 +21432 +21433 +21434 +21435 +21436 +21437 +21438 +21439 +21440 +21441 +21442 +21443 +21444 +21445 +21446 +21447 +21448 +21449 +21450 +21451 +21452 +21453 +21454 +21455 +21456 +21457 +21458 +21459 +21460 +21461 +21462 +21463 +21464 +21465 +21466 +21467 +21468 +21469 +21470 +21471 +21472 +21473 +21474 +21475 +21476 +21477 +21478 +21479 +21480 +21481 +21482 +21483 +21484 +21485 +21486 +21487 +21488 +21489 +21490 +21491 +21492 +21493 +21494 +21495 +21496 +21497 +21498 +21499 +21500 +21501 +21502 +21503 +21504 +21505 +21506 +21507 +21508 +21509 +21510 +21511 +21512 +21513 +21514 +21515 +21516 +21517 +21518 +21519 +21520 +21521 +21522 +21523 +21524 +21525 +21526 +21527 +21528 +21529 +21530 +21531 +21532 +21533 +21534 +21535 +21536 +21537 +21538 +21539 +21540 +21541 +21542 +21543 +21544 +21545 +21546 +21547 +21548 +21549 +21550 +21551 +21552 +21553 +21554 +21555 +21556 +21557 +21558 +21559 +21560 +21561 +21562 +21563 +21564 +21565 +21566 +21567 +21568 +21569 +21570 +21571 +21572 +21573 +21574 +21575 +21576 +21577 +21578 +21579 +21580 +21581 +21582 +21583 +21584 +21585 +21586 +21587 +21588 +21589 +21590 +21591 +21592 +21593 +21594 +21595 +21596 +21597 +21598 +21599 +21600 +21601 +21602 +21603 +21604 +21605 +21606 +21607 +21608 +21609 +21610 +21611 +21612 +21613 +21614 +21615 +21616 +21617 +21618 +21619 +21620 +21621 +21622 +21623 +21624 +21625 +21626 +21627 +21628 +21629 +21630 +21631 +21632 +21633 +21634 +21635 +21636 +21637 +21638 +21639 +21640 +21641 +21642 +21643 +21644 +21645 +21646 +21647 +21648 +21649 +21650 +21651 +21652 +21653 +21654 +21655 +21656 +21657 +21658 +21659 +21660 +21661 +21662 +21663 +21664 +21665 +21666 +21667 +21668 +21669 +21670 +21671 +21672 +21673 +21674 +21675 +21676 +21677 +21678 +21679 +21680 +21681 +21682 +21683 +21684 +21685 +21686 +21687 +21688 +21689 +21690 +21691 +21692 +21693 +21694 +21695 +21696 +21697 +21698 +21699 +21700 +21701 +21702 +21703 +21704 +21705 +21706 +21707 +21708 +21709 +21710 +21711 +21712 +21713 +21714 +21715 +21716 +21717 +21718 +21719 +21720 +21721 +21722 +21723 +21724 +21725 +21726 +21727 +21728 +21729 +21730 +21731 +21732 +21733 +21734 +21735 +21736 +21737 +21738 +21739 +21740 +21741 +21742 +21743 +21744 +21745 +21746 +21747 +21748 +21749 +21750 +21751 +21752 +21753 +21754 +21755 +21756 +21757 +21758 +21759 +21760 +21761 +21762 +21763 +21764 +21765 +21766 +21767 +21768 +21769 +21770 +21771 +21772 +21773 +21774 +21775 +21776 +21777 +21778 +21779 +21780 +21781 +21782 +21783 +21784 +21785 +21786 +21787 +21788 +21789 +21790 +21791 +21792 +21793 +21794 +21795 +21796 +21797 +21798 +21799 +21800 +21801 +21802 +21803 +21804 +21805 +21806 +21807 +21808 +21809 +21810 +21811 +21812 +21813 +21814 +21815 +21816 +21817 +21818 +21819 +21820 +21821 +21822 +21823 +21824 +21825 +21826 +21827 +21828 +21829 +21830 +21831 +21832 +21833 +21834 +21835 +21836 +21837 +21838 +21839 +21840 +21841 +21842 +21843 +21844 +21845 +21846 +21847 +21848 +21849 +21850 +21851 +21852 +21853 +21854 +21855 +21856 +21857 +21858 +21859 +21860 +21861 +21862 +21863 +21864 +21865 +21866 +21867 +21868 +21869 +21870 +21871 +21872 +21873 +21874 +21875 +21876 +21877 +21878 +21879 +21880 +21881 +21882 +21883 +21884 +21885 +21886 +21887 +21888 +21889 +21890 +21891 +21892 +21893 +21894 +21895 +21896 +21897 +21898 +21899 +21900 +21901 +21902 +21903 +21904 +21905 +21906 +21907 +21908 +21909 +21910 +21911 +21912 +21913 +21914 +21915 +21916 +21917 +21918 +21919 +21920 +21921 +21922 +21923 +21924 +21925 +21926 +21927 +21928 +21929 +21930 +21931 +21932 +21933 +21934 +21935 +21936 +21937 +21938 +21939 +21940 +21941 +21942 +21943 +21944 +21945 +21946 +21947 +21948 +21949 +21950 +21951 +21952 +21953 +21954 +21955 +21956 +21957 +21958 +21959 +21960 +21961 +21962 +21963 +21964 +21965 +21966 +21967 +21968 +21969 +21970 +21971 +21972 +21973 +21974 +21975 +21976 +21977 +21978 +21979 +21980 +21981 +21982 +21983 +21984 +21985 +21986 +21987 +21988 +21989 +21990 +21991 +21992 +21993 +21994 +21995 +21996 +21997 +21998 +21999 +22000 +22001 +22002 +22003 +22004 +22005 +22006 +22007 +22008 +22009 +22010 +22011 +22012 +22013 +22014 +22015 +22016 +22017 +22018 +22019 +22020 +22021 +22022 +22023 +22024 +22025 +22026 +22027 +22028 +22029 +22030 +22031 +22032 +22033 +22034 +22035 +22036 +22037 +22038 +22039 +22040 +22041 +22042 +22043 +22044 +22045 +22046 +22047 +22048 +22049 +22050 +22051 +22052 +22053 +22054 +22055 +22056 +22057 +22058 +22059 +22060 +22061 +22062 +22063 +22064 +22065 +22066 +22067 +22068 +22069 +22070 +22071 +22072 +22073 +22074 +22075 +22076 +22077 +22078 +22079 +22080 +22081 +22082 +22083 +22084 +22085 +22086 +22087 +22088 +22089 +22090 +22091 +22092 +22093 +22094 +22095 +22096 +22097 +22098 +22099 +22100 +22101 +22102 +22103 +22104 +22105 +22106 +22107 +22108 +22109 +22110 +22111 +22112 +22113 +22114 +22115 +22116 +22117 +22118 +22119 +22120 +22121 +22122 +22123 +22124 +22125 +22126 +22127 +22128 +22129 +22130 +22131 +22132 +22133 +22134 +22135 +22136 +22137 +22138 +22139 +22140 +22141 +22142 +22143 +22144 +22145 +22146 +22147 +22148 +22149 +22150 +22151 +22152 +22153 +22154 +22155 +22156 +22157 +22158 +22159 +22160 +22161 +22162 +22163 +22164 +22165 +22166 +22167 +22168 +22169 +22170 +22171 +22172 +22173 +22174 +22175 +22176 +22177 +22178 +22179 +22180 +22181 +22182 +22183 +22184 +22185 +22186 +22187 +22188 +22189 +22190 +22191 +22192 +22193 +22194 +22195 +22196 +22197 +22198 +22199 +22200 +22201 +22202 +22203 +22204 +22205 +22206 +22207 +22208 +22209 +22210 +22211 +22212 +22213 +22214 +22215 +22216 +22217 +22218 +22219 +22220 +22221 +22222 +22223 +22224 +22225 +22226 +22227 +22228 +22229 +22230 +22231 +22232 +22233 +22234 +22235 +22236 +22237 +22238 +22239 +22240 +22241 +22242 +22243 +22244 +22245 +22246 +22247 +22248 +22249 +22250 +22251 +22252 +22253 +22254 +22255 +22256 +22257 +22258 +22259 +22260 +22261 +22262 +22263 +22264 +22265 +22266 +22267 +22268 +22269 +22270 +22271 +22272 +22273 +22274 +22275 +22276 +22277 +22278 +22279 +22280 +22281 +22282 +22283 +22284 +22285 +22286 +22287 +22288 +22289 +22290 +22291 +22292 +22293 +22294 +22295 +22296 +22297 +22298 +22299 +22300 +22301 +22302 +22303 +22304 +22305 +22306 +22307 +22308 +22309 +22310 +22311 +22312 +22313 +22314 +22315 +22316 +22317 +22318 +22319 +22320 +22321 +22322 +22323 +22324 +22325 +22326 +22327 +22328 +22329 +22330 +22331 +22332 +22333 +22334 +22335 +22336 +22337 +22338 +22339 +22340 +22341 +22342 +22343 +22344 +22345 +22346 +22347 +22348 +22349 +22350 +22351 +22352 +22353 +22354 +22355 +22356 +22357 +22358 +22359 +22360 +22361 +22362 +22363 +22364 +22365 +22366 +22367 +22368 +22369 +22370 +22371 +22372 +22373 +22374 +22375 +22376 +22377 +22378 +22379 +22380 +22381 +22382 +22383 +22384 +22385 +22386 +22387 +22388 +22389 +22390 +22391 +22392 +22393 +22394 +22395 +22396 +22397 +22398 +22399 +22400 +22401 +22402 +22403 +22404 +22405 +22406 +22407 +22408 +22409 +22410 +22411 +22412 +22413 +22414 +22415 +22416 +22417 +22418 +22419 +22420 +22421 +22422 +22423 +22424 +22425 +22426 +22427 +22428 +22429 +22430 +22431 +22432 +22433 +22434 +22435 +22436 +22437 +22438 +22439 +22440 +22441 +22442 +22443 +22444 +22445 +22446 +22447 +22448 +22449 +22450 +22451 +22452 +22453 +22454 +22455 +22456 +22457 +22458 +22459 +22460 +22461 +22462 +22463 +22464 +22465 +22466 +22467 +22468 +22469 +22470 +22471 +22472 +22473 +22474 +22475 +22476 +22477 +22478 +22479 +22480 +22481 +22482 +22483 +22484 +22485 +22486 +22487 +22488 +22489 +22490 +22491 +22492 +22493 +22494 +22495 +22496 +22497 +22498 +22499 +22500 +22501 +22502 +22503 +22504 +22505 +22506 +22507 +22508 +22509 +22510 +22511 +22512 +22513 +22514 +22515 +22516 +22517 +22518 +22519 +22520 +22521 +22522 +22523 +22524 +22525 +22526 +22527 +22528 +22529 +22530 +22531 +22532 +22533 +22534 +22535 +22536 +22537 +22538 +22539 +22540 +22541 +22542 +22543 +22544 +22545 +22546 +22547 +22548 +22549 +22550 +22551 +22552 +22553 +22554 +22555 +22556 +22557 +22558 +22559 +22560 +22561 +22562 +22563 +22564 +22565 +22566 +22567 +22568 +22569 +22570 +22571 +22572 +22573 +22574 +22575 +22576 +22577 +22578 +22579 +22580 +22581 +22582 +22583 +22584 +22585 +22586 +22587 +22588 +22589 +22590 +22591 +22592 +22593 +22594 +22595 +22596 +22597 +22598 +22599 +22600 +22601 +22602 +22603 +22604 +22605 +22606 +22607 +22608 +22609 +22610 +22611 +22612 +22613 +22614 +22615 +22616 +22617 +22618 +22619 +22620 +22621 +22622 +22623 +22624 +22625 +22626 +22627 +22628 +22629 +22630 +22631 +22632 +22633 +22634 +22635 +22636 +22637 +22638 +22639 +22640 +22641 +22642 +22643 +22644 +22645 +22646 +22647 +22648 +22649 +22650 +22651 +22652 +22653 +22654 +22655 +22656 +22657 +22658 +22659 +22660 +22661 +22662 +22663 +22664 +22665 +22666 +22667 +22668 +22669 +22670 +22671 +22672 +22673 +22674 +22675 +22676 +22677 +22678 +22679 +22680 +22681 +22682 +22683 +22684 +22685 +22686 +22687 +22688 +22689 +22690 +22691 +22692 +22693 +22694 +22695 +22696 +22697 +22698 +22699 +22700 +22701 +22702 +22703 +22704 +22705 +22706 +22707 +22708 +22709 +22710 +22711 +22712 +22713 +22714 +22715 +22716 +22717 +22718 +22719 +22720 +22721 +22722 +22723 +22724 +22725 +22726 +22727 +22728 +22729 +22730 +22731 +22732 +22733 +22734 +22735 +22736 +22737 +22738 +22739 +22740 +22741 +22742 +22743 +22744 +22745 +22746 +22747 +22748 +22749 +22750 +22751 +22752 +22753 +22754 +22755 +22756 +22757 +22758 +22759 +22760 +22761 +22762 +22763 +22764 +22765 +22766 +22767 +22768 +22769 +22770 +22771 +22772 +22773 +22774 +22775 +22776 +22777 +22778 +22779 +22780 +22781 +22782 +22783 +22784 +22785 +22786 +22787 +22788 +22789 +22790 +22791 +22792 +22793 +22794 +22795 +22796 +22797 +22798 +22799 +22800 +22801 +22802 +22803 +22804 +22805 +22806 +22807 +22808 +22809 +22810 +22811 +22812 +22813 +22814 +22815 +22816 +22817 +22818 +22819 +22820 +22821 +22822 +22823 +22824 +22825 +22826 +22827 +22828 +22829 +22830 +22831 +22832 +22833 +22834 +22835 +22836 +22837 +22838 +22839 +22840 +22841 +22842 +22843 +22844 +22845 +22846 +22847 +22848 +22849 +22850 +22851 +22852 +22853 +22854 +22855 +22856 +22857 +22858 +22859 +22860 +22861 +22862 +22863 +22864 +22865 +22866 +22867 +22868 +22869 +22870 +22871 +22872 +22873 +22874 +22875 +22876 +22877 +22878 +22879 +22880 +22881 +22882 +22883 +22884 +22885 +22886 +22887 +22888 +22889 +22890 +22891 +22892 +22893 +22894 +22895 +22896 +22897 +22898 +22899 +22900 +22901 +22902 +22903 +22904 +22905 +22906 +22907 +22908 +22909 +22910 +22911 +22912 +22913 +22914 +22915 +22916 +22917 +22918 +22919 +22920 +22921 +22922 +22923 +22924 +22925 +22926 +22927 +22928 +22929 +22930 +22931 +22932 +22933 +22934 +22935 +22936 +22937 +22938 +22939 +22940 +22941 +22942 +22943 +22944 +22945 +22946 +22947 +22948 +22949 +22950 +22951 +22952 +22953 +22954 +22955 +22956 +22957 +22958 +22959 +22960 +22961 +22962 +22963 +22964 +22965 +22966 +22967 +22968 +22969 +22970 +22971 +22972 +22973 +22974 +22975 +22976 +22977 +22978 +22979 +22980 +22981 +22982 +22983 +22984 +22985 +22986 +22987 +22988 +22989 +22990 +22991 +22992 +22993 +22994 +22995 +22996 +22997 +22998 +22999 +23000 +23001 +23002 +23003 +23004 +23005 +23006 +23007 +23008 +23009 +23010 +23011 +23012 +23013 +23014 +23015 +23016 +23017 +23018 +23019 +23020 +23021 +23022 +23023 +23024 +23025 +23026 +23027 +23028 +23029 +23030 +23031 +23032 +23033 +23034 +23035 +23036 +23037 +23038 +23039 +23040 +23041 +23042 +23043 +23044 +23045 +23046 +23047 +23048 +23049 +23050 +23051 +23052 +23053 +23054 +23055 +23056 +23057 +23058 +23059 +23060 +23061 +23062 +23063 +23064 +23065 +23066 +23067 +23068 +23069 +23070 +23071 +23072 +23073 +23074 +23075 +23076 +23077 +23078 +23079 +23080 +23081 +23082 +23083 +23084 +23085 +23086 +23087 +23088 +23089 +23090 +23091 +23092 +23093 +23094 +23095 +23096 +23097 +23098 +23099 +23100 +23101 +23102 +23103 +23104 +23105 +23106 +23107 +23108 +23109 +23110 +23111 +23112 +23113 +23114 +23115 +23116 +23117 +23118 +23119 +23120 +23121 +23122 +23123 +23124 +23125 +23126 +23127 +23128 +23129 +23130 +23131 +23132 +23133 +23134 +23135 +23136 +23137 +23138 +23139 +23140 +23141 +23142 +23143 +23144 +23145 +23146 +23147 +23148 +23149 +23150 +23151 +23152 +23153 +23154 +23155 +23156 +23157 +23158 +23159 +23160 +23161 +23162 +23163 +23164 +23165 +23166 +23167 +23168 +23169 +23170 +23171 +23172 +23173 +23174 +23175 +23176 +23177 +23178 +23179 +23180 +23181 +23182 +23183 +23184 +23185 +23186 +23187 +23188 +23189 +23190 +23191 +23192 +23193 +23194 +23195 +23196 +23197 +23198 +23199 +23200 +23201 +23202 +23203 +23204 +23205 +23206 +23207 +23208 +23209 +23210 +23211 +23212 +23213 +23214 +23215 +23216 +23217 +23218 +23219 +23220 +23221 +23222 +23223 +23224 +23225 +23226 +23227 +23228 +23229 +23230 +23231 +23232 +23233 +23234 +23235 +23236 +23237 +23238 +23239 +23240 +23241 +23242 +23243 +23244 +23245 +23246 +23247 +23248 +23249 +23250 +23251 +23252 +23253 +23254 +23255 +23256 +23257 +23258 +23259 +23260 +23261 +23262 +23263 +23264 +23265 +23266 +23267 +23268 +23269 +23270 +23271 +23272 +23273 +23274 +23275 +23276 +23277 +23278 +23279 +23280 +23281 +23282 +23283 +23284 +23285 +23286 +23287 +23288 +23289 +23290 +23291 +23292 +23293 +23294 +23295 +23296 +23297 +23298 +23299 +23300 +23301 +23302 +23303 +23304 +23305 +23306 +23307 +23308 +23309 +23310 +23311 +23312 +23313 +23314 +23315 +23316 +23317 +23318 +23319 +23320 +23321 +23322 +23323 +23324 +23325 +23326 +23327 +23328 +23329 +23330 +23331 +23332 +23333 +23334 +23335 +23336 +23337 +23338 +23339 +23340 +23341 +23342 +23343 +23344 +23345 +23346 +23347 +23348 +23349 +23350 +23351 +23352 +23353 +23354 +23355 +23356 +23357 +23358 +23359 +23360 +23361 +23362 +23363 +23364 +23365 +23366 +23367 +23368 +23369 +23370 +23371 +23372 +23373 +23374 +23375 +23376 +23377 +23378 +23379 +23380 +23381 +23382 +23383 +23384 +23385 +23386 +23387 +23388 +23389 +23390 +23391 +23392 +23393 +23394 +23395 +23396 +23397 +23398 +23399 +23400 +23401 +23402 +23403 +23404 +23405 +23406 +23407 +23408 +23409 +23410 +23411 +23412 +23413 +23414 +23415 +23416 +23417 +23418 +23419 +23420 +23421 +23422 +23423 +23424 +23425 +23426 +23427 +23428 +23429 +23430 +23431 +23432 +23433 +23434 +23435 +23436 +23437 +23438 +23439 +23440 +23441 +23442 +23443 +23444 +23445 +23446 +23447 +23448 +23449 +23450 +23451 +23452 +23453 +23454 +23455 +23456 +23457 +23458 +23459 +23460 +23461 +23462 +23463 +23464 +23465 +23466 +23467 +23468 +23469 +23470 +23471 +23472 +23473 +23474 +23475 +23476 +23477 +23478 +23479 +23480 +23481 +23482 +23483 +23484 +23485 +23486 +23487 +23488 +23489 +23490 +23491 +23492 +23493 +23494 +23495 +23496 +23497 +23498 +23499 +23500 +23501 +23502 +23503 +23504 +23505 +23506 +23507 +23508 +23509 +23510 +23511 +23512 +23513 +23514 +23515 +23516 +23517 +23518 +23519 +23520 +23521 +23522 +23523 +23524 +23525 +23526 +23527 +23528 +23529 +23530 +23531 +23532 +23533 +23534 +23535 +23536 +23537 +23538 +23539 +23540 +23541 +23542 +23543 +23544 +23545 +23546 +23547 +23548 +23549 +23550 +23551 +23552 +23553 +23554 +23555 +23556 +23557 +23558 +23559 +23560 +23561 +23562 +23563 +23564 +23565 +23566 +23567 +23568 +23569 +23570 +23571 +23572 +23573 +23574 +23575 +23576 +23577 +23578 +23579 +23580 +23581 +23582 +23583 +23584 +23585 +23586 +23587 +23588 +23589 +23590 +23591 +23592 +23593 +23594 +23595 +23596 +23597 +23598 +23599 +23600 +23601 +23602 +23603 +23604 +23605 +23606 +23607 +23608 +23609 +23610 +23611 +23612 +23613 +23614 +23615 +23616 +23617 +23618 +23619 +23620 +23621 +23622 +23623 +23624 +23625 +23626 +23627 +23628 +23629 +23630 +23631 +23632 +23633 +23634 +23635 +23636 +23637 +23638 +23639 +23640 +23641 +23642 +23643 +23644 +23645 +23646 +23647 +23648 +23649 +23650 +23651 +23652 +23653 +23654 +23655 +23656 +23657 +23658 +23659 +23660 +23661 +23662 +23663 +23664 +23665 +23666 +23667 +23668 +23669 +23670 +23671 +23672 +23673 +23674 +23675 +23676 +23677 +23678 +23679 +23680 +23681 +23682 +23683 +23684 +23685 +23686 +23687 +23688 +23689 +23690 +23691 +23692 +23693 +23694 +23695 +23696 +23697 +23698 +23699 +23700 +23701 +23702 +23703 +23704 +23705 +23706 +23707 +23708 +23709 +23710 +23711 +23712 +23713 +23714 +23715 +23716 +23717 +23718 +23719 +23720 +23721 +23722 +23723 +23724 +23725 +23726 +23727 +23728 +23729 +23730 +23731 +23732 +23733 +23734 +23735 +23736 +23737 +23738 +23739 +23740 +23741 +23742 +23743 +23744 +23745 +23746 +23747 +23748 +23749 +23750 +23751 +23752 +23753 +23754 +23755 +23756 +23757 +23758 +23759 +23760 +23761 +23762 +23763 +23764 +23765 +23766 +23767 +23768 +23769 +23770 +23771 +23772 +23773 +23774 +23775 +23776 +23777 +23778 +23779 +23780 +23781 +23782 +23783 +23784 +23785 +23786 +23787 +23788 +23789 +23790 +23791 +23792 +23793 +23794 +23795 +23796 +23797 +23798 +23799 +23800 +23801 +23802 +23803 +23804 +23805 +23806 +23807 +23808 +23809 +23810 +23811 +23812 +23813 +23814 +23815 +23816 +23817 +23818 +23819 +23820 +23821 +23822 +23823 +23824 +23825 +23826 +23827 +23828 +23829 +23830 +23831 +23832 +23833 +23834 +23835 +23836 +23837 +23838 +23839 +23840 +23841 +23842 +23843 +23844 +23845 +23846 +23847 +23848 +23849 +23850 +23851 +23852 +23853 +23854 +23855 +23856 +23857 +23858 +23859 +23860 +23861 +23862 +23863 +23864 +23865 +23866 +23867 +23868 +23869 +23870 +23871 +23872 +23873 +23874 +23875 +23876 +23877 +23878 +23879 +23880 +23881 +23882 +23883 +23884 +23885 +23886 +23887 +23888 +23889 +23890 +23891 +23892 +23893 +23894 +23895 +23896 +23897 +23898 +23899 +23900 +23901 +23902 +23903 +23904 +23905 +23906 +23907 +23908 +23909 +23910 +23911 +23912 +23913 +23914 +23915 +23916 +23917 +23918 +23919 +23920 +23921 +23922 +23923 +23924 +23925 +23926 +23927 +23928 +23929 +23930 +23931 +23932 +23933 +23934 +23935 +23936 +23937 +23938 +23939 +23940 +23941 +23942 +23943 +23944 +23945 +23946 +23947 +23948 +23949 +23950 +23951 +23952 +23953 +23954 +23955 +23956 +23957 +23958 +23959 +23960 +23961 +23962 +23963 +23964 +23965 +23966 +23967 +23968 +23969 +23970 +23971 +23972 +23973 +23974 +23975 +23976 +23977 +23978 +23979 +23980 +23981 +23982 +23983 +23984 +23985 +23986 +23987 +23988 +23989 +23990 +23991 +23992 +23993 +23994 +23995 +23996 +23997 +23998 +23999 +24000 +24001 +24002 +24003 +24004 +24005 +24006 +24007 +24008 +24009 +24010 +24011 +24012 +24013 +24014 +24015 +24016 +24017 +24018 +24019 +24020 +24021 +24022 +24023 +24024 +24025 +24026 +24027 +24028 +24029 +24030 +24031 +24032 +24033 +24034 +24035 +24036 +24037 +24038 +24039 +24040 +24041 +24042 +24043 +24044 +24045 +24046 +24047 +24048 +24049 +24050 +24051 +24052 +24053 +24054 +24055 +24056 +24057 +24058 +24059 +24060 +24061 +24062 +24063 +24064 +24065 +24066 +24067 +24068 +24069 +24070 +24071 +24072 +24073 +24074 +24075 +24076 +24077 +24078 +24079 +24080 +24081 +24082 +24083 +24084 +24085 +24086 +24087 +24088 +24089 +24090 +24091 +24092 +24093 +24094 +24095 +24096 +24097 +24098 +24099 +24100 +24101 +24102 +24103 +24104 +24105 +24106 +24107 +24108 +24109 +24110 +24111 +24112 +24113 +24114 +24115 +24116 +24117 +24118 +24119 +24120 +24121 +24122 +24123 +24124 +24125 +24126 +24127 +24128 +24129 +24130 +24131 +24132 +24133 +24134 +24135 +24136 +24137 +24138 +24139 +24140 +24141 +24142 +24143 +24144 +24145 +24146 +24147 +24148 +24149 +24150 +24151 +24152 +24153 +24154 +24155 +24156 +24157 +24158 +24159 +24160 +24161 +24162 +24163 +24164 +24165 +24166 +24167 +24168 +24169 +24170 +24171 +24172 +24173 +24174 +24175 +24176 +24177 +24178 +24179 +24180 +24181 +24182 +24183 +24184 +24185 +24186 +24187 +24188 +24189 +24190 +24191 +24192 +24193 +24194 +24195 +24196 +24197 +24198 +24199 +24200 +24201 +24202 +24203 +24204 +24205 +24206 +24207 +24208 +24209 +24210 +24211 +24212 +24213 +24214 +24215 +24216 +24217 +24218 +24219 +24220 +24221 +24222 +24223 +24224 +24225 +24226 +24227 +24228 +24229 +24230 +24231 +24232 +24233 +24234 +24235 +24236 +24237 +24238 +24239 +24240 +24241 +24242 +24243 +24244 +24245 +24246 +24247 +24248 +24249 +24250 +24251 +24252 +24253 +24254 +24255 +24256 +24257 +24258 +24259 +24260 +24261 +24262 +24263 +24264 +24265 +24266 +24267 +24268 +24269 +24270 +24271 +24272 +24273 +24274 +24275 +24276 +24277 +24278 +24279 +24280 +24281 +24282 +24283 +24284 +24285 +24286 +24287 +24288 +24289 +24290 +24291 +24292 +24293 +24294 +24295 +24296 +24297 +24298 +24299 +24300 +24301 +24302 +24303 +24304 +24305 +24306 +24307 +24308 +24309 +24310 +24311 +24312 +24313 +24314 +24315 +24316 +24317 +24318 +24319 +24320 +24321 +24322 +24323 +24324 +24325 +24326 +24327 +24328 +24329 +24330 +24331 +24332 +24333 +24334 +24335 +24336 +24337 +24338 +24339 +24340 +24341 +24342 +24343 +24344 +24345 +24346 +24347 +24348 +24349 +24350 +24351 +24352 +24353 +24354 +24355 +24356 +24357 +24358 +24359 +24360 +24361 +24362 +24363 +24364 +24365 +24366 +24367 +24368 +24369 +24370 +24371 +24372 +24373 +24374 +24375 +24376 +24377 +24378 +24379 +24380 +24381 +24382 +24383 +24384 +24385 +24386 +24387 +24388 +24389 +24390 +24391 +24392 +24393 +24394 +24395 +24396 +24397 +24398 +24399 +24400 +24401 +24402 +24403 +24404 +24405 +24406 +24407 +24408 +24409 +24410 +24411 +24412 +24413 +24414 +24415 +24416 +24417 +24418 +24419 +24420 +24421 +24422 +24423 +24424 +24425 +24426 +24427 +24428 +24429 +24430 +24431 +24432 +24433 +24434 +24435 +24436 +24437 +24438 +24439 +24440 +24441 +24442 +24443 +24444 +24445 +24446 +24447 +24448 +24449 +24450 +24451 +24452 +24453 +24454 +24455 +24456 +24457 +24458 +24459 +24460 +24461 +24462 +24463 +24464 +24465 +24466 +24467 +24468 +24469 +24470 +24471 +24472 +24473 +24474 +24475 +24476 +24477 +24478 +24479 +24480 +24481 +24482 +24483 +24484 +24485 +24486 +24487 +24488 +24489 +24490 +24491 +24492 +24493 +24494 +24495 +24496 +24497 +24498 +24499 +24500 +24501 +24502 +24503 +24504 +24505 +24506 +24507 +24508 +24509 +24510 +24511 +24512 +24513 +24514 +24515 +24516 +24517 +24518 +24519 +24520 +24521 +24522 +24523 +24524 +24525 +24526 +24527 +24528 +24529 +24530 +24531 +24532 +24533 +24534 +24535 +24536 +24537 +24538 +24539 +24540 +24541 +24542 +24543 +24544 +24545 +24546 +24547 +24548 +24549 +24550 +24551 +24552 +24553 +24554 +24555 +24556 +24557 +24558 +24559 +24560 +24561 +24562 +24563 +24564 +24565 +24566 +24567 +24568 +24569 +24570 +24571 +24572 +24573 +24574 +24575 +24576 +24577 +24578 +24579 +24580 +24581 +24582 +24583 +24584 +24585 +24586 +24587 +24588 +24589 +24590 +24591 +24592 +24593 +24594 +24595 +24596 +24597 +24598 +24599 +24600 +24601 +24602 +24603 +24604 +24605 +24606 +24607 +24608 +24609 +24610 +24611 +24612 +24613 +24614 +24615 +24616 +24617 +24618 +24619 +24620 +24621 +24622 +24623 +24624 +24625 +24626 +24627 +24628 +24629 +24630 +24631 +24632 +24633 +24634 +24635 +24636 +24637 +24638 +24639 +24640 +24641 +24642 +24643 +24644 +24645 +24646 +24647 +24648 +24649 +24650 +24651 +24652 +24653 +24654 +24655 +24656 +24657 +24658 +24659 +24660 +24661 +24662 +24663 +24664 +24665 +24666 +24667 +24668 +24669 +24670 +24671 +24672 +24673 +24674 +24675 +24676 +24677 +24678 +24679 +24680 +24681 +24682 +24683 +24684 +24685 +24686 +24687 +24688 +24689 +24690 +24691 +24692 +24693 +24694 +24695 +24696 +24697 +24698 +24699 +24700 +24701 +24702 +24703 +24704 +24705 +24706 +24707 +24708 +24709 +24710 +24711 +24712 +24713 +24714 +24715 +24716 +24717 +24718 +24719 +24720 +24721 +24722 +24723 +24724 +24725 +24726 +24727 +24728 +24729 +24730 +24731 +24732 +24733 +24734 +24735 +24736 +24737 +24738 +24739 +24740 +24741 +24742 +24743 +24744 +24745 +24746 +24747 +24748 +24749 +24750 +24751 +24752 +24753 +24754 +24755 +24756 +24757 +24758 +24759 +24760 +24761 +24762 +24763 +24764 +24765 +24766 +24767 +24768 +24769 +24770 +24771 +24772 +24773 +24774 +24775 +24776 +24777 +24778 +24779 +24780 +24781 +24782 +24783 +24784 +24785 +24786 +24787 +24788 +24789 +24790 +24791 +24792 +24793 +24794 +24795 +24796 +24797 +24798 +24799 +24800 +24801 +24802 +24803 +24804 +24805 +24806 +24807 +24808 +24809 +24810 +24811 +24812 +24813 +24814 +24815 +24816 +24817 +24818 +24819 +24820 +24821 +24822 +24823 +24824 +24825 +24826 +24827 +24828 +24829 +24830 +24831 +24832 +24833 +24834 +24835 +24836 +24837 +24838 +24839 +24840 +24841 +24842 +24843 +24844 +24845 +24846 +24847 +24848 +24849 +24850 +24851 +24852 +24853 +24854 +24855 +24856 +24857 +24858 +24859 +24860 +24861 +24862 +24863 +24864 +24865 +24866 +24867 +24868 +24869 +24870 +24871 +24872 +24873 +24874 +24875 +24876 +24877 +24878 +24879 +24880 +24881 +24882 +24883 +24884 +24885 +24886 +24887 +24888 +24889 +24890 +24891 +24892 +24893 +24894 +24895 +24896 +24897 +24898 +24899 +24900 +24901 +24902 +24903 +24904 +24905 +24906 +24907 +24908 +24909 +24910 +24911 +24912 +24913 +24914 +24915 +24916 +24917 +24918 +24919 +24920 +24921 +24922 +24923 +24924 +24925 +24926 +24927 +24928 +24929 +24930 +24931 +24932 +24933 +24934 +24935 +24936 +24937 +24938 +24939 +24940 +24941 +24942 +24943 +24944 +24945 +24946 +24947 +24948 +24949 +24950 +24951 +24952 +24953 +24954 +24955 +24956 +24957 +24958 +24959 +24960 +24961 +24962 +24963 +24964 +24965 +24966 +24967 +24968 +24969 +24970 +24971 +24972 +24973 +24974 +24975 +24976 +24977 +24978 +24979 +24980 +24981 +24982 +24983 +24984 +24985 +24986 +24987 +24988 +24989 +24990 +24991 +24992 +24993 +24994 +24995 +24996 +24997 +24998 +24999 +25000 +25001 +25002 +25003 +25004 +25005 +25006 +25007 +25008 +25009 +25010 +25011 +25012 +25013 +25014 +25015 +25016 +25017 +25018 +25019 +25020 +25021 +25022 +25023 +25024 +25025 +25026 +25027 +25028 +25029 +25030 +25031 +25032 +25033 +25034 +25035 +25036 +25037 +25038 +25039 +25040 +25041 +25042 +25043 +25044 +25045 +25046 +25047 +25048 +25049 +25050 +25051 +25052 +25053 +25054 +25055 +25056 +25057 +25058 +25059 +25060 +25061 +25062 +25063 +25064 +25065 +25066 +25067 +25068 +25069 +25070 +25071 +25072 +25073 +25074 +25075 +25076 +25077 +25078 +25079 +25080 +25081 +25082 +25083 +25084 +25085 +25086 +25087 +25088 +25089 +25090 +25091 +25092 +25093 +25094 +25095 +25096 +25097 +25098 +25099 +25100 +25101 +25102 +25103 +25104 +25105 +25106 +25107 +25108 +25109 +25110 +25111 +25112 +25113 +25114 +25115 +25116 +25117 +25118 +25119 +25120 +25121 +25122 +25123 +25124 +25125 +25126 +25127 +25128 +25129 +25130 +25131 +25132 +25133 +25134 +25135 +25136 +25137 +25138 +25139 +25140 +25141 +25142 +25143 +25144 +25145 +25146 +25147 +25148 +25149 +25150 +25151 +25152 +25153 +25154 +25155 +25156 +25157 +25158 +25159 +25160 +25161 +25162 +25163 +25164 +25165 +25166 +25167 +25168 +25169 +25170 +25171 +25172 +25173 +25174 +25175 +25176 +25177 +25178 +25179 +25180 +25181 +25182 +25183 +25184 +25185 +25186 +25187 +25188 +25189 +25190 +25191 +25192 +25193 +25194 +25195 +25196 +25197 +25198 +25199 +25200 +25201 +25202 +25203 +25204 +25205 +25206 +25207 +25208 +25209 +25210 +25211 +25212 +25213 +25214 +25215 +25216 +25217 +25218 +25219 +25220 +25221 +25222 +25223 +25224 +25225 +25226 +25227 +25228 +25229 +25230 +25231 +25232 +25233 +25234 +25235 +25236 +25237 +25238 +25239 +25240 +25241 +25242 +25243 +25244 +25245 +25246 +25247 +25248 +25249 +25250 +25251 +25252 +25253 +25254 +25255 +25256 +25257 +25258 +25259 +25260 +25261 +25262 +25263 +25264 +25265 +25266 +25267 +25268 +25269 +25270 +25271 +25272 +25273 +25274 +25275 +25276 +25277 +25278 +25279 +25280 +25281 +25282 +25283 +25284 +25285 +25286 +25287 +25288 +25289 +25290 +25291 +25292 +25293 +25294 +25295 +25296 +25297 +25298 +25299 +25300 +25301 +25302 +25303 +25304 +25305 +25306 +25307 +25308 +25309 +25310 +25311 +25312 +25313 +25314 +25315 +25316 +25317 +25318 +25319 +25320 +25321 +25322 +25323 +25324 +25325 +25326 +25327 +25328 +25329 +25330 +25331 +25332 +25333 +25334 +25335 +25336 +25337 +25338 +25339 +25340 +25341 +25342 +25343 +25344 +25345 +25346 +25347 +25348 +25349 +25350 +25351 +25352 +25353 +25354 +25355 +25356 +25357 +25358 +25359 +25360 +25361 +25362 +25363 +25364 +25365 +25366 +25367 +25368 +25369 +25370 +25371 +25372 +25373 +25374 +25375 +25376 +25377 +25378 +25379 +25380 +25381 +25382 +25383 +25384 +25385 +25386 +25387 +25388 +25389 +25390 +25391 +25392 +25393 +25394 +25395 +25396 +25397 +25398 +25399 +25400 +25401 +25402 +25403 +25404 +25405 +25406 +25407 +25408 +25409 +25410 +25411 +25412 +25413 +25414 +25415 +25416 +25417 +25418 +25419 +25420 +25421 +25422 +25423 +25424 +25425 +25426 +25427 +25428 +25429 +25430 +25431 +25432 +25433 +25434 +25435 +25436 +25437 +25438 +25439 +25440 +25441 +25442 +25443 +25444 +25445 +25446 +25447 +25448 +25449 +25450 +25451 +25452 +25453 +25454 +25455 +25456 +25457 +25458 +25459 +25460 +25461 +25462 +25463 +25464 +25465 +25466 +25467 +25468 +25469 +25470 +25471 +25472 +25473 +25474 +25475 +25476 +25477 +25478 +25479 +25480 +25481 +25482 +25483 +25484 +25485 +25486 +25487 +25488 +25489 +25490 +25491 +25492 +25493 +25494 +25495 +25496 +25497 +25498 +25499 +25500 +25501 +25502 +25503 +25504 +25505 +25506 +25507 +25508 +25509 +25510 +25511 +25512 +25513 +25514 +25515 +25516 +25517 +25518 +25519 +25520 +25521 +25522 +25523 +25524 +25525 +25526 +25527 +25528 +25529 +25530 +25531 +25532 +25533 +25534 +25535 +25536 +25537 +25538 +25539 +25540 +25541 +25542 +25543 +25544 +25545 +25546 +25547 +25548 +25549 +25550 +25551 +25552 +25553 +25554 +25555 +25556 +25557 +25558 +25559 +25560 +25561 +25562 +25563 +25564 +25565 +25566 +25567 +25568 +25569 +25570 +25571 +25572 +25573 +25574 +25575 +25576 +25577 +25578 +25579 +25580 +25581 +25582 +25583 +25584 +25585 +25586 +25587 +25588 +25589 +25590 +25591 +25592 +25593 +25594 +25595 +25596 +25597 +25598 +25599 +25600 +25601 +25602 +25603 +25604 +25605 +25606 +25607 +25608 +25609 +25610 +25611 +25612 +25613 +25614 +25615 +25616 +25617 +25618 +25619 +25620 +25621 +25622 +25623 +25624 +25625 +25626 +25627 +25628 +25629 +25630 +25631 +25632 +25633 +25634 +25635 +25636 +25637 +25638 +25639 +25640 +25641 +25642 +25643 +25644 +25645 +25646 +25647 +25648 +25649 +25650 +25651 +25652 +25653 +25654 +25655 +25656 +25657 +25658 +25659 +25660 +25661 +25662 +25663 +25664 +25665 +25666 +25667 +25668 +25669 +25670 +25671 +25672 +25673 +25674 +25675 +25676 +25677 +25678 +25679 +25680 +25681 +25682 +25683 +25684 +25685 +25686 +25687 +25688 +25689 +25690 +25691 +25692 +25693 +25694 +25695 +25696 +25697 +25698 +25699 +25700 +25701 +25702 +25703 +25704 +25705 +25706 +25707 +25708 +25709 +25710 +25711 +25712 +25713 +25714 +25715 +25716 +25717 +25718 +25719 +25720 +25721 +25722 +25723 +25724 +25725 +25726 +25727 +25728 +25729 +25730 +25731 +25732 +25733 +25734 +25735 +25736 +25737 +25738 +25739 +25740 +25741 +25742 +25743 +25744 +25745 +25746 +25747 +25748 +25749 +25750 +25751 +25752 +25753 +25754 +25755 +25756 +25757 +25758 +25759 +25760 +25761 +25762 +25763 +25764 +25765 +25766 +25767 +25768 +25769 +25770 +25771 +25772 +25773 +25774 +25775 +25776 +25777 +25778 +25779 +25780 +25781 +25782 +25783 +25784 +25785 +25786 +25787 +25788 +25789 +25790 +25791 +25792 +25793 +25794 +25795 +25796 +25797 +25798 +25799 +25800 +25801 +25802 +25803 +25804 +25805 +25806 +25807 +25808 +25809 +25810 +25811 +25812 +25813 +25814 +25815 +25816 +25817 +25818 +25819 +25820 +25821 +25822 +25823 +25824 +25825 +25826 +25827 +25828 +25829 +25830 +25831 +25832 +25833 +25834 +25835 +25836 +25837 +25838 +25839 +25840 +25841 +25842 +25843 +25844 +25845 +25846 +25847 +25848 +25849 +25850 +25851 +25852 +25853 +25854 +25855 +25856 +25857 +25858 +25859 +25860 +25861 +25862 +25863 +25864 +25865 +25866 +25867 +25868 +25869 +25870 +25871 +25872 +25873 +25874 +25875 +25876 +25877 +25878 +25879 +25880 +25881 +25882 +25883 +25884 +25885 +25886 +25887 +25888 +25889 +25890 +25891 +25892 +25893 +25894 +25895 +25896 +25897 +25898 +25899 +25900 +25901 +25902 +25903 +25904 +25905 +25906 +25907 +25908 +25909 +25910 +25911 +25912 +25913 +25914 +25915 +25916 +25917 +25918 +25919 +25920 +25921 +25922 +25923 +25924 +25925 +25926 +25927 +25928 +25929 +25930 +25931 +25932 +25933 +25934 +25935 +25936 +25937 +25938 +25939 +25940 +25941 +25942 +25943 +25944 +25945 +25946 +25947 +25948 +25949 +25950 +25951 +25952 +25953 +25954 +25955 +25956 +25957 +25958 +25959 +25960 +25961 +25962 +25963 +25964 +25965 +25966 +25967 +25968 +25969 +25970 +25971 +25972 +25973 +25974 +25975 +25976 +25977 +25978 +25979 +25980 +25981 +25982 +25983 +25984 +25985 +25986 +25987 +25988 +25989 +25990 +25991 +25992 +25993 +25994 +25995 +25996 +25997 +25998 +25999 +26000 +26001 +26002 +26003 +26004 +26005 +26006 +26007 +26008 +26009 +26010 +26011 +26012 +26013 +26014 +26015 +26016 +26017 +26018 +26019 +26020 +26021 +26022 +26023 +26024 +26025 +26026 +26027 +26028 +26029 +26030 +26031 +26032 +26033 +26034 +26035 +26036 +26037 +26038 +26039 +26040 +26041 +26042 +26043 +26044 +26045 +26046 +26047 +26048 +26049 +26050 +26051 +26052 +26053 +26054 +26055 +26056 +26057 +26058 +26059 +26060 +26061 +26062 +26063 +26064 +26065 +26066 +26067 +26068 +26069 +26070 +26071 +26072 +26073 +26074 +26075 +26076 +26077 +26078 +26079 +26080 +26081 +26082 +26083 +26084 +26085 +26086 +26087 +26088 +26089 +26090 +26091 +26092 +26093 +26094 +26095 +26096 +26097 +26098 +26099 +26100 +26101 +26102 +26103 +26104 +26105 +26106 +26107 +26108 +26109 +26110 +26111 +26112 +26113 +26114 +26115 +26116 +26117 +26118 +26119 +26120 +26121 +26122 +26123 +26124 +26125 +26126 +26127 +26128 +26129 +26130 +26131 +26132 +26133 +26134 +26135 +26136 +26137 +26138 +26139 +26140 +26141 +26142 +26143 +26144 +26145 +26146 +26147 +26148 +26149 +26150 +26151 +26152 +26153 +26154 +26155 +26156 +26157 +26158 +26159 +26160 +26161 +26162 +26163 +26164 +26165 +26166 +26167 +26168 +26169 +26170 +26171 +26172 +26173 +26174 +26175 +26176 +26177 +26178 +26179 +26180 +26181 +26182 +26183 +26184 +26185 +26186 +26187 +26188 +26189 +26190 +26191 +26192 +26193 +26194 +26195 +26196 +26197 +26198 +26199 +26200 +26201 +26202 +26203 +26204 +26205 +26206 +26207 +26208 +26209 +26210 +26211 +26212 +26213 +26214 +26215 +26216 +26217 +26218 +26219 +26220 +26221 +26222 +26223 +26224 +26225 +26226 +26227 +26228 +26229 +26230 +26231 +26232 +26233 +26234 +26235 +26236 +26237 +26238 +26239 +26240 +26241 +26242 +26243 +26244 +26245 +26246 +26247 +26248 +26249 +26250 +26251 +26252 +26253 +26254 +26255 +26256 +26257 +26258 +26259 +26260 +26261 +26262 +26263 +26264 +26265 +26266 +26267 +26268 +26269 +26270 +26271 +26272 +26273 +26274 +26275 +26276 +26277 +26278 +26279 +26280 +26281 +26282 +26283 +26284 +26285 +26286 +26287 +26288 +26289 +26290 +26291 +26292 +26293 +26294 +26295 +26296 +26297 +26298 +26299 +26300 +26301 +26302 +26303 +26304 +26305 +26306 +26307 +26308 +26309 +26310 +26311 +26312 +26313 +26314 +26315 +26316 +26317 +26318 +26319 +26320 +26321 +26322 +26323 +26324 +26325 +26326 +26327 +26328 +26329 +26330 +26331 +26332 +26333 +26334 +26335 +26336 +26337 +26338 +26339 +26340 +26341 +26342 +26343 +26344 +26345 +26346 +26347 +26348 +26349 +26350 +26351 +26352 +26353 +26354 +26355 +26356 +26357 +26358 +26359 +26360 +26361 +26362 +26363 +26364 +26365 +26366 +26367 +26368 +26369 +26370 +26371 +26372 +26373 +26374 +26375 +26376 +26377 +26378 +26379 +26380 +26381 +26382 +26383 +26384 +26385 +26386 +26387 +26388 +26389 +26390 +26391 +26392 +26393 +26394 +26395 +26396 +26397 +26398 +26399 +26400 +26401 +26402 +26403 +26404 +26405 +26406 +26407 +26408 +26409 +26410 +26411 +26412 +26413 +26414 +26415 +26416 +26417 +26418 +26419 +26420 +26421 +26422 +26423 +26424 +26425 +26426 +26427 +26428 +26429 +26430 +26431 +26432 +26433 +26434 +26435 +26436 +26437 +26438 +26439 +26440 +26441 +26442 +26443 +26444 +26445 +26446 +26447 +26448 +26449 +26450 +26451 +26452 +26453 +26454 +26455 +26456 +26457 +26458 +26459 +26460 +26461 +26462 +26463 +26464 +26465 +26466 +26467 +26468 +26469 +26470 +26471 +26472 +26473 +26474 +26475 +26476 +26477 +26478 +26479 +26480 +26481 +26482 +26483 +26484 +26485 +26486 +26487 +26488 +26489 +26490 +26491 +26492 +26493 +26494 +26495 +26496 +26497 +26498 +26499 +26500 +26501 +26502 +26503 +26504 +26505 +26506 +26507 +26508 +26509 +26510 +26511 +26512 +26513 +26514 +26515 +26516 +26517 +26518 +26519 +26520 +26521 +26522 +26523 +26524 +26525 +26526 +26527 +26528 +26529 +26530 +26531 +26532 +26533 +26534 +26535 +26536 +26537 +26538 +26539 +26540 +26541 +26542 +26543 +26544 +26545 +26546 +26547 +26548 +26549 +26550 +26551 +26552 +26553 +26554 +26555 +26556 +26557 +26558 +26559 +26560 +26561 +26562 +26563 +26564 +26565 +26566 +26567 +26568 +26569 +26570 +26571 +26572 +26573 +26574 +26575 +26576 +26577 +26578 +26579 +26580 +26581 +26582 +26583 +26584 +26585 +26586 +26587 +26588 +26589 +26590 +26591 +26592 +26593 +26594 +26595 +26596 +26597 +26598 +26599 +26600 +26601 +26602 +26603 +26604 +26605 +26606 +26607 +26608 +26609 +26610 +26611 +26612 +26613 +26614 +26615 +26616 +26617 +26618 +26619 +26620 +26621 +26622 +26623 +26624 +26625 +26626 +26627 +26628 +26629 +26630 +26631 +26632 +26633 +26634 +26635 +26636 +26637 +26638 +26639 +26640 +26641 +26642 +26643 +26644 +26645 +26646 +26647 +26648 +26649 +26650 +26651 +26652 +26653 +26654 +26655 +26656 +26657 +26658 +26659 +26660 +26661 +26662 +26663 +26664 +26665 +26666 +26667 +26668 +26669 +26670 +26671 +26672 +26673 +26674 +26675 +26676 +26677 +26678 +26679 +26680 +26681 +26682 +26683 +26684 +26685 +26686 +26687 +26688 +26689 +26690 +26691 +26692 +26693 +26694 +26695 +26696 +26697 +26698 +26699 +26700 +26701 +26702 +26703 +26704 +26705 +26706 +26707 +26708 +26709 +26710 +26711 +26712 +26713 +26714 +26715 +26716 +26717 +26718 +26719 +26720 +26721 +26722 +26723 +26724 +26725 +26726 +26727 +26728 +26729 +26730 +26731 +26732 +26733 +26734 +26735 +26736 +26737 +26738 +26739 +26740 +26741 +26742 +26743 +26744 +26745 +26746 +26747 +26748 +26749 +26750 +26751 +26752 +26753 +26754 +26755 +26756 +26757 +26758 +26759 +26760 +26761 +26762 +26763 +26764 +26765 +26766 +26767 +26768 +26769 +26770 +26771 +26772 +26773 +26774 +26775 +26776 +26777 +26778 +26779 +26780 +26781 +26782 +26783 +26784 +26785 +26786 +26787 +26788 +26789 +26790 +26791 +26792 +26793 +26794 +26795 +26796 +26797 +26798 +26799 +26800 +26801 +26802 +26803 +26804 +26805 +26806 +26807 +26808 +26809 +26810 +26811 +26812 +26813 +26814 +26815 +26816 +26817 +26818 +26819 +26820 +26821 +26822 +26823 +26824 +26825 +26826 +26827 +26828 +26829 +26830 +26831 +26832 +26833 +26834 +26835 +26836 +26837 +26838 +26839 +26840 +26841 +26842 +26843 +26844 +26845 +26846 +26847 +26848 +26849 +26850 +26851 +26852 +26853 +26854 +26855 +26856 +26857 +26858 +26859 +26860 +26861 +26862 +26863 +26864 +26865 +26866 +26867 +26868 +26869 +26870 +26871 +26872 +26873 +26874 +26875 +26876 +26877 +26878 +26879 +26880 +26881 +26882 +26883 +26884 +26885 +26886 +26887 +26888 +26889 +26890 +26891 +26892 +26893 +26894 +26895 +26896 +26897 +26898 +26899 +26900 +26901 +26902 +26903 +26904 +26905 +26906 +26907 +26908 +26909 +26910 +26911 +26912 +26913 +26914 +26915 +26916 +26917 +26918 +26919 +26920 +26921 +26922 +26923 +26924 +26925 +26926 +26927 +26928 +26929 +26930 +26931 +26932 +26933 +26934 +26935 +26936 +26937 +26938 +26939 +26940 +26941 +26942 +26943 +26944 +26945 +26946 +26947 +26948 +26949 +26950 +26951 +26952 +26953 +26954 +26955 +26956 +26957 +26958 +26959 +26960 +26961 +26962 +26963 +26964 +26965 +26966 +26967 +26968 +26969 +26970 +26971 +26972 +26973 +26974 +26975 +26976 +26977 +26978 +26979 +26980 +26981 +26982 +26983 +26984 +26985 +26986 +26987 +26988 +26989 +26990 +26991 +26992 +26993 +26994 +26995 +26996 +26997 +26998 +26999 +27000 +27001 +27002 +27003 +27004 +27005 +27006 +27007 +27008 +27009 +27010 +27011 +27012 +27013 +27014 +27015 +27016 +27017 +27018 +27019 +27020 +27021 +27022 +27023 +27024 +27025 +27026 +27027 +27028 +27029 +27030 +27031 +27032 +27033 +27034 +27035 +27036 +27037 +27038 +27039 +27040 +27041 +27042 +27043 +27044 +27045 +27046 +27047 +27048 +27049 +27050 +27051 +27052 +27053 +27054 +27055 +27056 +27057 +27058 +27059 +27060 +27061 +27062 +27063 +27064 +27065 +27066 +27067 +27068 +27069 +27070 +27071 +27072 +27073 +27074 +27075 +27076 +27077 +27078 +27079 +27080 +27081 +27082 +27083 +27084 +27085 +27086 +27087 +27088 +27089 +27090 +27091 +27092 +27093 +27094 +27095 +27096 +27097 +27098 +27099 +27100 +27101 +27102 +27103 +27104 +27105 +27106 +27107 +27108 +27109 +27110 +27111 +27112 +27113 +27114 +27115 +27116 +27117 +27118 +27119 +27120 +27121 +27122 +27123 +27124 +27125 +27126 +27127 +27128 +27129 +27130 +27131 +27132 +27133 +27134 +27135 +27136 +27137 +27138 +27139 +27140 +27141 +27142 +27143 +27144 +27145 +27146 +27147 +27148 +27149 +27150 +27151 +27152 +27153 +27154 +27155 +27156 +27157 +27158 +27159 +27160 +27161 +27162 +27163 +27164 +27165 +27166 +27167 +27168 +27169 +27170 +27171 +27172 +27173 +27174 +27175 +27176 +27177 +27178 +27179 +27180 +27181 +27182 +27183 +27184 +27185 +27186 +27187 +27188 +27189 +27190 +27191 +27192 +27193 +27194 +27195 +27196 +27197 +27198 +27199 +27200 +27201 +27202 +27203 +27204 +27205 +27206 +27207 +27208 +27209 +27210 +27211 +27212 +27213 +27214 +27215 +27216 +27217 +27218 +27219 +27220 +27221 +27222 +27223 +27224 +27225 +27226 +27227 +27228 +27229 +27230 +27231 +27232 +27233 +27234 +27235 +27236 +27237 +27238 +27239 +27240 +27241 +27242 +27243 +27244 +27245 +27246 +27247 +27248 +27249 +27250 +27251 +27252 +27253 +27254 +27255 +27256 +27257 +27258 +27259 +27260 +27261 +27262 +27263 +27264 +27265 +27266 +27267 +27268 +27269 +27270 +27271 +27272 +27273 +27274 +27275 +27276 +27277 +27278 +27279 +27280 +27281 +27282 +27283 +27284 +27285 +27286 +27287 +27288 +27289 +27290 +27291 +27292 +27293 +27294 +27295 +27296 +27297 +27298 +27299 +27300 +27301 +27302 +27303 +27304 +27305 +27306 +27307 +27308 +27309 +27310 +27311 +27312 +27313 +27314 +27315 +27316 +27317 +27318 +27319 +27320 +27321 +27322 +27323 +27324 +27325 +27326 +27327 +27328 +27329 +27330 +27331 +27332 +27333 +27334 +27335 +27336 +27337 +27338 +27339 +27340 +27341 +27342 +27343 +27344 +27345 +27346 +27347 +27348 +27349 +27350 +27351 +27352 +27353 +27354 +27355 +27356 +27357 +27358 +27359 +27360 +27361 +27362 +27363 +27364 +27365 +27366 +27367 +27368 +27369 +27370 +27371 +27372 +27373 +27374 +27375 +27376 +27377 +27378 +27379 +27380 +27381 +27382 +27383 +27384 +27385 +27386 +27387 +27388 +27389 +27390 +27391 +27392 +27393 +27394 +27395 +27396 +27397 +27398 +27399 +27400 +27401 +27402 +27403 +27404 +27405 +27406 +27407 +27408 +27409 +27410 +27411 +27412 +27413 +27414 +27415 +27416 +27417 +27418 +27419 +27420 +27421 +27422 +27423 +27424 +27425 +27426 +27427 +27428 +27429 +27430 +27431 +27432 +27433 +27434 +27435 +27436 +27437 +27438 +27439 +27440 +27441 +27442 +27443 +27444 +27445 +27446 +27447 +27448 +27449 +27450 +27451 +27452 +27453 +27454 +27455 +27456 +27457 +27458 +27459 +27460 +27461 +27462 +27463 +27464 +27465 +27466 +27467 +27468 +27469 +27470 +27471 +27472 +27473 +27474 +27475 +27476 +27477 +27478 +27479 +27480 +27481 +27482 +27483 +27484 +27485 +27486 +27487 +27488 +27489 +27490 +27491 +27492 +27493 +27494 +27495 +27496 +27497 +27498 +27499 +27500 +27501 +27502 +27503 +27504 +27505 +27506 +27507 +27508 +27509 +27510 +27511 +27512 +27513 +27514 +27515 +27516 +27517 +27518 +27519 +27520 +27521 +27522 +27523 +27524 +27525 +27526 +27527 +27528 +27529 +27530 +27531 +27532 +27533 +27534 +27535 +27536 +27537 +27538 +27539 +27540 +27541 +27542 +27543 +27544 +27545 +27546 +27547 +27548 +27549 +27550 +27551 +27552 +27553 +27554 +27555 +27556 +27557 +27558 +27559 +27560 +27561 +27562 +27563 +27564 +27565 +27566 +27567 +27568 +27569 +27570 +27571 +27572 +27573 +27574 +27575 +27576 +27577 +27578 +27579 +27580 +27581 +27582 +27583 +27584 +27585 +27586 +27587 +27588 +27589 +27590 +27591 +27592 +27593 +27594 +27595 +27596 +27597 +27598 +27599 +27600 +27601 +27602 +27603 +27604 +27605 +27606 +27607 +27608 +27609 +27610 +27611 +27612 +27613 +27614 +27615 +27616 +27617 +27618 +27619 +27620 +27621 +27622 +27623 +27624 +27625 +27626 +27627 +27628 +27629 +27630 +27631 +27632 +27633 +27634 +27635 +27636 +27637 +27638 +27639 +27640 +27641 +27642 +27643 +27644 +27645 +27646 +27647 +27648 +27649 +27650 +27651 +27652 +27653 +27654 +27655 +27656 +27657 +27658 +27659 +27660 +27661 +27662 +27663 +27664 +27665 +27666 +27667 +27668 +27669 +27670 +27671 +27672 +27673 +27674 +27675 +27676 +27677 +27678 +27679 +27680 +27681 +27682 +27683 +27684 +27685 +27686 +27687 +27688 +27689 +27690 +27691 +27692 +27693 +27694 +27695 +27696 +27697 +27698 +27699 +27700 +27701 +27702 +27703 +27704 +27705 +27706 +27707 +27708 +27709 +27710 +27711 +27712 +27713 +27714 +27715 +27716 +27717 +27718 +27719 +27720 +27721 +27722 +27723 +27724 +27725 +27726 +27727 +27728 +27729 +27730 +27731 +27732 +27733 +27734 +27735 +27736 +27737 +27738 +27739 +27740 +27741 +27742 +27743 +27744 +27745 +27746 +27747 +27748 +27749 +27750 +27751 +27752 +27753 +27754 +27755 +27756 +27757 +27758 +27759 +27760 +27761 +27762 +27763 +27764 +27765 +27766 +27767 +27768 +27769 +27770 +27771 +27772 +27773 +27774 +27775 +27776 +27777 +27778 +27779 +27780 +27781 +27782 +27783 +27784 +27785 +27786 +27787 +27788 +27789 +27790 +27791 +27792 +27793 +27794 +27795 +27796 +27797 +27798 +27799 +27800 +27801 +27802 +27803 +27804 +27805 +27806 +27807 +27808 +27809 +27810 +27811 +27812 +27813 +27814 +27815 +27816 +27817 +27818 +27819 +27820 +27821 +27822 +27823 +27824 +27825 +27826 +27827 +27828 +27829 +27830 +27831 +27832 +27833 +27834 +27835 +27836 +27837 +27838 +27839 +27840 +27841 +27842 +27843 +27844 +27845 +27846 +27847 +27848 +27849 +27850 +27851 +27852 +27853 +27854 +27855 +27856 +27857 +27858 +27859 +27860 +27861 +27862 +27863 +27864 +27865 +27866 +27867 +27868 +27869 +27870 +27871 +27872 +27873 +27874 +27875 +27876 +27877 +27878 +27879 +27880 +27881 +27882 +27883 +27884 +27885 +27886 +27887 +27888 +27889 +27890 +27891 +27892 +27893 +27894 +27895 +27896 +27897 +27898 +27899 +27900 +27901 +27902 +27903 +27904 +27905 +27906 +27907 +27908 +27909 +27910 +27911 +27912 +27913 +27914 +27915 +27916 +27917 +27918 +27919 +27920 +27921 +27922 +27923 +27924 +27925 +27926 +27927 +27928 +27929 +27930 +27931 +27932 +27933 +27934 +27935 +27936 +27937 +27938 +27939 +27940 +27941 +27942 +27943 +27944 +27945 +27946 +27947 +27948 +27949 +27950 +27951 +27952 +27953 +27954 +27955 +27956 +27957 +27958 +27959 +27960 +27961 +27962 +27963 +27964 +27965 +27966 +27967 +27968 +27969 +27970 +27971 +27972 +27973 +27974 +27975 +27976 +27977 +27978 +27979 +27980 +27981 +27982 +27983 +27984 +27985 +27986 +27987 +27988 +27989 +27990 +27991 +27992 +27993 +27994 +27995 +27996 +27997 +27998 +27999 +28000 +28001 +28002 +28003 +28004 +28005 +28006 +28007 +28008 +28009 +28010 +28011 +28012 +28013 +28014 +28015 +28016 +28017 +28018 +28019 +28020 +28021 +28022 +28023 +28024 +28025 +28026 +28027 +28028 +28029 +28030 +28031 +28032 +28033 +28034 +28035 +28036 +28037 +28038 +28039 +28040 +28041 +28042 +28043 +28044 +28045 +28046 +28047 +28048 +28049 +28050 +28051 +28052 +28053 +28054 +28055 +28056 +28057 +28058 +28059 +28060 +28061 +28062 +28063 +28064 +28065 +28066 +28067 +28068 +28069 +28070 +28071 +28072 +28073 +28074 +28075 +28076 +28077 +28078 +28079 +28080 +28081 +28082 +28083 +28084 +28085 +28086 +28087 +28088 +28089 +28090 +28091 +28092 +28093 +28094 +28095 +28096 +28097 +28098 +28099 +28100 +28101 +28102 +28103 +28104 +28105 +28106 +28107 +28108 +28109 +28110 +28111 +28112 +28113 +28114 +28115 +28116 +28117 +28118 +28119 +28120 +28121 +28122 +28123 +28124 +28125 +28126 +28127 +28128 +28129 +28130 +28131 +28132 +28133 +28134 +28135 +28136 +28137 +28138 +28139 +28140 +28141 +28142 +28143 +28144 +28145 +28146 +28147 +28148 +28149 +28150 +28151 +28152 +28153 +28154 +28155 +28156 +28157 +28158 +28159 +28160 +28161 +28162 +28163 +28164 +28165 +28166 +28167 +28168 +28169 +28170 +28171 +28172 +28173 +28174 +28175 +28176 +28177 +28178 +28179 +28180 +28181 +28182 +28183 +28184 +28185 +28186 +28187 +28188 +28189 +28190 +28191 +28192 +28193 +28194 +28195 +28196 +28197 +28198 +28199 +28200 +28201 +28202 +28203 +28204 +28205 +28206 +28207 +28208 +28209 +28210 +28211 +28212 +28213 +28214 +28215 +28216 +28217 +28218 +28219 +28220 +28221 +28222 +28223 +28224 +28225 +28226 +28227 +28228 +28229 +28230 +28231 +28232 +28233 +28234 +28235 +28236 +28237 +28238 +28239 +28240 +28241 +28242 +28243 +28244 +28245 +28246 +28247 +28248 +28249 +28250 +28251 +28252 +28253 +28254 +28255 +28256 +28257 +28258 +28259 +28260 +28261  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+if (window){
+  window.csvtojson=require("./index.js");
+  window.csvtojson.version=require("./package.json").version;
+}
+ 
+},{"./index.js":2,"./package.json":134}],2:[function(require,module,exports){
+module.exports = require("./libs/csv2json.js");
+},{"./libs/csv2json.js":24}],3:[function(require,module,exports){
+var util = require("util");
+module.exports = CSVError;
+function CSVError(err, index, extra) {
+  Error.call(this, "");
+  this.err = err;
+  this.line = index;
+  this.extra = extra;
+  this.message = "Error: " + err + ". JSON Line number: " + index + (extra ? " near: " + extra : "");
+  this.name = "CSV Error";
+}
+util.inherits(CSVError, Error);
+ 
+CSVError.prototype.toString = function() {
+  return JSON.stringify([this.err, this.line, this.extra]);
+};
+ 
+CSVError.column_mismatched = function(index, extra) {
+  return new CSVError("column_mismatched", index, extra);
+};
+ 
+CSVError.unclosed_quote = function(index, extra) {
+  return new CSVError("unclosed_quote", index, extra);
+};
+ 
+CSVError.fromArray = function(arr) {
+  return new CSVError(arr[0], arr[1], arr[2]);
+};
+ 
+},{"util":73}],4:[function(require,module,exports){
+(function (process,Buffer){
+var util = require("util");
+var Transform = require("stream").Transform;
+var os = require("os");
+var stripBom = require('strip-bom');
+var eol = os.EOL;
+// var Processor = require("./Processor.js");
+var defParam = require("./defParam");
+var fileline = require("./fileline");
+var fileLineToCSVLine = require("./fileLineToCSVLine");
+var linesToJson = require("./linesToJson");
+var CSVError = require("./CSVError");
+var workerMgr = null;
+var _ = require('lodash');
+var rowSplit = require("./rowSplit");
+function Converter(params, options) {
+  Transform.call(this, options);
+  this._options = options || {};
+  this.param = defParam(params);
+  this.param._options = this._options;
+  // this.resultObject = new Result(this);
+  // this.pipe(this.resultObject); // it is important to have downstream for a transform otherwise it will stuck
+  this.started = false;//indicate if parsing has started.
+  this.recordNum = 0;
+  this.lineNumber = 0; //file line number
+  this._csvLineBuffer = "";
+  this.lastIndex = 0; // index in result json array
+  //this._pipe(this.lineParser).pipe(this.processor);
+  // this.initNoFork();
+  if (this.param.forked) {
+    this.param.forked = false;
+    this.workerNum = 2;
+  }
+  this.flushCb = null;
+  this.processEnd = false;
+  this.sequenceBuffer = [];
+  this._needJson = null;
+  this._needEmitResult = null;
+  this._needEmitFinalResult = null;
+  this._needEmitJson = null;
+  this._needPush = null;
+  this._needEmitCsv = null;
+  this._csvTransf = null;
+  this.finalResult = [];
+  // this.on("data", function() {});
+  this.on("error", emitDone(this));
+  this.on("end", emitDone(this));
+  this.initWorker();
+  process.nextTick(function () {
+    if (this._needEmitFinalResult === null) {
+      this._needEmitFinalResult = this.listeners("end_parsed").length > 0;
+    }
+    if (this._needEmitResult === null) {
+      this._needEmitResult = this.listeners("record_parsed").length > 0;
+    }
+    if (this._needEmitJson === null) {
+      this._needEmitJson = this.listeners("json").length > 0;
+    }
+    if (this._needEmitCsv === null) {
+      this._needEmitCsv = this.listeners("csv").length > 0;
+    }
+    if (this._needJson === null) {
+      this._needJson = this._needEmitJson || this._needEmitFinalResult || this._needEmitResult || this.transform || this._options.objectMode;
+    }
+    if (this._needPush === null) {
+      this._needPush = this.listeners("data").length > 0 || this.listeners("readable").length > 0;
+      // this._needPush=false;
+    }
+    this.param._needParseJson = this._needJson || this._needPush;
+  }.bind(this));
+ 
+  return this;
+}
+ 
+util.inherits(Converter, Transform);
+function emitDone(conv) {
+  return function (err) {
+    if (!conv._hasDone) {
+      conv._hasDone = true;
+      process.nextTick(function () {
+        conv.emit('done', err);
+      });
+    };
+  }
+}
+var useBufferFrom=process.versions.node.split(".")[0]>=6;
+function bufFromString(str){
+  return useBufferFrom?Buffer.from(str,"utf8"):new Buffer(str,"utf8");
+}
+Converter.prototype._transform = function (data, encoding, cb) {
+  data=this.prepareData(data);
+  var idx =data.length-1;
+  var left=null;
+  if ((data[idx] & 1<<7) !=0){
+    while ((data[idx] & 3<<6) === 128){
+      idx--;
+    }
+    idx--;
+  }
+  if (idx !=data.length-1){
+    left=data.slice(idx+1);
+    data=data.slice(0,idx+1)
+    var _cb=cb;
+    var self=this;
+    cb=function(){
+      if (self._csvLineBuffer){
+        self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]);
+      }else{
+        self._csvLineBuffer=left;
+      }
+      _cb();
+    }
+  }
+  data = data.toString("utf8");
+  if (this.started === false) {
+    this.started = true;
+    data = stripBom(data);
+    if (this.param.toArrayString) {
+      if (this._needPush) {
+        this.push("[" + eol, "utf8");
+      }
+    }
+  }
+  var self = this;
+  this.preProcessRaw(data, function (d) {
+    if (d && d.length > 0) {
+      self.processData(d, cb);
+    } else {
+      cb();
+    }
+  });
+};
+ 
+Converter.prototype.prepareData = function (data) {
+  if (this._csvLineBuffer && this._csvLineBuffer.length>0){
+    if (typeof this._csvLineBuffer === "string"){
+      this._csvLineBuffer=bufFromString(this._csvLineBuffer);
+    }
+    return Buffer.concat([this._csvLineBuffer,data]);
+  }else{
+    return data;
+  }
+  // return this._csvLineBuffer + data;
+};
+ 
+Converter.prototype.setPartialData = function (d) {
+  this._csvLineBuffer = d;
+};
+ 
+Converter.prototype.processData = function (data, cb) {
+  var params = this.param;
+  if (params.ignoreEmpty && !params._headers) {
+    data = data.trimLeft();
+  }
+  var fileLines = fileline(data, this.param);
+  if (fileLines.lines.length > 0) {
+    if (this.preProcessLine && typeof this.preProcessLine === "function") {
+      fileLines.lines = this._preProcessLines(fileLines.lines, this.lastIndex);
+    }
+    if (!params._headers) { //header is not inited. init header
+      this.processHead(fileLines, cb);
+    } else {
+      if (params.workerNum <= 1) {
+        var lines = fileLineToCSVLine(fileLines, params);
+        this.setPartialData(lines.partial);
+        var jsonArr = linesToJson(lines.lines, params, this.recordNum);
+        this.processResult(jsonArr);
+        this.lastIndex += jsonArr.length;
+        this.recordNum += jsonArr.length;
+        cb();
+      } else {
+        this.workerProcess(fileLines, cb);
+      }
+    }
+  } else {
+    this.setPartialData(fileLines.partial);
+    cb();
+  }
+};
+ 
+Converter.prototype._preProcessLines = function (lines, startIdx) {
+  var rtn = [];
+  for (var i = 0, len = lines.length; i < len; i++) {
+    var result = this.preProcessLine(lines[i], startIdx + i + 1);
+    if (typeof result === "string") {
+      rtn.push(result);
+    } else {
+      rtn.push(lines[i]);
+      this.emit("error", new Error("preProcessLine should return a string but got: " + JSON.stringify(result)));
+    }
+  }
+  return rtn;
+};
+ 
+Converter.prototype.initWorker = function () {
+  var workerNum = this.param.workerNum - 1;
+  if (workerNum > 0) {
+    workerMgr = require("./workerMgr");
+    this.workerMgr = workerMgr();
+    this.workerMgr.initWorker(workerNum, this.param);
+  }
+};
+ 
+Converter.prototype.preRawData = function (func) {
+  this.preProcessRaw = func;
+  return this;
+};
+ 
+Converter.prototype.preFileLine = function (func) {
+  this.preProcessLine = func;
+  return this;
+};
+ 
+/**
+ * workerpRocess does not support embeded multiple lines.
+ */
+Converter.prototype.workerProcess = function (fileLine, cb) {
+  var self = this;
+  var line = fileLine;
+  var eol = this.getEol();
+  this.setPartialData(line.partial);
+  this.workerMgr.sendWorker(line.lines.join(eol) + eol, this.lastIndex, cb, function (results, lastIndex) {
+    var buf;
+    var cur = self.sequenceBuffer[0];
+    if (cur.idx === lastIndex) {
+      cur.result = results;
+      var records = [];
+      while (self.sequenceBuffer[0] && self.sequenceBuffer[0].result) {
+        buf = self.sequenceBuffer.shift();
+        records = records.concat(buf.result);
+      }
+      self.processResult(records);
+      self.recordNum += records.length;
+    } else {
+      for (var i = 0, len = self.sequenceBuffer.length; i < len; i++) {
+        buf = self.sequenceBuffer[i];
+        if (buf.idx === lastIndex) {
+          buf.result = results;
+          break;
+        }
+      }
+    }
+  });
+  this.sequenceBuffer.push({
+    idx: this.lastIndex,
+    result: null
+  });
+  this.lastIndex += line.lines.length;
+};
+ 
+Converter.prototype.processHead = function (fileLine, cb) {
+  var params = this.param;
+  if (params._headers) {
+    return cb();
+  }
+  //dirty hack
+  params._needFilterRow = false;
+  // if header is not inited. init header
+  var lines = fileLine.lines;
+  var left = "";
+  var headerRow = [];
+  if (!params.noheader) {
+    while (lines.length) {
+      var line = left + lines.shift();
+      var row = rowSplit(line, params);
+      if (row.closed) {
+        headerRow = row.cols;
+        left = "";
+        break;
+      } else {
+        left = line + this.getEol();
+      }
+    }
+  }
+  params._needFilterRow = true;
+  if (!params.noheader && headerRow.length === 0) { //if one chunk of data does not complete header row.
+    this.setPartialData(left);
+    return cb();
+  }
+  if (params.noheader) {
+    if (params.headers) {
+      params._headers = params.headers;
+    } else {
+      params._headers = [];
+    }
+  } else {
+    if (params.headers) {
+      params._headers = params.headers;
+    } else {
+      params._headers = headerRow;
+    }
+  }
+  configIgnoreIncludeColumns(params);
+  params._headers = require("./filterRow")(params._headers, params);
+  var lines = fileLineToCSVLine(fileLine, params);
+  this.setPartialData(lines.partial);
+  if (this.param.workerNum > 1) {
+    this.workerMgr.setParams(params);
+  }
+  var res = linesToJson(lines.lines, params, 0);
+  this.processResult(res);
+  this.lastIndex += res.length;
+  this.recordNum += res.length;
+ 
+  cb();
+};
+function configIgnoreIncludeColumns(params) {
+  if (params._postIgnoreColumns) {
+    for (var i = 0; i < params.ignoreColumns.length; i++) {
+      var ignoreCol = params.ignoreColumns[i];
+      if (typeof ignoreCol === "string") {
+        var idx = params._headers.indexOf(ignoreCol);
+        if (idx > -1) {
+          params.ignoreColumns[i] = idx;
+        } else {
+          params.ignoreColumns[i] = -1;
+        }
+      }
+    }
+    params.ignoreColumns.sort(function (a, b) { return b - a; });
+  }
+  if (params._postIncludeColumns) {
+    for (var i = 0; i < params.includeColumns.length; i++) {
+      var includeCol = params.includeColumns[i];
+      if (typeof includeCol === "string") {
+        var idx = params._headers.indexOf(includeCol);
+        if (idx > -1) {
+          params.includeColumns[i] = idx;
+        } else {
+          params.includeColumns[i] = -1;
+        }
+      }
+    }
+  }
+  params.ignoreColumns = _.uniq(params.ignoreColumns);
+  params.includeColumns = _.uniq(params.includeColumns);
+}
+ 
+Converter.prototype.processResult = function (result) {
+  for (var i = 0, len = result.length; i < len; i++) {
+    var r = result[i];
+    if (r.err) {
+      this.emit("error", r.err);
+    } else {
+      this.emitResult(r);
+    }
+  }
+};
+ 
+Converter.prototype.emitResult = function (r) {
+  var index = r.index;
+  var row = r.row;
+  var result = r.json;
+  var resultJson = null;
+  var resultStr = null;
+  if (typeof result === "string") {
+    resultStr = result;
+  } else {
+    resultJson = result;
+  }
+  if (resultJson === null && this._needJson) {
+    resultJson = JSON.parse(resultStr);
+    if (typeof row === "string") {
+      row = JSON.parse(row);
+    }
+  }
+  if (this.transform && typeof this.transform === "function") {
+    this.transform(resultJson, row, index);
+    resultStr = null;
+  }
+  if (this._needEmitJson) {
+    this.emit("json", resultJson, index);
+  }
+  if (this._needEmitCsv) {
+    if (typeof row === "string") {
+      row = JSON.parse(row);
+    }
+    this.emit("csv", row, index);
+  }
+  if (this.param.constructResult && this._needEmitFinalResult) {
+    this.finalResult.push(resultJson);
+  }
+  if (this._needEmitResult) {
+    this.emit("record_parsed", resultJson, row, index);
+  }
+  if (this.param.toArrayString && index > 0 && this._needPush) {
+    this.push("," + eol);
+  }
+  if (this._options && this._options.objectMode) {
+    this.push(resultJson);
+  } else {
+    if (this._needPush) {
+      if (resultStr === null) {
+        resultStr = JSON.stringify(resultJson);
+      }
+      this.push(!this.param.toArrayString ? resultStr + eol : resultStr, "utf8");
+    }
+  }
+};
+ 
+Converter.prototype.preProcessRaw = function (data, cb) {
+  cb(data);
+};
+ 
+// FIXME: lineNumber is not used.
+Converter.prototype.preProcessLine = function (line, lineNumber) {
+  return line;
+};
+ 
+Converter.prototype._flush = function (cb) {
+  var self = this;
+  this.flushCb = function () {
+    self.emit("end_parsed", self.finalResult);
+    if (self.workerMgr) {
+      self.workerMgr.destroyWorker();
+    }
+    cb();
+    if (!self._needPush) {
+      self.emit("end");
+    }
+  };
+  if (this._csvLineBuffer.length > 0) {
+    var eol = this.getEol();
+    if (this._csvLineBuffer[this._csvLineBuffer.length - 1] !== eol) {
+      this._csvLineBuffer += eol;
+    }
+    this.processData(this._csvLineBuffer, function () {
+      this.checkAndFlush();
+    }.bind(this));
+  } else {
+    this.checkAndFlush();
+  }
+  return;
+};
+ 
+Converter.prototype.checkAndFlush = function () {
+  if (this._csvLineBuffer.length !== 0) {
+    this.emit("error", CSVError.unclosed_quote(this.recordNum, this._csvLineBuffer), this._csvLineBuffer);
+  }
+  if (this.param.toArrayString && this._needPush) {
+    this.push(eol + "]", "utf8");
+  }
+  if (this.workerMgr && this.workerMgr.isRunning()) {
+    this.workerMgr.drain = function () {
+      this.flushCb();
+    }.bind(this);
+  } else {
+    this.flushCb();
+  }
+};
+ 
+Converter.prototype.getEol = function (data) {
+  if (!this.param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          this.param.eol = "\r\n";
+        } else {
+          this.param.eol = "\r";
+        }
+        return this.param.eol;
+      } else if (data[i] === "\n") {
+        this.param.eol = "\n";
+        return this.param.eol;
+      }
+    }
+    this.param.eol = eol;
+  }
+ 
+  return this.param.eol || eol;
+};
+ 
+Converter.prototype.fromFile = function (filePath, cb, options) {
+  var fs = require('fs');
+  var rs = null;
+  if (typeof cb ==="object" && typeof options === "undefined"){
+    options=cb;
+    cb=null;
+  }
+  this.wrapCallback(cb, function () {
+    if (rs && rs.destroy) {
+      rs.destroy();
+    }
+  });
+  fs.exists(filePath, function (exist) {
+    if (exist) {
+      rs = fs.createReadStream(filePath,options);
+      rs.pipe(this);
+    } else {
+      this.emit('error', new Error("File not exists"));
+    }
+  }.bind(this));
+  return this;
+};
+ 
+Converter.prototype.fromStream = function (readStream, cb) {
+  if (cb && typeof cb === "function") {
+    this.wrapCallback(cb);
+  }
+  readStream.pipe(this);
+  return this;
+};
+ 
+Converter.prototype.transf = function (func) {
+  this.transform = func;
+  return this;
+};
+ 
+Converter.prototype.fromString = function (csvString, cb) {
+  if (typeof csvString !== "string") {
+    return cb(new Error("Passed CSV Data is not a string."));
+  }
+  if (cb && typeof cb === "function") {
+    this.wrapCallback(cb, function () {
+    });
+  }
+  process.nextTick(function () {
+    this.end(csvString);
+  }.bind(this));
+  return this;
+};
+ 
+Converter.prototype.wrapCallback = function (cb, clean) {
+  if (clean === undefined) {
+    clean = function () { };
+  }
+  if (cb && typeof cb === "function") {
+    this.once("end_parsed", function (res) {
+      if (!this.hasError) {
+        cb(null, res);
+      }
+    }.bind(this));
+  }
+  this.once("error", function (err) {
+    this.hasError = true;
+    if (cb && typeof cb === "function") {
+      cb(err);
+    }
+    clean();
+  }.bind(this));
+};
+ 
+module.exports = Converter;
+ 
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"./CSVError":3,"./defParam":6,"./fileLineToCSVLine":13,"./fileline":14,"./filterRow":15,"./linesToJson":19,"./rowSplit":22,"./workerMgr":23,"_process":42,"buffer":33,"fs":31,"lodash":129,"os":41,"stream":60,"strip-bom":133,"util":73}],5:[function(require,module,exports){
+var getEol = require("./getEol");
+var rowSplit = require("./rowSplit");
+/**
+ * Convert lines to csv columns
+ * @param  {[type]} lines [file lines]
+ * @param  {[type]} param [Converter param]
+ * @return {[type]}  {lines:[[col1,col2,col3...]],partial:String}
+ */
+module.exports = function(lines, param) {
+  var csvLines = [];
+  var left = "";
+  while (lines.length) {
+    var line = left + lines.shift();
+    var row = rowSplit(line, param);
+    if (row.closed) {
+      csvLines.push(row.cols);
+      left = "";
+    } else {
+      left = line + (getEol(line, param) || "\n"); // if unable to getEol from data, assume "\n"
+    }
+  }
+  return {lines: csvLines, partial: left};
+};
+ 
+},{"./getEol":17,"./rowSplit":22}],6:[function(require,module,exports){
+(function (process){
+var numExp = /^[0-9]+$/;
+module.exports = function (params) {
+  var _param = {
+    constructResult: true, //set to false to not construct result in memory. suitable for big csv data
+    delimiter: ',', // change the delimiter of csv columns. It is able to use an array to specify potencial delimiters. e.g. [",","|",";"]
+    ignoreColumns: [], // columns to ignore upon input.
+    includeColumns: [], // columns to include upon input.
+    quote: '"', //quote for a column containing delimiter.
+    trim: true, //trim column's space charcters
+    checkType: false, //whether check column type
+    toArrayString: false, //stream down stringified json array instead of string of json. (useful if downstream is file writer etc)
+    ignoreEmpty: false, //Ignore empty value while parsing. if a value of the column is empty, it will be skipped parsing.
+    workerNum: getEnv("CSV_WORKER", 1), //number of parallel workers. If multi-core CPU available, increase the number will get better performance for large csv data.
+    fork: false, //use another CPU core to convert the csv stream
+    noheader: false, //indicate if first line of CSV file is header or not.
+    headers: null, //an array of header strings. If noheader is false and headers is array, csv header will be ignored.
+    flatKeys: false, // Don't interpret dots and square brackets in header fields as nested object or array identifiers at all.
+    maxRowLength: 0, //the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0
+    checkColumn: false, //whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false
+    escape: '"', //escape char for quoted column
+    colParser:{}, //flags on columns to alter field processing.
+ 
+    /**below are internal params */
+    _columnConv:[],
+    _headerType: [],
+    _headerTitle: [],
+    _headerFlag: [],
+    _headers: null,
+    _needFilterRow: false
+  };
+  if (!params) {
+    params = {};
+  }
+  for (var key in params) {
+    if (params.hasOwnProperty(key)) {
+      _param[key] = params[key];
+    }
+  }
+  if (_param.ignoreColumns.length > 0 && !numExp.test(_param.ignoreColumns.join(""))) {
+    _param._postIgnoreColumns = true;
+  }
+  if (_param.includeColumns.length > 0 && !numExp.test(_param.includeColumns.join(""))) {
+    _param._postIncludeColumns = true;
+  }
+ 
+  if (_param.ignoreColumns.length || _param.includeColumns.length) {
+    _param._needFilterRow = true;
+    if (!_param._postIgnoreColumns){
+      _param.ignoreColumns.sort(function (a, b) { return b-a;});
+    }
+  }
+ 
+ 
+  return _param;
+};
+ 
+function getEnv(key, def) {
+  if (process.env[key]) {
+    return process.env[key];
+  } else {
+    return def;
+  }
+}
+ 
+}).call(this,require('_process'))
+},{"_process":42}],7:[function(require,module,exports){
+module.exports = [
+  require('./parser_array.js'),
+  require('./parser_json.js'),
+  require('./parser_omit.js'),
+  require('./parser_jsonarray.js'),
+  require("./parser_flat.js")
+];
+ 
+},{"./parser_array.js":8,"./parser_flat.js":9,"./parser_json.js":10,"./parser_jsonarray.js":11,"./parser_omit.js":12}],8:[function(require,module,exports){
+module.exports = {
+  "name": "array",
+  "processSafe":true,
+  "regExp": /^\*array\*/,
+  "parserFunc": function parser_array(params) {
+    var fieldName = params.head.replace(this.regExp, '');
+    if (params.resultRow[fieldName] === undefined) {
+      params.resultRow[fieldName] = [];
+    }
+    params.resultRow[fieldName].push(params.item);
+  }
+};
+ 
+},{}],9:[function(require,module,exports){
+module.exports = {
+  "name": "flat",
+  "processSafe": true,
+  "regExp": /^\*flat\*/,
+  "parserFunc": function parser_flat (params) {
+     var key = this.getHeadStr();
+     var val = params.item;
+     params.resultRow[key] = val;
+  }
+};
+ 
+},{}],10:[function(require,module,exports){
+var arrReg = /\[([0-9]*)\]/;
+ 
+ 
+function processHead(pointer, headArr, arrReg, flatKeys) {
+  var headStr, match, index;
+  while (headArr.length > 1) {
+    headStr = headArr.shift();
+    // match = headStr.match(arrReg);
+    match = flatKeys ? false : headStr.match(arrReg);
+    if (match) { //if its array, we need add an empty json object into specified index.
+      if (pointer[headStr.replace(match[0], '')] === undefined) {
+        pointer[headStr.replace(match[0], '')] = [];
+      }
+      index = match[1]; //get index where json object should stay
+      pointer = pointer[headStr.replace(match[0], '')];
+      if (index === '') { //if its dynamic array index, push to the end
+        index = pointer.length;
+      }
+      if (!pointer[index]) { //current index in the array is empty. we need create a new json object.
+        pointer[index] = {};
+      }
+      pointer = pointer[index];
+    } else { //not array, just normal JSON object. we get the reference of it
+      if (pointer[headStr] === undefined) {
+        pointer[headStr] = {};
+      }
+      pointer = pointer[headStr];
+    }
+  }
+  return pointer;
+}
+module.exports = {
+  "name": "json",
+  "processSafe": true,
+  "regExp": /^\*json\*/,
+  "parserFunc": function parser_json(params) {
+    var fieldStr = this.getHeadStr();
+    var headArr = (params.config && params.config.flatKeys) ? [fieldStr] : fieldStr.split('.');
+    var match, index, key;
+    //now the pointer is pointing the position to add a key/value pair.
+    var pointer = processHead(params.resultRow, headArr, arrReg, params.config && params.config.flatKeys);
+    key = headArr.shift();
+    match = (params.config && params.config.flatKeys) ? false : key.match(arrReg);
+    if (match) { // the last element is an array, we need check and treat it as an array.
+      try {
+        key = key.replace(match[0], '');
+        if (!pointer[key] || !(pointer[key] instanceof Array)) {
+          pointer[key] = [];
+        }
+        if (pointer[key]) {
+          index = match[1];
+          if (index === '') {
+            index = pointer[key].length;
+          }
+          pointer[key][index] = params.item;
+        } else {
+          params.resultRow[fieldStr] = params.item;
+        }
+      } catch (e) {
+        params.resultRow[fieldStr] = params.item;
+      }
+    } else {
+      if (typeof pointer === "string"){
+        params.resultRow[fieldStr] = params.item;
+      }else{
+        pointer[key] = params.item;
+      }
+    }
+  }
+};
+ 
+},{}],11:[function(require,module,exports){
+module.exports = {
+  "name": "jsonarray",
+  "processSafe":true,
+  "regExp": /^\*jsonarray\*/,
+  "parserFunc": function parser_jsonarray (params) {
+    var fieldStr = params.head.replace(this.regExp, "");
+    var headArr = fieldStr.split('.');
+    var pointer = params.resultRow;
+    while (headArr.length > 1) {
+      var headStr = headArr.shift();
+      if (pointer[headStr] === undefined) {
+        pointer[headStr] = {};
+      }
+      pointer = pointer[headStr];
+    }
+    var arrFieldName = headArr.shift();
+    if (pointer[arrFieldName] === undefined) {
+      pointer[arrFieldName] = [];
+    }
+    pointer[arrFieldName].push(params.item);
+  }
+};
+ 
+},{}],12:[function(require,module,exports){
+module.exports = {
+  "name": "omit",
+  "regExp": /^\*omit\*/,
+  "processSafe":true,
+  "parserFunc": function parser_omit() {}
+};
+ 
+},{}],13:[function(require,module,exports){
+var csvline=require("./csvline");
+/**
+ * Convert data chunk to csv lines with cols
+ * @param  {[type]} data   [description]
+ * @param  {[type]} params [description]
+ * @return {[type]}    {lines:[[col1,col2,col3]],partial:String}
+ */
+module.exports = function(fileLine, params) {
+  var lines = fileLine.lines;
+  var csvLines = csvline(lines,params);
+  return {
+    lines: csvLines.lines,
+    partial: csvLines.partial + fileLine.partial
+  };
+};
+ 
+},{"./csvline":5}],14:[function(require,module,exports){
+var getEol = require("./getEol");
+/**
+ * convert data chunk to file lines array
+ * @param  {string} data  data chunk as utf8 string
+ * @param  {object} param Converter param object
+ * @return {Object}   {lines:[line1,line2...],partial:String}
+ */
+module.exports = function(data, param) {
+  var eol = getEol(data,param);
+  var lines = data.split(eol);
+  var partial = lines.pop();
+  return {lines: lines, partial: partial};
+};
+ 
+},{"./getEol":17}],15:[function(require,module,exports){
+module.exports=function filterRow(row, param) {
+  if (param.ignoreColumns instanceof Array && param.ignoreColumns.length > 0) {
+    for (var igRow = 0, igColLen = param.ignoreColumns.length; igRow < igColLen; igRow++) {
+      if (param.ignoreColumns[igRow] >= 0) {
+        row.splice(param.ignoreColumns[igRow], 1);
+      }
+    }
+  }
+  if (param.includeColumns instanceof Array && param.includeColumns.length > 0) {
+    var cleanRowArr = [];
+    for (var inRow = 0, inColLen = param.includeColumns.length; inRow < inColLen; inRow++) {
+      if (param.includeColumns[inRow] >= 0) {
+        cleanRowArr.push(row[param.includeColumns[inRow]]);
+      }
+    }
+    row = cleanRowArr;
+  }
+  return row;
+}
+},{}],16:[function(require,module,exports){
+module.exports = getDelimiter;
+var defaulDelimiters = [",", "|", "\t", ";", ":"];
+function getDelimiter(rowStr,param) {
+  var checker;
+  if (param.delimiter === "auto"){
+    checker = defaulDelimiters;
+  } else if (param.delimiter instanceof Array) {
+    checker = param.delimiter;
+  } else {
+    return param.delimiter;
+  }
+  var count = 0;
+  var rtn = ",";
+  checker.forEach(function(delim) {
+    var delimCount = rowStr.split(delim).length;
+    if (delimCount > count) {
+      rtn = delim;
+      count = delimCount;
+    }
+  });
+  return rtn;
+}
+ 
+},{}],17:[function(require,module,exports){
+//return eol from a data chunk.
+var eol = require("os").EOL;
+module.exports = function(data, param) {
+  if (!param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          param.eol = "\r\n";
+        } else if (data[i + 1]) {
+          param.eol = "\r";
+        }
+        return param.eol;
+      } else if (data[i] === "\n") {
+        param.eol = "\n";
+        return param.eol;
+      }
+    }
+  }
+  return param.eol;
+};
+ 
+},{"os":41}],18:[function(require,module,exports){
+module.exports = constructor;
+module.exports.Converter = require("./Converter.js");
+ 
+function constructor(param,options) {
+  return new module.exports.Converter(param, options);
+}
+ 
+},{"./Converter.js":4}],19:[function(require,module,exports){
+var parserMgr = require("./parserMgr.js");
+var CSVError = require("./CSVError");
+var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+/**
+ * Convert lines of csv array into json
+ * @param  {[type]} lines  [[col1,col2,col3]]
+ * @param  {[type]} params Converter params with _headers field populated
+ * @param  {[type]} idx start pos of the lines
+ * @return {[type]}   [{err:null,json:obj,index:line,row:[csv row]}]
+ */
+module.exports = function (lines, params, idx) {
+  if (params._needParseJson) {
+    if (!params._headers) {
+      params._headers = [];
+    }
+    if (!params.parseRules) {
+      var row = params._headers;
+      params.parseRules = parserMgr.initParsers(row, params);
+    }
+    return processRows(lines, params, idx);
+  } else {
+    return justReturnRows(lines, params, idx);
+  }
+};
+ 
+function justReturnRows(lines, params, idx) {
+  var rtn = [];
+  for (var i = 0, len = lines.length; i < len; i++) {
+    rtn.push({
+      err: null,
+      json: {},
+      index: idx++,
+      row: lines[i]
+    });
+  }
+  return rtn;
+}
+ 
+function processRows(csvRows, params, startIndex) {
+  var res = [];
+  for (var i = 0, len = csvRows.length; i < len; i++) {
+    var r = processRow(csvRows[i], params, startIndex++);
+    if (r) {
+      res.push(r);
+    }
+  }
+  return res;
+}
+ 
+function processRow(row, param, index) {
+  var parseRules = param.parseRules;
+  if (param.checkColumn && row.length !== parseRules.length) {
+    return {
+      err: CSVError.column_mismatched(index)
+    };
+  }
+ 
+  var headRow = param._headers;
+  var resultRow = convertRowToJson(row, headRow, param);
+  if (resultRow) {
+    return {
+      json: resultRow,
+      index: index,
+      row: row
+    };
+  } else {
+    return null;
+  }
+}
+ 
+function convertRowToJson(row, headRow, param) {
+  var hasValue = false;
+  var resultRow = {};
+ 
+  for (var i = 0, len = row.length; i < len; i++) {
+    var convertFunc, head, item;
+    item = row[i];
+ 
+    if (param.ignoreEmpty && item === '') {
+      continue;
+    }
+    hasValue = true;
+ 
+    head = headRow[i];
+    if (!head || head === "") {
+      head = headRow[i] = "field" + (i + 1);
+    }
+    var convFunc = getConvFunc(head, i, param);
+    if (convFunc) {
+      var convRes = convFunc(item, head, resultRow,row,i);
+      if (convRes !== undefined) {
+        setPath(resultRow, head, convRes);
+      }
+    } else {
+      var flag = getFlag(head, i, param);
+      if (flag === 'omit') {
+        continue;
+      }
+      if (param.checkType) {
+        convertFunc = checkType(item, head, i, param);
+        item = convertFunc(item);
+      }
+      var title = getTitle(head, i, param);
+      if (flag === 'flat' || param.flatKeys) {
+        resultRow[title] = item;
+      } else {
+        setPath(resultRow, title, item);
+      }
+    }
+  }
+  if (hasValue) {
+    return resultRow;
+  } else {
+    return false;
+  }
+}
+ 
+var builtInConv={
+  "string":stringType,
+  "number":numberType,
+  "omit":function(){}
+}
+function getConvFunc(head,i,param){
+  if (param._columnConv[i] !== undefined){
+    return param._columnConv[i];
+  }else{
+    var flag=param.colParser[head];
+    if (flag === undefined){
+      return param._columnConv[i]=false;
+    }
+    if (typeof flag ==="string"){
+      flag=flag.trim().toLowerCase();
+      var builtInFunc=builtInConv[flag];
+      if (builtInFunc){
+        return param._columnConv[i]=builtInFunc;
+      }else{
+        return param._columnConv[i]=false;  
+      }
+    }else if (typeof flag ==="function"){
+      return param._columnConv[i]=flag;
+    }else{
+      return param._columnConv[i]=false;
+    }
+  }
+}
+function setPath(json, path, value) {
+  var _set = require('lodash/set');
+  var pathArr = path.split('.');
+  if (pathArr.length === 1) {
+    json[path] = value;
+  } else {
+    _set(json, path, value);
+  }
+}
+ 
+function getFlag(head, i, param) {
+  if (typeof param._headerFlag[i] === "string") {
+    return param._headerFlag[i];
+  } else if (head.indexOf('*omit*') > -1) {
+    return param._headerFlag[i] = 'omit';
+  } else if (head.indexOf('*flat*') > -1) {
+    return param._headerFlag[i] = 'flat';
+  } else {
+    return param._headerFlag[i] = '';
+  }
+}
+ 
+function getTitle(head, i, param) {
+  if (param._headerTitle[i]) {
+    return param._headerTitle[i];
+  }
+ 
+  var flag = getFlag(head, i, param);
+  var str = head.replace('*flat*', '').replace('string#!', '').replace('number#!', '');
+  return param._headerTitle[i] = str;
+}
+ 
+function checkType(item, head, headIdx, param) {
+  if (param._headerType[headIdx]) {
+    return param._headerType[headIdx];
+  } else if (head.indexOf('number#!') > -1) {
+    return param._headerType[headIdx] = numberType;
+  } else if (head.indexOf('string#!') > -1) {
+    return param._headerType[headIdx] = stringType;
+  } else if (param.checkType) {
+    return param._headerType[headIdx] = dynamicType;
+  } else {
+    return param._headerType[headIdx] = stringType;
+  }
+}
+ 
+function numberType(item) {
+  var rtn = parseFloat(item);
+  if (isNaN(rtn)) {
+    return item;
+  }
+  return rtn;
+}
+ 
+function stringType(item) {
+  return item.toString();
+}
+ 
+function dynamicType(item) {
+  var trimed = item.trim();
+  if (trimed === "") {
+    return stringType(item);
+  }
+  if (numReg.test(trimed)) {
+    return numberType(item);
+  } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") {
+    return booleanType(item);
+  } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") {
+    return jsonType(item);
+  } else {
+    return stringType(item);
+  }
+}
+ 
+function booleanType(item) {
+  var trimed = item.trim();
+  if (trimed.length === 5 && trimed.toLowerCase() === "false") {
+    return false;
+  } else {
+    return true;
+  }
+}
+ 
+function jsonType(item) {
+  try {
+    return JSON.parse(item);
+  } catch (e) {
+    return item;
+  }
+}
+ 
+},{"./CSVError":3,"./parserMgr.js":21,"lodash/set":131}],20:[function(require,module,exports){
+var explicitTypes = ["number", "string"];
+ 
+function Parser(name, regExp, parser, processSafe) {
+  this.name = typeof name === "undefined" ? "Default" : name;
+  this.regExp = null;
+  this.type = "";
+  this.processSafe = processSafe;
+  if (typeof regExp !== "undefined") {
+    if (typeof regExp === "string") {
+      this.regExp = new RegExp(regExp);
+    } else {
+      this.regExp = regExp;
+    }
+  }
+  if (typeof parser !== "undefined") {
+    this.parse = parser;
+  }
+}
+// var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+Parser.prototype.convertType = function(item) {
+  var type=this.type;
+  if (type === 'number') {
+    var rtn = parseFloat(item);
+    if (isNaN(rtn)) {
+      return 0;
+    } else {
+      return rtn;
+    }
+  } else if (this.param && this.param.checkType && type === '') {
+    var trimed = item.trim();
+    if (trimed === ""){
+      return trimed;
+    }
+    if (!isNaN(trimed)) {
+      return parseFloat(trimed);
+    } else if (trimed.length === 5 && trimed.toLowerCase() === "false") {
+      return false;
+    } else if (trimed.length === 4 && trimed.toLowerCase() === "true") {
+      return true;
+    } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1]==="]") {
+      try {
+        return JSON.parse(trimed);
+      } catch (e) {
+        return item;
+      }
+    } else {
+      return item;
+    }
+  }
+  return item;
+};
+ 
+Parser.prototype.setParam = function(param) {
+  this.param = param;
+};
+ 
+Parser.prototype.test = function(str) {
+  return this.regExp && this.regExp.test(str);
+};
+ 
+Parser.prototype.parse = function(params) {
+  params.resultRow[params.head] = params.item;
+};
+ 
+Parser.prototype.getHeadStr = function() {
+  if (this.headStr) {
+    return this.headStr;
+  } else {
+    var head = this.head;
+    this.headStr = head.replace(this.regExp, '');
+    if (!this.headStr) {
+      this.headStr = "Unknown Header";
+    }
+    return this.getHeadStr();
+  }
+};
+ 
+Parser.prototype.getHead = function() {
+  return this.head;
+};
+ 
+Parser.prototype.initHead = function(columnTitle) {
+  this.head = columnTitle;
+  var wholeHead = columnTitle.replace(this.regExp, '');
+  //init type && headStr
+  var splitArr = wholeHead.split("#!");
+  if (splitArr.length === 1) { //no explicit type
+    this.headStr = splitArr[0];
+  } else {
+    var type = splitArr.shift();
+    if (explicitTypes.indexOf(type.toLowerCase()) > -1) {
+      this.type = type;
+      this.headStr = splitArr.join("#!");
+    } else { //no explicit type
+      this.headStr = wholeHead;
+    }
+  }
+  if (!this.headStr) {
+    this.headStr = wholeHead ? wholeHead : "Unknown Head";
+  }
+};
+ 
+Parser.prototype.clone = function() {
+  var obj = Object.create(this);
+  var newParser = new Parser();
+  for (var key in obj) {
+    newParser[key] = obj[key];
+  }
+  return newParser;
+};
+ 
+Parser.prototype.getName = function() {
+  return this.name;
+};
+ 
+module.exports = Parser;
+ 
+},{}],21:[function(require,module,exports){
+//implementation
+var registeredParsers = [];
+var Parser = require("./parser.js");
+var defaultParser = require("./defaultParsers");
+ 
+function registerParser (parser) {
+  if (parser instanceof Parser && registeredParsers.indexOf(parser) === -1) {
+    registeredParsers.push(parser); // TODO indexOf doesn't work with object references
+  }
+}
+ 
+function getParser(columnTitle, param) {
+  var inst, parser;
+  function getParserByName(parserName) {
+    var parser;
+    registeredParsers.forEach(function(p){
+      if (p.getName() === parserName){
+        parser = p;
+      }
+    });
+    if (parser) {
+      var inst = parser.clone();
+      return inst;
+    }
+    return new Parser(); //TODO remove new
+  }
+  columnTitle = columnTitle ? columnTitle : '';
+  registeredParsers.forEach(function(p) {
+    if (p.test(columnTitle)) {
+      parser=p;
+    }
+  });
+  if (parser) {
+    inst = parser.clone();
+    inst.head = columnTitle;
+  } else {
+    inst = getParserByName("json", columnTitle);
+  }
+  inst.setParam(param);
+  inst.initHead(columnTitle);
+  return inst;
+}
+ 
+function addParser(name, regExp, parseFunc) {
+  var parser = new Parser(name, regExp, parseFunc,false); //TODO remove new
+  registerParser(parser);
+}
+ 
+function addSafeParser(parserPath) {
+  //TODO impl
+}
+ 
+function initParsers(row, param) {
+  var parsers = [];
+  row.forEach(function (columnTitle) {
+    parsers.push(getParser(columnTitle, param));
+  });
+  return parsers;
+}
+ 
+defaultParser.forEach(function (parserCfg){
+  //TODO refactor this
+  addParser(parserCfg.name, parserCfg.regExp, parserCfg.parserFunc, parserCfg.processSafe);
+});
+ 
+//module interfaces
+module.exports.addParser = addParser;
+module.exports.initParsers = initParsers;
+module.exports.getParser = getParser;
+ 
+},{"./defaultParsers":7,"./parser.js":20}],22:[function(require,module,exports){
+var getDelimiter = require("./getDelimiter");
+var filterRow=require("./filterRow");
+/**
+ * Convert a line of string to csv columns according to its delimiter
+ * the param._header may not be ready when this is called.
+ * @param  {[type]} rowStr [description]
+ * @param  {[type]} param  [Converter param]
+ * @return {[type]}        {cols:["a","b","c"],closed:boolean} the closed field indicate if the row is a complete row
+ */
+module.exports = function rowSplit(rowStr, param) {
+  if (rowStr === "") {
+    return { cols: [], closed: true };
+  }
+  var quote = param.quote;
+  var trim = param.trim;
+  var escape = param.escape;
+  if (param.delimiter instanceof Array || param.delimiter.toLowerCase() === "auto") {
+    param.delimiter = getDelimiter(rowStr, param);
+  }
+  var delimiter = param.delimiter;
+  var rowArr = rowStr.split(delimiter);
+  if (quote === "off") {
+    return { cols: rowArr, closed: true };
+  }
+  var row = [];
+  var inquote = false;
+  var quoteBuff = '';
+  for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) {
+    var e = rowArr[i];
+    if (!inquote && trim) {
+      e = e.trim();
+    }
+    var len = e.length;
+    if (!inquote) {
+      if (isQuoteOpen(e, param)) { //quote open
+        e = e.substr(1);
+        if (isQuoteClose(e, param)) { //quote close
+          e = e.substring(0, e.length - 1);
+          e = _escapeQuote(e, quote, escape);
+          row.push(e);
+          continue;
+        } else {
+          inquote = true;
+          quoteBuff += e;
+          continue;
+        }
+      } else {
+        row.push(e);
+        continue;
+      }
+    } else { //previous quote not closed
+      if (isQuoteClose(e, param)) { //close double quote
+        inquote = false;
+        e = e.substr(0, len - 1);
+        quoteBuff += delimiter + e;
+        quoteBuff = _escapeQuote(quoteBuff, quote, escape);
+        if (trim) {
+          quoteBuff = quoteBuff.trimRight();
+        }
+        row.push(quoteBuff);
+        quoteBuff = "";
+      } else {
+        quoteBuff += delimiter + e;
+      }
+    }
+  }
+ 
+  if (!inquote && param._needFilterRow) {
+    row = filterRow(row, param);
+  }
+ 
+  return { cols: row, closed: !inquote };
+  // if (param.workerNum<=1){
+  // }else{
+  //   if (inquote && quoteBuff.length>0){//for multi core, quote will be closed at the end of line
+  //     quoteBuff=_escapeQuote(quoteBuff,quote,escape);;
+  //     if (trim){
+  //       quoteBuff=quoteBuff.trimRight();
+  //     }
+  //     row.push(quoteBuff);
+  //   }
+  //   return {cols:row,closed:true};
+  // }
+ 
+};
+ 
+ 
+ 
+function isQuoteOpen(str, param) {
+  var quote = param.quote;
+  var escape = param.escape;
+  return str[0] === quote && (
+    str[1] !== quote ||
+    str[1] === escape && (str[2] === quote || str.length === 2));
+}
+function isQuoteClose(str, param) {
+  var quote = param.quote;
+  var count = 0;
+  var idx = str.length - 1;
+  var escape = param.escape;
+  while (str[idx] === quote || str[idx] === escape) {
+    idx--;
+    count++;
+  }
+  return count % 2 !== 0;
+}
+ 
+function twoDoubleQuote(str, quote) {
+  var twoQuote = quote + quote;
+  var curIndex = -1;
+  while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
+    str = str.substring(0, curIndex) + str.substring(++curIndex);
+  }
+  return str;
+}
+ 
+var cachedRegExp = {};
+function _escapeQuote(segment, quote, escape) {
+ 
+  var key = "es|" + quote + "|" + escape;
+  if (cachedRegExp[key] === undefined) {
+    if (escape === "\\") {
+      escape = "\\\\";
+    }
+    cachedRegExp[key] = new RegExp(escape + quote, 'g');
+  }
+  var regExp = cachedRegExp[key];
+  return segment.replace(regExp, quote);
+}
+ 
+},{"./filterRow":15,"./getDelimiter":16}],23:[function(require,module,exports){
+(function (process,__dirname){
+module.exports = workerMgr;
+var spawn = require("child_process").spawn;
+var eom = "\x03";
+var eom1 = "\x0e";
+var eom2 = "\x0f";
+var CSVError = require('./CSVError');
+function workerMgr() {
+ 
+  var exports = {
+    initWorker: initWorker,
+    sendWorker: sendWorker,
+    setParams: setParams,
+    drain: function(){},
+    isRunning: isRunning,
+    destroyWorker: destroyWorker
+  };
+  var workers = [];
+  var running = 0;
+  var waiting = null;
+  function initWorker(num, params) {
+    workers = [];
+    running = 0;
+    waiting = null;
+    for (var i = 0; i < num; i++) {
+      workers.push(new Worker(params));
+    }
+ 
+  }
+  function isRunning() {
+    return running > 0;
+  }
+  function destroyWorker() {
+    workers.forEach(function(w) {
+      w.destroy();
+    });
+  }
+ 
+  function sendWorker(data, startIdx, transformCb, cbResult) {
+    if (workers.length > 0) {
+      var worker = workers.shift();
+      running++;
+      worker.parse(data, startIdx, function(result) {
+        // var arr=JSON.parse(result);
+        // arr.forEach(function(item){
+        //   console.log('idx',item.index)
+        // })
+        workers.push(worker);
+        cbResult(result, startIdx);
+        running--;
+        if (waiting === null && running === 0) {
+          exports.drain();
+        } else if (waiting) {
+          sendWorker.apply(this, waiting);
+          waiting = null;
+        }
+      });
+      process.nextTick(transformCb);
+    } else {
+      waiting = [data, startIdx, transformCb, cbResult];
+    }
+  }
+ 
+  function setParams(params) {
+    workers.forEach(function(w) {
+      w.setParams(params);
+    });
+  }
+  return exports;
+}
+ 
+function Worker(params) {
+  this.cp = spawn(process.execPath, [__dirname + "/worker.js"], {
+    env: {
+      child:true
+    },
+    stdio:['pipe', 'pipe', 2, 'ipc']
+    // stdio:[0,1,2,'ipc']
+  });
+  this.setParams(params);
+  this.cp.on("message", this.onChildMsg.bind(this));
+  this.buffer = "";
+  var self = this;
+  this.cp.stdout.on("data", function(d) {
+    var str = d.toString("utf8");
+    var all = self.buffer + str;
+    var cmdArr = all.split(eom);
+    while (cmdArr.length > 1) {
+      self.onChildMsg(cmdArr.shift());
+    }
+    self.buffer = cmdArr[0];
+  });
+}
+ 
+Worker.prototype.setParams = function(params) {
+  var msg = "0" + JSON.stringify(params);
+  this.sendMsg(msg);
+};
+ 
+/**
+ * msg is like:
+ * <cmd><data>
+ * cmd is from 0-9
+ */
+Worker.prototype.onChildMsg = function(msg) {
+  if (msg) {
+    var cmd = msg[0];
+    var data = msg.substr(1);
+    switch (cmd) {
+      case "0": //total line number of current chunk
+        if (this.cbLine) {
+          var sp = data.split("|");
+          var len = parseInt(sp[0]);
+          var partial = sp[1];
+          this.cbLine(len, partial);
+        }
+        break;
+      case "1": // json array of current chunk
+        if (this.cbResult) {
+          var rows = data.split(eom1);
+          rows.pop();
+          var res = [];
+          rows.forEach(function(row) {
+            var sp = row.split(eom2);
+            res.push({
+              index: sp[0],
+              row: sp[1],
+              err: sp[2] ? CSVError.fromArray(JSON.parse(sp[2])) : null,
+              json: sp[3]
+            });
+          });
+          this.cbResult(res);
+        }
+        break;
+    }
+  }
+};
+ 
+Worker.prototype.parse = function(data, startIdx, cbResult) {
+  this.cbResult = cbResult;
+  var msg = "1" + startIdx + "|" + data;
+  this.sendMsg(msg);
+};
+ 
+Worker.prototype.destroy = function() {
+  this.cp.kill();
+};
+ 
+Worker.prototype.sendMsg = function(msg) {
+  this.cp.stdin.write(msg + eom, "utf8");
+  // this.cp.send(msg)
+};
+ 
+}).call(this,require('_process'),"/libs/core")
+},{"./CSVError":3,"_process":42,"child_process":31}],24:[function(require,module,exports){
+//deprecated but leave it for backword compatibility
+module.exports.core=require("./core");
+ 
+//live apis
+module.exports=require("./core");
+module.exports.interfaces = require("./interfaces");
+ 
+},{"./core":18,"./interfaces":27}],25:[function(require,module,exports){
+module.exports = require("./main.js");
+},{"./main.js":26}],26:[function(require,module,exports){
+(function (process){
+/**
+ * Convert input to process stdout
+ */
+ 
+//implementation
+var Converter = require("../../core/Converter.js");
+function _initConverter(){
+    var csvConverter = new Converter();
+    var started = false;
+    var writeStream = process.stdout;
+    csvConverter.on("record_parsed",function(rowJSON){
+        if (started){
+            writeStream.write(",\n");
+        }
+        writeStream.write(JSON.stringify(rowJSON));  //write parsed JSON object one by one.
+        if (started === false){
+            started = true;
+        }
+    });
+    writeStream.write("[\n"); //write array symbol
+ 
+    csvConverter.on("end_parsed",function(){
+        writeStream.write("\n]"); //end array symbol
+    });
+    csvConverter.on("error",function(err){
+        console.error(err);
+        process.exit(-1);
+    });
+    return csvConverter;
+}
+function convertFile(fileName){
+    var csvConverter=_initConverter();
+    csvConverter.from(fileName);
+}
+ 
+function convertString(csvString){
+    var csvConverter=_initConverter();
+    csvConverter.from(csvString);
+}
+//module interfaces
+module.exports.convertFile = convertFile;
+module.exports.convertString = convertString;
+}).call(this,require('_process'))
+},{"../../core/Converter.js":4,"_process":42}],27:[function(require,module,exports){
+module.exports.web=require("./web");
+module.exports.cli=require("./cli");
+},{"./cli":25,"./web":28}],28:[function(require,module,exports){
+module.exports = require("./webServer.js");
+},{"./webServer.js":29}],29:[function(require,module,exports){
+var http = require("http");
+var Converter = require("../../core/Converter.js");
+function startWebServer (args) {
+    args = args || {};
+    var serverArgs = {
+        port: args.port || '8801',
+        urlpath: args.urlpath || '/parseCSV'
+    };
+    var server = http.createServer();
+    server.on("request", function(req, res){
+        if (req.url === serverArgs.urlpath && req.method === "POST"){
+            req.pipe(new Converter({constructResult:false})).pipe(res);
+        } else {
+            res.end("Please post data to: " + serverArgs.urlpath);
+        }
+    });
+ 
+    server.listen(serverArgs.port);
+    console.log("CSV Web Server Listen On:" + serverArgs.port);
+    console.log("POST to " + serverArgs.urlpath + " with CSV data to get parsed.");
+    return server;
+}
+module.exports.startWebServer = startWebServer;
+ 
+},{"../../core/Converter.js":4,"http":61}],30:[function(require,module,exports){
+(function (Buffer){
+'use strict';
+var util = require('util');
+var Transform = require('stream').Transform;
+ 
+function ctor(options, transform) {
+	util.inherits(FirstChunk, Transform);
+ 
+	if (typeof options === 'function') {
+		transform = options;
+		options = {};
+	}
+ 
+	if (typeof transform !== 'function') {
+		throw new Error('transform function required');
+	}
+ 
+	function FirstChunk(options2) {
+		if (!(this instanceof FirstChunk)) {
+			return new FirstChunk(options2);
+		}
+ 
+		Transform.call(this, options2);
+ 
+		this._firstChunk = true;
+		this._transformCalled = false;
+		this._minSize = options.minSize;
+	}
+ 
+	FirstChunk.prototype._transform = function (chunk, enc, cb) {
+		this._enc = enc;
+ 
+		if (this._firstChunk) {
+			this._firstChunk = false;
+ 
+			if (this._minSize == null) {
+				transform.call(this, chunk, enc, cb);
+				this._transformCalled = true;
+				return;
+			}
+ 
+			this._buffer = chunk;
+			cb();
+			return;
+		}
+ 
+		if (this._minSize == null) {
+			this.push(chunk);
+			cb();
+			return;
+		}
+ 
+		if (this._buffer.length < this._minSize) {
+			this._buffer = Buffer.concat([this._buffer, chunk]);
+			cb();
+			return;
+		}
+ 
+		if (this._buffer.length >= this._minSize) {
+			transform.call(this, this._buffer.slice(), enc, function () {
+				this.push(chunk);
+				cb();
+			}.bind(this));
+			this._transformCalled = true;
+			this._buffer = false;
+			return;
+		}
+ 
+		this.push(chunk);
+		cb();
+	};
+ 
+	FirstChunk.prototype._flush = function (cb) {
+		if (!this._buffer) {
+			cb();
+			return;
+		}
+ 
+		if (this._transformCalled) {
+			this.push(this._buffer);
+			cb();
+		} else {
+			transform.call(this, this._buffer.slice(), this._enc, cb);
+		}
+	};
+ 
+	return FirstChunk;
+}
+ 
+module.exports = function () {
+	return ctor.apply(ctor, arguments)();
+};
+ 
+module.exports.ctor = ctor;
+ 
+}).call(this,require("buffer").Buffer)
+},{"buffer":33,"stream":60,"util":73}],31:[function(require,module,exports){
+ 
+},{}],32:[function(require,module,exports){
+arguments[4][31][0].apply(exports,arguments)
+},{"dup":31}],33:[function(require,module,exports){
+(function (global){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license  MIT
+ */
+/* eslint-disable no-proto */
+ 
+'use strict'
+ 
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+var isArray = require('isarray')
+ 
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+Buffer.poolSize = 8192 // not used by this implementation
+ 
+var rootParent = {}
+ 
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ *   === true    Use Uint8Array implementation (fastest)
+ *   === false   Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ *   - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property
+ *     on objects.
+ *
+ *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ *     incorrect length in some situations.
+ 
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
+  ? global.TYPED_ARRAY_SUPPORT
+  : typedArraySupport()
+ 
+function typedArraySupport () {
+  function Bar () {}
+  try {
+    var arr = new Uint8Array(1)
+    arr.foo = function () { return 42 }
+    arr.constructor = Bar
+    return arr.foo() === 42 && // typed array instances can be augmented
+        arr.constructor === Bar && // constructor can be set
+        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
+        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
+  } catch (e) {
+    return false
+  }
+}
+ 
+function kMaxLength () {
+  return Buffer.TYPED_ARRAY_SUPPORT
+    ? 0x7fffffff
+    : 0x3fffffff
+}
+ 
+/**
+ * Class: Buffer
+ * =============
+ *
+ * The Buffer constructor returns instances of `Uint8Array` that are augmented
+ * with function properties for all the node `Buffer` API functions. We use
+ * `Uint8Array` so that square bracket notation works as expected -- it returns
+ * a single octet.
+ *
+ * By augmenting the instances, we can avoid modifying the `Uint8Array`
+ * prototype.
+ */
+function Buffer (arg) {
+  if (!(this instanceof Buffer)) {
+    // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
+    if (arguments.length > 1) return new Buffer(arg, arguments[1])
+    return new Buffer(arg)
+  }
+ 
+  if (!Buffer.TYPED_ARRAY_SUPPORT) {
+    this.length = 0
+    this.parent = undefined
+  }
+ 
+  // Common case.
+  if (typeof arg === 'number') {
+    return fromNumber(this, arg)
+  }
+ 
+  // Slightly less common case.
+  if (typeof arg === 'string') {
+    return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
+  }
+ 
+  // Unusual.
+  return fromObject(this, arg)
+}
+ 
+function fromNumber (that, length) {
+  that = allocate(that, length < 0 ? 0 : checked(length) | 0)
+  if (!Buffer.TYPED_ARRAY_SUPPORT) {
+    for (var i = 0; i < length; i++) {
+      that[i] = 0
+    }
+  }
+  return that
+}
+ 
+function fromString (that, string, encoding) {
+  if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
+ 
+  // Assumption: byteLength() return value is always < kMaxLength.
+  var length = byteLength(string, encoding) | 0
+  that = allocate(that, length)
+ 
+  that.write(string, encoding)
+  return that
+}
+ 
+function fromObject (that, object) {
+  if (Buffer.isBuffer(object)) return fromBuffer(that, object)
+ 
+  if (isArray(object)) return fromArray(that, object)
+ 
+  if (object == null) {
+    throw new TypeError('must start with number, buffer, array or string')
+  }
+ 
+  if (typeof ArrayBuffer !== 'undefined') {
+    if (object.buffer instanceof ArrayBuffer) {
+      return fromTypedArray(that, object)
+    }
+    if (object instanceof ArrayBuffer) {
+      return fromArrayBuffer(that, object)
+    }
+  }
+ 
+  if (object.length) return fromArrayLike(that, object)
+ 
+  return fromJsonObject(that, object)
+}
+ 
+function fromBuffer (that, buffer) {
+  var length = checked(buffer.length) | 0
+  that = allocate(that, length)
+  buffer.copy(that, 0, 0, length)
+  return that
+}
+ 
+function fromArray (that, array) {
+  var length = checked(array.length) | 0
+  that = allocate(that, length)
+  for (var i = 0; i < length; i += 1) {
+    that[i] = array[i] & 255
+  }
+  return that
+}
+ 
+// Duplicate of fromArray() to keep fromArray() monomorphic.
+function fromTypedArray (that, array) {
+  var length = checked(array.length) | 0
+  that = allocate(that, length)
+  // Truncating the elements is probably not what people expect from typed
+  // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
+  // of the old Buffer constructor.
+  for (var i = 0; i < length; i += 1) {
+    that[i] = array[i] & 255
+  }
+  return that
+}
+ 
+function fromArrayBuffer (that, array) {
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    // Return an augmented `Uint8Array` instance, for best performance
+    array.byteLength
+    that = Buffer._augment(new Uint8Array(array))
+  } else {
+    // Fallback: Return an object instance of the Buffer class
+    that = fromTypedArray(that, new Uint8Array(array))
+  }
+  return that
+}
+ 
+function fromArrayLike (that, array) {
+  var length = checked(array.length) | 0
+  that = allocate(that, length)
+  for (var i = 0; i < length; i += 1) {
+    that[i] = array[i] & 255
+  }
+  return that
+}
+ 
+// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
+// Returns a zero-length buffer for inputs that don't conform to the spec.
+function fromJsonObject (that, object) {
+  var array
+  var length = 0
+ 
+  if (object.type === 'Buffer' && isArray(object.data)) {
+    array = object.data
+    length = checked(array.length) | 0
+  }
+  that = allocate(that, length)
+ 
+  for (var i = 0; i < length; i += 1) {
+    that[i] = array[i] & 255
+  }
+  return that
+}
+ 
+if (Buffer.TYPED_ARRAY_SUPPORT) {
+  Buffer.prototype.__proto__ = Uint8Array.prototype
+  Buffer.__proto__ = Uint8Array
+} else {
+  // pre-set for values that may exist in the future
+  Buffer.prototype.length = undefined
+  Buffer.prototype.parent = undefined
+}
+ 
+function allocate (that, length) {
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    // Return an augmented `Uint8Array` instance, for best performance
+    that = Buffer._augment(new Uint8Array(length))
+    that.__proto__ = Buffer.prototype
+  } else {
+    // Fallback: Return an object instance of the Buffer class
+    that.length = length
+    that._isBuffer = true
+  }
+ 
+  var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
+  if (fromPool) that.parent = rootParent
+ 
+  return that
+}
+ 
+function checked (length) {
+  // Note: cannot use `length < kMaxLength` here because that fails when
+  // length is NaN (which is otherwise coerced to zero.)
+  if (length >= kMaxLength()) {
+    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+                         'size: 0x' + kMaxLength().toString(16) + ' bytes')
+  }
+  return length | 0
+}
+ 
+function SlowBuffer (subject, encoding) {
+  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
+ 
+  var buf = new Buffer(subject, encoding)
+  delete buf.parent
+  return buf
+}
+ 
+Buffer.isBuffer = function isBuffer (b) {
+  return !!(b != null && b._isBuffer)
+}
+ 
+Buffer.compare = function compare (a, b) {
+  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+    throw new TypeError('Arguments must be Buffers')
+  }
+ 
+  if (a === b) return 0
+ 
+  var x = a.length
+  var y = b.length
+ 
+  var i = 0
+  var len = Math.min(x, y)
+  while (i < len) {
+    if (a[i] !== b[i]) break
+ 
+    ++i
+  }
+ 
+  if (i !== len) {
+    x = a[i]
+    y = b[i]
+  }
+ 
+  if (x < y) return -1
+  if (y < x) return 1
+  return 0
+}
+ 
+Buffer.isEncoding = function isEncoding (encoding) {
+  switch (String(encoding).toLowerCase()) {
+    case 'hex':
+    case 'utf8':
+    case 'utf-8':
+    case 'ascii':
+    case 'binary':
+    case 'base64':
+    case 'raw':
+    case 'ucs2':
+    case 'ucs-2':
+    case 'utf16le':
+    case 'utf-16le':
+      return true
+    default:
+      return false
+  }
+}
+ 
+Buffer.concat = function concat (list, length) {
+  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
+ 
+  if (list.length === 0) {
+    return new Buffer(0)
+  }
+ 
+  var i
+  if (length === undefined) {
+    length = 0
+    for (i = 0; i < list.length; i++) {
+      length += list[i].length
+    }
+  }
+ 
+  var buf = new Buffer(length)
+  var pos = 0
+  for (i = 0; i < list.length; i++) {
+    var item = list[i]
+    item.copy(buf, pos)
+    pos += item.length
+  }
+  return buf
+}
+ 
+function byteLength (string, encoding) {
+  if (typeof string !== 'string') string = '' + string
+ 
+  var len = string.length
+  if (len === 0) return 0
+ 
+  // Use a for loop to avoid recursion
+  var loweredCase = false
+  for (;;) {
+    switch (encoding) {
+      case 'ascii':
+      case 'binary':
+      // Deprecated
+      case 'raw':
+      case 'raws':
+        return len
+      case 'utf8':
+      case 'utf-8':
+        return utf8ToBytes(string).length
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return len * 2
+      case 'hex':
+        return len >>> 1
+      case 'base64':
+        return base64ToBytes(string).length
+      default:
+        if (loweredCase) return utf8ToBytes(string).length // assume utf8
+        encoding = ('' + encoding).toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+Buffer.byteLength = byteLength
+ 
+function slowToString (encoding, start, end) {
+  var loweredCase = false
+ 
+  start = start | 0
+  end = end === undefined || end === Infinity ? this.length : end | 0
+ 
+  if (!encoding) encoding = 'utf8'
+  if (start < 0) start = 0
+  if (end > this.length) end = this.length
+  if (end <= start) return ''
+ 
+  while (true) {
+    switch (encoding) {
+      case 'hex':
+        return hexSlice(this, start, end)
+ 
+      case 'utf8':
+      case 'utf-8':
+        return utf8Slice(this, start, end)
+ 
+      case 'ascii':
+        return asciiSlice(this, start, end)
+ 
+      case 'binary':
+        return binarySlice(this, start, end)
+ 
+      case 'base64':
+        return base64Slice(this, start, end)
+ 
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return utf16leSlice(this, start, end)
+ 
+      default:
+        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+        encoding = (encoding + '').toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+ 
+Buffer.prototype.toString = function toString () {
+  var length = this.length | 0
+  if (length === 0) return ''
+  if (arguments.length === 0) return utf8Slice(this, 0, length)
+  return slowToString.apply(this, arguments)
+}
+ 
+Buffer.prototype.equals = function equals (b) {
+  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+  if (this === b) return true
+  return Buffer.compare(this, b) === 0
+}
+ 
+Buffer.prototype.inspect = function inspect () {
+  var str = ''
+  var max = exports.INSPECT_MAX_BYTES
+  if (this.length > 0) {
+    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
+    if (this.length > max) str += ' ... '
+  }
+  return '<Buffer ' + str + '>'
+}
+ 
+Buffer.prototype.compare = function compare (b) {
+  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+  if (this === b) return 0
+  return Buffer.compare(this, b)
+}
+ 
+Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
+  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
+  else if (byteOffset < -0x80000000) byteOffset = -0x80000000
+  byteOffset >>= 0
+ 
+  if (this.length === 0) return -1
+  if (byteOffset >= this.length) return -1
+ 
+  // Negative offsets start from the end of the buffer
+  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
+ 
+  if (typeof val === 'string') {
+    if (val.length === 0) return -1 // special case: looking for empty string always fails
+    return String.prototype.indexOf.call(this, val, byteOffset)
+  }
+  if (Buffer.isBuffer(val)) {
+    return arrayIndexOf(this, val, byteOffset)
+  }
+  if (typeof val === 'number') {
+    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
+      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
+    }
+    return arrayIndexOf(this, [ val ], byteOffset)
+  }
+ 
+  function arrayIndexOf (arr, val, byteOffset) {
+    var foundIndex = -1
+    for (var i = 0; byteOffset + i < arr.length; i++) {
+      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
+        if (foundIndex === -1) foundIndex = i
+        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
+      } else {
+        foundIndex = -1
+      }
+    }
+    return -1
+  }
+ 
+  throw new TypeError('val must be string, number or Buffer')
+}
+ 
+// `get` is deprecated
+Buffer.prototype.get = function get (offset) {
+  console.log('.get() is deprecated. Access using array indexes instead.')
+  return this.readUInt8(offset)
+}
+ 
+// `set` is deprecated
+Buffer.prototype.set = function set (v, offset) {
+  console.log('.set() is deprecated. Access using array indexes instead.')
+  return this.writeUInt8(v, offset)
+}
+ 
+function hexWrite (buf, string, offset, length) {
+  offset = Number(offset) || 0
+  var remaining = buf.length - offset
+  if (!length) {
+    length = remaining
+  } else {
+    length = Number(length)
+    if (length > remaining) {
+      length = remaining
+    }
+  }
+ 
+  // must be an even number of digits
+  var strLen = string.length
+  if (strLen % 2 !== 0) throw new Error('Invalid hex string')
+ 
+  if (length > strLen / 2) {
+    length = strLen / 2
+  }
+  for (var i = 0; i < length; i++) {
+    var parsed = parseInt(string.substr(i * 2, 2), 16)
+    if (isNaN(parsed)) throw new Error('Invalid hex string')
+    buf[offset + i] = parsed
+  }
+  return i
+}
+ 
+function utf8Write (buf, string, offset, length) {
+  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+ 
+function asciiWrite (buf, string, offset, length) {
+  return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+ 
+function binaryWrite (buf, string, offset, length) {
+  return asciiWrite(buf, string, offset, length)
+}
+ 
+function base64Write (buf, string, offset, length) {
+  return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+ 
+function ucs2Write (buf, string, offset, length) {
+  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+ 
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+  // Buffer#write(string)
+  if (offset === undefined) {
+    encoding = 'utf8'
+    length = this.length
+    offset = 0
+  // Buffer#write(string, encoding)
+  } else if (length === undefined && typeof offset === 'string') {
+    encoding = offset
+    length = this.length
+    offset = 0
+  // Buffer#write(string, offset[, length][, encoding])
+  } else if (isFinite(offset)) {
+    offset = offset | 0
+    if (isFinite(length)) {
+      length = length | 0
+      if (encoding === undefined) encoding = 'utf8'
+    } else {
+      encoding = length
+      length = undefined
+    }
+  // legacy write(string, encoding, offset, length) - remove in v0.13
+  } else {
+    var swap = encoding
+    encoding = offset
+    offset = length | 0
+    length = swap
+  }
+ 
+  var remaining = this.length - offset
+  if (length === undefined || length > remaining) length = remaining
+ 
+  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+    throw new RangeError('attempt to write outside buffer bounds')
+  }
+ 
+  if (!encoding) encoding = 'utf8'
+ 
+  var loweredCase = false
+  for (;;) {
+    switch (encoding) {
+      case 'hex':
+        return hexWrite(this, string, offset, length)
+ 
+      case 'utf8':
+      case 'utf-8':
+        return utf8Write(this, string, offset, length)
+ 
+      case 'ascii':
+        return asciiWrite(this, string, offset, length)
+ 
+      case 'binary':
+        return binaryWrite(this, string, offset, length)
+ 
+      case 'base64':
+        // Warning: maxLength not taken into account in base64Write
+        return base64Write(this, string, offset, length)
+ 
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return ucs2Write(this, string, offset, length)
+ 
+      default:
+        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+        encoding = ('' + encoding).toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+ 
+Buffer.prototype.toJSON = function toJSON () {
+  return {
+    type: 'Buffer',
+    data: Array.prototype.slice.call(this._arr || this, 0)
+  }
+}
+ 
+function base64Slice (buf, start, end) {
+  if (start === 0 && end === buf.length) {
+    return base64.fromByteArray(buf)
+  } else {
+    return base64.fromByteArray(buf.slice(start, end))
+  }
+}
+ 
+function utf8Slice (buf, start, end) {
+  end = Math.min(buf.length, end)
+  var res = []
+ 
+  var i = start
+  while (i < end) {
+    var firstByte = buf[i]
+    var codePoint = null
+    var bytesPerSequence = (firstByte > 0xEF) ? 4
+      : (firstByte > 0xDF) ? 3
+      : (firstByte > 0xBF) ? 2
+      : 1
+ 
+    if (i + bytesPerSequence <= end) {
+      var secondByte, thirdByte, fourthByte, tempCodePoint
+ 
+      switch (bytesPerSequence) {
+        case 1:
+          if (firstByte < 0x80) {
+            codePoint = firstByte
+          }
+          break
+        case 2:
+          secondByte = buf[i + 1]
+          if ((secondByte & 0xC0) === 0x80) {
+            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+            if (tempCodePoint > 0x7F) {
+              codePoint = tempCodePoint
+            }
+          }
+          break
+        case 3:
+          secondByte = buf[i + 1]
+          thirdByte = buf[i + 2]
+          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+              codePoint = tempCodePoint
+            }
+          }
+          break
+        case 4:
+          secondByte = buf[i + 1]
+          thirdByte = buf[i + 2]
+          fourthByte = buf[i + 3]
+          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+              codePoint = tempCodePoint
+            }
+          }
+      }
+    }
+ 
+    if (codePoint === null) {
+      // we did not generate a valid codePoint so insert a
+      // replacement char (U+FFFD) and advance only 1 byte
+      codePoint = 0xFFFD
+      bytesPerSequence = 1
+    } else if (codePoint > 0xFFFF) {
+      // encode to utf16 (surrogate pair dance)
+      codePoint -= 0x10000
+      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+      codePoint = 0xDC00 | codePoint & 0x3FF
+    }
+ 
+    res.push(codePoint)
+    i += bytesPerSequence
+  }
+ 
+  return decodeCodePointsArray(res)
+}
+ 
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+ 
+function decodeCodePointsArray (codePoints) {
+  var len = codePoints.length
+  if (len <= MAX_ARGUMENTS_LENGTH) {
+    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+  }
+ 
+  // Decode in chunks to avoid "call stack size exceeded".
+  var res = ''
+  var i = 0
+  while (i < len) {
+    res += String.fromCharCode.apply(
+      String,
+      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+    )
+  }
+  return res
+}
+ 
+function asciiSlice (buf, start, end) {
+  var ret = ''
+  end = Math.min(buf.length, end)
+ 
+  for (var i = start; i < end; i++) {
+    ret += String.fromCharCode(buf[i] & 0x7F)
+  }
+  return ret
+}
+ 
+function binarySlice (buf, start, end) {
+  var ret = ''
+  end = Math.min(buf.length, end)
+ 
+  for (var i = start; i < end; i++) {
+    ret += String.fromCharCode(buf[i])
+  }
+  return ret
+}
+ 
+function hexSlice (buf, start, end) {
+  var len = buf.length
+ 
+  if (!start || start < 0) start = 0
+  if (!end || end < 0 || end > len) end = len
+ 
+  var out = ''
+  for (var i = start; i < end; i++) {
+    out += toHex(buf[i])
+  }
+  return out
+}
+ 
+function utf16leSlice (buf, start, end) {
+  var bytes = buf.slice(start, end)
+  var res = ''
+  for (var i = 0; i < bytes.length; i += 2) {
+    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
+  }
+  return res
+}
+ 
+Buffer.prototype.slice = function slice (start, end) {
+  var len = this.length
+  start = ~~start
+  end = end === undefined ? len : ~~end
+ 
+  if (start < 0) {
+    start += len
+    if (start < 0) start = 0
+  } else if (start > len) {
+    start = len
+  }
+ 
+  if (end < 0) {
+    end += len
+    if (end < 0) end = 0
+  } else if (end > len) {
+    end = len
+  }
+ 
+  if (end < start) end = start
+ 
+  var newBuf
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    newBuf = Buffer._augment(this.subarray(start, end))
+  } else {
+    var sliceLen = end - start
+    newBuf = new Buffer(sliceLen, undefined)
+    for (var i = 0; i < sliceLen; i++) {
+      newBuf[i] = this[i + start]
+    }
+  }
+ 
+  if (newBuf.length) newBuf.parent = this.parent || this
+ 
+  return newBuf
+}
+ 
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+ 
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+  offset = offset | 0
+  byteLength = byteLength | 0
+  if (!noAssert) checkOffset(offset, byteLength, this.length)
+ 
+  var val = this[offset]
+  var mul = 1
+  var i = 0
+  while (++i < byteLength && (mul *= 0x100)) {
+    val += this[offset + i] * mul
+  }
+ 
+  return val
+}
+ 
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+  offset = offset | 0
+  byteLength = byteLength | 0
+  if (!noAssert) {
+    checkOffset(offset, byteLength, this.length)
+  }
+ 
+  var val = this[offset + --byteLength]
+  var mul = 1
+  while (byteLength > 0 && (mul *= 0x100)) {
+    val += this[offset + --byteLength] * mul
+  }
+ 
+  return val
+}
+ 
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 1, this.length)
+  return this[offset]
+}
+ 
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  return this[offset] | (this[offset + 1] << 8)
+}
+ 
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  return (this[offset] << 8) | this[offset + 1]
+}
+ 
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 4, this.length)
+ 
+  return ((this[offset]) |
+      (this[offset + 1] << 8) |
+      (this[offset + 2] << 16)) +
+      (this[offset + 3] * 0x1000000)
+}
+ 
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 4, this.length)
+ 
+  return (this[offset] * 0x1000000) +
+    ((this[offset + 1] << 16) |
+    (this[offset + 2] << 8) |
+    this[offset + 3])
+}
+ 
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+  offset = offset | 0
+  byteLength = byteLength | 0
+  if (!noAssert) checkOffset(offset, byteLength, this.length)
+ 
+  var val = this[offset]
+  var mul = 1
+  var i = 0
+  while (++i < byteLength && (mul *= 0x100)) {
+    val += this[offset + i] * mul
+  }
+  mul *= 0x80
+ 
+  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+ 
+  return val
+}
+ 
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+  offset = offset | 0
+  byteLength = byteLength | 0
+  if (!noAssert) checkOffset(offset, byteLength, this.length)
+ 
+  var i = byteLength
+  var mul = 1
+  var val = this[offset + --i]
+  while (i > 0 && (mul *= 0x100)) {
+    val += this[offset + --i] * mul
+  }
+  mul *= 0x80
+ 
+  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+ 
+  return val
+}
+ 
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 1, this.length)
+  if (!(this[offset] & 0x80)) return (this[offset])
+  return ((0xff - this[offset] + 1) * -1)
+}
+ 
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  var val = this[offset] | (this[offset + 1] << 8)
+  return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+ 
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 2, this.length)
+  var val = this[offset + 1] | (this[offset] << 8)
+  return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+ 
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 4, this.length)
+ 
+  return (this[offset]) |
+    (this[offset + 1] << 8) |
+    (this[offset + 2] << 16) |
+    (this[offset + 3] << 24)
+}
+ 
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 4, this.length)
+ 
+  return (this[offset] << 24) |
+    (this[offset + 1] << 16) |
+    (this[offset + 2] << 8) |
+    (this[offset + 3])
+}
+ 
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 4, this.length)
+  return ieee754.read(this, offset, true, 23, 4)
+}
+ 
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 4, this.length)
+  return ieee754.read(this, offset, false, 23, 4)
+}
+ 
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 8, this.length)
+  return ieee754.read(this, offset, true, 52, 8)
+}
+ 
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+  if (!noAssert) checkOffset(offset, 8, this.length)
+  return ieee754.read(this, offset, false, 52, 8)
+}
+ 
+function checkInt (buf, value, offset, ext, max, min) {
+  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
+  if (value > max || value < min) throw new RangeError('value is out of bounds')
+  if (offset + ext > buf.length) throw new RangeError('index out of range')
+}
+ 
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset | 0
+  byteLength = byteLength | 0
+  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
+ 
+  var mul = 1
+  var i = 0
+  this[offset] = value & 0xFF
+  while (++i < byteLength && (mul *= 0x100)) {
+    this[offset + i] = (value / mul) & 0xFF
+  }
+ 
+  return offset + byteLength
+}
+ 
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset | 0
+  byteLength = byteLength | 0
+  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
+ 
+  var i = byteLength - 1
+  var mul = 1
+  this[offset + i] = value & 0xFF
+  while (--i >= 0 && (mul *= 0x100)) {
+    this[offset + i] = (value / mul) & 0xFF
+  }
+ 
+  return offset + byteLength
+}
+ 
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+  this[offset] = (value & 0xff)
+  return offset + 1
+}
+ 
+function objectWriteUInt16 (buf, value, offset, littleEndian) {
+  if (value < 0) value = 0xffff + value + 1
+  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
+    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
+      (littleEndian ? i : 1 - i) * 8
+  }
+}
+ 
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value & 0xff)
+    this[offset + 1] = (value >>> 8)
+  } else {
+    objectWriteUInt16(this, value, offset, true)
+  }
+  return offset + 2
+}
+ 
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 8)
+    this[offset + 1] = (value & 0xff)
+  } else {
+    objectWriteUInt16(this, value, offset, false)
+  }
+  return offset + 2
+}
+ 
+function objectWriteUInt32 (buf, value, offset, littleEndian) {
+  if (value < 0) value = 0xffffffff + value + 1
+  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
+    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
+  }
+}
+ 
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset + 3] = (value >>> 24)
+    this[offset + 2] = (value >>> 16)
+    this[offset + 1] = (value >>> 8)
+    this[offset] = (value & 0xff)
+  } else {
+    objectWriteUInt32(this, value, offset, true)
+  }
+  return offset + 4
+}
+ 
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 24)
+    this[offset + 1] = (value >>> 16)
+    this[offset + 2] = (value >>> 8)
+    this[offset + 3] = (value & 0xff)
+  } else {
+    objectWriteUInt32(this, value, offset, false)
+  }
+  return offset + 4
+}
+ 
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) {
+    var limit = Math.pow(2, 8 * byteLength - 1)
+ 
+    checkInt(this, value, offset, byteLength, limit - 1, -limit)
+  }
+ 
+  var i = 0
+  var mul = 1
+  var sub = value < 0 ? 1 : 0
+  this[offset] = value & 0xFF
+  while (++i < byteLength && (mul *= 0x100)) {
+    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+  }
+ 
+  return offset + byteLength
+}
+ 
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) {
+    var limit = Math.pow(2, 8 * byteLength - 1)
+ 
+    checkInt(this, value, offset, byteLength, limit - 1, -limit)
+  }
+ 
+  var i = byteLength - 1
+  var mul = 1
+  var sub = value < 0 ? 1 : 0
+  this[offset + i] = value & 0xFF
+  while (--i >= 0 && (mul *= 0x100)) {
+    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+  }
+ 
+  return offset + byteLength
+}
+ 
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+  if (value < 0) value = 0xff + value + 1
+  this[offset] = (value & 0xff)
+  return offset + 1
+}
+ 
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value & 0xff)
+    this[offset + 1] = (value >>> 8)
+  } else {
+    objectWriteUInt16(this, value, offset, true)
+  }
+  return offset + 2
+}
+ 
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 8)
+    this[offset + 1] = (value & 0xff)
+  } else {
+    objectWriteUInt16(this, value, offset, false)
+  }
+  return offset + 2
+}
+ 
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value & 0xff)
+    this[offset + 1] = (value >>> 8)
+    this[offset + 2] = (value >>> 16)
+    this[offset + 3] = (value >>> 24)
+  } else {
+    objectWriteUInt32(this, value, offset, true)
+  }
+  return offset + 4
+}
+ 
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+  value = +value
+  offset = offset | 0
+  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+  if (value < 0) value = 0xffffffff + value + 1
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 24)
+    this[offset + 1] = (value >>> 16)
+    this[offset + 2] = (value >>> 8)
+    this[offset + 3] = (value & 0xff)
+  } else {
+    objectWriteUInt32(this, value, offset, false)
+  }
+  return offset + 4
+}
+ 
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+  if (value > max || value < min) throw new RangeError('value is out of bounds')
+  if (offset + ext > buf.length) throw new RangeError('index out of range')
+  if (offset < 0) throw new RangeError('index out of range')
+}
+ 
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+  if (!noAssert) {
+    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+  }
+  ieee754.write(buf, value, offset, littleEndian, 23, 4)
+  return offset + 4
+}
+ 
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+  return writeFloat(this, value, offset, true, noAssert)
+}
+ 
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+  return writeFloat(this, value, offset, false, noAssert)
+}
+ 
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+  if (!noAssert) {
+    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+  }
+  ieee754.write(buf, value, offset, littleEndian, 52, 8)
+  return offset + 8
+}
+ 
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+  return writeDouble(this, value, offset, true, noAssert)
+}
+ 
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+  return writeDouble(this, value, offset, false, noAssert)
+}
+ 
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+  if (!start) start = 0
+  if (!end && end !== 0) end = this.length
+  if (targetStart >= target.length) targetStart = target.length
+  if (!targetStart) targetStart = 0
+  if (end > 0 && end < start) end = start
+ 
+  // Copy 0 bytes; we're done
+  if (end === start) return 0
+  if (target.length === 0 || this.length === 0) return 0
+ 
+  // Fatal error conditions
+  if (targetStart < 0) {
+    throw new RangeError('targetStart out of bounds')
+  }
+  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+  if (end < 0) throw new RangeError('sourceEnd out of bounds')
+ 
+  // Are we oob?
+  if (end > this.length) end = this.length
+  if (target.length - targetStart < end - start) {
+    end = target.length - targetStart + start
+  }
+ 
+  var len = end - start
+  var i
+ 
+  if (this === target && start < targetStart && targetStart < end) {
+    // descending copy from end
+    for (i = len - 1; i >= 0; i--) {
+      target[i + targetStart] = this[i + start]
+    }
+  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+    // ascending copy from start
+    for (i = 0; i < len; i++) {
+      target[i + targetStart] = this[i + start]
+    }
+  } else {
+    target._set(this.subarray(start, start + len), targetStart)
+  }
+ 
+  return len
+}
+ 
+// fill(value, start=0, end=buffer.length)
+Buffer.prototype.fill = function fill (value, start, end) {
+  if (!value) value = 0
+  if (!start) start = 0
+  if (!end) end = this.length
+ 
+  if (end < start) throw new RangeError('end < start')
+ 
+  // Fill 0 bytes; we're done
+  if (end === start) return
+  if (this.length === 0) return
+ 
+  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
+  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
+ 
+  var i
+  if (typeof value === 'number') {
+    for (i = start; i < end; i++) {
+      this[i] = value
+    }
+  } else {
+    var bytes = utf8ToBytes(value.toString())
+    var len = bytes.length
+    for (i = start; i < end; i++) {
+      this[i] = bytes[i % len]
+    }
+  }
+ 
+  return this
+}
+ 
+/**
+ * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
+ * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
+ */
+Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
+  if (typeof Uint8Array !== 'undefined') {
+    if (Buffer.TYPED_ARRAY_SUPPORT) {
+      return (new Buffer(this)).buffer
+    } else {
+      var buf = new Uint8Array(this.length)
+      for (var i = 0, len = buf.length; i < len; i += 1) {
+        buf[i] = this[i]
+      }
+      return buf.buffer
+    }
+  } else {
+    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
+  }
+}
+ 
+// HELPER FUNCTIONS
+// ================
+ 
+var BP = Buffer.prototype
+ 
+/**
+ * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
+ */
+Buffer._augment = function _augment (arr) {
+  arr.constructor = Buffer
+  arr._isBuffer = true
+ 
+  // save reference to original Uint8Array set method before overwriting
+  arr._set = arr.set
+ 
+  // deprecated
+  arr.get = BP.get
+  arr.set = BP.set
+ 
+  arr.write = BP.write
+  arr.toString = BP.toString
+  arr.toLocaleString = BP.toString
+  arr.toJSON = BP.toJSON
+  arr.equals = BP.equals
+  arr.compare = BP.compare
+  arr.indexOf = BP.indexOf
+  arr.copy = BP.copy
+  arr.slice = BP.slice
+  arr.readUIntLE = BP.readUIntLE
+  arr.readUIntBE = BP.readUIntBE
+  arr.readUInt8 = BP.readUInt8
+  arr.readUInt16LE = BP.readUInt16LE
+  arr.readUInt16BE = BP.readUInt16BE
+  arr.readUInt32LE = BP.readUInt32LE
+  arr.readUInt32BE = BP.readUInt32BE
+  arr.readIntLE = BP.readIntLE
+  arr.readIntBE = BP.readIntBE
+  arr.readInt8 = BP.readInt8
+  arr.readInt16LE = BP.readInt16LE
+  arr.readInt16BE = BP.readInt16BE
+  arr.readInt32LE = BP.readInt32LE
+  arr.readInt32BE = BP.readInt32BE
+  arr.readFloatLE = BP.readFloatLE
+  arr.readFloatBE = BP.readFloatBE
+  arr.readDoubleLE = BP.readDoubleLE
+  arr.readDoubleBE = BP.readDoubleBE
+  arr.writeUInt8 = BP.writeUInt8
+  arr.writeUIntLE = BP.writeUIntLE
+  arr.writeUIntBE = BP.writeUIntBE
+  arr.writeUInt16LE = BP.writeUInt16LE
+  arr.writeUInt16BE = BP.writeUInt16BE
+  arr.writeUInt32LE = BP.writeUInt32LE
+  arr.writeUInt32BE = BP.writeUInt32BE
+  arr.writeIntLE = BP.writeIntLE
+  arr.writeIntBE = BP.writeIntBE
+  arr.writeInt8 = BP.writeInt8
+  arr.writeInt16LE = BP.writeInt16LE
+  arr.writeInt16BE = BP.writeInt16BE
+  arr.writeInt32LE = BP.writeInt32LE
+  arr.writeInt32BE = BP.writeInt32BE
+  arr.writeFloatLE = BP.writeFloatLE
+  arr.writeFloatBE = BP.writeFloatBE
+  arr.writeDoubleLE = BP.writeDoubleLE
+  arr.writeDoubleBE = BP.writeDoubleBE
+  arr.fill = BP.fill
+  arr.inspect = BP.inspect
+  arr.toArrayBuffer = BP.toArrayBuffer
+ 
+  return arr
+}
+ 
+var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
+ 
+function base64clean (str) {
+  // Node strips out invalid characters like \n and \t from the string, base64-js does not
+  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
+  // Node converts strings with length < 2 to ''
+  if (str.length < 2) return ''
+  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+  while (str.length % 4 !== 0) {
+    str = str + '='
+  }
+  return str
+}
+ 
+function stringtrim (str) {
+  if (str.trim) return str.trim()
+  return str.replace(/^\s+|\s+$/g, '')
+}
+ 
+function toHex (n) {
+  if (n < 16) return '0' + n.toString(16)
+  return n.toString(16)
+}
+ 
+function utf8ToBytes (string, units) {
+  units = units || Infinity
+  var codePoint
+  var length = string.length
+  var leadSurrogate = null
+  var bytes = []
+ 
+  for (var i = 0; i < length; i++) {
+    codePoint = string.charCodeAt(i)
+ 
+    // is surrogate component
+    if (codePoint > 0xD7FF && codePoint < 0xE000) {
+      // last char was a lead
+      if (!leadSurrogate) {
+        // no lead yet
+        if (codePoint > 0xDBFF) {
+          // unexpected trail
+          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+          continue
+        } else if (i + 1 === length) {
+          // unpaired lead
+          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+          continue
+        }
+ 
+        // valid lead
+        leadSurrogate = codePoint
+ 
+        continue
+      }
+ 
+      // 2 leads in a row
+      if (codePoint < 0xDC00) {
+        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+        leadSurrogate = codePoint
+        continue
+      }
+ 
+      // valid surrogate pair
+      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+    } else if (leadSurrogate) {
+      // valid bmp char, but last char was a lead
+      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+    }
+ 
+    leadSurrogate = null
+ 
+    // encode utf8
+    if (codePoint < 0x80) {
+      if ((units -= 1) < 0) break
+      bytes.push(codePoint)
+    } else if (codePoint < 0x800) {
+      if ((units -= 2) < 0) break
+      bytes.push(
+        codePoint >> 0x6 | 0xC0,
+        codePoint & 0x3F | 0x80
+      )
+    } else if (codePoint < 0x10000) {
+      if ((units -= 3) < 0) break
+      bytes.push(
+        codePoint >> 0xC | 0xE0,
+        codePoint >> 0x6 & 0x3F | 0x80,
+        codePoint & 0x3F | 0x80
+      )
+    } else if (codePoint < 0x110000) {
+      if ((units -= 4) < 0) break
+      bytes.push(
+        codePoint >> 0x12 | 0xF0,
+        codePoint >> 0xC & 0x3F | 0x80,
+        codePoint >> 0x6 & 0x3F | 0x80,
+        codePoint & 0x3F | 0x80
+      )
+    } else {
+      throw new Error('Invalid code point')
+    }
+  }
+ 
+  return bytes
+}
+ 
+function asciiToBytes (str) {
+  var byteArray = []
+  for (var i = 0; i < str.length; i++) {
+    // Node's code seems to be doing this and not & 0x7F..
+    byteArray.push(str.charCodeAt(i) & 0xFF)
+  }
+  return byteArray
+}
+ 
+function utf16leToBytes (str, units) {
+  var c, hi, lo
+  var byteArray = []
+  for (var i = 0; i < str.length; i++) {
+    if ((units -= 2) < 0) break
+ 
+    c = str.charCodeAt(i)
+    hi = c >> 8
+    lo = c % 256
+    byteArray.push(lo)
+    byteArray.push(hi)
+  }
+ 
+  return byteArray
+}
+ 
+function base64ToBytes (str) {
+  return base64.toByteArray(base64clean(str))
+}
+ 
+function blitBuffer (src, dst, offset, length) {
+  for (var i = 0; i < length; i++) {
+    if ((i + offset >= dst.length) || (i >= src.length)) break
+    dst[i + offset] = src[i]
+  }
+  return i
+}
+ 
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"base64-js":34,"ieee754":35,"isarray":36}],34:[function(require,module,exports){
+var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ 
+;(function (exports) {
+	'use strict';
+ 
+  var Arr = (typeof Uint8Array !== 'undefined')
+    ? Uint8Array
+    : Array
+ 
+	var PLUS   = '+'.charCodeAt(0)
+	var SLASH  = '/'.charCodeAt(0)
+	var NUMBER = '0'.charCodeAt(0)
+	var LOWER  = 'a'.charCodeAt(0)
+	var UPPER  = 'A'.charCodeAt(0)
+	var PLUS_URL_SAFE = '-'.charCodeAt(0)
+	var SLASH_URL_SAFE = '_'.charCodeAt(0)
+ 
+	function decode (elt) {
+		var code = elt.charCodeAt(0)
+		if (code === PLUS ||
+		    code === PLUS_URL_SAFE)
+			return 62 // '+'
+		if (code === SLASH ||
+		    code === SLASH_URL_SAFE)
+			return 63 // '/'
+		if (code < NUMBER)
+			return -1 //no match
+		if (code < NUMBER + 10)
+			return code - NUMBER + 26 + 26
+		if (code < UPPER + 26)
+			return code - UPPER
+		if (code < LOWER + 26)
+			return code - LOWER + 26
+	}
+ 
+	function b64ToByteArray (b64) {
+		var i, j, l, tmp, placeHolders, arr
+ 
+		if (b64.length % 4 > 0) {
+			throw new Error('Invalid string. Length must be a multiple of 4')
+		}
+ 
+		// the number of equal signs (place holders)
+		// if there are two placeholders, than the two characters before it
+		// represent one byte
+		// if there is only one, then the three characters before it represent 2 bytes
+		// this is just a cheap hack to not do indexOf twice
+		var len = b64.length
+		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
+ 
+		// base64 is 4/3 + up to two characters of the original data
+		arr = new Arr(b64.length * 3 / 4 - placeHolders)
+ 
+		// if there are placeholders, only get up to the last complete 4 chars
+		l = placeHolders > 0 ? b64.length - 4 : b64.length
+ 
+		var L = 0
+ 
+		function push (v) {
+			arr[L++] = v
+		}
+ 
+		for (i = 0, j = 0; i < l; i += 4, j += 3) {
+			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
+			push((tmp & 0xFF0000) >> 16)
+			push((tmp & 0xFF00) >> 8)
+			push(tmp & 0xFF)
+		}
+ 
+		if (placeHolders === 2) {
+			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
+			push(tmp & 0xFF)
+		} else if (placeHolders === 1) {
+			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
+			push((tmp >> 8) & 0xFF)
+			push(tmp & 0xFF)
+		}
+ 
+		return arr
+	}
+ 
+	function uint8ToBase64 (uint8) {
+		var i,
+			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
+			output = "",
+			temp, length
+ 
+		function encode (num) {
+			return lookup.charAt(num)
+		}
+ 
+		function tripletToBase64 (num) {
+			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
+		}
+ 
+		// go through the array every three bytes, we'll deal with trailing stuff later
+		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
+			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
+			output += tripletToBase64(temp)
+		}
+ 
+		// pad the end with zeros, but make sure to not forget the extra bytes
+		switch (extraBytes) {
+			case 1:
+				temp = uint8[uint8.length - 1]
+				output += encode(temp >> 2)
+				output += encode((temp << 4) & 0x3F)
+				output += '=='
+				break
+			case 2:
+				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
+				output += encode(temp >> 10)
+				output += encode((temp >> 4) & 0x3F)
+				output += encode((temp << 2) & 0x3F)
+				output += '='
+				break
+		}
+ 
+		return output
+	}
+ 
+	exports.toByteArray = b64ToByteArray
+	exports.fromByteArray = uint8ToBase64
+}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
+ 
+},{}],35:[function(require,module,exports){
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+  var e, m
+  var eLen = nBytes * 8 - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var nBits = -7
+  var i = isLE ? (nBytes - 1) : 0
+  var d = isLE ? -1 : 1
+  var s = buffer[offset + i]
+ 
+  i += d
+ 
+  e = s & ((1 << (-nBits)) - 1)
+  s >>= (-nBits)
+  nBits += eLen
+  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+ 
+  m = e & ((1 << (-nBits)) - 1)
+  e >>= (-nBits)
+  nBits += mLen
+  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+ 
+  if (e === 0) {
+    e = 1 - eBias
+  } else if (e === eMax) {
+    return m ? NaN : ((s ? -1 : 1) * Infinity)
+  } else {
+    m = m + Math.pow(2, mLen)
+    e = e - eBias
+  }
+  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
+ 
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+  var e, m, c
+  var eLen = nBytes * 8 - mLen - 1
+  var eMax = (1 << eLen) - 1
+  var eBias = eMax >> 1
+  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+  var i = isLE ? 0 : (nBytes - 1)
+  var d = isLE ? 1 : -1
+  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
+ 
+  value = Math.abs(value)
+ 
+  if (isNaN(value) || value === Infinity) {
+    m = isNaN(value) ? 1 : 0
+    e = eMax
+  } else {
+    e = Math.floor(Math.log(value) / Math.LN2)
+    if (value * (c = Math.pow(2, -e)) < 1) {
+      e--
+      c *= 2
+    }
+    if (e + eBias >= 1) {
+      value += rt / c
+    } else {
+      value += rt * Math.pow(2, 1 - eBias)
+    }
+    if (value * c >= 2) {
+      e++
+      c /= 2
+    }
+ 
+    if (e + eBias >= eMax) {
+      m = 0
+      e = eMax
+    } else if (e + eBias >= 1) {
+      m = (value * c - 1) * Math.pow(2, mLen)
+      e = e + eBias
+    } else {
+      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+      e = 0
+    }
+  }
+ 
+  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+ 
+  e = (e << mLen) | m
+  eLen += mLen
+  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+ 
+  buffer[offset + i - d] |= s * 128
+}
+ 
+},{}],36:[function(require,module,exports){
+var toString = {}.toString;
+ 
+module.exports = Array.isArray || function (arr) {
+  return toString.call(arr) == '[object Array]';
+};
+ 
+},{}],37:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+function EventEmitter() {
+  this._events = this._events || {};
+  this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+ 
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+ 
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+ 
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+ 
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+  if (!isNumber(n) || n < 0 || isNaN(n))
+    throw TypeError('n must be a positive number');
+  this._maxListeners = n;
+  return this;
+};
+ 
+EventEmitter.prototype.emit = function(type) {
+  var er, handler, len, args, i, listeners;
+ 
+  if (!this._events)
+    this._events = {};
+ 
+  // If there is no 'error' event listener then throw.
+  if (type === 'error') {
+    if (!this._events.error ||
+        (isObject(this._events.error) && !this._events.error.length)) {
+      er = arguments[1];
+      if (er instanceof Error) {
+        throw er; // Unhandled 'error' event
+      }
+      throw TypeError('Uncaught, unspecified "error" event.');
+    }
+  }
+ 
+  handler = this._events[type];
+ 
+  if (isUndefined(handler))
+    return false;
+ 
+  if (isFunction(handler)) {
+    switch (arguments.length) {
+      // fast cases
+      case 1:
+        handler.call(this);
+        break;
+      case 2:
+        handler.call(this, arguments[1]);
+        break;
+      case 3:
+        handler.call(this, arguments[1], arguments[2]);
+        break;
+      // slower
+      default:
+        len = arguments.length;
+        args = new Array(len - 1);
+        for (i = 1; i < len; i++)
+          args[i - 1] = arguments[i];
+        handler.apply(this, args);
+    }
+  } else if (isObject(handler)) {
+    len = arguments.length;
+    args = new Array(len - 1);
+    for (i = 1; i < len; i++)
+      args[i - 1] = arguments[i];
+ 
+    listeners = handler.slice();
+    len = listeners.length;
+    for (i = 0; i < len; i++)
+      listeners[i].apply(this, args);
+  }
+ 
+  return true;
+};
+ 
+EventEmitter.prototype.addListener = function(type, listener) {
+  var m;
+ 
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+ 
+  if (!this._events)
+    this._events = {};
+ 
+  // To avoid recursion in the case that type === "newListener"! Before
+  // adding it to the listeners, first emit "newListener".
+  if (this._events.newListener)
+    this.emit('newListener', type,
+              isFunction(listener.listener) ?
+              listener.listener : listener);
+ 
+  if (!this._events[type])
+    // Optimize the case of one listener. Don't need the extra array object.
+    this._events[type] = listener;
+  else if (isObject(this._events[type]))
+    // If we've already got an array, just append.
+    this._events[type].push(listener);
+  else
+    // Adding the second element, need to change to array.
+    this._events[type] = [this._events[type], listener];
+ 
+  // Check for listener leak
+  if (isObject(this._events[type]) && !this._events[type].warned) {
+    var m;
+    if (!isUndefined(this._maxListeners)) {
+      m = this._maxListeners;
+    } else {
+      m = EventEmitter.defaultMaxListeners;
+    }
+ 
+    if (m && m > 0 && this._events[type].length > m) {
+      this._events[type].warned = true;
+      console.error('(node) warning: possible EventEmitter memory ' +
+                    'leak detected. %d listeners added. ' +
+                    'Use emitter.setMaxListeners() to increase limit.',
+                    this._events[type].length);
+      if (typeof console.trace === 'function') {
+        // not supported in IE 10
+        console.trace();
+      }
+    }
+  }
+ 
+  return this;
+};
+ 
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+ 
+EventEmitter.prototype.once = function(type, listener) {
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+ 
+  var fired = false;
+ 
+  function g() {
+    this.removeListener(type, g);
+ 
+    if (!fired) {
+      fired = true;
+      listener.apply(this, arguments);
+    }
+  }
+ 
+  g.listener = listener;
+  this.on(type, g);
+ 
+  return this;
+};
+ 
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+  var list, position, length, i;
+ 
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+ 
+  if (!this._events || !this._events[type])
+    return this;
+ 
+  list = this._events[type];
+  length = list.length;
+  position = -1;
+ 
+  if (list === listener ||
+      (isFunction(list.listener) && list.listener === listener)) {
+    delete this._events[type];
+    if (this._events.removeListener)
+      this.emit('removeListener', type, listener);
+ 
+  } else if (isObject(list)) {
+    for (i = length; i-- > 0;) {
+      if (list[i] === listener ||
+          (list[i].listener && list[i].listener === listener)) {
+        position = i;
+        break;
+      }
+    }
+ 
+    if (position < 0)
+      return this;
+ 
+    if (list.length === 1) {
+      list.length = 0;
+      delete this._events[type];
+    } else {
+      list.splice(position, 1);
+    }
+ 
+    if (this._events.removeListener)
+      this.emit('removeListener', type, listener);
+  }
+ 
+  return this;
+};
+ 
+EventEmitter.prototype.removeAllListeners = function(type) {
+  var key, listeners;
+ 
+  if (!this._events)
+    return this;
+ 
+  // not listening for removeListener, no need to emit
+  if (!this._events.removeListener) {
+    if (arguments.length === 0)
+      this._events = {};
+    else if (this._events[type])
+      delete this._events[type];
+    return this;
+  }
+ 
+  // emit removeListener for all listeners on all events
+  if (arguments.length === 0) {
+    for (key in this._events) {
+      if (key === 'removeListener') continue;
+      this.removeAllListeners(key);
+    }
+    this.removeAllListeners('removeListener');
+    this._events = {};
+    return this;
+  }
+ 
+  listeners = this._events[type];
+ 
+  if (isFunction(listeners)) {
+    this.removeListener(type, listeners);
+  } else {
+    // LIFO order
+    while (listeners.length)
+      this.removeListener(type, listeners[listeners.length - 1]);
+  }
+  delete this._events[type];
+ 
+  return this;
+};
+ 
+EventEmitter.prototype.listeners = function(type) {
+  var ret;
+  if (!this._events || !this._events[type])
+    ret = [];
+  else if (isFunction(this._events[type]))
+    ret = [this._events[type]];
+  else
+    ret = this._events[type].slice();
+  return ret;
+};
+ 
+EventEmitter.listenerCount = function(emitter, type) {
+  var ret;
+  if (!emitter._events || !emitter._events[type])
+    ret = 0;
+  else if (isFunction(emitter._events[type]))
+    ret = 1;
+  else
+    ret = emitter._events[type].length;
+  return ret;
+};
+ 
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+ 
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+ 
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+ 
+function isUndefined(arg) {
+  return arg === void 0;
+}
+ 
+},{}],38:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+  // implementation from standard node.js 'util' module
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    ctor.prototype = Object.create(superCtor.prototype, {
+      constructor: {
+        value: ctor,
+        enumerable: false,
+        writable: true,
+        configurable: true
+      }
+    });
+  };
+} else {
+  // old school shim for old browsers
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    var TempCtor = function () {}
+    TempCtor.prototype = superCtor.prototype
+    ctor.prototype = new TempCtor()
+    ctor.prototype.constructor = ctor
+  }
+}
+ 
+},{}],39:[function(require,module,exports){
+/**
+ * Determine if an object is Buffer
+ *
+ * Author:   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * License:  MIT
+ *
+ * `npm install is-buffer`
+ */
+ 
+module.exports = function (obj) {
+  return !!(obj != null &&
+    (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor)
+      (obj.constructor &&
+      typeof obj.constructor.isBuffer === 'function' &&
+      obj.constructor.isBuffer(obj))
+    ))
+}
+ 
+},{}],40:[function(require,module,exports){
+module.exports = Array.isArray || function (arr) {
+  return Object.prototype.toString.call(arr) == '[object Array]';
+};
+ 
+},{}],41:[function(require,module,exports){
+exports.endianness = function () { return 'LE' };
+ 
+exports.hostname = function () {
+    if (typeof location !== 'undefined') {
+        return location.hostname
+    }
+    else return '';
+};
+ 
+exports.loadavg = function () { return [] };
+ 
+exports.uptime = function () { return 0 };
+ 
+exports.freemem = function () {
+    return Number.MAX_VALUE;
+};
+ 
+exports.totalmem = function () {
+    return Number.MAX_VALUE;
+};
+ 
+exports.cpus = function () { return [] };
+ 
+exports.type = function () { return 'Browser' };
+ 
+exports.release = function () {
+    if (typeof navigator !== 'undefined') {
+        return navigator.appVersion;
+    }
+    return '';
+};
+ 
+exports.networkInterfaces
+= exports.getNetworkInterfaces
+= function () { return {} };
+ 
+exports.arch = function () { return 'javascript' };
+ 
+exports.platform = function () { return 'browser' };
+ 
+exports.tmpdir = exports.tmpDir = function () {
+    return '/tmp';
+};
+ 
+exports.EOL = '\n';
+ 
+},{}],42:[function(require,module,exports){
+// shim for using process in browser
+ 
+var process = module.exports = {};
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+ 
+function cleanUpNextTick() {
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+ 
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = setTimeout(cleanUpNextTick);
+    draining = true;
+ 
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    clearTimeout(timeout);
+}
+ 
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        setTimeout(drainQueue, 0);
+    }
+};
+ 
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+ 
+function noop() {}
+ 
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+ 
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+ 
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+ 
+},{}],43:[function(require,module,exports){
+(function (global){
+/*! https://mths.be/punycode v1.4.0 by @mathias */
+;(function(root) {
+ 
+	/** Detect free variables */
+	var freeExports = typeof exports == 'object' && exports &&
+		!exports.nodeType && exports;
+	var freeModule = typeof module == 'object' && module &&
+		!module.nodeType && module;
+	var freeGlobal = typeof global == 'object' && global;
+	if (
+		freeGlobal.global === freeGlobal ||
+		freeGlobal.window === freeGlobal ||
+		freeGlobal.self === freeGlobal
+	) {
+		root = freeGlobal;
+	}
+ 
+	/**
+	 * The `punycode` object.
+	 * @name punycode
+	 * @type Object
+	 */
+	var punycode,
+ 
+	/** Highest positive signed 32-bit float value */
+	maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
+ 
+	/** Bootstring parameters */
+	base = 36,
+	tMin = 1,
+	tMax = 26,
+	skew = 38,
+	damp = 700,
+	initialBias = 72,
+	initialN = 128, // 0x80
+	delimiter = '-', // '\x2D'
+ 
+	/** Regular expressions */
+	regexPunycode = /^xn--/,
+	regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
+	regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
+ 
+	/** Error messages */
+	errors = {
+		'overflow': 'Overflow: input needs wider integers to process',
+		'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
+		'invalid-input': 'Invalid input'
+	},
+ 
+	/** Convenience shortcuts */
+	baseMinusTMin = base - tMin,
+	floor = Math.floor,
+	stringFromCharCode = String.fromCharCode,
+ 
+	/** Temporary variable */
+	key;
+ 
+	/*--------------------------------------------------------------------------*/
+ 
+	/**
+	 * A generic error utility function.
+	 * @private
+	 * @param {String} type The error type.
+	 * @returns {Error} Throws a `RangeError` with the applicable error message.
+	 */
+	function error(type) {
+		throw new RangeError(errors[type]);
+	}
+ 
+	/**
+	 * A generic `Array#map` utility function.
+	 * @private
+	 * @param {Array} array The array to iterate over.
+	 * @param {Function} callback The function that gets called for every array
+	 * item.
+	 * @returns {Array} A new array of values returned by the callback function.
+	 */
+	function map(array, fn) {
+		var length = array.length;
+		var result = [];
+		while (length--) {
+			result[length] = fn(array[length]);
+		}
+		return result;
+	}
+ 
+	/**
+	 * A simple `Array#map`-like wrapper to work with domain name strings or email
+	 * addresses.
+	 * @private
+	 * @param {String} domain The domain name or email address.
+	 * @param {Function} callback The function that gets called for every
+	 * character.
+	 * @returns {Array} A new string of characters returned by the callback
+	 * function.
+	 */
+	function mapDomain(string, fn) {
+		var parts = string.split('@');
+		var result = '';
+		if (parts.length > 1) {
+			// In email addresses, only the domain name should be punycoded. Leave
+			// the local part (i.e. everything up to `@`) intact.
+			result = parts[0] + '@';
+			string = parts[1];
+		}
+		// Avoid `split(regex)` for IE8 compatibility. See #17.
+		string = string.replace(regexSeparators, '\x2E');
+		var labels = string.split('.');
+		var encoded = map(labels, fn).join('.');
+		return result + encoded;
+	}
+ 
+	/**
+	 * Creates an array containing the numeric code points of each Unicode
+	 * character in the string. While JavaScript uses UCS-2 internally,
+	 * this function will convert a pair of surrogate halves (each of which
+	 * UCS-2 exposes as separate characters) into a single code point,
+	 * matching UTF-16.
+	 * @see `punycode.ucs2.encode`
+	 * @see <https://mathiasbynens.be/notes/javascript-encoding>
+	 * @memberOf punycode.ucs2
+	 * @name decode
+	 * @param {String} string The Unicode input string (UCS-2).
+	 * @returns {Array} The new array of code points.
+	 */
+	function ucs2decode(string) {
+		var output = [],
+		    counter = 0,
+		    length = string.length,
+		    value,
+		    extra;
+		while (counter < length) {
+			value = string.charCodeAt(counter++);
+			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+				// high surrogate, and there is a next character
+				extra = string.charCodeAt(counter++);
+				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
+					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+				} else {
+					// unmatched surrogate; only append this code unit, in case the next
+					// code unit is the high surrogate of a surrogate pair
+					output.push(value);
+					counter--;
+				}
+			} else {
+				output.push(value);
+			}
+		}
+		return output;
+	}
+ 
+	/**
+	 * Creates a string based on an array of numeric code points.
+	 * @see `punycode.ucs2.decode`
+	 * @memberOf punycode.ucs2
+	 * @name encode
+	 * @param {Array} codePoints The array of numeric code points.
+	 * @returns {String} The new Unicode string (UCS-2).
+	 */
+	function ucs2encode(array) {
+		return map(array, function(value) {
+			var output = '';
+			if (value > 0xFFFF) {
+				value -= 0x10000;
+				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
+				value = 0xDC00 | value & 0x3FF;
+			}
+			output += stringFromCharCode(value);
+			return output;
+		}).join('');
+	}
+ 
+	/**
+	 * Converts a basic code point into a digit/integer.
+	 * @see `digitToBasic()`
+	 * @private
+	 * @param {Number} codePoint The basic numeric code point value.
+	 * @returns {Number} The numeric value of a basic code point (for use in
+	 * representing integers) in the range `0` to `base - 1`, or `base` if
+	 * the code point does not represent a value.
+	 */
+	function basicToDigit(codePoint) {
+		if (codePoint - 48 < 10) {
+			return codePoint - 22;
+		}
+		if (codePoint - 65 < 26) {
+			return codePoint - 65;
+		}
+		if (codePoint - 97 < 26) {
+			return codePoint - 97;
+		}
+		return base;
+	}
+ 
+	/**
+	 * Converts a digit/integer into a basic code point.
+	 * @see `basicToDigit()`
+	 * @private
+	 * @param {Number} digit The numeric value of a basic code point.
+	 * @returns {Number} The basic code point whose value (when used for
+	 * representing integers) is `digit`, which needs to be in the range
+	 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+	 * used; else, the lowercase form is used. The behavior is undefined
+	 * if `flag` is non-zero and `digit` has no uppercase form.
+	 */
+	function digitToBasic(digit, flag) {
+		//  0..25 map to ASCII a..z or A..Z
+		// 26..35 map to ASCII 0..9
+		return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+	}
+ 
+	/**
+	 * Bias adaptation function as per section 3.4 of RFC 3492.
+	 * https://tools.ietf.org/html/rfc3492#section-3.4
+	 * @private
+	 */
+	function adapt(delta, numPoints, firstTime) {
+		var k = 0;
+		delta = firstTime ? floor(delta / damp) : delta >> 1;
+		delta += floor(delta / numPoints);
+		for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
+			delta = floor(delta / baseMinusTMin);
+		}
+		return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+	}
+ 
+	/**
+	 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+	 * symbols.
+	 * @memberOf punycode
+	 * @param {String} input The Punycode string of ASCII-only symbols.
+	 * @returns {String} The resulting string of Unicode symbols.
+	 */
+	function decode(input) {
+		// Don't use UCS-2
+		var output = [],
+		    inputLength = input.length,
+		    out,
+		    i = 0,
+		    n = initialN,
+		    bias = initialBias,
+		    basic,
+		    j,
+		    index,
+		    oldi,
+		    w,
+		    k,
+		    digit,
+		    t,
+		    /** Cached calculation results */
+		    baseMinusT;
+ 
+		// Handle the basic code points: let `basic` be the number of input code
+		// points before the last delimiter, or `0` if there is none, then copy
+		// the first basic code points to the output.
+ 
+		basic = input.lastIndexOf(delimiter);
+		if (basic < 0) {
+			basic = 0;
+		}
+ 
+		for (j = 0; j < basic; ++j) {
+			// if it's not a basic code point
+			if (input.charCodeAt(j) >= 0x80) {
+				error('not-basic');
+			}
+			output.push(input.charCodeAt(j));
+		}
+ 
+		// Main decoding loop: start just after the last delimiter if any basic code
+		// points were copied; start at the beginning otherwise.
+ 
+		for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
+ 
+			// `index` is the index of the next character to be consumed.
+			// Decode a generalized variable-length integer into `delta`,
+			// which gets added to `i`. The overflow checking is easier
+			// if we increase `i` as we go, then subtract off its starting
+			// value at the end to obtain `delta`.
+			for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
+ 
+				if (index >= inputLength) {
+					error('invalid-input');
+				}
+ 
+				digit = basicToDigit(input.charCodeAt(index++));
+ 
+				if (digit >= base || digit > floor((maxInt - i) / w)) {
+					error('overflow');
+				}
+ 
+				i += digit * w;
+				t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+ 
+				if (digit < t) {
+					break;
+				}
+ 
+				baseMinusT = base - t;
+				if (w > floor(maxInt / baseMinusT)) {
+					error('overflow');
+				}
+ 
+				w *= baseMinusT;
+ 
+			}
+ 
+			out = output.length + 1;
+			bias = adapt(i - oldi, out, oldi == 0);
+ 
+			// `i` was supposed to wrap around from `out` to `0`,
+			// incrementing `n` each time, so we'll fix that now:
+			if (floor(i / out) > maxInt - n) {
+				error('overflow');
+			}
+ 
+			n += floor(i / out);
+			i %= out;
+ 
+			// Insert `n` at position `i` of the output
+			output.splice(i++, 0, n);
+ 
+		}
+ 
+		return ucs2encode(output);
+	}
+ 
+	/**
+	 * Converts a string of Unicode symbols (e.g. a domain name label) to a
+	 * Punycode string of ASCII-only symbols.
+	 * @memberOf punycode
+	 * @param {String} input The string of Unicode symbols.
+	 * @returns {String} The resulting Punycode string of ASCII-only symbols.
+	 */
+	function encode(input) {
+		var n,
+		    delta,
+		    handledCPCount,
+		    basicLength,
+		    bias,
+		    j,
+		    m,
+		    q,
+		    k,
+		    t,
+		    currentValue,
+		    output = [],
+		    /** `inputLength` will hold the number of code points in `input`. */
+		    inputLength,
+		    /** Cached calculation results */
+		    handledCPCountPlusOne,
+		    baseMinusT,
+		    qMinusT;
+ 
+		// Convert the input in UCS-2 to Unicode
+		input = ucs2decode(input);
+ 
+		// Cache the length
+		inputLength = input.length;
+ 
+		// Initialize the state
+		n = initialN;
+		delta = 0;
+		bias = initialBias;
+ 
+		// Handle the basic code points
+		for (j = 0; j < inputLength; ++j) {
+			currentValue = input[j];
+			if (currentValue < 0x80) {
+				output.push(stringFromCharCode(currentValue));
+			}
+		}
+ 
+		handledCPCount = basicLength = output.length;
+ 
+		// `handledCPCount` is the number of code points that have been handled;
+		// `basicLength` is the number of basic code points.
+ 
+		// Finish the basic string - if it is not empty - with a delimiter
+		if (basicLength) {
+			output.push(delimiter);
+		}
+ 
+		// Main encoding loop:
+		while (handledCPCount < inputLength) {
+ 
+			// All non-basic code points < n have been handled already. Find the next
+			// larger one:
+			for (m = maxInt, j = 0; j < inputLength; ++j) {
+				currentValue = input[j];
+				if (currentValue >= n && currentValue < m) {
+					m = currentValue;
+				}
+			}
+ 
+			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
+			// but guard against overflow
+			handledCPCountPlusOne = handledCPCount + 1;
+			if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+				error('overflow');
+			}
+ 
+			delta += (m - n) * handledCPCountPlusOne;
+			n = m;
+ 
+			for (j = 0; j < inputLength; ++j) {
+				currentValue = input[j];
+ 
+				if (currentValue < n && ++delta > maxInt) {
+					error('overflow');
+				}
+ 
+				if (currentValue == n) {
+					// Represent delta as a generalized variable-length integer
+					for (q = delta, k = base; /* no condition */; k += base) {
+						t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+						if (q < t) {
+							break;
+						}
+						qMinusT = q - t;
+						baseMinusT = base - t;
+						output.push(
+							stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
+						);
+						q = floor(qMinusT / baseMinusT);
+					}
+ 
+					output.push(stringFromCharCode(digitToBasic(q, 0)));
+					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+					delta = 0;
+					++handledCPCount;
+				}
+			}
+ 
+			++delta;
+			++n;
+ 
+		}
+		return output.join('');
+	}
+ 
+	/**
+	 * Converts a Punycode string representing a domain name or an email address
+	 * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
+	 * it doesn't matter if you call it on a string that has already been
+	 * converted to Unicode.
+	 * @memberOf punycode
+	 * @param {String} input The Punycoded domain name or email address to
+	 * convert to Unicode.
+	 * @returns {String} The Unicode representation of the given Punycode
+	 * string.
+	 */
+	function toUnicode(input) {
+		return mapDomain(input, function(string) {
+			return regexPunycode.test(string)
+				? decode(string.slice(4).toLowerCase())
+				: string;
+		});
+	}
+ 
+	/**
+	 * Converts a Unicode string representing a domain name or an email address to
+	 * Punycode. Only the non-ASCII parts of the domain name will be converted,
+	 * i.e. it doesn't matter if you call it with a domain that's already in
+	 * ASCII.
+	 * @memberOf punycode
+	 * @param {String} input The domain name or email address to convert, as a
+	 * Unicode string.
+	 * @returns {String} The Punycode representation of the given domain name or
+	 * email address.
+	 */
+	function toASCII(input) {
+		return mapDomain(input, function(string) {
+			return regexNonASCII.test(string)
+				? 'xn--' + encode(string)
+				: string;
+		});
+	}
+ 
+	/*--------------------------------------------------------------------------*/
+ 
+	/** Define the public API */
+	punycode = {
+		/**
+		 * A string representing the current Punycode.js version number.
+		 * @memberOf punycode
+		 * @type String
+		 */
+		'version': '1.3.2',
+		/**
+		 * An object of methods to convert from JavaScript's internal character
+		 * representation (UCS-2) to Unicode code points, and back.
+		 * @see <https://mathiasbynens.be/notes/javascript-encoding>
+		 * @memberOf punycode
+		 * @type Object
+		 */
+		'ucs2': {
+			'decode': ucs2decode,
+			'encode': ucs2encode
+		},
+		'decode': decode,
+		'encode': encode,
+		'toASCII': toASCII,
+		'toUnicode': toUnicode
+	};
+ 
+	/** Expose `punycode` */
+	// Some AMD build optimizers, like r.js, check for specific condition patterns
+	// like the following:
+	if (
+		typeof define == 'function' &&
+		typeof define.amd == 'object' &&
+		define.amd
+	) {
+		define('punycode', function() {
+			return punycode;
+		});
+	} else if (freeExports && freeModule) {
+		if (module.exports == freeExports) {
+			// in Node.js, io.js, or RingoJS v0.8.0+
+			freeModule.exports = punycode;
+		} else {
+			// in Narwhal or RingoJS v0.7.0-
+			for (key in punycode) {
+				punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
+			}
+		}
+	} else {
+		// in Rhino or a web browser
+		root.punycode = punycode;
+	}
+ 
+}(this));
+ 
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],44:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+'use strict';
+ 
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
+  return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+ 
+module.exports = function(qs, sep, eq, options) {
+  sep = sep || '&';
+  eq = eq || '=';
+  var obj = {};
+ 
+  if (typeof qs !== 'string' || qs.length === 0) {
+    return obj;
+  }
+ 
+  var regexp = /\+/g;
+  qs = qs.split(sep);
+ 
+  var maxKeys = 1000;
+  if (options && typeof options.maxKeys === 'number') {
+    maxKeys = options.maxKeys;
+  }
+ 
+  var len = qs.length;
+  // maxKeys <= 0 means that we should not limit keys count
+  if (maxKeys > 0 && len > maxKeys) {
+    len = maxKeys;
+  }
+ 
+  for (var i = 0; i < len; ++i) {
+    var x = qs[i].replace(regexp, '%20'),
+        idx = x.indexOf(eq),
+        kstr, vstr, k, v;
+ 
+    if (idx >= 0) {
+      kstr = x.substr(0, idx);
+      vstr = x.substr(idx + 1);
+    } else {
+      kstr = x;
+      vstr = '';
+    }
+ 
+    k = decodeURIComponent(kstr);
+    v = decodeURIComponent(vstr);
+ 
+    if (!hasOwnProperty(obj, k)) {
+      obj[k] = v;
+    } else if (isArray(obj[k])) {
+      obj[k].push(v);
+    } else {
+      obj[k] = [obj[k], v];
+    }
+  }
+ 
+  return obj;
+};
+ 
+var isArray = Array.isArray || function (xs) {
+  return Object.prototype.toString.call(xs) === '[object Array]';
+};
+ 
+},{}],45:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+'use strict';
+ 
+var stringifyPrimitive = function(v) {
+  switch (typeof v) {
+    case 'string':
+      return v;
+ 
+    case 'boolean':
+      return v ? 'true' : 'false';
+ 
+    case 'number':
+      return isFinite(v) ? v : '';
+ 
+    default:
+      return '';
+  }
+};
+ 
+module.exports = function(obj, sep, eq, name) {
+  sep = sep || '&';
+  eq = eq || '=';
+  if (obj === null) {
+    obj = undefined;
+  }
+ 
+  if (typeof obj === 'object') {
+    return map(objectKeys(obj), function(k) {
+      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+      if (isArray(obj[k])) {
+        return map(obj[k], function(v) {
+          return ks + encodeURIComponent(stringifyPrimitive(v));
+        }).join(sep);
+      } else {
+        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+      }
+    }).join(sep);
+ 
+  }
+ 
+  if (!name) return '';
+  return encodeURIComponent(stringifyPrimitive(name)) + eq +
+         encodeURIComponent(stringifyPrimitive(obj));
+};
+ 
+var isArray = Array.isArray || function (xs) {
+  return Object.prototype.toString.call(xs) === '[object Array]';
+};
+ 
+function map (xs, f) {
+  if (xs.map) return xs.map(f);
+  var res = [];
+  for (var i = 0; i < xs.length; i++) {
+    res.push(f(xs[i], i));
+  }
+  return res;
+}
+ 
+var objectKeys = Object.keys || function (obj) {
+  var res = [];
+  for (var key in obj) {
+    if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+  }
+  return res;
+};
+ 
+},{}],46:[function(require,module,exports){
+'use strict';
+ 
+exports.decode = exports.parse = require('./decode');
+exports.encode = exports.stringify = require('./encode');
+ 
+},{"./decode":44,"./encode":45}],47:[function(require,module,exports){
+module.exports = require("./lib/_stream_duplex.js")
+ 
+},{"./lib/_stream_duplex.js":48}],48:[function(require,module,exports){
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+ 
+'use strict';
+ 
+/*<replacement>*/
+var objectKeys = Object.keys || function (obj) {
+  var keys = [];
+  for (var key in obj) keys.push(key);
+  return keys;
+}
+/*</replacement>*/
+ 
+ 
+module.exports = Duplex;
+ 
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+ 
+ 
+ 
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+ 
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+ 
+util.inherits(Duplex, Readable);
+ 
+var keys = objectKeys(Writable.prototype);
+for (var v = 0; v < keys.length; v++) {
+  var method = keys[v];
+  if (!Duplex.prototype[method])
+    Duplex.prototype[method] = Writable.prototype[method];
+}
+ 
+function Duplex(options) {
+  if (!(this instanceof Duplex))
+    return new Duplex(options);
+ 
+  Readable.call(this, options);
+  Writable.call(this, options);
+ 
+  if (options && options.readable === false)
+    this.readable = false;
+ 
+  if (options && options.writable === false)
+    this.writable = false;
+ 
+  this.allowHalfOpen = true;
+  if (options && options.allowHalfOpen === false)
+    this.allowHalfOpen = false;
+ 
+  this.once('end', onend);
+}
+ 
+// the no-half-open enforcer
+function onend() {
+  // if we allow half-open state, or if the writable side ended,
+  // then we're ok.
+  if (this.allowHalfOpen || this._writableState.ended)
+    return;
+ 
+  // no more data can be written.
+  // But allow more writes to happen in this tick.
+  processNextTick(onEndNT, this);
+}
+ 
+function onEndNT(self) {
+  self.end();
+}
+ 
+function forEach (xs, f) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    f(xs[i], i);
+  }
+}
+ 
+},{"./_stream_readable":50,"./_stream_writable":52,"core-util-is":53,"inherits":38,"process-nextick-args":54}],49:[function(require,module,exports){
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+ 
+'use strict';
+ 
+module.exports = PassThrough;
+ 
+var Transform = require('./_stream_transform');
+ 
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+ 
+util.inherits(PassThrough, Transform);
+ 
+function PassThrough(options) {
+  if (!(this instanceof PassThrough))
+    return new PassThrough(options);
+ 
+  Transform.call(this, options);
+}
+ 
+PassThrough.prototype._transform = function(chunk, encoding, cb) {
+  cb(null, chunk);
+};
+ 
+},{"./_stream_transform":51,"core-util-is":53,"inherits":38}],50:[function(require,module,exports){
+(function (process){
+'use strict';
+ 
+module.exports = Readable;
+ 
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+ 
+ 
+/*<replacement>*/
+var isArray = require('isarray');
+/*</replacement>*/
+ 
+ 
+/*<replacement>*/
+var Buffer = require('buffer').Buffer;
+/*</replacement>*/
+ 
+Readable.ReadableState = ReadableState;
+ 
+var EE = require('events');
+ 
+/*<replacement>*/
+var EElistenerCount = function(emitter, type) {
+  return emitter.listeners(type).length;
+};
+/*</replacement>*/
+ 
+ 
+ 
+/*<replacement>*/
+var Stream;
+(function (){try{
+  Stream = require('st' + 'ream');
+}catch(_){}finally{
+  if (!Stream)
+    Stream = require('events').EventEmitter;
+}}())
+/*</replacement>*/
+ 
+var Buffer = require('buffer').Buffer;
+ 
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+ 
+ 
+ 
+/*<replacement>*/
+var debugUtil = require('util');
+var debug;
+if (debugUtil && debugUtil.debuglog) {
+  debug = debugUtil.debuglog('stream');
+} else {
+  debug = function () {};
+}
+/*</replacement>*/
+ 
+var StringDecoder;
+ 
+util.inherits(Readable, Stream);
+ 
+var Duplex;
+function ReadableState(options, stream) {
+  Duplex = Duplex || require('./_stream_duplex');
+ 
+  options = options || {};
+ 
+  // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+  this.objectMode = !!options.objectMode;
+ 
+  if (stream instanceof Duplex)
+    this.objectMode = this.objectMode || !!options.readableObjectMode;
+ 
+  // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+  var hwm = options.highWaterMark;
+  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+  this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;
+ 
+  // cast to ints.
+  this.highWaterMark = ~~this.highWaterMark;
+ 
+  this.buffer = [];
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = null;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false;
+ 
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, because any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+ 
+  // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+ 
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+ 
+  // when piping, we only care about 'readable' events that happen
+  // after read()ing all the bytes and not getting any pushback.
+  this.ranOut = false;
+ 
+  // the number of writers that are awaiting a drain event in .pipe()s
+  this.awaitDrain = 0;
+ 
+  // if true, a maybeReadMore has been scheduled
+  this.readingMore = false;
+ 
+  this.decoder = null;
+  this.encoding = null;
+  if (options.encoding) {
+    if (!StringDecoder)
+      StringDecoder = require('string_decoder/').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+ 
+var Duplex;
+function Readable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+ 
+  if (!(this instanceof Readable))
+    return new Readable(options);
+ 
+  this._readableState = new ReadableState(options, this);
+ 
+  // legacy
+  this.readable = true;
+ 
+  if (options && typeof options.read === 'function')
+    this._read = options.read;
+ 
+  Stream.call(this);
+}
+ 
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function(chunk, encoding) {
+  var state = this._readableState;
+ 
+  if (!state.objectMode && typeof chunk === 'string') {
+    encoding = encoding || state.defaultEncoding;
+    if (encoding !== state.encoding) {
+      chunk = new Buffer(chunk, encoding);
+      encoding = '';
+    }
+  }
+ 
+  return readableAddChunk(this, state, chunk, encoding, false);
+};
+ 
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function(chunk) {
+  var state = this._readableState;
+  return readableAddChunk(this, state, chunk, '', true);
+};
+ 
+Readable.prototype.isPaused = function() {
+  return this._readableState.flowing === false;
+};
+ 
+function readableAddChunk(stream, state, chunk, encoding, addToFront) {
+  var er = chunkInvalid(state, chunk);
+  if (er) {
+    stream.emit('error', er);
+  } else if (chunk === null) {
+    state.reading = false;
+    onEofChunk(stream, state);
+  } else if (state.objectMode || chunk && chunk.length > 0) {
+    if (state.ended && !addToFront) {
+      var e = new Error('stream.push() after EOF');
+      stream.emit('error', e);
+    } else if (state.endEmitted && addToFront) {
+      var e = new Error('stream.unshift() after end event');
+      stream.emit('error', e);
+    } else {
+      if (state.decoder && !addToFront && !encoding)
+        chunk = state.decoder.write(chunk);
+ 
+      if (!addToFront)
+        state.reading = false;
+ 
+      // if we want the data now, just emit it.
+      if (state.flowing && state.length === 0 && !state.sync) {
+        stream.emit('data', chunk);
+        stream.read(0);
+      } else {
+        // update the buffer info.
+        state.length += state.objectMode ? 1 : chunk.length;
+        if (addToFront)
+          state.buffer.unshift(chunk);
+        else
+          state.buffer.push(chunk);
+ 
+        if (state.needReadable)
+          emitReadable(stream);
+      }
+ 
+      maybeReadMore(stream, state);
+    }
+  } else if (!addToFront) {
+    state.reading = false;
+  }
+ 
+  return needMoreData(state);
+}
+ 
+ 
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes.  This is to work around cases where hwm=0,
+// such as the repl.  Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+  return !state.ended &&
+         (state.needReadable ||
+          state.length < state.highWaterMark ||
+          state.length === 0);
+}
+ 
+// backwards compatibility.
+Readable.prototype.setEncoding = function(enc) {
+  if (!StringDecoder)
+    StringDecoder = require('string_decoder/').StringDecoder;
+  this._readableState.decoder = new StringDecoder(enc);
+  this._readableState.encoding = enc;
+  return this;
+};
+ 
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+  if (n >= MAX_HWM) {
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2
+    n--;
+    n |= n >>> 1;
+    n |= n >>> 2;
+    n |= n >>> 4;
+    n |= n >>> 8;
+    n |= n >>> 16;
+    n++;
+  }
+  return n;
+}
+ 
+function howMuchToRead(n, state) {
+  if (state.length === 0 && state.ended)
+    return 0;
+ 
+  if (state.objectMode)
+    return n === 0 ? 0 : 1;
+ 
+  if (n === null || isNaN(n)) {
+    // only flow one buffer at a time
+    if (state.flowing && state.buffer.length)
+      return state.buffer[0].length;
+    else
+      return state.length;
+  }
+ 
+  if (n <= 0)
+    return 0;
+ 
+  // If we're asking for more than the target buffer level,
+  // then raise the water mark.  Bump up to the next highest
+  // power of 2, to prevent increasing it excessively in tiny
+  // amounts.
+  if (n > state.highWaterMark)
+    state.highWaterMark = computeNewHighWaterMark(n);
+ 
+  // don't have that much.  return null, unless we've ended.
+  if (n > state.length) {
+    if (!state.ended) {
+      state.needReadable = true;
+      return 0;
+    } else {
+      return state.length;
+    }
+  }
+ 
+  return n;
+}
+ 
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function(n) {
+  debug('read', n);
+  var state = this._readableState;
+  var nOrig = n;
+ 
+  if (typeof n !== 'number' || n > 0)
+    state.emittedReadable = false;
+ 
+  // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+  if (n === 0 &&
+      state.needReadable &&
+      (state.length >= state.highWaterMark || state.ended)) {
+    debug('read: emitReadable', state.length, state.ended);
+    if (state.length === 0 && state.ended)
+      endReadable(this);
+    else
+      emitReadable(this);
+    return null;
+  }
+ 
+  n = howMuchToRead(n, state);
+ 
+  // if we've ended, and we're now clear, then finish it up.
+  if (n === 0 && state.ended) {
+    if (state.length === 0)
+      endReadable(this);
+    return null;
+  }
+ 
+  // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+ 
+  // if we need a readable event, then we need to do some reading.
+  var doRead = state.needReadable;
+  debug('need readable', doRead);
+ 
+  // if we currently have less than the highWaterMark, then also read some
+  if (state.length === 0 || state.length - n < state.highWaterMark) {
+    doRead = true;
+    debug('length less than watermark', doRead);
+  }
+ 
+  // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+  if (state.ended || state.reading) {
+    doRead = false;
+    debug('reading or ended', doRead);
+  }
+ 
+  if (doRead) {
+    debug('do read');
+    state.reading = true;
+    state.sync = true;
+    // if the length is currently zero, then we *need* a readable event.
+    if (state.length === 0)
+      state.needReadable = true;
+    // call internal read method
+    this._read(state.highWaterMark);
+    state.sync = false;
+  }
+ 
+  // If _read pushed data synchronously, then `reading` will be false,
+  // and we need to re-evaluate how much data we can return to the user.
+  if (doRead && !state.reading)
+    n = howMuchToRead(nOrig, state);
+ 
+  var ret;
+  if (n > 0)
+    ret = fromList(n, state);
+  else
+    ret = null;
+ 
+  if (ret === null) {
+    state.needReadable = true;
+    n = 0;
+  }
+ 
+  state.length -= n;
+ 
+  // If we have nothing in the buffer, then we want to know
+  // as soon as we *do* get something into the buffer.
+  if (state.length === 0 && !state.ended)
+    state.needReadable = true;
+ 
+  // If we tried to read() past the EOF, then emit end on the next tick.
+  if (nOrig !== n && state.ended && state.length === 0)
+    endReadable(this);
+ 
+  if (ret !== null)
+    this.emit('data', ret);
+ 
+  return ret;
+};
+ 
+function chunkInvalid(state, chunk) {
+  var er = null;
+  if (!(Buffer.isBuffer(chunk)) &&
+      typeof chunk !== 'string' &&
+      chunk !== null &&
+      chunk !== undefined &&
+      !state.objectMode) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  return er;
+}
+ 
+ 
+function onEofChunk(stream, state) {
+  if (state.ended) return;
+  if (state.decoder) {
+    var chunk = state.decoder.end();
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+  state.ended = true;
+ 
+  // emit 'readable' now to make sure it gets picked up.
+  emitReadable(stream);
+}
+ 
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+  var state = stream._readableState;
+  state.needReadable = false;
+  if (!state.emittedReadable) {
+    debug('emitReadable', state.flowing);
+    state.emittedReadable = true;
+    if (state.sync)
+      processNextTick(emitReadable_, stream);
+    else
+      emitReadable_(stream);
+  }
+}
+ 
+function emitReadable_(stream) {
+  debug('emit readable');
+  stream.emit('readable');
+  flow(stream);
+}
+ 
+ 
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    processNextTick(maybeReadMore_, stream, state);
+  }
+}
+ 
+function maybeReadMore_(stream, state) {
+  var len = state.length;
+  while (!state.reading && !state.flowing && !state.ended &&
+         state.length < state.highWaterMark) {
+    debug('maybeReadMore read 0');
+    stream.read(0);
+    if (len === state.length)
+      // didn't get any data, stop spinning.
+      break;
+    else
+      len = state.length;
+  }
+  state.readingMore = false;
+}
+ 
+// abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function(n) {
+  this.emit('error', new Error('not implemented'));
+};
+ 
+Readable.prototype.pipe = function(dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+ 
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+  state.pipesCount += 1;
+  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+ 
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
+              dest !== process.stdout &&
+              dest !== process.stderr;
+ 
+  var endFn = doEnd ? onend : cleanup;
+  if (state.endEmitted)
+    processNextTick(endFn);
+  else
+    src.once('end', endFn);
+ 
+  dest.on('unpipe', onunpipe);
+  function onunpipe(readable) {
+    debug('onunpipe');
+    if (readable === src) {
+      cleanup();
+    }
+  }
+ 
+  function onend() {
+    debug('onend');
+    dest.end();
+  }
+ 
+  // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+ 
+  var cleanedUp = false;
+  function cleanup() {
+    debug('cleanup');
+    // cleanup event handlers once the pipe is broken
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', cleanup);
+    src.removeListener('data', ondata);
+ 
+    cleanedUp = true;
+ 
+    // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+    if (state.awaitDrain &&
+        (!dest._writableState || dest._writableState.needDrain))
+      ondrain();
+  }
+ 
+  src.on('data', ondata);
+  function ondata(chunk) {
+    debug('ondata');
+    var ret = dest.write(chunk);
+    if (false === ret) {
+      // If the user unpiped during `dest.write()`, it is possible
+      // to get stuck in a permanently paused state if that write
+      // also returned false.
+      if (state.pipesCount === 1 &&
+          state.pipes[0] === dest &&
+          src.listenerCount('data') === 1 &&
+          !cleanedUp) {
+        debug('false write response, pause', src._readableState.awaitDrain);
+        src._readableState.awaitDrain++;
+      }
+      src.pause();
+    }
+  }
+ 
+  // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+  function onerror(er) {
+    debug('onerror', er);
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EElistenerCount(dest, 'error') === 0)
+      dest.emit('error', er);
+  }
+  // This is a brutally ugly hack to make sure that our error handler
+  // is attached before any userland ones.  NEVER DO THIS.
+  if (!dest._events || !dest._events.error)
+    dest.on('error', onerror);
+  else if (isArray(dest._events.error))
+    dest._events.error.unshift(onerror);
+  else
+    dest._events.error = [onerror, dest._events.error];
+ 
+ 
+  // Both close and finish should trigger unpipe, but only once.
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+  dest.once('close', onclose);
+  function onfinish() {
+    debug('onfinish');
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+  dest.once('finish', onfinish);
+ 
+  function unpipe() {
+    debug('unpipe');
+    src.unpipe(dest);
+  }
+ 
+  // tell the dest that it's being piped to
+  dest.emit('pipe', src);
+ 
+  // start the flow if it hasn't been started already.
+  if (!state.flowing) {
+    debug('pipe resume');
+    src.resume();
+  }
+ 
+  return dest;
+};
+ 
+function pipeOnDrain(src) {
+  return function() {
+    var state = src._readableState;
+    debug('pipeOnDrain', state.awaitDrain);
+    if (state.awaitDrain)
+      state.awaitDrain--;
+    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+      state.flowing = true;
+      flow(src);
+    }
+  };
+}
+ 
+ 
+Readable.prototype.unpipe = function(dest) {
+  var state = this._readableState;
+ 
+  // if we're not piping anywhere, then do nothing.
+  if (state.pipesCount === 0)
+    return this;
+ 
+  // just one destination.  most common case.
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes)
+      return this;
+ 
+    if (!dest)
+      dest = state.pipes;
+ 
+    // got a match.
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+    if (dest)
+      dest.emit('unpipe', this);
+    return this;
+  }
+ 
+  // slow case. multiple pipe destinations.
+ 
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    state.flowing = false;
+ 
+    for (var i = 0; i < len; i++)
+      dests[i].emit('unpipe', this);
+    return this;
+  }
+ 
+  // try to find the right one.
+  var i = indexOf(state.pipes, dest);
+  if (i === -1)
+    return this;
+ 
+  state.pipes.splice(i, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1)
+    state.pipes = state.pipes[0];
+ 
+  dest.emit('unpipe', this);
+ 
+  return this;
+};
+ 
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function(ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+ 
+  // If listening to data, and it has not explicitly been paused,
+  // then call resume to start the flow of data on the next tick.
+  if (ev === 'data' && false !== this._readableState.flowing) {
+    this.resume();
+  }
+ 
+  if (ev === 'readable' && this.readable) {
+    var state = this._readableState;
+    if (!state.readableListening) {
+      state.readableListening = true;
+      state.emittedReadable = false;
+      state.needReadable = true;
+      if (!state.reading) {
+        processNextTick(nReadingNextTick, this);
+      } else if (state.length) {
+        emitReadable(this, state);
+      }
+    }
+  }
+ 
+  return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+ 
+function nReadingNextTick(self) {
+  debug('readable nexttick read 0');
+  self.read(0);
+}
+ 
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function() {
+  var state = this._readableState;
+  if (!state.flowing) {
+    debug('resume');
+    state.flowing = true;
+    resume(this, state);
+  }
+  return this;
+};
+ 
+function resume(stream, state) {
+  if (!state.resumeScheduled) {
+    state.resumeScheduled = true;
+    processNextTick(resume_, stream, state);
+  }
+}
+ 
+function resume_(stream, state) {
+  if (!state.reading) {
+    debug('resume read 0');
+    stream.read(0);
+  }
+ 
+  state.resumeScheduled = false;
+  stream.emit('resume');
+  flow(stream);
+  if (state.flowing && !state.reading)
+    stream.read(0);
+}
+ 
+Readable.prototype.pause = function() {
+  debug('call pause flowing=%j', this._readableState.flowing);
+  if (false !== this._readableState.flowing) {
+    debug('pause');
+    this._readableState.flowing = false;
+    this.emit('pause');
+  }
+  return this;
+};
+ 
+function flow(stream) {
+  var state = stream._readableState;
+  debug('flow', state.flowing);
+  if (state.flowing) {
+    do {
+      var chunk = stream.read();
+    } while (null !== chunk && state.flowing);
+  }
+}
+ 
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function(stream) {
+  var state = this._readableState;
+  var paused = false;
+ 
+  var self = this;
+  stream.on('end', function() {
+    debug('wrapped end');
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length)
+        self.push(chunk);
+    }
+ 
+    self.push(null);
+  });
+ 
+  stream.on('data', function(chunk) {
+    debug('wrapped data');
+    if (state.decoder)
+      chunk = state.decoder.write(chunk);
+ 
+    // don't skip over falsy values in objectMode
+    if (state.objectMode && (chunk === null || chunk === undefined))
+      return;
+    else if (!state.objectMode && (!chunk || !chunk.length))
+      return;
+ 
+    var ret = self.push(chunk);
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  });
+ 
+  // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+  for (var i in stream) {
+    if (this[i] === undefined && typeof stream[i] === 'function') {
+      this[i] = function(method) { return function() {
+        return stream[method].apply(stream, arguments);
+      }; }(i);
+    }
+  }
+ 
+  // proxy certain important events.
+  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
+  forEach(events, function(ev) {
+    stream.on(ev, self.emit.bind(self, ev));
+  });
+ 
+  // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+  self._read = function(n) {
+    debug('wrapped _read', n);
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+ 
+  return self;
+};
+ 
+ 
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+ 
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+function fromList(n, state) {
+  var list = state.buffer;
+  var length = state.length;
+  var stringMode = !!state.decoder;
+  var objectMode = !!state.objectMode;
+  var ret;
+ 
+  // nothing in the list, definitely empty.
+  if (list.length === 0)
+    return null;
+ 
+  if (length === 0)
+    ret = null;
+  else if (objectMode)
+    ret = list.shift();
+  else if (!n || n >= length) {
+    // read it all, truncate the array.
+    if (stringMode)
+      ret = list.join('');
+    else if (list.length === 1)
+      ret = list[0];
+    else
+      ret = Buffer.concat(list, length);
+    list.length = 0;
+  } else {
+    // read just some of it.
+    if (n < list[0].length) {
+      // just take a part of the first list item.
+      // slice is the same for buffers and strings.
+      var buf = list[0];
+      ret = buf.slice(0, n);
+      list[0] = buf.slice(n);
+    } else if (n === list[0].length) {
+      // first list is a perfect match
+      ret = list.shift();
+    } else {
+      // complex case.
+      // we have enough to cover it, but it spans past the first buffer.
+      if (stringMode)
+        ret = '';
+      else
+        ret = new Buffer(n);
+ 
+      var c = 0;
+      for (var i = 0, l = list.length; i < l && c < n; i++) {
+        var buf = list[0];
+        var cpy = Math.min(n - c, buf.length);
+ 
+        if (stringMode)
+          ret += buf.slice(0, cpy);
+        else
+          buf.copy(ret, c, 0, cpy);
+ 
+        if (cpy < buf.length)
+          list[0] = buf.slice(cpy);
+        else
+          list.shift();
+ 
+        c += cpy;
+      }
+    }
+  }
+ 
+  return ret;
+}
+ 
+function endReadable(stream) {
+  var state = stream._readableState;
+ 
+  // If we get here before consuming all the bytes, then that is a
+  // bug in node.  Should never happen.
+  if (state.length > 0)
+    throw new Error('endReadable called on non-empty stream');
+ 
+  if (!state.endEmitted) {
+    state.ended = true;
+    processNextTick(endReadableNT, state, stream);
+  }
+}
+ 
+function endReadableNT(state, stream) {
+  // Check that we didn't get one last unshift.
+  if (!state.endEmitted && state.length === 0) {
+    state.endEmitted = true;
+    stream.readable = false;
+    stream.emit('end');
+  }
+}
+ 
+function forEach (xs, f) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    f(xs[i], i);
+  }
+}
+ 
+function indexOf (xs, x) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    if (xs[i] === x) return i;
+  }
+  return -1;
+}
+ 
+}).call(this,require('_process'))
+},{"./_stream_duplex":48,"_process":42,"buffer":33,"core-util-is":53,"events":37,"inherits":38,"isarray":40,"process-nextick-args":54,"string_decoder/":70,"util":32}],51:[function(require,module,exports){
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+ 
+'use strict';
+ 
+module.exports = Transform;
+ 
+var Duplex = require('./_stream_duplex');
+ 
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+ 
+util.inherits(Transform, Duplex);
+ 
+ 
+function TransformState(stream) {
+  this.afterTransform = function(er, data) {
+    return afterTransform(stream, er, data);
+  };
+ 
+  this.needTransform = false;
+  this.transforming = false;
+  this.writecb = null;
+  this.writechunk = null;
+}
+ 
+function afterTransform(stream, er, data) {
+  var ts = stream._transformState;
+  ts.transforming = false;
+ 
+  var cb = ts.writecb;
+ 
+  if (!cb)
+    return stream.emit('error', new Error('no writecb in Transform class'));
+ 
+  ts.writechunk = null;
+  ts.writecb = null;
+ 
+  if (data !== null && data !== undefined)
+    stream.push(data);
+ 
+  if (cb)
+    cb(er);
+ 
+  var rs = stream._readableState;
+  rs.reading = false;
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    stream._read(rs.highWaterMark);
+  }
+}
+ 
+ 
+function Transform(options) {
+  if (!(this instanceof Transform))
+    return new Transform(options);
+ 
+  Duplex.call(this, options);
+ 
+  this._transformState = new TransformState(this);
+ 
+  // when the writable side finishes, then flush out anything remaining.
+  var stream = this;
+ 
+  // start out asking for a readable event once data is transformed.
+  this._readableState.needReadable = true;
+ 
+  // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+  this._readableState.sync = false;
+ 
+  if (options) {
+    if (typeof options.transform === 'function')
+      this._transform = options.transform;
+ 
+    if (typeof options.flush === 'function')
+      this._flush = options.flush;
+  }
+ 
+  this.once('prefinish', function() {
+    if (typeof this._flush === 'function')
+      this._flush(function(er) {
+        done(stream, er);
+      });
+    else
+      done(stream);
+  });
+}
+ 
+Transform.prototype.push = function(chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+};
+ 
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function(chunk, encoding, cb) {
+  throw new Error('not implemented');
+};
+ 
+Transform.prototype._write = function(chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform ||
+        rs.needReadable ||
+        rs.length < rs.highWaterMark)
+      this._read(rs.highWaterMark);
+  }
+};
+ 
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function(n) {
+  var ts = this._transformState;
+ 
+  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+    ts.transforming = true;
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+ 
+ 
+function done(stream, er) {
+  if (er)
+    return stream.emit('error', er);
+ 
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+  var ws = stream._writableState;
+  var ts = stream._transformState;
+ 
+  if (ws.length)
+    throw new Error('calling transform done when ws.length != 0');
+ 
+  if (ts.transforming)
+    throw new Error('calling transform done when still transforming');
+ 
+  return stream.push(null);
+}
+ 
+},{"./_stream_duplex":48,"core-util-is":53,"inherits":38}],52:[function(require,module,exports){
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+ 
+'use strict';
+ 
+module.exports = Writable;
+ 
+/*<replacement>*/
+var processNextTick = require('process-nextick-args');
+/*</replacement>*/
+ 
+ 
+/*<replacement>*/
+var Buffer = require('buffer').Buffer;
+/*</replacement>*/
+ 
+Writable.WritableState = WritableState;
+ 
+ 
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+ 
+ 
+/*<replacement>*/
+var internalUtil = {
+  deprecate: require('util-deprecate')
+};
+/*</replacement>*/
+ 
+ 
+ 
+/*<replacement>*/
+var Stream;
+(function (){try{
+  Stream = require('st' + 'ream');
+}catch(_){}finally{
+  if (!Stream)
+    Stream = require('events').EventEmitter;
+}}())
+/*</replacement>*/
+ 
+var Buffer = require('buffer').Buffer;
+ 
+util.inherits(Writable, Stream);
+ 
+function nop() {}
+ 
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+  this.next = null;
+}
+ 
+var Duplex;
+function WritableState(options, stream) {
+  Duplex = Duplex || require('./_stream_duplex');
+ 
+  options = options || {};
+ 
+  // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+  this.objectMode = !!options.objectMode;
+ 
+  if (stream instanceof Duplex)
+    this.objectMode = this.objectMode || !!options.writableObjectMode;
+ 
+  // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+  var hwm = options.highWaterMark;
+  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+  this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;
+ 
+  // cast to ints.
+  this.highWaterMark = ~~this.highWaterMark;
+ 
+  this.needDrain = false;
+  // at the start of calling end()
+  this.ending = false;
+  // when end() has been called, and returned
+  this.ended = false;
+  // when 'finish' is emitted
+  this.finished = false;
+ 
+  // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode;
+ 
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+ 
+  // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+  this.length = 0;
+ 
+  // a flag to see when we're in the middle of a write.
+  this.writing = false;
+ 
+  // when true all writes will be buffered until .uncork() call
+  this.corked = 0;
+ 
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, because any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+ 
+  // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+  this.bufferProcessing = false;
+ 
+  // the callback that's passed to _write(chunk,cb)
+  this.onwrite = function(er) {
+    onwrite(stream, er);
+  };
+ 
+  // the callback that the user supplies to write(chunk,encoding,cb)
+  this.writecb = null;
+ 
+  // the amount that is being written when _write is called.
+  this.writelen = 0;
+ 
+  this.bufferedRequest = null;
+  this.lastBufferedRequest = null;
+ 
+  // number of pending user-supplied write callbacks
+  // this must be 0 before 'finish' can be emitted
+  this.pendingcb = 0;
+ 
+  // emit prefinish if the only thing we're waiting for is _write cbs
+  // This is relevant for synchronous Transform streams
+  this.prefinished = false;
+ 
+  // True if the error was already emitted and should not be thrown again
+  this.errorEmitted = false;
+}
+ 
+WritableState.prototype.getBuffer = function writableStateGetBuffer() {
+  var current = this.bufferedRequest;
+  var out = [];
+  while (current) {
+    out.push(current);
+    current = current.next;
+  }
+  return out;
+};
+ 
+(function (){try {
+Object.defineProperty(WritableState.prototype, 'buffer', {
+  get: internalUtil.deprecate(function() {
+    return this.getBuffer();
+  }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' +
+     'instead.')
+});
+}catch(_){}}());
+ 
+ 
+var Duplex;
+function Writable(options) {
+  Duplex = Duplex || require('./_stream_duplex');
+ 
+  // Writable ctor is applied to Duplexes, though they're not
+  // instanceof Writable, they're instanceof Readable.
+  if (!(this instanceof Writable) && !(this instanceof Duplex))
+    return new Writable(options);
+ 
+  this._writableState = new WritableState(options, this);
+ 
+  // legacy.
+  this.writable = true;
+ 
+  if (options) {
+    if (typeof options.write === 'function')
+      this._write = options.write;
+ 
+    if (typeof options.writev === 'function')
+      this._writev = options.writev;
+  }
+ 
+  Stream.call(this);
+}
+ 
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function() {
+  this.emit('error', new Error('Cannot pipe. Not readable.'));
+};
+ 
+ 
+function writeAfterEnd(stream, cb) {
+  var er = new Error('write after end');
+  // TODO: defer error events consistently everywhere, not just the cb
+  stream.emit('error', er);
+  processNextTick(cb, er);
+}
+ 
+// If we get something that is not a buffer, string, null, or undefined,
+// and we're not in objectMode, then that's an error.
+// Otherwise stream chunks are all considered to be of length=1, and the
+// watermarks determine how many objects to keep in the buffer, rather than
+// how many bytes or characters.
+function validChunk(stream, state, chunk, cb) {
+  var valid = true;
+ 
+  if (!(Buffer.isBuffer(chunk)) &&
+      typeof chunk !== 'string' &&
+      chunk !== null &&
+      chunk !== undefined &&
+      !state.objectMode) {
+    var er = new TypeError('Invalid non-string/buffer chunk');
+    stream.emit('error', er);
+    processNextTick(cb, er);
+    valid = false;
+  }
+  return valid;
+}
+ 
+Writable.prototype.write = function(chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+ 
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+ 
+  if (Buffer.isBuffer(chunk))
+    encoding = 'buffer';
+  else if (!encoding)
+    encoding = state.defaultEncoding;
+ 
+  if (typeof cb !== 'function')
+    cb = nop;
+ 
+  if (state.ended)
+    writeAfterEnd(this, cb);
+  else if (validChunk(this, state, chunk, cb)) {
+    state.pendingcb++;
+    ret = writeOrBuffer(this, state, chunk, encoding, cb);
+  }
+ 
+  return ret;
+};
+ 
+Writable.prototype.cork = function() {
+  var state = this._writableState;
+ 
+  state.corked++;
+};
+ 
+Writable.prototype.uncork = function() {
+  var state = this._writableState;
+ 
+  if (state.corked) {
+    state.corked--;
+ 
+    if (!state.writing &&
+        !state.corked &&
+        !state.finished &&
+        !state.bufferProcessing &&
+        state.bufferedRequest)
+      clearBuffer(this, state);
+  }
+};
+ 
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+  // node::ParseEncoding() requires lower case.
+  if (typeof encoding === 'string')
+    encoding = encoding.toLowerCase();
+  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64',
+'ucs2', 'ucs-2','utf16le', 'utf-16le', 'raw']
+.indexOf((encoding + '').toLowerCase()) > -1))
+    throw new TypeError('Unknown encoding: ' + encoding);
+  this._writableState.defaultEncoding = encoding;
+};
+ 
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode &&
+      state.decodeStrings !== false &&
+      typeof chunk === 'string') {
+    chunk = new Buffer(chunk, encoding);
+  }
+  return chunk;
+}
+ 
+// if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, chunk, encoding, cb) {
+  chunk = decodeChunk(state, chunk, encoding);
+ 
+  if (Buffer.isBuffer(chunk))
+    encoding = 'buffer';
+  var len = state.objectMode ? 1 : chunk.length;
+ 
+  state.length += len;
+ 
+  var ret = state.length < state.highWaterMark;
+  // we must ensure that previous needDrain will not be reset to false.
+  if (!ret)
+    state.needDrain = true;
+ 
+  if (state.writing || state.corked) {
+    var last = state.lastBufferedRequest;
+    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
+    if (last) {
+      last.next = state.lastBufferedRequest;
+    } else {
+      state.bufferedRequest = state.lastBufferedRequest;
+    }
+  } else {
+    doWrite(stream, state, false, len, chunk, encoding, cb);
+  }
+ 
+  return ret;
+}
+ 
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  if (writev)
+    stream._writev(chunk, state.onwrite);
+  else
+    stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+ 
+function onwriteError(stream, state, sync, er, cb) {
+  --state.pendingcb;
+  if (sync)
+    processNextTick(cb, er);
+  else
+    cb(er);
+ 
+  stream._writableState.errorEmitted = true;
+  stream.emit('error', er);
+}
+ 
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+ 
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+ 
+  onwriteStateUpdate(state);
+ 
+  if (er)
+    onwriteError(stream, state, sync, er, cb);
+  else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(state);
+ 
+    if (!finished &&
+        !state.corked &&
+        !state.bufferProcessing &&
+        state.bufferedRequest) {
+      clearBuffer(stream, state);
+    }
+ 
+    if (sync) {
+      processNextTick(afterWrite, stream, state, finished, cb);
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+ 
+function afterWrite(stream, state, finished, cb) {
+  if (!finished)
+    onwriteDrain(stream, state);
+  state.pendingcb--;
+  cb();
+  finishMaybe(stream, state);
+}
+ 
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+}
+ 
+ 
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+  var entry = state.bufferedRequest;
+ 
+  if (stream._writev && entry && entry.next) {
+    // Fast case, write everything using _writev()
+    var buffer = [];
+    var cbs = [];
+    while (entry) {
+      cbs.push(entry.callback);
+      buffer.push(entry);
+      entry = entry.next;
+    }
+ 
+    // count the one we are adding, as well.
+    // TODO(isaacs) clean this up
+    state.pendingcb++;
+    state.lastBufferedRequest = null;
+    doWrite(stream, state, true, state.length, buffer, '', function(err) {
+      for (var i = 0; i < cbs.length; i++) {
+        state.pendingcb--;
+        cbs[i](err);
+      }
+    });
+ 
+    // Clear buffer
+  } else {
+    // Slow case, write chunks one-by-one
+    while (entry) {
+      var chunk = entry.chunk;
+      var encoding = entry.encoding;
+      var cb = entry.callback;
+      var len = state.objectMode ? 1 : chunk.length;
+ 
+      doWrite(stream, state, false, len, chunk, encoding, cb);
+      entry = entry.next;
+      // if we didn't call the onwrite immediately, then
+      // it means that we need to wait until it does.
+      // also, that means that the chunk and cb are currently
+      // being processed, so move the buffer counter past them.
+      if (state.writing) {
+        break;
+      }
+    }
+ 
+    if (entry === null)
+      state.lastBufferedRequest = null;
+  }
+  state.bufferedRequest = entry;
+  state.bufferProcessing = false;
+}
+ 
+Writable.prototype._write = function(chunk, encoding, cb) {
+  cb(new Error('not implemented'));
+};
+ 
+Writable.prototype._writev = null;
+ 
+Writable.prototype.end = function(chunk, encoding, cb) {
+  var state = this._writableState;
+ 
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+ 
+  if (chunk !== null && chunk !== undefined)
+    this.write(chunk, encoding);
+ 
+  // .end() fully uncorks
+  if (state.corked) {
+    state.corked = 1;
+    this.uncork();
+  }
+ 
+  // ignore unnecessary end() calls.
+  if (!state.ending && !state.finished)
+    endWritable(this, state, cb);
+};
+ 
+ 
+function needFinish(state) {
+  return (state.ending &&
+          state.length === 0 &&
+          state.bufferedRequest === null &&
+          !state.finished &&
+          !state.writing);
+}
+ 
+function prefinish(stream, state) {
+  if (!state.prefinished) {
+    state.prefinished = true;
+    stream.emit('prefinish');
+  }
+}
+ 
+function finishMaybe(stream, state) {
+  var need = needFinish(state);
+  if (need) {
+    if (state.pendingcb === 0) {
+      prefinish(stream, state);
+      state.finished = true;
+      stream.emit('finish');
+    } else {
+      prefinish(stream, state);
+    }
+  }
+  return need;
+}
+ 
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+  if (cb) {
+    if (state.finished)
+      processNextTick(cb);
+    else
+      stream.once('finish', cb);
+  }
+  state.ended = true;
+}
+ 
+},{"./_stream_duplex":48,"buffer":33,"core-util-is":53,"events":37,"inherits":38,"process-nextick-args":54,"util-deprecate":55}],53:[function(require,module,exports){
+(function (Buffer){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+ 
+function isArray(arg) {
+  if (Array.isArray) {
+    return Array.isArray(arg);
+  }
+  return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+ 
+function isBoolean(arg) {
+  return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+ 
+function isNull(arg) {
+  return arg === null;
+}
+exports.isNull = isNull;
+ 
+function isNullOrUndefined(arg) {
+  return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+ 
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+ 
+function isString(arg) {
+  return typeof arg === 'string';
+}
+exports.isString = isString;
+ 
+function isSymbol(arg) {
+  return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+ 
+function isUndefined(arg) {
+  return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+ 
+function isRegExp(re) {
+  return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+ 
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+ 
+function isDate(d) {
+  return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+ 
+function isError(e) {
+  return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+ 
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+ 
+function isPrimitive(arg) {
+  return arg === null ||
+         typeof arg === 'boolean' ||
+         typeof arg === 'number' ||
+         typeof arg === 'string' ||
+         typeof arg === 'symbol' ||  // ES6 symbol
+         typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+ 
+exports.isBuffer = Buffer.isBuffer;
+ 
+function objectToString(o) {
+  return Object.prototype.toString.call(o);
+}
+ 
+}).call(this,{"isBuffer":require("../../../../insert-module-globals/node_modules/is-buffer/index.js")})
+},{"../../../../insert-module-globals/node_modules/is-buffer/index.js":39}],54:[function(require,module,exports){
+(function (process){
+'use strict';
+ 
+if (!process.version ||
+    process.version.indexOf('v0.') === 0 ||
+    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+  module.exports = nextTick;
+} else {
+  module.exports = process.nextTick;
+}
+ 
+function nextTick(fn) {
+  var args = new Array(arguments.length - 1);
+  var i = 0;
+  while (i < args.length) {
+    args[i++] = arguments[i];
+  }
+  process.nextTick(function afterTick() {
+    fn.apply(null, args);
+  });
+}
+ 
+}).call(this,require('_process'))
+},{"_process":42}],55:[function(require,module,exports){
+(function (global){
+ 
+/**
+ * Module exports.
+ */
+ 
+module.exports = deprecate;
+ 
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+ 
+function deprecate (fn, msg) {
+  if (config('noDeprecation')) {
+    return fn;
+  }
+ 
+  var warned = false;
+  function deprecated() {
+    if (!warned) {
+      if (config('throwDeprecation')) {
+        throw new Error(msg);
+      } else if (config('traceDeprecation')) {
+        console.trace(msg);
+      } else {
+        console.warn(msg);
+      }
+      warned = true;
+    }
+    return fn.apply(this, arguments);
+  }
+ 
+  return deprecated;
+}
+ 
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+ 
+function config (name) {
+  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+  try {
+    if (!global.localStorage) return false;
+  } catch (_) {
+    return false;
+  }
+  var val = global.localStorage[name];
+  if (null == val) return false;
+  return String(val).toLowerCase() === 'true';
+}
+ 
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],56:[function(require,module,exports){
+module.exports = require("./lib/_stream_passthrough.js")
+ 
+},{"./lib/_stream_passthrough.js":49}],57:[function(require,module,exports){
+var Stream = (function (){
+  try {
+    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify
+  } catch(_){}
+}());
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = Stream || exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+ 
+},{"./lib/_stream_duplex.js":48,"./lib/_stream_passthrough.js":49,"./lib/_stream_readable.js":50,"./lib/_stream_transform.js":51,"./lib/_stream_writable.js":52}],58:[function(require,module,exports){
+module.exports = require("./lib/_stream_transform.js")
+ 
+},{"./lib/_stream_transform.js":51}],59:[function(require,module,exports){
+module.exports = require("./lib/_stream_writable.js")
+ 
+},{"./lib/_stream_writable.js":52}],60:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+module.exports = Stream;
+ 
+var EE = require('events').EventEmitter;
+var inherits = require('inherits');
+ 
+inherits(Stream, EE);
+Stream.Readable = require('readable-stream/readable.js');
+Stream.Writable = require('readable-stream/writable.js');
+Stream.Duplex = require('readable-stream/duplex.js');
+Stream.Transform = require('readable-stream/transform.js');
+Stream.PassThrough = require('readable-stream/passthrough.js');
+ 
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream;
+ 
+ 
+ 
+// old-style streams.  Note that the pipe method (the only relevant
+// part of this class) is overridden in the Readable class.
+ 
+function Stream() {
+  EE.call(this);
+}
+ 
+Stream.prototype.pipe = function(dest, options) {
+  var source = this;
+ 
+  function ondata(chunk) {
+    if (dest.writable) {
+      if (false === dest.write(chunk) && source.pause) {
+        source.pause();
+      }
+    }
+  }
+ 
+  source.on('data', ondata);
+ 
+  function ondrain() {
+    if (source.readable && source.resume) {
+      source.resume();
+    }
+  }
+ 
+  dest.on('drain', ondrain);
+ 
+  // If the 'end' option is not supplied, dest.end() will be called when
+  // source gets the 'end' or 'close' events.  Only dest.end() once.
+  if (!dest._isStdio && (!options || options.end !== false)) {
+    source.on('end', onend);
+    source.on('close', onclose);
+  }
+ 
+  var didOnEnd = false;
+  function onend() {
+    if (didOnEnd) return;
+    didOnEnd = true;
+ 
+    dest.end();
+  }
+ 
+ 
+  function onclose() {
+    if (didOnEnd) return;
+    didOnEnd = true;
+ 
+    if (typeof dest.destroy === 'function') dest.destroy();
+  }
+ 
+  // don't leave dangling pipes when there are errors.
+  function onerror(er) {
+    cleanup();
+    if (EE.listenerCount(this, 'error') === 0) {
+      throw er; // Unhandled stream error in pipe.
+    }
+  }
+ 
+  source.on('error', onerror);
+  dest.on('error', onerror);
+ 
+  // remove all the event listeners that were added.
+  function cleanup() {
+    source.removeListener('data', ondata);
+    dest.removeListener('drain', ondrain);
+ 
+    source.removeListener('end', onend);
+    source.removeListener('close', onclose);
+ 
+    source.removeListener('error', onerror);
+    dest.removeListener('error', onerror);
+ 
+    source.removeListener('end', cleanup);
+    source.removeListener('close', cleanup);
+ 
+    dest.removeListener('close', cleanup);
+  }
+ 
+  source.on('end', cleanup);
+  source.on('close', cleanup);
+ 
+  dest.on('close', cleanup);
+ 
+  dest.emit('pipe', source);
+ 
+  // Allow for unix-like usage: A.pipe(B).pipe(C)
+  return dest;
+};
+ 
+},{"events":37,"inherits":38,"readable-stream/duplex.js":47,"readable-stream/passthrough.js":56,"readable-stream/readable.js":57,"readable-stream/transform.js":58,"readable-stream/writable.js":59}],61:[function(require,module,exports){
+var ClientRequest = require('./lib/request')
+var extend = require('xtend')
+var statusCodes = require('builtin-status-codes')
+var url = require('url')
+ 
+var http = exports
+ 
+http.request = function (opts, cb) {
+	if (typeof opts === 'string')
+		opts = url.parse(opts)
+	else
+		opts = extend(opts)
+ 
+	var protocol = opts.protocol || ''
+	var host = opts.hostname || opts.host
+	var port = opts.port
+	var path = opts.path || '/'
+ 
+	// Necessary for IPv6 addresses
+	if (host && host.indexOf(':') !== -1)
+		host = '[' + host + ']'
+ 
+	// This may be a relative url. The browser should always be able to interpret it correctly.
+	opts.url = (host ? (protocol + '//' + host) : '') + (port ? ':' + port : '') + path
+	opts.method = (opts.method || 'GET').toUpperCase()
+	opts.headers = opts.headers || {}
+ 
+	// Also valid opts.auth, opts.mode
+ 
+	var req = new ClientRequest(opts)
+	if (cb)
+		req.on('response', cb)
+	return req
+}
+ 
+http.get = function get (opts, cb) {
+	var req = http.request(opts, cb)
+	req.end()
+	return req
+}
+ 
+http.Agent = function () {}
+http.Agent.defaultMaxSockets = 4
+ 
+http.STATUS_CODES = statusCodes
+ 
+http.METHODS = [
+	'CHECKOUT',
+	'CONNECT',
+	'COPY',
+	'DELETE',
+	'GET',
+	'HEAD',
+	'LOCK',
+	'M-SEARCH',
+	'MERGE',
+	'MKACTIVITY',
+	'MKCOL',
+	'MOVE',
+	'NOTIFY',
+	'OPTIONS',
+	'PATCH',
+	'POST',
+	'PROPFIND',
+	'PROPPATCH',
+	'PURGE',
+	'PUT',
+	'REPORT',
+	'SEARCH',
+	'SUBSCRIBE',
+	'TRACE',
+	'UNLOCK',
+	'UNSUBSCRIBE'
+]
+},{"./lib/request":63,"builtin-status-codes":65,"url":71,"xtend":74}],62:[function(require,module,exports){
+(function (global){
+exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableByteStream)
+ 
+exports.blobConstructor = false
+try {
+	new Blob([new ArrayBuffer(1)])
+	exports.blobConstructor = true
+} catch (e) {}
+ 
+var xhr = new global.XMLHttpRequest()
+// If location.host is empty, e.g. if this page/worker was loaded
+// from a Blob, then use example.com to avoid an error
+xhr.open('GET', global.location.host ? '/' : 'https://example.com')
+ 
+function checkTypeSupport (type) {
+	try {
+		xhr.responseType = type
+		return xhr.responseType === type
+	} catch (e) {}
+	return false
+}
+ 
+// For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'.
+// Safari 7.1 appears to have fixed this bug.
+var haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined'
+var haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice)
+ 
+exports.arraybuffer = haveArrayBuffer && checkTypeSupport('arraybuffer')
+// These next two tests unavoidably show warnings in Chrome. Since fetch will always
+// be used if it's available, just return false for these to avoid the warnings.
+exports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream')
+exports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer &&
+	checkTypeSupport('moz-chunked-arraybuffer')
+exports.overrideMimeType = isFunction(xhr.overrideMimeType)
+exports.vbArray = isFunction(global.VBArray)
+ 
+function isFunction (value) {
+  return typeof value === 'function'
+}
+ 
+xhr = null // Help gc
+ 
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],63:[function(require,module,exports){
+(function (process,global,Buffer){
+// var Base64 = require('Base64')
+var capability = require('./capability')
+var foreach = require('foreach')
+var indexOf = require('indexof')
+var inherits = require('inherits')
+var keys = require('object-keys')
+var response = require('./response')
+var stream = require('stream')
+ 
+var IncomingMessage = response.IncomingMessage
+var rStates = response.readyStates
+ 
+function decideMode (preferBinary) {
+	if (capability.fetch) {
+		return 'fetch'
+	} else if (capability.mozchunkedarraybuffer) {
+		return 'moz-chunked-arraybuffer'
+	} else if (capability.msstream) {
+		return 'ms-stream'
+	} else if (capability.arraybuffer && preferBinary) {
+		return 'arraybuffer'
+	} else if (capability.vbArray && preferBinary) {
+		return 'text:vbarray'
+	} else {
+		return 'text'
+	}
+}
+ 
+var ClientRequest = module.exports = function (opts) {
+	var self = this
+	stream.Writable.call(self)
+ 
+	self._opts = opts
+	self._body = []
+	self._headers = {}
+	if (opts.auth)
+		self.setHeader('Authorization', 'Basic ' + new Buffer(opts.auth).toString('base64'))
+	foreach(keys(opts.headers), function (name) {
+		self.setHeader(name, opts.headers[name])
+	})
+ 
+	var preferBinary
+	if (opts.mode === 'prefer-streaming') {
+		// If streaming is a high priority but binary compatibility and
+		// the accuracy of the 'content-type' header aren't
+		preferBinary = false
+	} else if (opts.mode === 'allow-wrong-content-type') {
+		// If streaming is more important than preserving the 'content-type' header
+		preferBinary = !capability.overrideMimeType
+	} else if (!opts.mode || opts.mode === 'default' || opts.mode === 'prefer-fast') {
+		// Use binary if text streaming may corrupt data or the content-type header, or for speed
+		preferBinary = true
+	} else {
+		throw new Error('Invalid value for opts.mode')
+	}
+	self._mode = decideMode(preferBinary)
+ 
+	self.on('finish', function () {
+		self._onFinish()
+	})
+}
+ 
+inherits(ClientRequest, stream.Writable)
+ 
+ClientRequest.prototype.setHeader = function (name, value) {
+	var self = this
+	var lowerName = name.toLowerCase()
+	// This check is not necessary, but it prevents warnings from browsers about setting unsafe
+	// headers. To be honest I'm not entirely sure hiding these warnings is a good thing, but
+	// http-browserify did it, so I will too.
+	if (indexOf(unsafeHeaders, lowerName) !== -1)
+		return
+ 
+	self._headers[lowerName] = {
+		name: name,
+		value: value
+	}
+}
+ 
+ClientRequest.prototype.getHeader = function (name) {
+	var self = this
+	return self._headers[name.toLowerCase()].value
+}
+ 
+ClientRequest.prototype.removeHeader = function (name) {
+	var self = this
+	delete self._headers[name.toLowerCase()]
+}
+ 
+ClientRequest.prototype._onFinish = function () {
+	var self = this
+ 
+	if (self._destroyed)
+		return
+	var opts = self._opts
+ 
+	var headersObj = self._headers
+	var body
+	if (opts.method === 'POST' || opts.method === 'PUT') {
+		if (capability.blobConstructor) {
+			body = new global.Blob(self._body.map(function (buffer) {
+				return buffer.toArrayBuffer()
+			}), {
+				type: (headersObj['content-type'] || {}).value || ''
+			})
+		} else {
+			// get utf8 string
+			body = Buffer.concat(self._body).toString()
+		}
+	}
+ 
+	if (self._mode === 'fetch') {
+		var headers = keys(headersObj).map(function (name) {
+			return [headersObj[name].name, headersObj[name].value]
+		})
+ 
+		global.fetch(self._opts.url, {
+			method: self._opts.method,
+			headers: headers,
+			body: body,
+			mode: 'cors',
+			credentials: opts.withCredentials ? 'include' : 'same-origin'
+		}).then(function (response) {
+			self._fetchResponse = response
+			self._connect()
+		}).then(undefined, function (reason) {
+			self.emit('error', reason)
+		})
+	} else {
+		var xhr = self._xhr = new global.XMLHttpRequest()
+		try {
+			xhr.open(self._opts.method, self._opts.url, true)
+		} catch (err) {
+			process.nextTick(function () {
+				self.emit('error', err)
+			})
+			return
+		}
+ 
+		// Can't set responseType on really old browsers
+		if ('responseType' in xhr)
+			xhr.responseType = self._mode.split(':')[0]
+ 
+		if ('withCredentials' in xhr)
+			xhr.withCredentials = !!opts.withCredentials
+ 
+		if (self._mode === 'text' && 'overrideMimeType' in xhr)
+			xhr.overrideMimeType('text/plain; charset=x-user-defined')
+ 
+		foreach(keys(headersObj), function (name) {
+			xhr.setRequestHeader(headersObj[name].name, headersObj[name].value)
+		})
+ 
+		self._response = null
+		xhr.onreadystatechange = function () {
+			switch (xhr.readyState) {
+				case rStates.LOADING:
+				case rStates.DONE:
+					self._onXHRProgress()
+					break
+			}
+		}
+		// Necessary for streaming in Firefox, since xhr.response is ONLY defined
+		// in onprogress, not in onreadystatechange with xhr.readyState = 3
+		if (self._mode === 'moz-chunked-arraybuffer') {
+			xhr.onprogress = function () {
+				self._onXHRProgress()
+			}
+		}
+ 
+		xhr.onerror = function () {
+			if (self._destroyed)
+				return
+			self.emit('error', new Error('XHR error'))
+		}
+ 
+		try {
+			xhr.send(body)
+		} catch (err) {
+			process.nextTick(function () {
+				self.emit('error', err)
+			})
+			return
+		}
+	}
+}
+ 
+/**
+ * Checks if xhr.status is readable. Even though the spec says it should
+ * be available in readyState 3, accessing it throws an exception in IE8
+ */
+function statusValid (xhr) {
+	try {
+		return (xhr.status !== null)
+	} catch (e) {
+		return false
+	}
+}
+ 
+ClientRequest.prototype._onXHRProgress = function () {
+	var self = this
+ 
+	if (!statusValid(self._xhr) || self._destroyed)
+		return
+ 
+	if (!self._response)
+		self._connect()
+ 
+	self._response._onXHRProgress()
+}
+ 
+ClientRequest.prototype._connect = function () {
+	var self = this
+ 
+	if (self._destroyed)
+		return
+ 
+	self._response = new IncomingMessage(self._xhr, self._fetchResponse, self._mode)
+	self.emit('response', self._response)
+}
+ 
+ClientRequest.prototype._write = function (chunk, encoding, cb) {
+	var self = this
+ 
+	self._body.push(chunk)
+	cb()
+}
+ 
+ClientRequest.prototype.abort = ClientRequest.prototype.destroy = function () {
+	var self = this
+	self._destroyed = true
+	if (self._response)
+		self._response._destroyed = true
+	if (self._xhr)
+		self._xhr.abort()
+	// Currently, there isn't a way to truly abort a fetch.
+	// If you like bikeshedding, see https://github.com/whatwg/fetch/issues/27
+}
+ 
+ClientRequest.prototype.end = function (data, encoding, cb) {
+	var self = this
+	if (typeof data === 'function') {
+		cb = data
+		data = undefined
+	}
+ 
+	stream.Writable.prototype.end.call(self, data, encoding, cb)
+}
+ 
+ClientRequest.prototype.flushHeaders = function () {}
+ClientRequest.prototype.setTimeout = function () {}
+ClientRequest.prototype.setNoDelay = function () {}
+ClientRequest.prototype.setSocketKeepAlive = function () {}
+ 
+// Taken from http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader%28%29-method
+var unsafeHeaders = [
+	'accept-charset',
+	'accept-encoding',
+	'access-control-request-headers',
+	'access-control-request-method',
+	'connection',
+	'content-length',
+	'cookie',
+	'cookie2',
+	'date',
+	'dnt',
+	'expect',
+	'host',
+	'keep-alive',
+	'origin',
+	'referer',
+	'te',
+	'trailer',
+	'transfer-encoding',
+	'upgrade',
+	'user-agent',
+	'via'
+]
+ 
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
+},{"./capability":62,"./response":64,"_process":42,"buffer":33,"foreach":66,"indexof":67,"inherits":38,"object-keys":68,"stream":60}],64:[function(require,module,exports){
+(function (process,global,Buffer){
+var capability = require('./capability')
+var foreach = require('foreach')
+var inherits = require('inherits')
+var stream = require('stream')
+ 
+var rStates = exports.readyStates = {
+	UNSENT: 0,
+	OPENED: 1,
+	HEADERS_RECEIVED: 2,
+	LOADING: 3,
+	DONE: 4
+}
+ 
+var IncomingMessage = exports.IncomingMessage = function (xhr, response, mode) {
+	var self = this
+	stream.Readable.call(self)
+ 
+	self._mode = mode
+	self.headers = {}
+	self.rawHeaders = []
+	self.trailers = {}
+	self.rawTrailers = []
+ 
+	// Fake the 'close' event, but only once 'end' fires
+	self.on('end', function () {
+		// The nextTick is necessary to prevent the 'request' module from causing an infinite loop
+		process.nextTick(function () {
+			self.emit('close')
+		})
+	})
+ 
+	if (mode === 'fetch') {
+		self._fetchResponse = response
+ 
+		self.statusCode = response.status
+		self.statusMessage = response.statusText
+		// backwards compatible version of for (<item> of <iterable>):
+		// for (var <item>,_i,_it = <iterable>[Symbol.iterator](); <item> = (_i = _it.next()).value,!_i.done;)
+		for (var header, _i, _it = response.headers[Symbol.iterator](); header = (_i = _it.next()).value, !_i.done;) {
+			self.headers[header[0].toLowerCase()] = header[1]
+			self.rawHeaders.push(header[0], header[1])
+		}
+ 
+		// TODO: this doesn't respect backpressure. Once WritableStream is available, this can be fixed
+		var reader = response.body.getReader()
+		function read () {
+			reader.read().then(function (result) {
+				if (self._destroyed)
+					return
+				if (result.done) {
+					self.push(null)
+					return
+				}
+				self.push(new Buffer(result.value))
+				read()
+			})
+		}
+		read()
+ 
+	} else {
+		self._xhr = xhr
+		self._pos = 0
+ 
+		self.statusCode = xhr.status
+		self.statusMessage = xhr.statusText
+		var headers = xhr.getAllResponseHeaders().split(/\r?\n/)
+		foreach(headers, function (header) {
+			var matches = header.match(/^([^:]+):\s*(.*)/)
+			if (matches) {
+				var key = matches[1].toLowerCase()
+				if (self.headers[key] !== undefined)
+					self.headers[key] += ', ' + matches[2]
+				else
+					self.headers[key] = matches[2]
+				self.rawHeaders.push(matches[1], matches[2])
+			}
+		})
+ 
+		self._charset = 'x-user-defined'
+		if (!capability.overrideMimeType) {
+			var mimeType = self.rawHeaders['mime-type']
+			if (mimeType) {
+				var charsetMatch = mimeType.match(/;\s*charset=([^;])(;|$)/)
+				if (charsetMatch) {
+					self._charset = charsetMatch[1].toLowerCase()
+				}
+			}
+			if (!self._charset)
+				self._charset = 'utf-8' // best guess
+		}
+	}
+}
+ 
+inherits(IncomingMessage, stream.Readable)
+ 
+IncomingMessage.prototype._read = function () {}
+ 
+IncomingMessage.prototype._onXHRProgress = function () {
+	var self = this
+ 
+	var xhr = self._xhr
+ 
+	var response = null
+	switch (self._mode) {
+		case 'text:vbarray': // For IE9
+			if (xhr.readyState !== rStates.DONE)
+				break
+			try {
+				// This fails in IE8
+				response = new global.VBArray(xhr.responseBody).toArray()
+			} catch (e) {}
+			if (response !== null) {
+				self.push(new Buffer(response))
+				break
+			}
+			// Falls through in IE8	
+		case 'text':
+			try { // This will fail when readyState = 3 in IE9. Switch mode and wait for readyState = 4
+				response = xhr.responseText
+			} catch (e) {
+				self._mode = 'text:vbarray'
+				break
+			}
+			if (response.length > self._pos) {
+				var newData = response.substr(self._pos)
+				if (self._charset === 'x-user-defined') {
+					var buffer = new Buffer(newData.length)
+					for (var i = 0; i < newData.length; i++)
+						buffer[i] = newData.charCodeAt(i) & 0xff
+ 
+					self.push(buffer)
+				} else {
+					self.push(newData, self._charset)
+				}
+				self._pos = response.length
+			}
+			break
+		case 'arraybuffer':
+			if (xhr.readyState !== rStates.DONE)
+				break
+			response = xhr.response
+			self.push(new Buffer(new Uint8Array(response)))
+			break
+		case 'moz-chunked-arraybuffer': // take whole
+			response = xhr.response
+			if (xhr.readyState !== rStates.LOADING || !response)
+				break
+			self.push(new Buffer(new Uint8Array(response)))
+			break
+		case 'ms-stream':
+			response = xhr.response
+			if (xhr.readyState !== rStates.LOADING)
+				break
+			var reader = new global.MSStreamReader()
+			reader.onprogress = function () {
+				if (reader.result.byteLength > self._pos) {
+					self.push(new Buffer(new Uint8Array(reader.result.slice(self._pos))))
+					self._pos = reader.result.byteLength
+				}
+			}
+			reader.onload = function () {
+				self.push(null)
+			}
+			// reader.onerror = ??? // TODO: this
+			reader.readAsArrayBuffer(response)
+			break
+	}
+ 
+	// The ms-stream case handles end separately in reader.onload()
+	if (self._xhr.readyState === rStates.DONE && self._mode !== 'ms-stream') {
+		self.push(null)
+	}
+}
+ 
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
+},{"./capability":62,"_process":42,"buffer":33,"foreach":66,"inherits":38,"stream":60}],65:[function(require,module,exports){
+module.exports = {
+  "100": "Continue",
+  "101": "Switching Protocols",
+  "102": "Processing",
+  "200": "OK",
+  "201": "Created",
+  "202": "Accepted",
+  "203": "Non-Authoritative Information",
+  "204": "No Content",
+  "205": "Reset Content",
+  "206": "Partial Content",
+  "207": "Multi-Status",
+  "300": "Multiple Choices",
+  "301": "Moved Permanently",
+  "302": "Moved Temporarily",
+  "303": "See Other",
+  "304": "Not Modified",
+  "305": "Use Proxy",
+  "307": "Temporary Redirect",
+  "308": "Permanent Redirect",
+  "400": "Bad Request",
+  "401": "Unauthorized",
+  "402": "Payment Required",
+  "403": "Forbidden",
+  "404": "Not Found",
+  "405": "Method Not Allowed",
+  "406": "Not Acceptable",
+  "407": "Proxy Authentication Required",
+  "408": "Request Time-out",
+  "409": "Conflict",
+  "410": "Gone",
+  "411": "Length Required",
+  "412": "Precondition Failed",
+  "413": "Request Entity Too Large",
+  "414": "Request-URI Too Large",
+  "415": "Unsupported Media Type",
+  "416": "Requested Range Not Satisfiable",
+  "417": "Expectation Failed",
+  "418": "I'm a teapot",
+  "422": "Unprocessable Entity",
+  "423": "Locked",
+  "424": "Failed Dependency",
+  "425": "Unordered Collection",
+  "426": "Upgrade Required",
+  "428": "Precondition Required",
+  "429": "Too Many Requests",
+  "431": "Request Header Fields Too Large",
+  "500": "Internal Server Error",
+  "501": "Not Implemented",
+  "502": "Bad Gateway",
+  "503": "Service Unavailable",
+  "504": "Gateway Time-out",
+  "505": "HTTP Version Not Supported",
+  "506": "Variant Also Negotiates",
+  "507": "Insufficient Storage",
+  "509": "Bandwidth Limit Exceeded",
+  "510": "Not Extended",
+  "511": "Network Authentication Required"
+}
+ 
+},{}],66:[function(require,module,exports){
+ 
+var hasOwn = Object.prototype.hasOwnProperty;
+var toString = Object.prototype.toString;
+ 
+module.exports = function forEach (obj, fn, ctx) {
+    if (toString.call(fn) !== '[object Function]') {
+        throw new TypeError('iterator must be a function');
+    }
+    var l = obj.length;
+    if (l === +l) {
+        for (var i = 0; i < l; i++) {
+            fn.call(ctx, obj[i], i, obj);
+        }
+    } else {
+        for (var k in obj) {
+            if (hasOwn.call(obj, k)) {
+                fn.call(ctx, obj[k], k, obj);
+            }
+        }
+    }
+};
+ 
+ 
+},{}],67:[function(require,module,exports){
+ 
+var indexOf = [].indexOf;
+ 
+module.exports = function(arr, obj){
+  if (indexOf) return arr.indexOf(obj);
+  for (var i = 0; i < arr.length; ++i) {
+    if (arr[i] === obj) return i;
+  }
+  return -1;
+};
+},{}],68:[function(require,module,exports){
+'use strict';
+ 
+// modified from https://github.com/es-shims/es5-shim
+var has = Object.prototype.hasOwnProperty;
+var toStr = Object.prototype.toString;
+var slice = Array.prototype.slice;
+var isArgs = require('./isArguments');
+var hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');
+var hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');
+var dontEnums = [
+	'toString',
+	'toLocaleString',
+	'valueOf',
+	'hasOwnProperty',
+	'isPrototypeOf',
+	'propertyIsEnumerable',
+	'constructor'
+];
+var equalsConstructorPrototype = function (o) {
+	var ctor = o.constructor;
+	return ctor && ctor.prototype === o;
+};
+var blacklistedKeys = {
+	$console: true,
+	$frame: true,
+	$frameElement: true,
+	$frames: true,
+	$parent: true,
+	$self: true,
+	$webkitIndexedDB: true,
+	$webkitStorageInfo: true,
+	$window: true
+};
+var hasAutomationEqualityBug = (function () {
+	/* global window */
+	if (typeof window === 'undefined') { return false; }
+	for (var k in window) {
+		try {
+			if (!blacklistedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
+				try {
+					equalsConstructorPrototype(window[k]);
+				} catch (e) {
+					return true;
+				}
+			}
+		} catch (e) {
+			return true;
+		}
+	}
+	return false;
+}());
+var equalsConstructorPrototypeIfNotBuggy = function (o) {
+	/* global window */
+	if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
+		return equalsConstructorPrototype(o);
+	}
+	try {
+		return equalsConstructorPrototype(o);
+	} catch (e) {
+		return false;
+	}
+};
+ 
+var keysShim = function keys(object) {
+	var isObject = object !== null && typeof object === 'object';
+	var isFunction = toStr.call(object) === '[object Function]';
+	var isArguments = isArgs(object);
+	var isString = isObject && toStr.call(object) === '[object String]';
+	var theKeys = [];
+ 
+	if (!isObject && !isFunction && !isArguments) {
+		throw new TypeError('Object.keys called on a non-object');
+	}
+ 
+	var skipProto = hasProtoEnumBug && isFunction;
+	if (isString && object.length > 0 && !has.call(object, 0)) {
+		for (var i = 0; i < object.length; ++i) {
+			theKeys.push(String(i));
+		}
+	}
+ 
+	if (isArguments && object.length > 0) {
+		for (var j = 0; j < object.length; ++j) {
+			theKeys.push(String(j));
+		}
+	} else {
+		for (var name in object) {
+			if (!(skipProto && name === 'prototype') && has.call(object, name)) {
+				theKeys.push(String(name));
+			}
+		}
+	}
+ 
+	if (hasDontEnumBug) {
+		var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
+ 
+		for (var k = 0; k < dontEnums.length; ++k) {
+			if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
+				theKeys.push(dontEnums[k]);
+			}
+		}
+	}
+	return theKeys;
+};
+ 
+keysShim.shim = function shimObjectKeys() {
+	if (Object.keys) {
+		var keysWorksWithArguments = (function () {
+			// Safari 5.0 bug
+			return (Object.keys(arguments) || '').length === 2;
+		}(1, 2));
+		if (!keysWorksWithArguments) {
+			var originalKeys = Object.keys;
+			Object.keys = function keys(object) {
+				if (isArgs(object)) {
+					return originalKeys(slice.call(object));
+				} else {
+					return originalKeys(object);
+				}
+			};
+		}
+	} else {
+		Object.keys = keysShim;
+	}
+	return Object.keys || keysShim;
+};
+ 
+module.exports = keysShim;
+ 
+},{"./isArguments":69}],69:[function(require,module,exports){
+'use strict';
+ 
+var toStr = Object.prototype.toString;
+ 
+module.exports = function isArguments(value) {
+	var str = toStr.call(value);
+	var isArgs = str === '[object Arguments]';
+	if (!isArgs) {
+		isArgs = str !== '[object Array]' &&
+			value !== null &&
+			typeof value === 'object' &&
+			typeof value.length === 'number' &&
+			value.length >= 0 &&
+			toStr.call(value.callee) === '[object Function]';
+	}
+	return isArgs;
+};
+ 
+},{}],70:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+var Buffer = require('buffer').Buffer;
+ 
+var isBufferEncoding = Buffer.isEncoding
+  || function(encoding) {
+       switch (encoding && encoding.toLowerCase()) {
+         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
+         default: return false;
+       }
+     }
+ 
+ 
+function assertEncoding(encoding) {
+  if (encoding && !isBufferEncoding(encoding)) {
+    throw new Error('Unknown encoding: ' + encoding);
+  }
+}
+ 
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters. CESU-8 is handled as part of the UTF-8 encoding.
+//
+// @TODO Handling all encodings inside a single object makes it very difficult
+// to reason about this code, so it should be split up in the future.
+// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
+// points as used by CESU-8.
+var StringDecoder = exports.StringDecoder = function(encoding) {
+  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
+  assertEncoding(encoding);
+  switch (this.encoding) {
+    case 'utf8':
+      // CESU-8 represents each of Surrogate Pair by 3-bytes
+      this.surrogateSize = 3;
+      break;
+    case 'ucs2':
+    case 'utf16le':
+      // UTF-16 represents each of Surrogate Pair by 2-bytes
+      this.surrogateSize = 2;
+      this.detectIncompleteChar = utf16DetectIncompleteChar;
+      break;
+    case 'base64':
+      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
+      this.surrogateSize = 3;
+      this.detectIncompleteChar = base64DetectIncompleteChar;
+      break;
+    default:
+      this.write = passThroughWrite;
+      return;
+  }
+ 
+  // Enough space to store all bytes of a single character. UTF-8 needs 4
+  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
+  this.charBuffer = new Buffer(6);
+  // Number of bytes received for the current incomplete multi-byte character.
+  this.charReceived = 0;
+  // Number of bytes expected for the current incomplete multi-byte character.
+  this.charLength = 0;
+};
+ 
+ 
+// write decodes the given buffer and returns it as JS string that is
+// guaranteed to not contain any partial multi-byte characters. Any partial
+// character found at the end of the buffer is buffered up, and will be
+// returned when calling write again with the remaining bytes.
+//
+// Note: Converting a Buffer containing an orphan surrogate to a String
+// currently works, but converting a String to a Buffer (via `new Buffer`, or
+// Buffer#write) will replace incomplete surrogates with the unicode
+// replacement character. See https://codereview.chromium.org/121173009/ .
+StringDecoder.prototype.write = function(buffer) {
+  var charStr = '';
+  // if our last write ended with an incomplete multibyte character
+  while (this.charLength) {
+    // determine how many remaining bytes this buffer has to offer for this char
+    var available = (buffer.length >= this.charLength - this.charReceived) ?
+        this.charLength - this.charReceived :
+        buffer.length;
+ 
+    // add the new bytes to the char buffer
+    buffer.copy(this.charBuffer, this.charReceived, 0, available);
+    this.charReceived += available;
+ 
+    if (this.charReceived < this.charLength) {
+      // still not enough chars in this buffer? wait for more ...
+      return '';
+    }
+ 
+    // remove bytes belonging to the current character from the buffer
+    buffer = buffer.slice(available, buffer.length);
+ 
+    // get the character that was split
+    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
+ 
+    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+    var charCode = charStr.charCodeAt(charStr.length - 1);
+    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+      this.charLength += this.surrogateSize;
+      charStr = '';
+      continue;
+    }
+    this.charReceived = this.charLength = 0;
+ 
+    // if there are no more bytes in this buffer, just emit our char
+    if (buffer.length === 0) {
+      return charStr;
+    }
+    break;
+  }
+ 
+  // determine and set charLength / charReceived
+  this.detectIncompleteChar(buffer);
+ 
+  var end = buffer.length;
+  if (this.charLength) {
+    // buffer the incomplete character bytes we got
+    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
+    end -= this.charReceived;
+  }
+ 
+  charStr += buffer.toString(this.encoding, 0, end);
+ 
+  var end = charStr.length - 1;
+  var charCode = charStr.charCodeAt(end);
+  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+    var size = this.surrogateSize;
+    this.charLength += size;
+    this.charReceived += size;
+    this.charBuffer.copy(this.charBuffer, size, 0, size);
+    buffer.copy(this.charBuffer, 0, 0, size);
+    return charStr.substring(0, end);
+  }
+ 
+  // or just emit the charStr
+  return charStr;
+};
+ 
+// detectIncompleteChar determines if there is an incomplete UTF-8 character at
+// the end of the given buffer. If so, it sets this.charLength to the byte
+// length that character, and sets this.charReceived to the number of bytes
+// that are available for this character.
+StringDecoder.prototype.detectIncompleteChar = function(buffer) {
+  // determine how many bytes we have to check at the end of this buffer
+  var i = (buffer.length >= 3) ? 3 : buffer.length;
+ 
+  // Figure out if one of the last i bytes of our buffer announces an
+  // incomplete char.
+  for (; i > 0; i--) {
+    var c = buffer[buffer.length - i];
+ 
+    // See http://en.wikipedia.org/wiki/UTF-8#Description
+ 
+    // 110XXXXX
+    if (i == 1 && c >> 5 == 0x06) {
+      this.charLength = 2;
+      break;
+    }
+ 
+    // 1110XXXX
+    if (i <= 2 && c >> 4 == 0x0E) {
+      this.charLength = 3;
+      break;
+    }
+ 
+    // 11110XXX
+    if (i <= 3 && c >> 3 == 0x1E) {
+      this.charLength = 4;
+      break;
+    }
+  }
+  this.charReceived = i;
+};
+ 
+StringDecoder.prototype.end = function(buffer) {
+  var res = '';
+  if (buffer && buffer.length)
+    res = this.write(buffer);
+ 
+  if (this.charReceived) {
+    var cr = this.charReceived;
+    var buf = this.charBuffer;
+    var enc = this.encoding;
+    res += buf.slice(0, cr).toString(enc);
+  }
+ 
+  return res;
+};
+ 
+function passThroughWrite(buffer) {
+  return buffer.toString(this.encoding);
+}
+ 
+function utf16DetectIncompleteChar(buffer) {
+  this.charReceived = buffer.length % 2;
+  this.charLength = this.charReceived ? 2 : 0;
+}
+ 
+function base64DetectIncompleteChar(buffer) {
+  this.charReceived = buffer.length % 3;
+  this.charLength = this.charReceived ? 3 : 0;
+}
+ 
+},{"buffer":33}],71:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+var punycode = require('punycode');
+ 
+exports.parse = urlParse;
+exports.resolve = urlResolve;
+exports.resolveObject = urlResolveObject;
+exports.format = urlFormat;
+ 
+exports.Url = Url;
+ 
+function Url() {
+  this.protocol = null;
+  this.slashes = null;
+  this.auth = null;
+  this.host = null;
+  this.port = null;
+  this.hostname = null;
+  this.hash = null;
+  this.search = null;
+  this.query = null;
+  this.pathname = null;
+  this.path = null;
+  this.href = null;
+}
+ 
+// Reference: RFC 3986, RFC 1808, RFC 2396
+ 
+// define these here so at least they only have to be
+// compiled once on the first module load.
+var protocolPattern = /^([a-z0-9.+-]+:)/i,
+    portPattern = /:[0-9]*$/,
+ 
+    // RFC 2396: characters reserved for delimiting URLs.
+    // We actually just auto-escape these.
+    delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+ 
+    // RFC 2396: characters not allowed for various reasons.
+    unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
+ 
+    // Allowed by RFCs, but cause of XSS attacks.  Always escape these.
+    autoEscape = ['\''].concat(unwise),
+    // Characters that are never ever allowed in a hostname.
+    // Note that any invalid chars are also handled, but these
+    // are the ones that are *expected* to be seen, so we fast-path
+    // them.
+    nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
+    hostEndingChars = ['/', '?', '#'],
+    hostnameMaxLen = 255,
+    hostnamePartPattern = /^[a-z0-9A-Z_-]{0,63}$/,
+    hostnamePartStart = /^([a-z0-9A-Z_-]{0,63})(.*)$/,
+    // protocols that can allow "unsafe" and "unwise" chars.
+    unsafeProtocol = {
+      'javascript': true,
+      'javascript:': true
+    },
+    // protocols that never have a hostname.
+    hostlessProtocol = {
+      'javascript': true,
+      'javascript:': true
+    },
+    // protocols that always contain a // bit.
+    slashedProtocol = {
+      'http': true,
+      'https': true,
+      'ftp': true,
+      'gopher': true,
+      'file': true,
+      'http:': true,
+      'https:': true,
+      'ftp:': true,
+      'gopher:': true,
+      'file:': true
+    },
+    querystring = require('querystring');
+ 
+function urlParse(url, parseQueryString, slashesDenoteHost) {
+  if (url && isObject(url) && url instanceof Url) return url;
+ 
+  var u = new Url;
+  u.parse(url, parseQueryString, slashesDenoteHost);
+  return u;
+}
+ 
+Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
+  if (!isString(url)) {
+    throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
+  }
+ 
+  var rest = url;
+ 
+  // trim before proceeding.
+  // This is to support parse stuff like "  http://foo.com  \n"
+  rest = rest.trim();
+ 
+  var proto = protocolPattern.exec(rest);
+  if (proto) {
+    proto = proto[0];
+    var lowerProto = proto.toLowerCase();
+    this.protocol = lowerProto;
+    rest = rest.substr(proto.length);
+  }
+ 
+  // figure out if it's got a host
+  // user@server is *always* interpreted as a hostname, and url
+  // resolution will treat //foo/bar as host=foo,path=bar because that's
+  // how the browser resolves relative URLs.
+  if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+    var slashes = rest.substr(0, 2) === '//';
+    if (slashes && !(proto && hostlessProtocol[proto])) {
+      rest = rest.substr(2);
+      this.slashes = true;
+    }
+  }
+ 
+  if (!hostlessProtocol[proto] &&
+      (slashes || (proto && !slashedProtocol[proto]))) {
+ 
+    // there's a hostname.
+    // the first instance of /, ?, ;, or # ends the host.
+    //
+    // If there is an @ in the hostname, then non-host chars *are* allowed
+    // to the left of the last @ sign, unless some host-ending character
+    // comes *before* the @-sign.
+    // URLs are obnoxious.
+    //
+    // ex:
+    // http://a@b@c/ => user:a@b host:c
+    // http://a@b?@c => user:a host:c path:/?@c
+ 
+    // v0.12 TODO(isaacs): This is not quite how Chrome does things.
+    // Review our test case against browsers more comprehensively.
+ 
+    // find the first instance of any hostEndingChars
+    var hostEnd = -1;
+    for (var i = 0; i < hostEndingChars.length; i++) {
+      var hec = rest.indexOf(hostEndingChars[i]);
+      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+        hostEnd = hec;
+    }
+ 
+    // at this point, either we have an explicit point where the
+    // auth portion cannot go past, or the last @ char is the decider.
+    var auth, atSign;
+    if (hostEnd === -1) {
+      // atSign can be anywhere.
+      atSign = rest.lastIndexOf('@');
+    } else {
+      // atSign must be in auth portion.
+      // http://a@b/c@d => host:b auth:a path:/c@d
+      atSign = rest.lastIndexOf('@', hostEnd);
+    }
+ 
+    // Now we have a portion which is definitely the auth.
+    // Pull that off.
+    if (atSign !== -1) {
+      auth = rest.slice(0, atSign);
+      rest = rest.slice(atSign + 1);
+      this.auth = decodeURIComponent(auth);
+    }
+ 
+    // the host is the remaining to the left of the first non-host char
+    hostEnd = -1;
+    for (var i = 0; i < nonHostChars.length; i++) {
+      var hec = rest.indexOf(nonHostChars[i]);
+      if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+        hostEnd = hec;
+    }
+    // if we still have not hit it, then the entire thing is a host.
+    if (hostEnd === -1)
+      hostEnd = rest.length;
+ 
+    this.host = rest.slice(0, hostEnd);
+    rest = rest.slice(hostEnd);
+ 
+    // pull out port.
+    this.parseHost();
+ 
+    // we've indicated that there is a hostname,
+    // so even if it's empty, it has to be present.
+    this.hostname = this.hostname || '';
+ 
+    // if hostname begins with [ and ends with ]
+    // assume that it's an IPv6 address.
+    var ipv6Hostname = this.hostname[0] === '[' &&
+        this.hostname[this.hostname.length - 1] === ']';
+ 
+    // validate a little.
+    if (!ipv6Hostname) {
+      var hostparts = this.hostname.split(/\./);
+      for (var i = 0, l = hostparts.length; i < l; i++) {
+        var part = hostparts[i];
+        if (!part) continue;
+        if (!part.match(hostnamePartPattern)) {
+          var newpart = '';
+          for (var j = 0, k = part.length; j < k; j++) {
+            if (part.charCodeAt(j) > 127) {
+              // we replace non-ASCII char with a temporary placeholder
+              // we need this to make sure size of hostname is not
+              // broken by replacing non-ASCII by nothing
+              newpart += 'x';
+            } else {
+              newpart += part[j];
+            }
+          }
+          // we test again with ASCII char only
+          if (!newpart.match(hostnamePartPattern)) {
+            var validParts = hostparts.slice(0, i);
+            var notHost = hostparts.slice(i + 1);
+            var bit = part.match(hostnamePartStart);
+            if (bit) {
+              validParts.push(bit[1]);
+              notHost.unshift(bit[2]);
+            }
+            if (notHost.length) {
+              rest = '/' + notHost.join('.') + rest;
+            }
+            this.hostname = validParts.join('.');
+            break;
+          }
+        }
+      }
+    }
+ 
+    if (this.hostname.length > hostnameMaxLen) {
+      this.hostname = '';
+    } else {
+      // hostnames are always lower case.
+      this.hostname = this.hostname.toLowerCase();
+    }
+ 
+    if (!ipv6Hostname) {
+      // IDNA Support: Returns a puny coded representation of "domain".
+      // It only converts the part of the domain name that
+      // has non ASCII characters. I.e. it dosent matter if
+      // you call it with a domain that already is in ASCII.
+      var domainArray = this.hostname.split('.');
+      var newOut = [];
+      for (var i = 0; i < domainArray.length; ++i) {
+        var s = domainArray[i];
+        newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
+            'xn--' + punycode.encode(s) : s);
+      }
+      this.hostname = newOut.join('.');
+    }
+ 
+    var p = this.port ? ':' + this.port : '';
+    var h = this.hostname || '';
+    this.host = h + p;
+    this.href += this.host;
+ 
+    // strip [ and ] from the hostname
+    // the host field still retains them, though
+    if (ipv6Hostname) {
+      this.hostname = this.hostname.substr(1, this.hostname.length - 2);
+      if (rest[0] !== '/') {
+        rest = '/' + rest;
+      }
+    }
+  }
+ 
+  // now rest is set to the post-host stuff.
+  // chop off any delim chars.
+  if (!unsafeProtocol[lowerProto]) {
+ 
+    // First, make 100% sure that any "autoEscape" chars get
+    // escaped, even if encodeURIComponent doesn't think they
+    // need to be.
+    for (var i = 0, l = autoEscape.length; i < l; i++) {
+      var ae = autoEscape[i];
+      var esc = encodeURIComponent(ae);
+      if (esc === ae) {
+        esc = escape(ae);
+      }
+      rest = rest.split(ae).join(esc);
+    }
+  }
+ 
+ 
+  // chop off from the tail first.
+  var hash = rest.indexOf('#');
+  if (hash !== -1) {
+    // got a fragment string.
+    this.hash = rest.substr(hash);
+    rest = rest.slice(0, hash);
+  }
+  var qm = rest.indexOf('?');
+  if (qm !== -1) {
+    this.search = rest.substr(qm);
+    this.query = rest.substr(qm + 1);
+    if (parseQueryString) {
+      this.query = querystring.parse(this.query);
+    }
+    rest = rest.slice(0, qm);
+  } else if (parseQueryString) {
+    // no query string, but parseQueryString still requested
+    this.search = '';
+    this.query = {};
+  }
+  if (rest) this.pathname = rest;
+  if (slashedProtocol[lowerProto] &&
+      this.hostname && !this.pathname) {
+    this.pathname = '/';
+  }
+ 
+  //to support http.request
+  if (this.pathname || this.search) {
+    var p = this.pathname || '';
+    var s = this.search || '';
+    this.path = p + s;
+  }
+ 
+  // finally, reconstruct the href based on what has been validated.
+  this.href = this.format();
+  return this;
+};
+ 
+// format a parsed object into a url string
+function urlFormat(obj) {
+  // ensure it's an object, and not a string url.
+  // If it's an obj, this is a no-op.
+  // this way, you can call url_format() on strings
+  // to clean up potentially wonky urls.
+  if (isString(obj)) obj = urlParse(obj);
+  if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
+  return obj.format();
+}
+ 
+Url.prototype.format = function() {
+  var auth = this.auth || '';
+  if (auth) {
+    auth = encodeURIComponent(auth);
+    auth = auth.replace(/%3A/i, ':');
+    auth += '@';
+  }
+ 
+  var protocol = this.protocol || '',
+      pathname = this.pathname || '',
+      hash = this.hash || '',
+      host = false,
+      query = '';
+ 
+  if (this.host) {
+    host = auth + this.host;
+  } else if (this.hostname) {
+    host = auth + (this.hostname.indexOf(':') === -1 ?
+        this.hostname :
+        '[' + this.hostname + ']');
+    if (this.port) {
+      host += ':' + this.port;
+    }
+  }
+ 
+  if (this.query &&
+      isObject(this.query) &&
+      Object.keys(this.query).length) {
+    query = querystring.stringify(this.query);
+  }
+ 
+  var search = this.search || (query && ('?' + query)) || '';
+ 
+  if (protocol && protocol.substr(-1) !== ':') protocol += ':';
+ 
+  // only the slashedProtocols get the //.  Not mailto:, xmpp:, etc.
+  // unless they had them to begin with.
+  if (this.slashes ||
+      (!protocol || slashedProtocol[protocol]) && host !== false) {
+    host = '//' + (host || '');
+    if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
+  } else if (!host) {
+    host = '';
+  }
+ 
+  if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
+  if (search && search.charAt(0) !== '?') search = '?' + search;
+ 
+  pathname = pathname.replace(/[?#]/g, function(match) {
+    return encodeURIComponent(match);
+  });
+  search = search.replace('#', '%23');
+ 
+  return protocol + host + pathname + search + hash;
+};
+ 
+function urlResolve(source, relative) {
+  return urlParse(source, false, true).resolve(relative);
+}
+ 
+Url.prototype.resolve = function(relative) {
+  return this.resolveObject(urlParse(relative, false, true)).format();
+};
+ 
+function urlResolveObject(source, relative) {
+  if (!source) return relative;
+  return urlParse(source, false, true).resolveObject(relative);
+}
+ 
+Url.prototype.resolveObject = function(relative) {
+  if (isString(relative)) {
+    var rel = new Url();
+    rel.parse(relative, false, true);
+    relative = rel;
+  }
+ 
+  var result = new Url();
+  Object.keys(this).forEach(function(k) {
+    result[k] = this[k];
+  }, this);
+ 
+  // hash is always overridden, no matter what.
+  // even href="" will remove it.
+  result.hash = relative.hash;
+ 
+  // if the relative url is empty, then there's nothing left to do here.
+  if (relative.href === '') {
+    result.href = result.format();
+    return result;
+  }
+ 
+  // hrefs like //foo/bar always cut to the protocol.
+  if (relative.slashes && !relative.protocol) {
+    // take everything except the protocol from relative
+    Object.keys(relative).forEach(function(k) {
+      if (k !== 'protocol')
+        result[k] = relative[k];
+    });
+ 
+    //urlParse appends trailing / to urls like http://www.example.com
+    if (slashedProtocol[result.protocol] &&
+        result.hostname && !result.pathname) {
+      result.path = result.pathname = '/';
+    }
+ 
+    result.href = result.format();
+    return result;
+  }
+ 
+  if (relative.protocol && relative.protocol !== result.protocol) {
+    // if it's a known url protocol, then changing
+    // the protocol does weird things
+    // first, if it's not file:, then we MUST have a host,
+    // and if there was a path
+    // to begin with, then we MUST have a path.
+    // if it is file:, then the host is dropped,
+    // because that's known to be hostless.
+    // anything else is assumed to be absolute.
+    if (!slashedProtocol[relative.protocol]) {
+      Object.keys(relative).forEach(function(k) {
+        result[k] = relative[k];
+      });
+      result.href = result.format();
+      return result;
+    }
+ 
+    result.protocol = relative.protocol;
+    if (!relative.host && !hostlessProtocol[relative.protocol]) {
+      var relPath = (relative.pathname || '').split('/');
+      while (relPath.length && !(relative.host = relPath.shift()));
+      if (!relative.host) relative.host = '';
+      if (!relative.hostname) relative.hostname = '';
+      if (relPath[0] !== '') relPath.unshift('');
+      if (relPath.length < 2) relPath.unshift('');
+      result.pathname = relPath.join('/');
+    } else {
+      result.pathname = relative.pathname;
+    }
+    result.search = relative.search;
+    result.query = relative.query;
+    result.host = relative.host || '';
+    result.auth = relative.auth;
+    result.hostname = relative.hostname || relative.host;
+    result.port = relative.port;
+    // to support http.request
+    if (result.pathname || result.search) {
+      var p = result.pathname || '';
+      var s = result.search || '';
+      result.path = p + s;
+    }
+    result.slashes = result.slashes || relative.slashes;
+    result.href = result.format();
+    return result;
+  }
+ 
+  var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
+      isRelAbs = (
+          relative.host ||
+          relative.pathname && relative.pathname.charAt(0) === '/'
+      ),
+      mustEndAbs = (isRelAbs || isSourceAbs ||
+                    (result.host && relative.pathname)),
+      removeAllDots = mustEndAbs,
+      srcPath = result.pathname && result.pathname.split('/') || [],
+      relPath = relative.pathname && relative.pathname.split('/') || [],
+      psychotic = result.protocol && !slashedProtocol[result.protocol];
+ 
+  // if the url is a non-slashed url, then relative
+  // links like ../.. should be able
+  // to crawl up to the hostname, as well.  This is strange.
+  // result.protocol has already been set by now.
+  // Later on, put the first path part into the host field.
+  if (psychotic) {
+    result.hostname = '';
+    result.port = null;
+    if (result.host) {
+      if (srcPath[0] === '') srcPath[0] = result.host;
+      else srcPath.unshift(result.host);
+    }
+    result.host = '';
+    if (relative.protocol) {
+      relative.hostname = null;
+      relative.port = null;
+      if (relative.host) {
+        if (relPath[0] === '') relPath[0] = relative.host;
+        else relPath.unshift(relative.host);
+      }
+      relative.host = null;
+    }
+    mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+  }
+ 
+  if (isRelAbs) {
+    // it's absolute.
+    result.host = (relative.host || relative.host === '') ?
+                  relative.host : result.host;
+    result.hostname = (relative.hostname || relative.hostname === '') ?
+                      relative.hostname : result.hostname;
+    result.search = relative.search;
+    result.query = relative.query;
+    srcPath = relPath;
+    // fall through to the dot-handling below.
+  } else if (relPath.length) {
+    // it's relative
+    // throw away the existing file, and take the new path instead.
+    if (!srcPath) srcPath = [];
+    srcPath.pop();
+    srcPath = srcPath.concat(relPath);
+    result.search = relative.search;
+    result.query = relative.query;
+  } else if (!isNullOrUndefined(relative.search)) {
+    // just pull out the search.
+    // like href='?foo'.
+    // Put this after the other two cases because it simplifies the booleans
+    if (psychotic) {
+      result.hostname = result.host = srcPath.shift();
+      //occationaly the auth can get stuck only in host
+      //this especialy happens in cases like
+      //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+      var authInHost = result.host && result.host.indexOf('@') > 0 ?
+                       result.host.split('@') : false;
+      if (authInHost) {
+        result.auth = authInHost.shift();
+        result.host = result.hostname = authInHost.shift();
+      }
+    }
+    result.search = relative.search;
+    result.query = relative.query;
+    //to support http.request
+    if (!isNull(result.pathname) || !isNull(result.search)) {
+      result.path = (result.pathname ? result.pathname : '') +
+                    (result.search ? result.search : '');
+    }
+    result.href = result.format();
+    return result;
+  }
+ 
+  if (!srcPath.length) {
+    // no path at all.  easy.
+    // we've already handled the other stuff above.
+    result.pathname = null;
+    //to support http.request
+    if (result.search) {
+      result.path = '/' + result.search;
+    } else {
+      result.path = null;
+    }
+    result.href = result.format();
+    return result;
+  }
+ 
+  // if a url ENDs in . or .., then it must get a trailing slash.
+  // however, if it ends in anything else non-slashy,
+  // then it must NOT get a trailing slash.
+  var last = srcPath.slice(-1)[0];
+  var hasTrailingSlash = (
+      (result.host || relative.host) && (last === '.' || last === '..') ||
+      last === '');
+ 
+  // strip single dots, resolve double dots to parent dir
+  // if the path tries to go above the root, `up` ends up > 0
+  var up = 0;
+  for (var i = srcPath.length; i >= 0; i--) {
+    last = srcPath[i];
+    if (last == '.') {
+      srcPath.splice(i, 1);
+    } else if (last === '..') {
+      srcPath.splice(i, 1);
+      up++;
+    } else if (up) {
+      srcPath.splice(i, 1);
+      up--;
+    }
+  }
+ 
+  // if the path is allowed to go above the root, restore leading ..s
+  if (!mustEndAbs && !removeAllDots) {
+    for (; up--; up) {
+      srcPath.unshift('..');
+    }
+  }
+ 
+  if (mustEndAbs && srcPath[0] !== '' &&
+      (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+    srcPath.unshift('');
+  }
+ 
+  if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
+    srcPath.push('');
+  }
+ 
+  var isAbsolute = srcPath[0] === '' ||
+      (srcPath[0] && srcPath[0].charAt(0) === '/');
+ 
+  // put the host back
+  if (psychotic) {
+    result.hostname = result.host = isAbsolute ? '' :
+                                    srcPath.length ? srcPath.shift() : '';
+    //occationaly the auth can get stuck only in host
+    //this especialy happens in cases like
+    //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+    var authInHost = result.host && result.host.indexOf('@') > 0 ?
+                     result.host.split('@') : false;
+    if (authInHost) {
+      result.auth = authInHost.shift();
+      result.host = result.hostname = authInHost.shift();
+    }
+  }
+ 
+  mustEndAbs = mustEndAbs || (result.host && srcPath.length);
+ 
+  if (mustEndAbs && !isAbsolute) {
+    srcPath.unshift('');
+  }
+ 
+  if (!srcPath.length) {
+    result.pathname = null;
+    result.path = null;
+  } else {
+    result.pathname = srcPath.join('/');
+  }
+ 
+  //to support request.http
+  if (!isNull(result.pathname) || !isNull(result.search)) {
+    result.path = (result.pathname ? result.pathname : '') +
+                  (result.search ? result.search : '');
+  }
+  result.auth = relative.auth || result.auth;
+  result.slashes = result.slashes || relative.slashes;
+  result.href = result.format();
+  return result;
+};
+ 
+Url.prototype.parseHost = function() {
+  var host = this.host;
+  var port = portPattern.exec(host);
+  if (port) {
+    port = port[0];
+    if (port !== ':') {
+      this.port = port.substr(1);
+    }
+    host = host.substr(0, host.length - port.length);
+  }
+  if (host) this.hostname = host;
+};
+ 
+function isString(arg) {
+  return typeof arg === "string";
+}
+ 
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+ 
+function isNull(arg) {
+  return arg === null;
+}
+function isNullOrUndefined(arg) {
+  return  arg == null;
+}
+ 
+},{"punycode":43,"querystring":46}],72:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+  return arg && typeof arg === 'object'
+    && typeof arg.copy === 'function'
+    && typeof arg.fill === 'function'
+    && typeof arg.readUInt8 === 'function';
+}
+},{}],73:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+  if (!isString(f)) {
+    var objects = [];
+    for (var i = 0; i < arguments.length; i++) {
+      objects.push(inspect(arguments[i]));
+    }
+    return objects.join(' ');
+  }
+ 
+  var i = 1;
+  var args = arguments;
+  var len = args.length;
+  var str = String(f).replace(formatRegExp, function(x) {
+    if (x === '%%') return '%';
+    if (i >= len) return x;
+    switch (x) {
+      case '%s': return String(args[i++]);
+      case '%d': return Number(args[i++]);
+      case '%j':
+        try {
+          return JSON.stringify(args[i++]);
+        } catch (_) {
+          return '[Circular]';
+        }
+      default:
+        return x;
+    }
+  });
+  for (var x = args[i]; i < len; x = args[++i]) {
+    if (isNull(x) || !isObject(x)) {
+      str += ' ' + x;
+    } else {
+      str += ' ' + inspect(x);
+    }
+  }
+  return str;
+};
+ 
+ 
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+  // Allow for deprecating things in the process of starting up.
+  if (isUndefined(global.process)) {
+    return function() {
+      return exports.deprecate(fn, msg).apply(this, arguments);
+    };
+  }
+ 
+  if (process.noDeprecation === true) {
+    return fn;
+  }
+ 
+  var warned = false;
+  function deprecated() {
+    if (!warned) {
+      if (process.throwDeprecation) {
+        throw new Error(msg);
+      } else if (process.traceDeprecation) {
+        console.trace(msg);
+      } else {
+        console.error(msg);
+      }
+      warned = true;
+    }
+    return fn.apply(this, arguments);
+  }
+ 
+  return deprecated;
+};
+ 
+ 
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+  if (isUndefined(debugEnviron))
+    debugEnviron = process.env.NODE_DEBUG || '';
+  set = set.toUpperCase();
+  if (!debugs[set]) {
+    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+      var pid = process.pid;
+      debugs[set] = function() {
+        var msg = exports.format.apply(exports, arguments);
+        console.error('%s %d: %s', set, pid, msg);
+      };
+    } else {
+      debugs[set] = function() {};
+    }
+  }
+  return debugs[set];
+};
+ 
+ 
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+  // default options
+  var ctx = {
+    seen: [],
+    stylize: stylizeNoColor
+  };
+  // legacy...
+  if (arguments.length >= 3) ctx.depth = arguments[2];
+  if (arguments.length >= 4) ctx.colors = arguments[3];
+  if (isBoolean(opts)) {
+    // legacy...
+    ctx.showHidden = opts;
+  } else if (opts) {
+    // got an "options" object
+    exports._extend(ctx, opts);
+  }
+  // set default options
+  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+  if (isUndefined(ctx.depth)) ctx.depth = 2;
+  if (isUndefined(ctx.colors)) ctx.colors = false;
+  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+  if (ctx.colors) ctx.stylize = stylizeWithColor;
+  return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+ 
+ 
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+  'bold' : [1, 22],
+  'italic' : [3, 23],
+  'underline' : [4, 24],
+  'inverse' : [7, 27],
+  'white' : [37, 39],
+  'grey' : [90, 39],
+  'black' : [30, 39],
+  'blue' : [34, 39],
+  'cyan' : [36, 39],
+  'green' : [32, 39],
+  'magenta' : [35, 39],
+  'red' : [31, 39],
+  'yellow' : [33, 39]
+};
+ 
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+  'special': 'cyan',
+  'number': 'yellow',
+  'boolean': 'yellow',
+  'undefined': 'grey',
+  'null': 'bold',
+  'string': 'green',
+  'date': 'magenta',
+  // "name": intentionally not styling
+  'regexp': 'red'
+};
+ 
+ 
+function stylizeWithColor(str, styleType) {
+  var style = inspect.styles[styleType];
+ 
+  if (style) {
+    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+           '\u001b[' + inspect.colors[style][1] + 'm';
+  } else {
+    return str;
+  }
+}
+ 
+ 
+function stylizeNoColor(str, styleType) {
+  return str;
+}
+ 
+ 
+function arrayToHash(array) {
+  var hash = {};
+ 
+  array.forEach(function(val, idx) {
+    hash[val] = true;
+  });
+ 
+  return hash;
+}
+ 
+ 
+function formatValue(ctx, value, recurseTimes) {
+  // Provide a hook for user-specified inspect functions.
+  // Check that value is an object with an inspect function on it
+  if (ctx.customInspect &&
+      value &&
+      isFunction(value.inspect) &&
+      // Filter out the util module, it's inspect function is special
+      value.inspect !== exports.inspect &&
+      // Also filter out any prototype objects using the circular check.
+      !(value.constructor && value.constructor.prototype === value)) {
+    var ret = value.inspect(recurseTimes, ctx);
+    if (!isString(ret)) {
+      ret = formatValue(ctx, ret, recurseTimes);
+    }
+    return ret;
+  }
+ 
+  // Primitive types cannot have properties
+  var primitive = formatPrimitive(ctx, value);
+  if (primitive) {
+    return primitive;
+  }
+ 
+  // Look up the keys of the object.
+  var keys = Object.keys(value);
+  var visibleKeys = arrayToHash(keys);
+ 
+  if (ctx.showHidden) {
+    keys = Object.getOwnPropertyNames(value);
+  }
+ 
+  // IE doesn't make error fields non-enumerable
+  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+  if (isError(value)
+      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+    return formatError(value);
+  }
+ 
+  // Some type of object without properties can be shortcutted.
+  if (keys.length === 0) {
+    if (isFunction(value)) {
+      var name = value.name ? ': ' + value.name : '';
+      return ctx.stylize('[Function' + name + ']', 'special');
+    }
+    if (isRegExp(value)) {
+      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+    }
+    if (isDate(value)) {
+      return ctx.stylize(Date.prototype.toString.call(value), 'date');
+    }
+    if (isError(value)) {
+      return formatError(value);
+    }
+  }
+ 
+  var base = '', array = false, braces = ['{', '}'];
+ 
+  // Make Array say that they are Array
+  if (isArray(value)) {
+    array = true;
+    braces = ['[', ']'];
+  }
+ 
+  // Make functions say that they are functions
+  if (isFunction(value)) {
+    var n = value.name ? ': ' + value.name : '';
+    base = ' [Function' + n + ']';
+  }
+ 
+  // Make RegExps say that they are RegExps
+  if (isRegExp(value)) {
+    base = ' ' + RegExp.prototype.toString.call(value);
+  }
+ 
+  // Make dates with properties first say the date
+  if (isDate(value)) {
+    base = ' ' + Date.prototype.toUTCString.call(value);
+  }
+ 
+  // Make error with message first say the error
+  if (isError(value)) {
+    base = ' ' + formatError(value);
+  }
+ 
+  if (keys.length === 0 && (!array || value.length == 0)) {
+    return braces[0] + base + braces[1];
+  }
+ 
+  if (recurseTimes < 0) {
+    if (isRegExp(value)) {
+      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+    } else {
+      return ctx.stylize('[Object]', 'special');
+    }
+  }
+ 
+  ctx.seen.push(value);
+ 
+  var output;
+  if (array) {
+    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+  } else {
+    output = keys.map(function(key) {
+      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+    });
+  }
+ 
+  ctx.seen.pop();
+ 
+  return reduceToSingleString(output, base, braces);
+}
+ 
+ 
+function formatPrimitive(ctx, value) {
+  if (isUndefined(value))
+    return ctx.stylize('undefined', 'undefined');
+  if (isString(value)) {
+    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+                                             .replace(/'/g, "\\'")
+                                             .replace(/\\"/g, '"') + '\'';
+    return ctx.stylize(simple, 'string');
+  }
+  if (isNumber(value))
+    return ctx.stylize('' + value, 'number');
+  if (isBoolean(value))
+    return ctx.stylize('' + value, 'boolean');
+  // For some reason typeof null is "object", so special case here.
+  if (isNull(value))
+    return ctx.stylize('null', 'null');
+}
+ 
+ 
+function formatError(value) {
+  return '[' + Error.prototype.toString.call(value) + ']';
+}
+ 
+ 
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+  var output = [];
+  for (var i = 0, l = value.length; i < l; ++i) {
+    if (hasOwnProperty(value, String(i))) {
+      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+          String(i), true));
+    } else {
+      output.push('');
+    }
+  }
+  keys.forEach(function(key) {
+    if (!key.match(/^\d+$/)) {
+      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+          key, true));
+    }
+  });
+  return output;
+}
+ 
+ 
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+  var name, str, desc;
+  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+  if (desc.get) {
+    if (desc.set) {
+      str = ctx.stylize('[Getter/Setter]', 'special');
+    } else {
+      str = ctx.stylize('[Getter]', 'special');
+    }
+  } else {
+    if (desc.set) {
+      str = ctx.stylize('[Setter]', 'special');
+    }
+  }
+  if (!hasOwnProperty(visibleKeys, key)) {
+    name = '[' + key + ']';
+  }
+  if (!str) {
+    if (ctx.seen.indexOf(desc.value) < 0) {
+      if (isNull(recurseTimes)) {
+        str = formatValue(ctx, desc.value, null);
+      } else {
+        str = formatValue(ctx, desc.value, recurseTimes - 1);
+      }
+      if (str.indexOf('\n') > -1) {
+        if (array) {
+          str = str.split('\n').map(function(line) {
+            return '  ' + line;
+          }).join('\n').substr(2);
+        } else {
+          str = '\n' + str.split('\n').map(function(line) {
+            return '   ' + line;
+          }).join('\n');
+        }
+      }
+    } else {
+      str = ctx.stylize('[Circular]', 'special');
+    }
+  }
+  if (isUndefined(name)) {
+    if (array && key.match(/^\d+$/)) {
+      return str;
+    }
+    name = JSON.stringify('' + key);
+    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+      name = name.substr(1, name.length - 2);
+      name = ctx.stylize(name, 'name');
+    } else {
+      name = name.replace(/'/g, "\\'")
+                 .replace(/\\"/g, '"')
+                 .replace(/(^"|"$)/g, "'");
+      name = ctx.stylize(name, 'string');
+    }
+  }
+ 
+  return name + ': ' + str;
+}
+ 
+ 
+function reduceToSingleString(output, base, braces) {
+  var numLinesEst = 0;
+  var length = output.reduce(function(prev, cur) {
+    numLinesEst++;
+    if (cur.indexOf('\n') >= 0) numLinesEst++;
+    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+  }, 0);
+ 
+  if (length > 60) {
+    return braces[0] +
+           (base === '' ? '' : base + '\n ') +
+           ' ' +
+           output.join(',\n  ') +
+           ' ' +
+           braces[1];
+  }
+ 
+  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+ 
+ 
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+  return Array.isArray(ar);
+}
+exports.isArray = isArray;
+ 
+function isBoolean(arg) {
+  return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+ 
+function isNull(arg) {
+  return arg === null;
+}
+exports.isNull = isNull;
+ 
+function isNullOrUndefined(arg) {
+  return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+ 
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+ 
+function isString(arg) {
+  return typeof arg === 'string';
+}
+exports.isString = isString;
+ 
+function isSymbol(arg) {
+  return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+ 
+function isUndefined(arg) {
+  return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+ 
+function isRegExp(re) {
+  return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+ 
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+ 
+function isDate(d) {
+  return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+ 
+function isError(e) {
+  return isObject(e) &&
+      (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+ 
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+ 
+function isPrimitive(arg) {
+  return arg === null ||
+         typeof arg === 'boolean' ||
+         typeof arg === 'number' ||
+         typeof arg === 'string' ||
+         typeof arg === 'symbol' ||  // ES6 symbol
+         typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+ 
+exports.isBuffer = require('./support/isBuffer');
+ 
+function objectToString(o) {
+  return Object.prototype.toString.call(o);
+}
+ 
+ 
+function pad(n) {
+  return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+ 
+ 
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+              'Oct', 'Nov', 'Dec'];
+ 
+// 26 Feb 16:19:34
+function timestamp() {
+  var d = new Date();
+  var time = [pad(d.getHours()),
+              pad(d.getMinutes()),
+              pad(d.getSeconds())].join(':');
+  return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+ 
+ 
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+ 
+ 
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ *     prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+ 
+exports._extend = function(origin, add) {
+  // Don't do anything if add isn't an object
+  if (!add || !isObject(add)) return origin;
+ 
+  var keys = Object.keys(add);
+  var i = keys.length;
+  while (i--) {
+    origin[keys[i]] = add[keys[i]];
+  }
+  return origin;
+};
+ 
+function hasOwnProperty(obj, prop) {
+  return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+ 
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":72,"_process":42,"inherits":38}],74:[function(require,module,exports){
+module.exports = extend
+ 
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+ 
+function extend() {
+    var target = {}
+ 
+    for (var i = 0; i < arguments.length; i++) {
+        var source = arguments[i]
+ 
+        for (var key in source) {
+            if (hasOwnProperty.call(source, key)) {
+                target[key] = source[key]
+            }
+        }
+    }
+ 
+    return target
+}
+ 
+},{}],75:[function(require,module,exports){
+ 
+exports = module.exports = function(bytes)
+{
+    var i = 0;
+    while(i < bytes.length)
+    {
+        if(     (// ASCII
+                    bytes[i] == 0x09 ||
+                    bytes[i] == 0x0A ||
+                    bytes[i] == 0x0D ||
+                    (0x20 <= bytes[i] && bytes[i] <= 0x7E)
+                )
+          ) {
+              i += 1;
+              continue;
+          }
+ 
+        if(     (// non-overlong 2-byte
+                    (0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
+                    (0x80 <= bytes[i+1] && bytes[i+1] <= 0xBF)
+                )
+          ) {
+              i += 2;
+              continue;
+          }
+ 
+        if(     (// excluding overlongs
+                    bytes[i] == 0xE0 &&
+                    (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
+                    (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
+                ) ||
+                (// straight 3-byte
+                 ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
+                  bytes[i] == 0xEE ||
+                  bytes[i] == 0xEF) &&
+                 (0x80 <= bytes[i + 1] && bytes[i+1] <= 0xBF) &&
+                 (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF)
+                ) ||
+                (// excluding surrogates
+                 bytes[i] == 0xED &&
+                 (0x80 <= bytes[i+1] && bytes[i+1] <= 0x9F) &&
+                 (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF)
+                )
+          ) {
+              i += 3;
+              continue;
+          }
+ 
+        if(     (// planes 1-3
+                    bytes[i] == 0xF0 &&
+                    (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
+                    (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
+                    (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
+                ) ||
+                (// planes 4-15
+                 (0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
+                 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
+                 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
+                 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
+                ) ||
+                (// plane 16
+                 bytes[i] == 0xF4 &&
+                 (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
+                 (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
+                 (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
+                )
+          ) {
+              i += 4;
+              continue;
+          }
+ 
+        return false;
+    }
+ 
+    return true;
+}
+ 
+},{}],76:[function(require,module,exports){
+var hashClear = require('./_hashClear'),
+    hashDelete = require('./_hashDelete'),
+    hashGet = require('./_hashGet'),
+    hashHas = require('./_hashHas'),
+    hashSet = require('./_hashSet');
+ 
+/**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Hash(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+ 
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+ 
+// Add methods to `Hash`.
+Hash.prototype.clear = hashClear;
+Hash.prototype['delete'] = hashDelete;
+Hash.prototype.get = hashGet;
+Hash.prototype.has = hashHas;
+Hash.prototype.set = hashSet;
+ 
+module.exports = Hash;
+ 
+},{"./_hashClear":97,"./_hashDelete":98,"./_hashGet":99,"./_hashHas":100,"./_hashSet":101}],77:[function(require,module,exports){
+var listCacheClear = require('./_listCacheClear'),
+    listCacheDelete = require('./_listCacheDelete'),
+    listCacheGet = require('./_listCacheGet'),
+    listCacheHas = require('./_listCacheHas'),
+    listCacheSet = require('./_listCacheSet');
+ 
+/**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function ListCache(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+ 
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+ 
+// Add methods to `ListCache`.
+ListCache.prototype.clear = listCacheClear;
+ListCache.prototype['delete'] = listCacheDelete;
+ListCache.prototype.get = listCacheGet;
+ListCache.prototype.has = listCacheHas;
+ListCache.prototype.set = listCacheSet;
+ 
+module.exports = ListCache;
+ 
+},{"./_listCacheClear":106,"./_listCacheDelete":107,"./_listCacheGet":108,"./_listCacheHas":109,"./_listCacheSet":110}],78:[function(require,module,exports){
+var getNative = require('./_getNative'),
+    root = require('./_root');
+ 
+/* Built-in method references that are verified to be native. */
+var Map = getNative(root, 'Map');
+ 
+module.exports = Map;
+ 
+},{"./_getNative":94,"./_root":119}],79:[function(require,module,exports){
+var mapCacheClear = require('./_mapCacheClear'),
+    mapCacheDelete = require('./_mapCacheDelete'),
+    mapCacheGet = require('./_mapCacheGet'),
+    mapCacheHas = require('./_mapCacheHas'),
+    mapCacheSet = require('./_mapCacheSet');
+ 
+/**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function MapCache(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+ 
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+ 
+// Add methods to `MapCache`.
+MapCache.prototype.clear = mapCacheClear;
+MapCache.prototype['delete'] = mapCacheDelete;
+MapCache.prototype.get = mapCacheGet;
+MapCache.prototype.has = mapCacheHas;
+MapCache.prototype.set = mapCacheSet;
+ 
+module.exports = MapCache;
+ 
+},{"./_mapCacheClear":111,"./_mapCacheDelete":112,"./_mapCacheGet":113,"./_mapCacheHas":114,"./_mapCacheSet":115}],80:[function(require,module,exports){
+var root = require('./_root');
+ 
+/** Built-in value references. */
+var Symbol = root.Symbol;
+ 
+module.exports = Symbol;
+ 
+},{"./_root":119}],81:[function(require,module,exports){
+/**
+ * A specialized version of `_.map` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+function arrayMap(array, iteratee) {
+  var index = -1,
+      length = array == null ? 0 : array.length,
+      result = Array(length);
+ 
+  while (++index < length) {
+    result[index] = iteratee(array[index], index, array);
+  }
+  return result;
+}
+ 
+module.exports = arrayMap;
+ 
+},{}],82:[function(require,module,exports){
+var baseAssignValue = require('./_baseAssignValue'),
+    eq = require('./eq');
+ 
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+ 
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+ 
+/**
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignValue(object, key, value) {
+  var objValue = object[key];
+  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+      (value === undefined && !(key in object))) {
+    baseAssignValue(object, key, value);
+  }
+}
+ 
+module.exports = assignValue;
+ 
+},{"./_baseAssignValue":84,"./eq":123}],83:[function(require,module,exports){
+var eq = require('./eq');
+ 
+/**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function assocIndexOf(array, key) {
+  var length = array.length;
+  while (length--) {
+    if (eq(array[length][0], key)) {
+      return length;
+    }
+  }
+  return -1;
+}
+ 
+module.exports = assocIndexOf;
+ 
+},{"./eq":123}],84:[function(require,module,exports){
+var defineProperty = require('./_defineProperty');
+ 
+/**
+ * The base implementation of `assignValue` and `assignMergeValue` without
+ * value checks.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function baseAssignValue(object, key, value) {
+  if (key == '__proto__' && defineProperty) {
+    defineProperty(object, key, {
+      'configurable': true,
+      'enumerable': true,
+      'value': value,
+      'writable': true
+    });
+  } else {
+    object[key] = value;
+  }
+}
+ 
+module.exports = baseAssignValue;
+ 
+},{"./_defineProperty":91}],85:[function(require,module,exports){
+var Symbol = require('./_Symbol'),
+    getRawTag = require('./_getRawTag'),
+    objectToString = require('./_objectToString');
+ 
+/** `Object#toString` result references. */
+var nullTag = '[object Null]',
+    undefinedTag = '[object Undefined]';
+ 
+/** Built-in value references. */
+var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+ 
+/**
+ * The base implementation of `getTag` without fallbacks for buggy environments.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+function baseGetTag(value) {
+  if (value == null) {
+    return value === undefined ? undefinedTag : nullTag;
+  }
+  return (symToStringTag && symToStringTag in Object(value))
+    ? getRawTag(value)
+    : objectToString(value);
+}
+ 
+module.exports = baseGetTag;
+ 
+},{"./_Symbol":80,"./_getRawTag":95,"./_objectToString":118}],86:[function(require,module,exports){
+var isFunction = require('./isFunction'),
+    isMasked = require('./_isMasked'),
+    isObject = require('./isObject'),
+    toSource = require('./_toSource');
+ 
+/**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */
+var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+ 
+/** Used to detect host constructors (Safari). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+ 
+/** Used for built-in method references. */
+var funcProto = Function.prototype,
+    objectProto = Object.prototype;
+ 
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+ 
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+ 
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+ 
+/**
+ * The base implementation of `_.isNative` without bad shim checks.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ *  else `false`.
+ */
+function baseIsNative(value) {
+  if (!isObject(value) || isMasked(value)) {
+    return false;
+  }
+  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+  return pattern.test(toSource(value));
+}
+ 
+module.exports = baseIsNative;
+ 
+},{"./_isMasked":105,"./_toSource":122,"./isFunction":125,"./isObject":126}],87:[function(require,module,exports){
+var assignValue = require('./_assignValue'),
+    castPath = require('./_castPath'),
+    isIndex = require('./_isIndex'),
+    isObject = require('./isObject'),
+    toKey = require('./_toKey');
+ 
+/**
+ * The base implementation of `_.set`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @param {Function} [customizer] The function to customize path creation.
+ * @returns {Object} Returns `object`.
+ */
+function baseSet(object, path, value, customizer) {
+  if (!isObject(object)) {
+    return object;
+  }
+  path = castPath(path, object);
+ 
+  var index = -1,
+      length = path.length,
+      lastIndex = length - 1,
+      nested = object;
+ 
+  while (nested != null && ++index < length) {
+    var key = toKey(path[index]),
+        newValue = value;
+ 
+    if (index != lastIndex) {
+      var objValue = nested[key];
+      newValue = customizer ? customizer(objValue, key, nested) : undefined;
+      if (newValue === undefined) {
+        newValue = isObject(objValue)
+          ? objValue
+          : (isIndex(path[index + 1]) ? [] : {});
+      }
+    }
+    assignValue(nested, key, newValue);
+    nested = nested[key];
+  }
+  return object;
+}
+ 
+module.exports = baseSet;
+ 
+},{"./_assignValue":82,"./_castPath":89,"./_isIndex":102,"./_toKey":121,"./isObject":126}],88:[function(require,module,exports){
+var Symbol = require('./_Symbol'),
+    arrayMap = require('./_arrayMap'),
+    isArray = require('./isArray'),
+    isSymbol = require('./isSymbol');
+ 
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0;
+ 
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+    symbolToString = symbolProto ? symbolProto.toString : undefined;
+ 
+/**
+ * The base implementation of `_.toString` which doesn't convert nullish
+ * values to empty strings.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
+function baseToString(value) {
+  // Exit early for strings to avoid a performance hit in some environments.
+  if (typeof value == 'string') {
+    return value;
+  }
+  if (isArray(value)) {
+    // Recursively convert values (susceptible to call stack limits).
+    return arrayMap(value, baseToString) + '';
+  }
+  if (isSymbol(value)) {
+    return symbolToString ? symbolToString.call(value) : '';
+  }
+  var result = (value + '');
+  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+}
+ 
+module.exports = baseToString;
+ 
+},{"./_Symbol":80,"./_arrayMap":81,"./isArray":124,"./isSymbol":128}],89:[function(require,module,exports){
+var isArray = require('./isArray'),
+    isKey = require('./_isKey'),
+    stringToPath = require('./_stringToPath'),
+    toString = require('./toString');
+ 
+/**
+ * Casts `value` to a path array if it's not one.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {Array} Returns the cast property path array.
+ */
+function castPath(value, object) {
+  if (isArray(value)) {
+    return value;
+  }
+  return isKey(value, object) ? [value] : stringToPath(toString(value));
+}
+ 
+module.exports = castPath;
+ 
+},{"./_isKey":103,"./_stringToPath":120,"./isArray":124,"./toString":132}],90:[function(require,module,exports){
+var root = require('./_root');
+ 
+/** Used to detect overreaching core-js shims. */
+var coreJsData = root['__core-js_shared__'];
+ 
+module.exports = coreJsData;
+ 
+},{"./_root":119}],91:[function(require,module,exports){
+var getNative = require('./_getNative');
+ 
+var defineProperty = (function() {
+  try {
+    var func = getNative(Object, 'defineProperty');
+    func({}, '', {});
+    return func;
+  } catch (e) {}
+}());
+ 
+module.exports = defineProperty;
+ 
+},{"./_getNative":94}],92:[function(require,module,exports){
+(function (global){
+/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+ 
+module.exports = freeGlobal;
+ 
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],93:[function(require,module,exports){
+var isKeyable = require('./_isKeyable');
+ 
+/**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
+function getMapData(map, key) {
+  var data = map.__data__;
+  return isKeyable(key)
+    ? data[typeof key == 'string' ? 'string' : 'hash']
+    : data.map;
+}
+ 
+module.exports = getMapData;
+ 
+},{"./_isKeyable":104}],94:[function(require,module,exports){
+var baseIsNative = require('./_baseIsNative'),
+    getValue = require('./_getValue');
+ 
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+  var value = getValue(object, key);
+  return baseIsNative(value) ? value : undefined;
+}
+ 
+module.exports = getNative;
+ 
+},{"./_baseIsNative":86,"./_getValue":96}],95:[function(require,module,exports){
+var Symbol = require('./_Symbol');
+ 
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+ 
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+ 
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var nativeObjectToString = objectProto.toString;
+ 
+/** Built-in value references. */
+var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+ 
+/**
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the raw `toStringTag`.
+ */
+function getRawTag(value) {
+  var isOwn = hasOwnProperty.call(value, symToStringTag),
+      tag = value[symToStringTag];
+ 
+  try {
+    value[symToStringTag] = undefined;
+    var unmasked = true;
+  } catch (e) {}
+ 
+  var result = nativeObjectToString.call(value);
+  if (unmasked) {
+    if (isOwn) {
+      value[symToStringTag] = tag;
+    } else {
+      delete value[symToStringTag];
+    }
+  }
+  return result;
+}
+ 
+module.exports = getRawTag;
+ 
+},{"./_Symbol":80}],96:[function(require,module,exports){
+/**
+ * Gets the value at `key` of `object`.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
+function getValue(object, key) {
+  return object == null ? undefined : object[key];
+}
+ 
+module.exports = getValue;
+ 
+},{}],97:[function(require,module,exports){
+var nativeCreate = require('./_nativeCreate');
+ 
+/**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
+function hashClear() {
+  this.__data__ = nativeCreate ? nativeCreate(null) : {};
+  this.size = 0;
+}
+ 
+module.exports = hashClear;
+ 
+},{"./_nativeCreate":117}],98:[function(require,module,exports){
+/**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function hashDelete(key) {
+  var result = this.has(key) && delete this.__data__[key];
+  this.size -= result ? 1 : 0;
+  return result;
+}
+ 
+module.exports = hashDelete;
+ 
+},{}],99:[function(require,module,exports){
+var nativeCreate = require('./_nativeCreate');
+ 
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+ 
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+ 
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+ 
+/**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function hashGet(key) {
+  var data = this.__data__;
+  if (nativeCreate) {
+    var result = data[key];
+    return result === HASH_UNDEFINED ? undefined : result;
+  }
+  return hasOwnProperty.call(data, key) ? data[key] : undefined;
+}
+ 
+module.exports = hashGet;
+ 
+},{"./_nativeCreate":117}],100:[function(require,module,exports){
+var nativeCreate = require('./_nativeCreate');
+ 
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+ 
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+ 
+/**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function hashHas(key) {
+  var data = this.__data__;
+  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
+}
+ 
+module.exports = hashHas;
+ 
+},{"./_nativeCreate":117}],101:[function(require,module,exports){
+var nativeCreate = require('./_nativeCreate');
+ 
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+ 
+/**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
+function hashSet(key, value) {
+  var data = this.__data__;
+  this.size += this.has(key) ? 0 : 1;
+  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+  return this;
+}
+ 
+module.exports = hashSet;
+ 
+},{"./_nativeCreate":117}],102:[function(require,module,exports){
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+ 
+/** Used to detect unsigned integer values. */
+var reIsUint = /^(?:0|[1-9]\d*)$/;
+ 
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+  length = length == null ? MAX_SAFE_INTEGER : length;
+  return !!length &&
+    (typeof value == 'number' || reIsUint.test(value)) &&
+    (value > -1 && value % 1 == 0 && value < length);
+}
+ 
+module.exports = isIndex;
+ 
+},{}],103:[function(require,module,exports){
+var isArray = require('./isArray'),
+    isSymbol = require('./isSymbol');
+ 
+/** Used to match property names within property paths. */
+var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
+    reIsPlainProp = /^\w*$/;
+ 
+/**
+ * Checks if `value` is a property name and not a property path.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+ */
+function isKey(value, object) {
+  if (isArray(value)) {
+    return false;
+  }
+  var type = typeof value;
+  if (type == 'number' || type == 'symbol' || type == 'boolean' ||
+      value == null || isSymbol(value)) {
+    return true;
+  }
+  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
+    (object != null && value in Object(object));
+}
+ 
+module.exports = isKey;
+ 
+},{"./isArray":124,"./isSymbol":128}],104:[function(require,module,exports){
+/**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+function isKeyable(value) {
+  var type = typeof value;
+  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+    ? (value !== '__proto__')
+    : (value === null);
+}
+ 
+module.exports = isKeyable;
+ 
+},{}],105:[function(require,module,exports){
+var coreJsData = require('./_coreJsData');
+ 
+/** Used to detect methods masquerading as native. */
+var maskSrcKey = (function() {
+  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+  return uid ? ('Symbol(src)_1.' + uid) : '';
+}());
+ 
+/**
+ * Checks if `func` has its source masked.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+ */
+function isMasked(func) {
+  return !!maskSrcKey && (maskSrcKey in func);
+}
+ 
+module.exports = isMasked;
+ 
+},{"./_coreJsData":90}],106:[function(require,module,exports){
+/**
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
+function listCacheClear() {
+  this.__data__ = [];
+  this.size = 0;
+}
+ 
+module.exports = listCacheClear;
+ 
+},{}],107:[function(require,module,exports){
+var assocIndexOf = require('./_assocIndexOf');
+ 
+/** Used for built-in method references. */
+var arrayProto = Array.prototype;
+ 
+/** Built-in value references. */
+var splice = arrayProto.splice;
+ 
+/**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function listCacheDelete(key) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+ 
+  if (index < 0) {
+    return false;
+  }
+  var lastIndex = data.length - 1;
+  if (index == lastIndex) {
+    data.pop();
+  } else {
+    splice.call(data, index, 1);
+  }
+  --this.size;
+  return true;
+}
+ 
+module.exports = listCacheDelete;
+ 
+},{"./_assocIndexOf":83}],108:[function(require,module,exports){
+var assocIndexOf = require('./_assocIndexOf');
+ 
+/**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function listCacheGet(key) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+ 
+  return index < 0 ? undefined : data[index][1];
+}
+ 
+module.exports = listCacheGet;
+ 
+},{"./_assocIndexOf":83}],109:[function(require,module,exports){
+var assocIndexOf = require('./_assocIndexOf');
+ 
+/**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function listCacheHas(key) {
+  return assocIndexOf(this.__data__, key) > -1;
+}
+ 
+module.exports = listCacheHas;
+ 
+},{"./_assocIndexOf":83}],110:[function(require,module,exports){
+var assocIndexOf = require('./_assocIndexOf');
+ 
+/**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
+function listCacheSet(key, value) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+ 
+  if (index < 0) {
+    ++this.size;
+    data.push([key, value]);
+  } else {
+    data[index][1] = value;
+  }
+  return this;
+}
+ 
+module.exports = listCacheSet;
+ 
+},{"./_assocIndexOf":83}],111:[function(require,module,exports){
+var Hash = require('./_Hash'),
+    ListCache = require('./_ListCache'),
+    Map = require('./_Map');
+ 
+/**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+function mapCacheClear() {
+  this.size = 0;
+  this.__data__ = {
+    'hash': new Hash,
+    'map': new (Map || ListCache),
+    'string': new Hash
+  };
+}
+ 
+module.exports = mapCacheClear;
+ 
+},{"./_Hash":76,"./_ListCache":77,"./_Map":78}],112:[function(require,module,exports){
+var getMapData = require('./_getMapData');
+ 
+/**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function mapCacheDelete(key) {
+  var result = getMapData(this, key)['delete'](key);
+  this.size -= result ? 1 : 0;
+  return result;
+}
+ 
+module.exports = mapCacheDelete;
+ 
+},{"./_getMapData":93}],113:[function(require,module,exports){
+var getMapData = require('./_getMapData');
+ 
+/**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function mapCacheGet(key) {
+  return getMapData(this, key).get(key);
+}
+ 
+module.exports = mapCacheGet;
+ 
+},{"./_getMapData":93}],114:[function(require,module,exports){
+var getMapData = require('./_getMapData');
+ 
+/**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function mapCacheHas(key) {
+  return getMapData(this, key).has(key);
+}
+ 
+module.exports = mapCacheHas;
+ 
+},{"./_getMapData":93}],115:[function(require,module,exports){
+var getMapData = require('./_getMapData');
+ 
+/**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
+function mapCacheSet(key, value) {
+  var data = getMapData(this, key),
+      size = data.size;
+ 
+  data.set(key, value);
+  this.size += data.size == size ? 0 : 1;
+  return this;
+}
+ 
+module.exports = mapCacheSet;
+ 
+},{"./_getMapData":93}],116:[function(require,module,exports){
+var memoize = require('./memoize');
+ 
+/** Used as the maximum memoize cache size. */
+var MAX_MEMOIZE_SIZE = 500;
+ 
+/**
+ * A specialized version of `_.memoize` which clears the memoized function's
+ * cache when it exceeds `MAX_MEMOIZE_SIZE`.
+ *
+ * @private
+ * @param {Function} func The function to have its output memoized.
+ * @returns {Function} Returns the new memoized function.
+ */
+function memoizeCapped(func) {
+  var result = memoize(func, function(key) {
+    if (cache.size === MAX_MEMOIZE_SIZE) {
+      cache.clear();
+    }
+    return key;
+  });
+ 
+  var cache = result.cache;
+  return result;
+}
+ 
+module.exports = memoizeCapped;
+ 
+},{"./memoize":130}],117:[function(require,module,exports){
+var getNative = require('./_getNative');
+ 
+/* Built-in method references that are verified to be native. */
+var nativeCreate = getNative(Object, 'create');
+ 
+module.exports = nativeCreate;
+ 
+},{"./_getNative":94}],118:[function(require,module,exports){
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+ 
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var nativeObjectToString = objectProto.toString;
+ 
+/**
+ * Converts `value` to a string using `Object.prototype.toString`.
+ *
+ * @private
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ */
+function objectToString(value) {
+  return nativeObjectToString.call(value);
+}
+ 
+module.exports = objectToString;
+ 
+},{}],119:[function(require,module,exports){
+var freeGlobal = require('./_freeGlobal');
+ 
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+ 
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+ 
+module.exports = root;
+ 
+},{"./_freeGlobal":92}],120:[function(require,module,exports){
+var memoizeCapped = require('./_memoizeCapped');
+ 
+/** Used to match property names within property paths. */
+var reLeadingDot = /^\./,
+    rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+ 
+/** Used to match backslashes in property paths. */
+var reEscapeChar = /\\(\\)?/g;
+ 
+/**
+ * Converts `string` to a property path array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the property path array.
+ */
+var stringToPath = memoizeCapped(function(string) {
+  var result = [];
+  if (reLeadingDot.test(string)) {
+    result.push('');
+  }
+  string.replace(rePropName, function(match, number, quote, string) {
+    result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
+  });
+  return result;
+});
+ 
+module.exports = stringToPath;
+ 
+},{"./_memoizeCapped":116}],121:[function(require,module,exports){
+var isSymbol = require('./isSymbol');
+ 
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0;
+ 
+/**
+ * Converts `value` to a string key if it's not a string or symbol.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {string|symbol} Returns the key.
+ */
+function toKey(value) {
+  if (typeof value == 'string' || isSymbol(value)) {
+    return value;
+  }
+  var result = (value + '');
+  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+}
+ 
+module.exports = toKey;
+ 
+},{"./isSymbol":128}],122:[function(require,module,exports){
+/** Used for built-in method references. */
+var funcProto = Function.prototype;
+ 
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+ 
+/**
+ * Converts `func` to its source code.
+ *
+ * @private
+ * @param {Function} func The function to convert.
+ * @returns {string} Returns the source code.
+ */
+function toSource(func) {
+  if (func != null) {
+    try {
+      return funcToString.call(func);
+    } catch (e) {}
+    try {
+      return (func + '');
+    } catch (e) {}
+  }
+  return '';
+}
+ 
+module.exports = toSource;
+ 
+},{}],123:[function(require,module,exports){
+/**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
+function eq(value, other) {
+  return value === other || (value !== value && other !== other);
+}
+ 
+module.exports = eq;
+ 
+},{}],124:[function(require,module,exports){
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+var isArray = Array.isArray;
+ 
+module.exports = isArray;
+ 
+},{}],125:[function(require,module,exports){
+var baseGetTag = require('./_baseGetTag'),
+    isObject = require('./isObject');
+ 
+/** `Object#toString` result references. */
+var asyncTag = '[object AsyncFunction]',
+    funcTag = '[object Function]',
+    genTag = '[object GeneratorFunction]',
+    proxyTag = '[object Proxy]';
+ 
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+  if (!isObject(value)) {
+    return false;
+  }
+  // The use of `Object#toString` avoids issues with the `typeof` operator
+  // in Safari 9 which returns 'object' for typed arrays and other constructors.
+  var tag = baseGetTag(value);
+  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+}
+ 
+module.exports = isFunction;
+ 
+},{"./_baseGetTag":85,"./isObject":126}],126:[function(require,module,exports){
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+  var type = typeof value;
+  return value != null && (type == 'object' || type == 'function');
+}
+ 
+module.exports = isObject;
+ 
+},{}],127:[function(require,module,exports){
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+  return value != null && typeof value == 'object';
+}
+ 
+module.exports = isObjectLike;
+ 
+},{}],128:[function(require,module,exports){
+var baseGetTag = require('./_baseGetTag'),
+    isObjectLike = require('./isObjectLike');
+ 
+/** `Object#toString` result references. */
+var symbolTag = '[object Symbol]';
+ 
+/**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+function isSymbol(value) {
+  return typeof value == 'symbol' ||
+    (isObjectLike(value) && baseGetTag(value) == symbolTag);
+}
+ 
+module.exports = isSymbol;
+ 
+},{"./_baseGetTag":85,"./isObjectLike":127}],129:[function(require,module,exports){
+(function (global){
+/**
+ * @license
+ * Lodash <https://lodash.com/>
+ * Copyright JS Foundation and other contributors <https://js.foundation/>
+ * Released under MIT license <https://lodash.com/license>
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
+ * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+ */
+;(function() {
+ 
+  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+  var undefined;
+ 
+  /** Used as the semantic version number. */
+  var VERSION = '4.17.3';
+ 
+  /** Used as the size to enable large array optimizations. */
+  var LARGE_ARRAY_SIZE = 200;
+ 
+  /** Error message constants. */
+  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
+      FUNC_ERROR_TEXT = 'Expected a function';
+ 
+  /** Used to stand-in for `undefined` hash values. */
+  var HASH_UNDEFINED = '__lodash_hash_undefined__';
+ 
+  /** Used as the maximum memoize cache size. */
+  var MAX_MEMOIZE_SIZE = 500;
+ 
+  /** Used as the internal argument placeholder. */
+  var PLACEHOLDER = '__lodash_placeholder__';
+ 
+  /** Used to compose bitmasks for cloning. */
+  var CLONE_DEEP_FLAG = 1,
+      CLONE_FLAT_FLAG = 2,
+      CLONE_SYMBOLS_FLAG = 4;
+ 
+  /** Used to compose bitmasks for value comparisons. */
+  var COMPARE_PARTIAL_FLAG = 1,
+      COMPARE_UNORDERED_FLAG = 2;
+ 
+  /** Used to compose bitmasks for function metadata. */
+  var WRAP_BIND_FLAG = 1,
+      WRAP_BIND_KEY_FLAG = 2,
+      WRAP_CURRY_BOUND_FLAG = 4,
+      WRAP_CURRY_FLAG = 8,
+      WRAP_CURRY_RIGHT_FLAG = 16,
+      WRAP_PARTIAL_FLAG = 32,
+      WRAP_PARTIAL_RIGHT_FLAG = 64,
+      WRAP_ARY_FLAG = 128,
+      WRAP_REARG_FLAG = 256,
+      WRAP_FLIP_FLAG = 512;
+ 
+  /** Used as default options for `_.truncate`. */
+  var DEFAULT_TRUNC_LENGTH = 30,
+      DEFAULT_TRUNC_OMISSION = '...';
+ 
+  /** Used to detect hot functions by number of calls within a span of milliseconds. */
+  var HOT_COUNT = 800,
+      HOT_SPAN = 16;
+ 
+  /** Used to indicate the type of lazy iteratees. */
+  var LAZY_FILTER_FLAG = 1,
+      LAZY_MAP_FLAG = 2,
+      LAZY_WHILE_FLAG = 3;
+ 
+  /** Used as references for various `Number` constants. */
+  var INFINITY = 1 / 0,
+      MAX_SAFE_INTEGER = 9007199254740991,
+      MAX_INTEGER = 1.7976931348623157e+308,
+      NAN = 0 / 0;
+ 
+  /** Used as references for the maximum length and index of an array. */
+  var MAX_ARRAY_LENGTH = 4294967295,
+      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
+      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
+ 
+  /** Used to associate wrap methods with their bit flags. */
+  var wrapFlags = [
+    ['ary', WRAP_ARY_FLAG],
+    ['bind', WRAP_BIND_FLAG],
+    ['bindKey', WRAP_BIND_KEY_FLAG],
+    ['curry', WRAP_CURRY_FLAG],
+    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
+    ['flip', WRAP_FLIP_FLAG],
+    ['partial', WRAP_PARTIAL_FLAG],
+    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
+    ['rearg', WRAP_REARG_FLAG]
+  ];
+ 
+  /** `Object#toString` result references. */
+  var argsTag = '[object Arguments]',
+      arrayTag = '[object Array]',
+      asyncTag = '[object AsyncFunction]',
+      boolTag = '[object Boolean]',
+      dateTag = '[object Date]',
+      domExcTag = '[object DOMException]',
+      errorTag = '[object Error]',
+      funcTag = '[object Function]',
+      genTag = '[object GeneratorFunction]',
+      mapTag = '[object Map]',
+      numberTag = '[object Number]',
+      nullTag = '[object Null]',
+      objectTag = '[object Object]',
+      promiseTag = '[object Promise]',
+      proxyTag = '[object Proxy]',
+      regexpTag = '[object RegExp]',
+      setTag = '[object Set]',
+      stringTag = '[object String]',
+      symbolTag = '[object Symbol]',
+      undefinedTag = '[object Undefined]',
+      weakMapTag = '[object WeakMap]',
+      weakSetTag = '[object WeakSet]';
+ 
+  var arrayBufferTag = '[object ArrayBuffer]',
+      dataViewTag = '[object DataView]',
+      float32Tag = '[object Float32Array]',
+      float64Tag = '[object Float64Array]',
+      int8Tag = '[object Int8Array]',
+      int16Tag = '[object Int16Array]',
+      int32Tag = '[object Int32Array]',
+      uint8Tag = '[object Uint8Array]',
+      uint8ClampedTag = '[object Uint8ClampedArray]',
+      uint16Tag = '[object Uint16Array]',
+      uint32Tag = '[object Uint32Array]';
+ 
+  /** Used to match empty string literals in compiled template source. */
+  var reEmptyStringLeading = /\b__p \+= '';/g,
+      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
+      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
+ 
+  /** Used to match HTML entities and HTML characters. */
+  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
+      reUnescapedHtml = /[&<>"']/g,
+      reHasEscapedHtml = RegExp(reEscapedHtml.source),
+      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+ 
+  /** Used to match template delimiters. */
+  var reEscape = /<%-([\s\S]+?)%>/g,
+      reEvaluate = /<%([\s\S]+?)%>/g,
+      reInterpolate = /<%=([\s\S]+?)%>/g;
+ 
+  /** Used to match property names within property paths. */
+  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
+      reIsPlainProp = /^\w*$/,
+      reLeadingDot = /^\./,
+      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+ 
+  /**
+   * Used to match `RegExp`
+   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+   */
+  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
+      reHasRegExpChar = RegExp(reRegExpChar.source);
+ 
+  /** Used to match leading and trailing whitespace. */
+  var reTrim = /^\s+|\s+$/g,
+      reTrimStart = /^\s+/,
+      reTrimEnd = /\s+$/;
+ 
+  /** Used to match wrap detail comments. */
+  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
+      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
+      reSplitDetails = /,? & /;
+ 
+  /** Used to match words composed of alphanumeric characters. */
+  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
+ 
+  /** Used to match backslashes in property paths. */
+  var reEscapeChar = /\\(\\)?/g;
+ 
+  /**
+   * Used to match
+   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
+   */
+  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
+ 
+  /** Used to match `RegExp` flags from their coerced string values. */
+  var reFlags = /\w*$/;
+ 
+  /** Used to detect bad signed hexadecimal string values. */
+  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+ 
+  /** Used to detect binary string values. */
+  var reIsBinary = /^0b[01]+$/i;
+ 
+  /** Used to detect host constructors (Safari). */
+  var reIsHostCtor = /^\[object .+?Constructor\]$/;
+ 
+  /** Used to detect octal string values. */
+  var reIsOctal = /^0o[0-7]+$/i;
+ 
+  /** Used to detect unsigned integer values. */
+  var reIsUint = /^(?:0|[1-9]\d*)$/;
+ 
+  /** Used to match Latin Unicode letters (excluding mathematical operators). */
+  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
+ 
+  /** Used to ensure capturing order of template delimiters. */
+  var reNoMatch = /($^)/;
+ 
+  /** Used to match unescaped characters in compiled string literals. */
+  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
+ 
+  /** Used to compose unicode character classes. */
+  var rsAstralRange = '\\ud800-\\udfff',
+      rsComboMarksRange = '\\u0300-\\u036f',
+      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
+      rsComboSymbolsRange = '\\u20d0-\\u20ff',
+      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
+      rsDingbatRange = '\\u2700-\\u27bf',
+      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
+      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
+      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
+      rsPunctuationRange = '\\u2000-\\u206f',
+      rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
+      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
+      rsVarRange = '\\ufe0e\\ufe0f',
+      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
+ 
+  /** Used to compose unicode capture groups. */
+  var rsApos = "['\u2019]",
+      rsAstral = '[' + rsAstralRange + ']',
+      rsBreak = '[' + rsBreakRange + ']',
+      rsCombo = '[' + rsComboRange + ']',
+      rsDigits = '\\d+',
+      rsDingbat = '[' + rsDingbatRange + ']',
+      rsLower = '[' + rsLowerRange + ']',
+      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
+      rsFitz = '\\ud83c[\\udffb-\\udfff]',
+      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
+      rsNonAstral = '[^' + rsAstralRange + ']',
+      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
+      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
+      rsUpper = '[' + rsUpperRange + ']',
+      rsZWJ = '\\u200d';
+ 
+  /** Used to compose unicode regexes. */
+  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
+      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
+      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
+      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
+      reOptMod = rsModifier + '?',
+      rsOptVar = '[' + rsVarRange + ']?',
+      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
+      rsOrdLower = '\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)',
+      rsOrdUpper = '\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)',
+      rsSeq = rsOptVar + reOptMod + rsOptJoin,
+      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
+      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
+ 
+  /** Used to match apostrophes. */
+  var reApos = RegExp(rsApos, 'g');
+ 
+  /**
+   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
+   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
+   */
+  var reComboMark = RegExp(rsCombo, 'g');
+ 
+  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
+  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
+ 
+  /** Used to match complex or compound words. */
+  var reUnicodeWord = RegExp([
+    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
+    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
+    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
+    rsUpper + '+' + rsOptContrUpper,
+    rsOrdUpper,
+    rsOrdLower,
+    rsDigits,
+    rsEmoji
+  ].join('|'), 'g');
+ 
+  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
+  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
+ 
+  /** Used to detect strings that need a more robust regexp to match words. */
+  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
+ 
+  /** Used to assign default `context` object properties. */
+  var contextProps = [
+    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
+    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
+    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
+    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
+    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
+  ];
+ 
+  /** Used to make template sourceURLs easier to identify. */
+  var templateCounter = -1;
+ 
+  /** Used to identify `toStringTag` values of typed arrays. */
+  var typedArrayTags = {};
+  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+  typedArrayTags[uint32Tag] = true;
+  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+  typedArrayTags[setTag] = typedArrayTags[stringTag] =
+  typedArrayTags[weakMapTag] = false;
+ 
+  /** Used to identify `toStringTag` values supported by `_.clone`. */
+  var cloneableTags = {};
+  cloneableTags[argsTag] = cloneableTags[arrayTag] =
+  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
+  cloneableTags[boolTag] = cloneableTags[dateTag] =
+  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
+  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
+  cloneableTags[int32Tag] = cloneableTags[mapTag] =
+  cloneableTags[numberTag] = cloneableTags[objectTag] =
+  cloneableTags[regexpTag] = cloneableTags[setTag] =
+  cloneableTags[stringTag] = cloneableTags[symbolTag] =
+  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
+  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+  cloneableTags[errorTag] = cloneableTags[funcTag] =
+  cloneableTags[weakMapTag] = false;
+ 
+  /** Used to map Latin Unicode letters to basic Latin letters. */
+  var deburredLetters = {
+    // Latin-1 Supplement block.
+    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
+    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
+    '\xc7': 'C',  '\xe7': 'c',
+    '\xd0': 'D',  '\xf0': 'd',
+    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
+    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
+    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
+    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
+    '\xd1': 'N',  '\xf1': 'n',
+    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
+    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
+    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
+    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
+    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
+    '\xc6': 'Ae', '\xe6': 'ae',
+    '\xde': 'Th', '\xfe': 'th',
+    '\xdf': 'ss',
+    // Latin Extended-A block.
+    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
+    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
+    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
+    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
+    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
+    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
+    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
+    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
+    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
+    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
+    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
+    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
+    '\u0134': 'J',  '\u0135': 'j',
+    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
+    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
+    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
+    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
+    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
+    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
+    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
+    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
+    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
+    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
+    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
+    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
+    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
+    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
+    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
+    '\u0174': 'W',  '\u0175': 'w',
+    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
+    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
+    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
+    '\u0132': 'IJ', '\u0133': 'ij',
+    '\u0152': 'Oe', '\u0153': 'oe',
+    '\u0149': "'n", '\u017f': 's'
+  };
+ 
+  /** Used to map characters to HTML entities. */
+  var htmlEscapes = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#39;'
+  };
+ 
+  /** Used to map HTML entities to characters. */
+  var htmlUnescapes = {
+    '&amp;': '&',
+    '&lt;': '<',
+    '&gt;': '>',
+    '&quot;': '"',
+    '&#39;': "'"
+  };
+ 
+  /** Used to escape characters for inclusion in compiled string literals. */
+  var stringEscapes = {
+    '\\': '\\',
+    "'": "'",
+    '\n': 'n',
+    '\r': 'r',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+ 
+  /** Built-in method references without a dependency on `root`. */
+  var freeParseFloat = parseFloat,
+      freeParseInt = parseInt;
+ 
+  /** Detect free variable `global` from Node.js. */
+  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+ 
+  /** Detect free variable `self`. */
+  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+ 
+  /** Used as a reference to the global object. */
+  var root = freeGlobal || freeSelf || Function('return this')();
+ 
+  /** Detect free variable `exports`. */
+  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
+ 
+  /** Detect free variable `module`. */
+  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+ 
+  /** Detect the popular CommonJS extension `module.exports`. */
+  var moduleExports = freeModule && freeModule.exports === freeExports;
+ 
+  /** Detect free variable `process` from Node.js. */
+  var freeProcess = moduleExports && freeGlobal.process;
+ 
+  /** Used to access faster Node.js helpers. */
+  var nodeUtil = (function() {
+    try {
+      return freeProcess && freeProcess.binding && freeProcess.binding('util');
+    } catch (e) {}
+  }());
+ 
+  /* Node.js helper references. */
+  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
+      nodeIsDate = nodeUtil && nodeUtil.isDate,
+      nodeIsMap = nodeUtil && nodeUtil.isMap,
+      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
+      nodeIsSet = nodeUtil && nodeUtil.isSet,
+      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+ 
+  /*--------------------------------------------------------------------------*/
+ 
+  /**
+   * Adds the key-value `pair` to `map`.
+   *
+   * @private
+   * @param {Object} map The map to modify.
+   * @param {Array} pair The key-value pair to add.
+   * @returns {Object} Returns `map`.
+   */
+  function addMapEntry(map, pair) {
+    // Don't return `map.set` because it's not chainable in IE 11.
+    map.set(pair[0], pair[1]);
+    return map;
+  }
+ 
+  /**
+   * Adds `value` to `set`.
+   *
+   * @private
+   * @param {Object} set The set to modify.
+   * @param {*} value The value to add.
+   * @returns {Object} Returns `set`.
+   */
+  function addSetEntry(set, value) {
+    // Don't return `set.add` because it's not chainable in IE 11.
+    set.add(value);
+    return set;
+  }
+ 
+  /**
+   * A faster alternative to `Function#apply`, this function invokes `func`
+   * with the `this` binding of `thisArg` and the arguments of `args`.
+   *
+   * @private
+   * @param {Function} func The function to invoke.
+   * @param {*} thisArg The `this` binding of `func`.
+   * @param {Array} args The arguments to invoke `func` with.
+   * @returns {*} Returns the result of `func`.
+   */
+  function apply(func, thisArg, args) {
+    switch (args.length) {
+      case 0: return func.call(thisArg);
+      case 1: return func.call(thisArg, args[0]);
+      case 2: return func.call(thisArg, args[0], args[1]);
+      case 3: return func.call(thisArg, args[0], args[1], args[2]);
+    }
+    return func.apply(thisArg, args);
+  }
+ 
+  /**
+   * A specialized version of `baseAggregator` for arrays.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} setter The function to set `accumulator` values.
+   * @param {Function} iteratee The iteratee to transform keys.
+   * @param {Object} accumulator The initial aggregated object.
+   * @returns {Function} Returns `accumulator`.
+   */
+  function arrayAggregator(array, setter, iteratee, accumulator) {
+    var index = -1,
+        length = array == null ? 0 : array.length;
+ 
+    while (++index < length) {
+      var value = array[index];
+      setter(accumulator, value, iteratee(value), array);
+    }
+    return accumulator;
+  }
+ 
+  /**
+   * A specialized version of `_.forEach` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns `array`.
+   */
+  function arrayEach(array, iteratee) {
+    var index = -1,
+        length = array == null ? 0 : array.length;
+ 
+    while (++index < length) {
+      if (iteratee(array[index], index, array) === false) {
+        break;
+      }
+    }
+    return array;
+  }
+ 
+  /**
+   * A specialized version of `_.forEachRight` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns `array`.
+   */
+  function arrayEachRight(array, iteratee) {
+    var length = array == null ? 0 : array.length;
+ 
+    while (length--) {
+      if (iteratee(array[length], length, array) === false) {
+        break;
+      }
+    }
+    return array;
+  }
+ 
+  /**
+   * A specialized version of `_.every` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} predicate The function invoked per iteration.
+   * @returns {boolean} Returns `true` if all elements pass the predicate check,
+   *  else `false`.
+   */
+  function arrayEvery(array, predicate) {
+    var index = -1,
+        length = array == null ? 0 : array.length;
+ 
+    while (++index < length) {
+      if (!predicate(array[index], index, array)) {
+        return false;
+      }
+    }
+    return true;
+  }
+ 
+  /**
+   * A specialized version of `_.filter` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} predicate The function invoked per iteration.
+   * @returns {Array} Returns the new filtered array.
+   */
+  function arrayFilter(array, predicate) {
+    var index = -1,
+        length = array == null ? 0 : array.length,
+        resIndex = 0,
+        result = [];
+ 
+    while (++index < length) {
+      var value = array[index];
+      if (predicate(value, index, array)) {
+        result[resIndex++] = value;
+      }
+    }
+    return result;
+  }
+ 
+  /**
+   * A specialized version of `_.includes` for arrays without support for
+   * specifying an index to search from.
+   *
+   * @private
+   * @param {Array} [array] The array to inspect.
+   * @param {*} target The value to search for.
+   * @returns {boolean} Returns `true` if `target` is found, else `false`.
+   */
+  function arrayIncludes(array, value) {
+    var length = array == null ? 0 : array.length;
+    return !!length && baseIndexOf(array, value, 0) > -1;
+  }
+ 
+  /**
+   * This function is like `arrayIncludes` except that it accepts a comparator.
+   *
+   * @private
+   * @param {Array} [array] The array to inspect.
+   * @param {*} target The value to search for.
+   * @param {Function} comparator The comparator invoked per element.
+   * @returns {boolean} Returns `true` if `target` is found, else `false`.
+   */
+  function arrayIncludesWith(array, value, comparator) {
+    var index = -1,
+        length = array == null ? 0 : array.length;
+ 
+    while (++index < length) {
+      if (comparator(value, array[index])) {
+        return true;
+      }
+    }
+    return false;
+  }
+ 
+  /**
+   * A specialized version of `_.map` for arrays without support for iteratee
+   * shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns the new mapped array.
+   */
+  function arrayMap(array, iteratee) {
+    var index = -1,
+        length = array == null ? 0 : array.length,
+        result = Array(length);
+ 
+    while (++index < length) {
+      result[index] = iteratee(array[index], index, array);
+    }
+    return result;
+  }
+ 
+  /**
+   * Appends the elements of `values` to `array`.
+   *
+   * @private
+   * @param {Array} array The array to modify.
+   * @param {Array} values The values to append.
+   * @returns {Array} Returns `array`.
+   */
+  function arrayPush(array, values) {
+    var index = -1,
+        length = values.length,
+        offset = array.length;
+ 
+    while (++index < length) {
+      array[offset + index] = values[index];
+    }
+    return array;
+  }
+ 
+  /**
+   * A specialized version of `_.reduce` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @param {*} [accumulator] The initial value.
+   * @param {boolean} [initAccum] Specify using the first element of `array` as
+   *  the initial value.
+   * @returns {*} Returns the accumulated value.
+   */
+  function arrayReduce(array, iteratee, accumulator, initAccum) {
+    var index = -1,
+        length = array == null ? 0 : array.length;
+ 
+    if (initAccum && length) {
+      accumulator = array[++index];
+    }
+    while (++index < length) {
+      accumulator = iteratee(accumulator, array[index], index, array);
+    }
+    return accumulator;
+  }
+ 
+  /**
+   * A specialized version of `_.reduceRight` for arrays without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @param {*} [accumulator] The initial value.
+   * @param {boolean} [initAccum] Specify using the last element of `array` as
+   *  the initial value.
+   * @returns {*} Returns the accumulated value.
+   */
+  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
+    var length = array == null ? 0 : array.length;
+    if (initAccum && length) {
+      accumulator = array[--length];
+    }
+    while (length--) {
+      accumulator = iteratee(accumulator, array[length], length, array);
+    }
+    return accumulator;
+  }
+ 
+  /**
+   * A specialized version of `_.some` for arrays without support for iteratee
+   * shorthands.
+   *
+   * @private
+   * @param {Array} [array] The array to iterate over.
+   * @param {Function} predicate The function invoked per iteration.
+   * @returns {boolean} Returns `true` if any element passes the predicate check,
+   *  else `false`.
+   */
+  function arraySome(array, predicate) {
+    var index = -1,
+        length = array == null ? 0 : array.length;
+ 
+    while (++index < length) {
+      if (predicate(array[index], index, array)) {
+        return true;
+      }
+    }
+    return false;
+  }
+ 
+  /**
+   * Gets the size of an ASCII `string`.
+   *
+   * @private
+   * @param {string} string The string inspect.
+   * @returns {number} Returns the string size.
+   */
+  var asciiSize = baseProperty('length');
+ 
+  /**
+   * Converts an ASCII `string` to an array.
+   *
+   * @private
+   * @param {string} string The string to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function asciiToArray(string) {
+    return string.split('');
+  }
+ 
+  /**
+   * Splits an ASCII `string` into an array of its words.
+   *
+   * @private
+   * @param {string} The string to inspect.
+   * @returns {Array} Returns the words of `string`.
+   */
+  function asciiWords(string) {
+    return string.match(reAsciiWord) || [];
+  }
+ 
+  /**
+   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
+   * without support for iteratee shorthands, which iterates over `collection`
+   * using `eachFunc`.
+   *
+   * @private
+   * @param {Array|Object} collection The collection to inspect.
+   * @param {Function} predicate The function invoked per iteration.
+   * @param {Function} eachFunc The function to iterate over `collection`.
+   * @returns {*} Returns the found element or its key, else `undefined`.
+   */
+  function baseFindKey(collection, predicate, eachFunc) {
+    var result;
+    eachFunc(collection, function(value, key, collection) {
+      if (predicate(value, key, collection)) {
+        result = key;
+        return false;
+      }
+    });
+    return result;
+  }
+ 
+  /**
+   * The base implementation of `_.findIndex` and `_.findLastIndex` without
+   * support for iteratee shorthands.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {Function} predicate The function invoked per iteration.
+   * @param {number} fromIndex The index to search from.
+   * @param {boolean} [fromRight] Specify iterating from right to left.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function baseFindIndex(array, predicate, fromIndex, fromRight) {
+    var length = array.length,
+        index = fromIndex + (fromRight ? 1 : -1);
+ 
+    while ((fromRight ? index-- : ++index < length)) {
+      if (predicate(array[index], index, array)) {
+        return index;
+      }
+    }
+    return -1;
+  }
+ 
+  /**
+   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function baseIndexOf(array, value, fromIndex) {
+    return value === value
+      ? strictIndexOf(array, value, fromIndex)
+      : baseFindIndex(array, baseIsNaN, fromIndex);
+  }
+ 
+  /**
+   * This function is like `baseIndexOf` except that it accepts a comparator.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @param {Function} comparator The comparator invoked per element.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function baseIndexOfWith(array, value, fromIndex, comparator) {
+    var index = fromIndex - 1,
+        length = array.length;
+ 
+    while (++index < length) {
+      if (comparator(array[index], value)) {
+        return index;
+      }
+    }
+    return -1;
+  }
+ 
+  /**
+   * The base implementation of `_.isNaN` without support for number objects.
+   *
+   * @private
+   * @param {*} value The value to check.
+   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+   */
+  function baseIsNaN(value) {
+    return value !== value;
+  }
+ 
+  /**
+   * The base implementation of `_.mean` and `_.meanBy` without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} array The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {number} Returns the mean.
+   */
+  function baseMean(array, iteratee) {
+    var length = array == null ? 0 : array.length;
+    return length ? (baseSum(array, iteratee) / length) : NAN;
+  }
+ 
+  /**
+   * The base implementation of `_.property` without support for deep paths.
+   *
+   * @private
+   * @param {string} key The key of the property to get.
+   * @returns {Function} Returns the new accessor function.
+   */
+  function baseProperty(key) {
+    return function(object) {
+      return object == null ? undefined : object[key];
+    };
+  }
+ 
+  /**
+   * The base implementation of `_.propertyOf` without support for deep paths.
+   *
+   * @private
+   * @param {Object} object The object to query.
+   * @returns {Function} Returns the new accessor function.
+   */
+  function basePropertyOf(object) {
+    return function(key) {
+      return object == null ? undefined : object[key];
+    };
+  }
+ 
+  /**
+   * The base implementation of `_.reduce` and `_.reduceRight`, without support
+   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
+   *
+   * @private
+   * @param {Array|Object} collection The collection to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @param {*} accumulator The initial value.
+   * @param {boolean} initAccum Specify using the first or last element of
+   *  `collection` as the initial value.
+   * @param {Function} eachFunc The function to iterate over `collection`.
+   * @returns {*} Returns the accumulated value.
+   */
+  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
+    eachFunc(collection, function(value, index, collection) {
+      accumulator = initAccum
+        ? (initAccum = false, value)
+        : iteratee(accumulator, value, index, collection);
+    });
+    return accumulator;
+  }
+ 
+  /**
+   * The base implementation of `_.sortBy` which uses `comparer` to define the
+   * sort order of `array` and replaces criteria objects with their corresponding
+   * values.
+   *
+   * @private
+   * @param {Array} array The array to sort.
+   * @param {Function} comparer The function to define sort order.
+   * @returns {Array} Returns `array`.
+   */
+  function baseSortBy(array, comparer) {
+    var length = array.length;
+ 
+    array.sort(comparer);
+    while (length--) {
+      array[length] = array[length].value;
+    }
+    return array;
+  }
+ 
+  /**
+   * The base implementation of `_.sum` and `_.sumBy` without support for
+   * iteratee shorthands.
+   *
+   * @private
+   * @param {Array} array The array to iterate over.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {number} Returns the sum.
+   */
+  function baseSum(array, iteratee) {
+    var result,
+        index = -1,
+        length = array.length;
+ 
+    while (++index < length) {
+      var current = iteratee(array[index]);
+      if (current !== undefined) {
+        result = result === undefined ? current : (result + current);
+      }
+    }
+    return result;
+  }
+ 
+  /**
+   * The base implementation of `_.times` without support for iteratee shorthands
+   * or max array length checks.
+   *
+   * @private
+   * @param {number} n The number of times to invoke `iteratee`.
+   * @param {Function} iteratee The function invoked per iteration.
+   * @returns {Array} Returns the array of results.
+   */
+  function baseTimes(n, iteratee) {
+    var index = -1,
+        result = Array(n);
+ 
+    while (++index < n) {
+      result[index] = iteratee(index);
+    }
+    return result;
+  }
+ 
+  /**
+   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
+   * of key-value pairs for `object` corresponding to the property names of `props`.
+   *
+   * @private
+   * @param {Object} object The object to query.
+   * @param {Array} props The property names to get values for.
+   * @returns {Object} Returns the key-value pairs.
+   */
+  function baseToPairs(object, props) {
+    return arrayMap(props, function(key) {
+      return [key, object[key]];
+    });
+  }
+ 
+  /**
+   * The base implementation of `_.unary` without support for storing metadata.
+   *
+   * @private
+   * @param {Function} func The function to cap arguments for.
+   * @returns {Function} Returns the new capped function.
+   */
+  function baseUnary(func) {
+    return function(value) {
+      return func(value);
+    };
+  }
+ 
+  /**
+   * The base implementation of `_.values` and `_.valuesIn` which creates an
+   * array of `object` property values corresponding to the property names
+   * of `props`.
+   *
+   * @private
+   * @param {Object} object The object to query.
+   * @param {Array} props The property names to get values for.
+   * @returns {Object} Returns the array of property values.
+   */
+  function baseValues(object, props) {
+    return arrayMap(props, function(key) {
+      return object[key];
+    });
+  }
+ 
+  /**
+   * Checks if a `cache` value for `key` exists.
+   *
+   * @private
+   * @param {Object} cache The cache to query.
+   * @param {string} key The key of the entry to check.
+   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+   */
+  function cacheHas(cache, key) {
+    return cache.has(key);
+  }
+ 
+  /**
+   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
+   * that is not found in the character symbols.
+   *
+   * @private
+   * @param {Array} strSymbols The string symbols to inspect.
+   * @param {Array} chrSymbols The character symbols to find.
+   * @returns {number} Returns the index of the first unmatched string symbol.
+   */
+  function charsStartIndex(strSymbols, chrSymbols) {
+    var index = -1,
+        length = strSymbols.length;
+ 
+    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
+    return index;
+  }
+ 
+  /**
+   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
+   * that is not found in the character symbols.
+   *
+   * @private
+   * @param {Array} strSymbols The string symbols to inspect.
+   * @param {Array} chrSymbols The character symbols to find.
+   * @returns {number} Returns the index of the last unmatched string symbol.
+   */
+  function charsEndIndex(strSymbols, chrSymbols) {
+    var index = strSymbols.length;
+ 
+    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
+    return index;
+  }
+ 
+  /**
+   * Gets the number of `placeholder` occurrences in `array`.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} placeholder The placeholder to search for.
+   * @returns {number} Returns the placeholder count.
+   */
+  function countHolders(array, placeholder) {
+    var length = array.length,
+        result = 0;
+ 
+    while (length--) {
+      if (array[length] === placeholder) {
+        ++result;
+      }
+    }
+    return result;
+  }
+ 
+  /**
+   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
+   * letters to basic Latin letters.
+   *
+   * @private
+   * @param {string} letter The matched letter to deburr.
+   * @returns {string} Returns the deburred letter.
+   */
+  var deburrLetter = basePropertyOf(deburredLetters);
+ 
+  /**
+   * Used by `_.escape` to convert characters to HTML entities.
+   *
+   * @private
+   * @param {string} chr The matched character to escape.
+   * @returns {string} Returns the escaped character.
+   */
+  var escapeHtmlChar = basePropertyOf(htmlEscapes);
+ 
+  /**
+   * Used by `_.template` to escape characters for inclusion in compiled string literals.
+   *
+   * @private
+   * @param {string} chr The matched character to escape.
+   * @returns {string} Returns the escaped character.
+   */
+  function escapeStringChar(chr) {
+    return '\\' + stringEscapes[chr];
+  }
+ 
+  /**
+   * Gets the value at `key` of `object`.
+   *
+   * @private
+   * @param {Object} [object] The object to query.
+   * @param {string} key The key of the property to get.
+   * @returns {*} Returns the property value.
+   */
+  function getValue(object, key) {
+    return object == null ? undefined : object[key];
+  }
+ 
+  /**
+   * Checks if `string` contains Unicode symbols.
+   *
+   * @private
+   * @param {string} string The string to inspect.
+   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+   */
+  function hasUnicode(string) {
+    return reHasUnicode.test(string);
+  }
+ 
+  /**
+   * Checks if `string` contains a word composed of Unicode symbols.
+   *
+   * @private
+   * @param {string} string The string to inspect.
+   * @returns {boolean} Returns `true` if a word is found, else `false`.
+   */
+  function hasUnicodeWord(string) {
+    return reHasUnicodeWord.test(string);
+  }
+ 
+  /**
+   * Converts `iterator` to an array.
+   *
+   * @private
+   * @param {Object} iterator The iterator to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function iteratorToArray(iterator) {
+    var data,
+        result = [];
+ 
+    while (!(data = iterator.next()).done) {
+      result.push(data.value);
+    }
+    return result;
+  }
+ 
+  /**
+   * Converts `map` to its key-value pairs.
+   *
+   * @private
+   * @param {Object} map The map to convert.
+   * @returns {Array} Returns the key-value pairs.
+   */
+  function mapToArray(map) {
+    var index = -1,
+        result = Array(map.size);
+ 
+    map.forEach(function(value, key) {
+      result[++index] = [key, value];
+    });
+    return result;
+  }
+ 
+  /**
+   * Creates a unary function that invokes `func` with its argument transformed.
+   *
+   * @private
+   * @param {Function} func The function to wrap.
+   * @param {Function} transform The argument transform.
+   * @returns {Function} Returns the new function.
+   */
+  function overArg(func, transform) {
+    return function(arg) {
+      return func(transform(arg));
+    };
+  }
+ 
+  /**
+   * Replaces all `placeholder` elements in `array` with an internal placeholder
+   * and returns an array of their indexes.
+   *
+   * @private
+   * @param {Array} array The array to modify.
+   * @param {*} placeholder The placeholder to replace.
+   * @returns {Array} Returns the new array of placeholder indexes.
+   */
+  function replaceHolders(array, placeholder) {
+    var index = -1,
+        length = array.length,
+        resIndex = 0,
+        result = [];
+ 
+    while (++index < length) {
+      var value = array[index];
+      if (value === placeholder || value === PLACEHOLDER) {
+        array[index] = PLACEHOLDER;
+        result[resIndex++] = index;
+      }
+    }
+    return result;
+  }
+ 
+  /**
+   * Converts `set` to an array of its values.
+   *
+   * @private
+   * @param {Object} set The set to convert.
+   * @returns {Array} Returns the values.
+   */
+  function setToArray(set) {
+    var index = -1,
+        result = Array(set.size);
+ 
+    set.forEach(function(value) {
+      result[++index] = value;
+    });
+    return result;
+  }
+ 
+  /**
+   * Converts `set` to its value-value pairs.
+   *
+   * @private
+   * @param {Object} set The set to convert.
+   * @returns {Array} Returns the value-value pairs.
+   */
+  function setToPairs(set) {
+    var index = -1,
+        result = Array(set.size);
+ 
+    set.forEach(function(value) {
+      result[++index] = [value, value];
+    });
+    return result;
+  }
+ 
+  /**
+   * A specialized version of `_.indexOf` which performs strict equality
+   * comparisons of values, i.e. `===`.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function strictIndexOf(array, value, fromIndex) {
+    var index = fromIndex - 1,
+        length = array.length;
+ 
+    while (++index < length) {
+      if (array[index] === value) {
+        return index;
+      }
+    }
+    return -1;
+  }
+ 
+  /**
+   * A specialized version of `_.lastIndexOf` which performs strict equality
+   * comparisons of values, i.e. `===`.
+   *
+   * @private
+   * @param {Array} array The array to inspect.
+   * @param {*} value The value to search for.
+   * @param {number} fromIndex The index to search from.
+   * @returns {number} Returns the index of the matched value, else `-1`.
+   */
+  function strictLastIndexOf(array, value, fromIndex) {
+    var index = fromIndex + 1;
+    while (index--) {
+      if (array[index] === value) {
+        return index;
+      }
+    }
+    return index;
+  }
+ 
+  /**
+   * Gets the number of symbols in `string`.
+   *
+   * @private
+   * @param {string} string The string to inspect.
+   * @returns {number} Returns the string size.
+   */
+  function stringSize(string) {
+    return hasUnicode(string)
+      ? unicodeSize(string)
+      : asciiSize(string);
+  }
+ 
+  /**
+   * Converts `string` to an array.
+   *
+   * @private
+   * @param {string} string The string to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function stringToArray(string) {
+    return hasUnicode(string)
+      ? unicodeToArray(string)
+      : asciiToArray(string);
+  }
+ 
+  /**
+   * Used by `_.unescape` to convert HTML entities to characters.
+   *
+   * @private
+   * @param {string} chr The matched character to unescape.
+   * @returns {string} Returns the unescaped character.
+   */
+  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
+ 
+  /**
+   * Gets the size of a Unicode `string`.
+   *
+   * @private
+   * @param {string} string The string inspect.
+   * @returns {number} Returns the string size.
+   */
+  function unicodeSize(string) {
+    var result = reUnicode.lastIndex = 0;
+    while (reUnicode.test(string)) {
+      ++result;
+    }
+    return result;
+  }
+ 
+  /**
+   * Converts a Unicode `string` to an array.
+   *
+   * @private
+   * @param {string} string The string to convert.
+   * @returns {Array} Returns the converted array.
+   */
+  function unicodeToArray(string) {
+    return string.match(reUnicode) || [];
+  }
+ 
+  /**
+   * Splits a Unicode `string` into an array of its words.
+   *
+   * @private
+   * @param {string} The string to inspect.
+   * @returns {Array} Returns the words of `string`.
+   */
+  function unicodeWords(string) {
+    return string.match(reUnicodeWord) || [];
+  }
+ 
+  /*--------------------------------------------------------------------------*/
+ 
+  /**
+   * Create a new pristine `lodash` function using the `context` object.
+   *
+   * @static
+   * @memberOf _
+   * @since 1.1.0
+   * @category Util
+   * @param {Object} [context=root] The context object.
+   * @returns {Function} Returns a new `lodash` function.
+   * @example
+   *
+   * _.mixin({ 'foo': _.constant('foo') });
+   *
+   * var lodash = _.runInContext();
+   * lodash.mixin({ 'bar': lodash.constant('bar') });
+   *
+   * _.isFunction(_.foo);
+   * // => true
+   * _.isFunction(_.bar);
+   * // => false
+   *
+   * lodash.isFunction(lodash.foo);
+   * // => false
+   * lodash.isFunction(lodash.bar);
+   * // => true
+   *
+   * // Create a suped-up `defer` in Node.js.
+   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
+   */
+  var runInContext = (function runInContext(context) {
+    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
+ 
+    /** Built-in constructor references. */
+    var Array = context.Array,
+        Date = context.Date,
+        Error = context.Error,
+        Function = context.Function,
+        Math = context.Math,
+        Object = context.Object,
+        RegExp = context.RegExp,
+        String = context.String,
+        TypeError = context.TypeError;
+ 
+    /** Used for built-in method references. */
+    var arrayProto = Array.prototype,
+        funcProto = Function.prototype,
+        objectProto = Object.prototype;
+ 
+    /** Used to detect overreaching core-js shims. */
+    var coreJsData = context['__core-js_shared__'];
+ 
+    /** Used to resolve the decompiled source of functions. */
+    var funcToString = funcProto.toString;
+ 
+    /** Used to check objects for own properties. */
+    var hasOwnProperty = objectProto.hasOwnProperty;
+ 
+    /** Used to generate unique IDs. */
+    var idCounter = 0;
+ 
+    /** Used to detect methods masquerading as native. */
+    var maskSrcKey = (function() {
+      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+      return uid ? ('Symbol(src)_1.' + uid) : '';
+    }());
+ 
+    /**
+     * Used to resolve the
+     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+     * of values.
+     */
+    var nativeObjectToString = objectProto.toString;
+ 
+    /** Used to infer the `Object` constructor. */
+    var objectCtorString = funcToString.call(Object);
+ 
+    /** Used to restore the original `_` reference in `_.noConflict`. */
+    var oldDash = root._;
+ 
+    /** Used to detect if a method is native. */
+    var reIsNative = RegExp('^' +
+      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+    );
+ 
+    /** Built-in value references. */
+    var Buffer = moduleExports ? context.Buffer : undefined,
+        Symbol = context.Symbol,
+        Uint8Array = context.Uint8Array,
+        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
+        getPrototype = overArg(Object.getPrototypeOf, Object),
+        objectCreate = Object.create,
+        propertyIsEnumerable = objectProto.propertyIsEnumerable,
+        splice = arrayProto.splice,
+        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
+        symIterator = Symbol ? Symbol.iterator : undefined,
+        symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+ 
+    var defineProperty = (function() {
+      try {
+        var func = getNative(Object, 'defineProperty');
+        func({}, '', {});
+        return func;
+      } catch (e) {}
+    }());
+ 
+    /** Mocked built-ins. */
+    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
+        ctxNow = Date && Date.now !== root.Date.now && Date.now,
+        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
+ 
+    /* Built-in method references for those with the same name as other `lodash` methods. */
+    var nativeCeil = Math.ceil,
+        nativeFloor = Math.floor,
+        nativeGetSymbols = Object.getOwnPropertySymbols,
+        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
+        nativeIsFinite = context.isFinite,
+        nativeJoin = arrayProto.join,
+        nativeKeys = overArg(Object.keys, Object),
+        nativeMax = Math.max,
+        nativeMin = Math.min,
+        nativeNow = Date.now,
+        nativeParseInt = context.parseInt,
+        nativeRandom = Math.random,
+        nativeReverse = arrayProto.reverse;
+ 
+    /* Built-in method references that are verified to be native. */
+    var DataView = getNative(context, 'DataView'),
+        Map = getNative(context, 'Map'),
+        Promise = getNative(context, 'Promise'),
+        Set = getNative(context, 'Set'),
+        WeakMap = getNative(context, 'WeakMap'),
+        nativeCreate = getNative(Object, 'create');
+ 
+    /** Used to store function metadata. */
+    var metaMap = WeakMap && new WeakMap;
+ 
+    /** Used to lookup unminified function names. */
+    var realNames = {};
+ 
+    /** Used to detect maps, sets, and weakmaps. */
+    var dataViewCtorString = toSource(DataView),
+        mapCtorString = toSource(Map),
+        promiseCtorString = toSource(Promise),
+        setCtorString = toSource(Set),
+        weakMapCtorString = toSource(WeakMap);
+ 
+    /** Used to convert symbols to primitives and strings. */
+    var symbolProto = Symbol ? Symbol.prototype : undefined,
+        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
+        symbolToString = symbolProto ? symbolProto.toString : undefined;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates a `lodash` object which wraps `value` to enable implicit method
+     * chain sequences. Methods that operate on and return arrays, collections,
+     * and functions can be chained together. Methods that retrieve a single value
+     * or may return a primitive value will automatically end the chain sequence
+     * and return the unwrapped value. Otherwise, the value must be unwrapped
+     * with `_#value`.
+     *
+     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
+     * enabled using `_.chain`.
+     *
+     * The execution of chained methods is lazy, that is, it's deferred until
+     * `_#value` is implicitly or explicitly called.
+     *
+     * Lazy evaluation allows several methods to support shortcut fusion.
+     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
+     * the creation of intermediate arrays and can greatly reduce the number of
+     * iteratee executions. Sections of a chain sequence qualify for shortcut
+     * fusion if the section is applied to an array and iteratees accept only
+     * one argument. The heuristic for whether a section qualifies for shortcut
+     * fusion is subject to change.
+     *
+     * Chaining is supported in custom builds as long as the `_#value` method is
+     * directly or indirectly included in the build.
+     *
+     * In addition to lodash methods, wrappers have `Array` and `String` methods.
+     *
+     * The wrapper `Array` methods are:
+     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
+     *
+     * The wrapper `String` methods are:
+     * `replace` and `split`
+     *
+     * The wrapper methods that support shortcut fusion are:
+     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
+     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
+     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
+     *
+     * The chainable wrapper methods are:
+     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
+     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
+     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
+     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
+     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
+     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
+     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
+     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
+     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
+     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
+     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
+     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
+     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
+     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
+     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
+     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
+     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
+     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
+     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
+     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
+     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
+     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
+     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
+     * `zipObject`, `zipObjectDeep`, and `zipWith`
+     *
+     * The wrapper methods that are **not** chainable by default are:
+     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
+     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
+     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
+     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
+     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
+     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
+     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
+     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
+     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
+     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
+     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
+     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
+     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
+     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
+     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
+     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
+     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
+     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
+     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
+     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
+     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
+     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
+     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
+     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
+     * `upperFirst`, `value`, and `words`
+     *
+     * @name _
+     * @constructor
+     * @category Seq
+     * @param {*} value The value to wrap in a `lodash` instance.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var wrapped = _([1, 2, 3]);
+     *
+     * // Returns an unwrapped value.
+     * wrapped.reduce(_.add);
+     * // => 6
+     *
+     * // Returns a wrapped value.
+     * var squares = wrapped.map(square);
+     *
+     * _.isArray(squares);
+     * // => false
+     *
+     * _.isArray(squares.value());
+     * // => true
+     */
+    function lodash(value) {
+      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
+        if (value instanceof LodashWrapper) {
+          return value;
+        }
+        if (hasOwnProperty.call(value, '__wrapped__')) {
+          return wrapperClone(value);
+        }
+      }
+      return new LodashWrapper(value);
+    }
+ 
+    /**
+     * The base implementation of `_.create` without support for assigning
+     * properties to the created object.
+     *
+     * @private
+     * @param {Object} proto The object to inherit from.
+     * @returns {Object} Returns the new object.
+     */
+    var baseCreate = (function() {
+      function object() {}
+      return function(proto) {
+        if (!isObject(proto)) {
+          return {};
+        }
+        if (objectCreate) {
+          return objectCreate(proto);
+        }
+        object.prototype = proto;
+        var result = new object;
+        object.prototype = undefined;
+        return result;
+      };
+    }());
+ 
+    /**
+     * The function whose prototype chain sequence wrappers inherit from.
+     *
+     * @private
+     */
+    function baseLodash() {
+      // No operation performed.
+    }
+ 
+    /**
+     * The base constructor for creating `lodash` wrapper objects.
+     *
+     * @private
+     * @param {*} value The value to wrap.
+     * @param {boolean} [chainAll] Enable explicit method chain sequences.
+     */
+    function LodashWrapper(value, chainAll) {
+      this.__wrapped__ = value;
+      this.__actions__ = [];
+      this.__chain__ = !!chainAll;
+      this.__index__ = 0;
+      this.__values__ = undefined;
+    }
+ 
+    /**
+     * By default, the template delimiters used by lodash are like those in
+     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
+     * following template settings to use alternative delimiters.
+     *
+     * @static
+     * @memberOf _
+     * @type {Object}
+     */
+    lodash.templateSettings = {
+ 
+      /**
+       * Used to detect `data` property values to be HTML-escaped.
+       *
+       * @memberOf _.templateSettings
+       * @type {RegExp}
+       */
+      'escape': reEscape,
+ 
+      /**
+       * Used to detect code to be evaluated.
+       *
+       * @memberOf _.templateSettings
+       * @type {RegExp}
+       */
+      'evaluate': reEvaluate,
+ 
+      /**
+       * Used to detect `data` property values to inject.
+       *
+       * @memberOf _.templateSettings
+       * @type {RegExp}
+       */
+      'interpolate': reInterpolate,
+ 
+      /**
+       * Used to reference the data object in the template text.
+       *
+       * @memberOf _.templateSettings
+       * @type {string}
+       */
+      'variable': '',
+ 
+      /**
+       * Used to import variables into the compiled template.
+       *
+       * @memberOf _.templateSettings
+       * @type {Object}
+       */
+      'imports': {
+ 
+        /**
+         * A reference to the `lodash` function.
+         *
+         * @memberOf _.templateSettings.imports
+         * @type {Function}
+         */
+        '_': lodash
+      }
+    };
+ 
+    // Ensure wrappers are instances of `baseLodash`.
+    lodash.prototype = baseLodash.prototype;
+    lodash.prototype.constructor = lodash;
+ 
+    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
+    LodashWrapper.prototype.constructor = LodashWrapper;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
+     *
+     * @private
+     * @constructor
+     * @param {*} value The value to wrap.
+     */
+    function LazyWrapper(value) {
+      this.__wrapped__ = value;
+      this.__actions__ = [];
+      this.__dir__ = 1;
+      this.__filtered__ = false;
+      this.__iteratees__ = [];
+      this.__takeCount__ = MAX_ARRAY_LENGTH;
+      this.__views__ = [];
+    }
+ 
+    /**
+     * Creates a clone of the lazy wrapper object.
+     *
+     * @private
+     * @name clone
+     * @memberOf LazyWrapper
+     * @returns {Object} Returns the cloned `LazyWrapper` object.
+     */
+    function lazyClone() {
+      var result = new LazyWrapper(this.__wrapped__);
+      result.__actions__ = copyArray(this.__actions__);
+      result.__dir__ = this.__dir__;
+      result.__filtered__ = this.__filtered__;
+      result.__iteratees__ = copyArray(this.__iteratees__);
+      result.__takeCount__ = this.__takeCount__;
+      result.__views__ = copyArray(this.__views__);
+      return result;
+    }
+ 
+    /**
+     * Reverses the direction of lazy iteration.
+     *
+     * @private
+     * @name reverse
+     * @memberOf LazyWrapper
+     * @returns {Object} Returns the new reversed `LazyWrapper` object.
+     */
+    function lazyReverse() {
+      if (this.__filtered__) {
+        var result = new LazyWrapper(this);
+        result.__dir__ = -1;
+        result.__filtered__ = true;
+      } else {
+        result = this.clone();
+        result.__dir__ *= -1;
+      }
+      return result;
+    }
+ 
+    /**
+     * Extracts the unwrapped value from its lazy wrapper.
+     *
+     * @private
+     * @name value
+     * @memberOf LazyWrapper
+     * @returns {*} Returns the unwrapped value.
+     */
+    function lazyValue() {
+      var array = this.__wrapped__.value(),
+          dir = this.__dir__,
+          isArr = isArray(array),
+          isRight = dir < 0,
+          arrLength = isArr ? array.length : 0,
+          view = getView(0, arrLength, this.__views__),
+          start = view.start,
+          end = view.end,
+          length = end - start,
+          index = isRight ? end : (start - 1),
+          iteratees = this.__iteratees__,
+          iterLength = iteratees.length,
+          resIndex = 0,
+          takeCount = nativeMin(length, this.__takeCount__);
+ 
+      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
+        return baseWrapperValue(array, this.__actions__);
+      }
+      var result = [];
+ 
+      outer:
+      while (length-- && resIndex < takeCount) {
+        index += dir;
+ 
+        var iterIndex = -1,
+            value = array[index];
+ 
+        while (++iterIndex < iterLength) {
+          var data = iteratees[iterIndex],
+              iteratee = data.iteratee,
+              type = data.type,
+              computed = iteratee(value);
+ 
+          if (type == LAZY_MAP_FLAG) {
+            value = computed;
+          } else if (!computed) {
+            if (type == LAZY_FILTER_FLAG) {
+              continue outer;
+            } else {
+              break outer;
+            }
+          }
+        }
+        result[resIndex++] = value;
+      }
+      return result;
+    }
+ 
+    // Ensure `LazyWrapper` is an instance of `baseLodash`.
+    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
+    LazyWrapper.prototype.constructor = LazyWrapper;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates a hash object.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function Hash(entries) {
+      var index = -1,
+          length = entries == null ? 0 : entries.length;
+ 
+      this.clear();
+      while (++index < length) {
+        var entry = entries[index];
+        this.set(entry[0], entry[1]);
+      }
+    }
+ 
+    /**
+     * Removes all key-value entries from the hash.
+     *
+     * @private
+     * @name clear
+     * @memberOf Hash
+     */
+    function hashClear() {
+      this.__data__ = nativeCreate ? nativeCreate(null) : {};
+      this.size = 0;
+    }
+ 
+    /**
+     * Removes `key` and its value from the hash.
+     *
+     * @private
+     * @name delete
+     * @memberOf Hash
+     * @param {Object} hash The hash to modify.
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function hashDelete(key) {
+      var result = this.has(key) && delete this.__data__[key];
+      this.size -= result ? 1 : 0;
+      return result;
+    }
+ 
+    /**
+     * Gets the hash value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf Hash
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function hashGet(key) {
+      var data = this.__data__;
+      if (nativeCreate) {
+        var result = data[key];
+        return result === HASH_UNDEFINED ? undefined : result;
+      }
+      return hasOwnProperty.call(data, key) ? data[key] : undefined;
+    }
+ 
+    /**
+     * Checks if a hash value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf Hash
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function hashHas(key) {
+      var data = this.__data__;
+      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
+    }
+ 
+    /**
+     * Sets the hash `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf Hash
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the hash instance.
+     */
+    function hashSet(key, value) {
+      var data = this.__data__;
+      this.size += this.has(key) ? 0 : 1;
+      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+      return this;
+    }
+ 
+    // Add methods to `Hash`.
+    Hash.prototype.clear = hashClear;
+    Hash.prototype['delete'] = hashDelete;
+    Hash.prototype.get = hashGet;
+    Hash.prototype.has = hashHas;
+    Hash.prototype.set = hashSet;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates an list cache object.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function ListCache(entries) {
+      var index = -1,
+          length = entries == null ? 0 : entries.length;
+ 
+      this.clear();
+      while (++index < length) {
+        var entry = entries[index];
+        this.set(entry[0], entry[1]);
+      }
+    }
+ 
+    /**
+     * Removes all key-value entries from the list cache.
+     *
+     * @private
+     * @name clear
+     * @memberOf ListCache
+     */
+    function listCacheClear() {
+      this.__data__ = [];
+      this.size = 0;
+    }
+ 
+    /**
+     * Removes `key` and its value from the list cache.
+     *
+     * @private
+     * @name delete
+     * @memberOf ListCache
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function listCacheDelete(key) {
+      var data = this.__data__,
+          index = assocIndexOf(data, key);
+ 
+      if (index < 0) {
+        return false;
+      }
+      var lastIndex = data.length - 1;
+      if (index == lastIndex) {
+        data.pop();
+      } else {
+        splice.call(data, index, 1);
+      }
+      --this.size;
+      return true;
+    }
+ 
+    /**
+     * Gets the list cache value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf ListCache
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function listCacheGet(key) {
+      var data = this.__data__,
+          index = assocIndexOf(data, key);
+ 
+      return index < 0 ? undefined : data[index][1];
+    }
+ 
+    /**
+     * Checks if a list cache value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf ListCache
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function listCacheHas(key) {
+      return assocIndexOf(this.__data__, key) > -1;
+    }
+ 
+    /**
+     * Sets the list cache `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf ListCache
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the list cache instance.
+     */
+    function listCacheSet(key, value) {
+      var data = this.__data__,
+          index = assocIndexOf(data, key);
+ 
+      if (index < 0) {
+        ++this.size;
+        data.push([key, value]);
+      } else {
+        data[index][1] = value;
+      }
+      return this;
+    }
+ 
+    // Add methods to `ListCache`.
+    ListCache.prototype.clear = listCacheClear;
+    ListCache.prototype['delete'] = listCacheDelete;
+    ListCache.prototype.get = listCacheGet;
+    ListCache.prototype.has = listCacheHas;
+    ListCache.prototype.set = listCacheSet;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates a map cache object to store key-value pairs.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function MapCache(entries) {
+      var index = -1,
+          length = entries == null ? 0 : entries.length;
+ 
+      this.clear();
+      while (++index < length) {
+        var entry = entries[index];
+        this.set(entry[0], entry[1]);
+      }
+    }
+ 
+    /**
+     * Removes all key-value entries from the map.
+     *
+     * @private
+     * @name clear
+     * @memberOf MapCache
+     */
+    function mapCacheClear() {
+      this.size = 0;
+      this.__data__ = {
+        'hash': new Hash,
+        'map': new (Map || ListCache),
+        'string': new Hash
+      };
+    }
+ 
+    /**
+     * Removes `key` and its value from the map.
+     *
+     * @private
+     * @name delete
+     * @memberOf MapCache
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function mapCacheDelete(key) {
+      var result = getMapData(this, key)['delete'](key);
+      this.size -= result ? 1 : 0;
+      return result;
+    }
+ 
+    /**
+     * Gets the map value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf MapCache
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function mapCacheGet(key) {
+      return getMapData(this, key).get(key);
+    }
+ 
+    /**
+     * Checks if a map value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf MapCache
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function mapCacheHas(key) {
+      return getMapData(this, key).has(key);
+    }
+ 
+    /**
+     * Sets the map `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf MapCache
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the map cache instance.
+     */
+    function mapCacheSet(key, value) {
+      var data = getMapData(this, key),
+          size = data.size;
+ 
+      data.set(key, value);
+      this.size += data.size == size ? 0 : 1;
+      return this;
+    }
+ 
+    // Add methods to `MapCache`.
+    MapCache.prototype.clear = mapCacheClear;
+    MapCache.prototype['delete'] = mapCacheDelete;
+    MapCache.prototype.get = mapCacheGet;
+    MapCache.prototype.has = mapCacheHas;
+    MapCache.prototype.set = mapCacheSet;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     *
+     * Creates an array cache object to store unique values.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [values] The values to cache.
+     */
+    function SetCache(values) {
+      var index = -1,
+          length = values == null ? 0 : values.length;
+ 
+      this.__data__ = new MapCache;
+      while (++index < length) {
+        this.add(values[index]);
+      }
+    }
+ 
+    /**
+     * Adds `value` to the array cache.
+     *
+     * @private
+     * @name add
+     * @memberOf SetCache
+     * @alias push
+     * @param {*} value The value to cache.
+     * @returns {Object} Returns the cache instance.
+     */
+    function setCacheAdd(value) {
+      this.__data__.set(value, HASH_UNDEFINED);
+      return this;
+    }
+ 
+    /**
+     * Checks if `value` is in the array cache.
+     *
+     * @private
+     * @name has
+     * @memberOf SetCache
+     * @param {*} value The value to search for.
+     * @returns {number} Returns `true` if `value` is found, else `false`.
+     */
+    function setCacheHas(value) {
+      return this.__data__.has(value);
+    }
+ 
+    // Add methods to `SetCache`.
+    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+    SetCache.prototype.has = setCacheHas;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates a stack cache object to store key-value pairs.
+     *
+     * @private
+     * @constructor
+     * @param {Array} [entries] The key-value pairs to cache.
+     */
+    function Stack(entries) {
+      var data = this.__data__ = new ListCache(entries);
+      this.size = data.size;
+    }
+ 
+    /**
+     * Removes all key-value entries from the stack.
+     *
+     * @private
+     * @name clear
+     * @memberOf Stack
+     */
+    function stackClear() {
+      this.__data__ = new ListCache;
+      this.size = 0;
+    }
+ 
+    /**
+     * Removes `key` and its value from the stack.
+     *
+     * @private
+     * @name delete
+     * @memberOf Stack
+     * @param {string} key The key of the value to remove.
+     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+     */
+    function stackDelete(key) {
+      var data = this.__data__,
+          result = data['delete'](key);
+ 
+      this.size = data.size;
+      return result;
+    }
+ 
+    /**
+     * Gets the stack value for `key`.
+     *
+     * @private
+     * @name get
+     * @memberOf Stack
+     * @param {string} key The key of the value to get.
+     * @returns {*} Returns the entry value.
+     */
+    function stackGet(key) {
+      return this.__data__.get(key);
+    }
+ 
+    /**
+     * Checks if a stack value for `key` exists.
+     *
+     * @private
+     * @name has
+     * @memberOf Stack
+     * @param {string} key The key of the entry to check.
+     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+     */
+    function stackHas(key) {
+      return this.__data__.has(key);
+    }
+ 
+    /**
+     * Sets the stack `key` to `value`.
+     *
+     * @private
+     * @name set
+     * @memberOf Stack
+     * @param {string} key The key of the value to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns the stack cache instance.
+     */
+    function stackSet(key, value) {
+      var data = this.__data__;
+      if (data instanceof ListCache) {
+        var pairs = data.__data__;
+        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+          pairs.push([key, value]);
+          this.size = ++data.size;
+          return this;
+        }
+        data = this.__data__ = new MapCache(pairs);
+      }
+      data.set(key, value);
+      this.size = data.size;
+      return this;
+    }
+ 
+    // Add methods to `Stack`.
+    Stack.prototype.clear = stackClear;
+    Stack.prototype['delete'] = stackDelete;
+    Stack.prototype.get = stackGet;
+    Stack.prototype.has = stackHas;
+    Stack.prototype.set = stackSet;
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates an array of the enumerable property names of the array-like `value`.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @param {boolean} inherited Specify returning inherited property names.
+     * @returns {Array} Returns the array of property names.
+     */
+    function arrayLikeKeys(value, inherited) {
+      var isArr = isArray(value),
+          isArg = !isArr && isArguments(value),
+          isBuff = !isArr && !isArg && isBuffer(value),
+          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
+          skipIndexes = isArr || isArg || isBuff || isType,
+          result = skipIndexes ? baseTimes(value.length, String) : [],
+          length = result.length;
+ 
+      for (var key in value) {
+        if ((inherited || hasOwnProperty.call(value, key)) &&
+            !(skipIndexes && (
+               // Safari 9 has enumerable `arguments.length` in strict mode.
+               key == 'length' ||
+               // Node.js 0.10 has enumerable non-index properties on buffers.
+               (isBuff && (key == 'offset' || key == 'parent')) ||
+               // PhantomJS 2 has enumerable non-index properties on typed arrays.
+               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
+               // Skip index properties.
+               isIndex(key, length)
+            ))) {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * A specialized version of `_.sample` for arrays.
+     *
+     * @private
+     * @param {Array} array The array to sample.
+     * @returns {*} Returns the random element.
+     */
+    function arraySample(array) {
+      var length = array.length;
+      return length ? array[baseRandom(0, length - 1)] : undefined;
+    }
+ 
+    /**
+     * A specialized version of `_.sampleSize` for arrays.
+     *
+     * @private
+     * @param {Array} array The array to sample.
+     * @param {number} n The number of elements to sample.
+     * @returns {Array} Returns the random elements.
+     */
+    function arraySampleSize(array, n) {
+      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
+    }
+ 
+    /**
+     * A specialized version of `_.shuffle` for arrays.
+     *
+     * @private
+     * @param {Array} array The array to shuffle.
+     * @returns {Array} Returns the new shuffled array.
+     */
+    function arrayShuffle(array) {
+      return shuffleSelf(copyArray(array));
+    }
+ 
+    /**
+     * This function is like `assignValue` except that it doesn't assign
+     * `undefined` values.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {string} key The key of the property to assign.
+     * @param {*} value The value to assign.
+     */
+    function assignMergeValue(object, key, value) {
+      if ((value !== undefined && !eq(object[key], value)) ||
+          (value === undefined && !(key in object))) {
+        baseAssignValue(object, key, value);
+      }
+    }
+ 
+    /**
+     * Assigns `value` to `key` of `object` if the existing value is not equivalent
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {string} key The key of the property to assign.
+     * @param {*} value The value to assign.
+     */
+    function assignValue(object, key, value) {
+      var objValue = object[key];
+      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+          (value === undefined && !(key in object))) {
+        baseAssignValue(object, key, value);
+      }
+    }
+ 
+    /**
+     * Gets the index at which the `key` is found in `array` of key-value pairs.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {*} key The key to search for.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     */
+    function assocIndexOf(array, key) {
+      var length = array.length;
+      while (length--) {
+        if (eq(array[length][0], key)) {
+          return length;
+        }
+      }
+      return -1;
+    }
+ 
+    /**
+     * Aggregates elements of `collection` on `accumulator` with keys transformed
+     * by `iteratee` and values set by `setter`.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} setter The function to set `accumulator` values.
+     * @param {Function} iteratee The iteratee to transform keys.
+     * @param {Object} accumulator The initial aggregated object.
+     * @returns {Function} Returns `accumulator`.
+     */
+    function baseAggregator(collection, setter, iteratee, accumulator) {
+      baseEach(collection, function(value, key, collection) {
+        setter(accumulator, value, iteratee(value), collection);
+      });
+      return accumulator;
+    }
+ 
+    /**
+     * The base implementation of `_.assign` without support for multiple sources
+     * or `customizer` functions.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @returns {Object} Returns `object`.
+     */
+    function baseAssign(object, source) {
+      return object && copyObject(source, keys(source), object);
+    }
+ 
+    /**
+     * The base implementation of `_.assignIn` without support for multiple sources
+     * or `customizer` functions.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @returns {Object} Returns `object`.
+     */
+    function baseAssignIn(object, source) {
+      return object && copyObject(source, keysIn(source), object);
+    }
+ 
+    /**
+     * The base implementation of `assignValue` and `assignMergeValue` without
+     * value checks.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {string} key The key of the property to assign.
+     * @param {*} value The value to assign.
+     */
+    function baseAssignValue(object, key, value) {
+      if (key == '__proto__' && defineProperty) {
+        defineProperty(object, key, {
+          'configurable': true,
+          'enumerable': true,
+          'value': value,
+          'writable': true
+        });
+      } else {
+        object[key] = value;
+      }
+    }
+ 
+    /**
+     * The base implementation of `_.at` without support for individual paths.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {string[]} paths The property paths to pick.
+     * @returns {Array} Returns the picked elements.
+     */
+    function baseAt(object, paths) {
+      var index = -1,
+          length = paths.length,
+          result = Array(length),
+          skip = object == null;
+ 
+      while (++index < length) {
+        result[index] = skip ? undefined : get(object, paths[index]);
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.clamp` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {number} number The number to clamp.
+     * @param {number} [lower] The lower bound.
+     * @param {number} upper The upper bound.
+     * @returns {number} Returns the clamped number.
+     */
+    function baseClamp(number, lower, upper) {
+      if (number === number) {
+        if (upper !== undefined) {
+          number = number <= upper ? number : upper;
+        }
+        if (lower !== undefined) {
+          number = number >= lower ? number : lower;
+        }
+      }
+      return number;
+    }
+ 
+    /**
+     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+     * traversed objects.
+     *
+     * @private
+     * @param {*} value The value to clone.
+     * @param {boolean} bitmask The bitmask flags.
+     *  1 - Deep clone
+     *  2 - Flatten inherited properties
+     *  4 - Clone symbols
+     * @param {Function} [customizer] The function to customize cloning.
+     * @param {string} [key] The key of `value`.
+     * @param {Object} [object] The parent object of `value`.
+     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+     * @returns {*} Returns the cloned value.
+     */
+    function baseClone(value, bitmask, customizer, key, object, stack) {
+      var result,
+          isDeep = bitmask & CLONE_DEEP_FLAG,
+          isFlat = bitmask & CLONE_FLAT_FLAG,
+          isFull = bitmask & CLONE_SYMBOLS_FLAG;
+ 
+      if (customizer) {
+        result = object ? customizer(value, key, object, stack) : customizer(value);
+      }
+      if (result !== undefined) {
+        return result;
+      }
+      if (!isObject(value)) {
+        return value;
+      }
+      var isArr = isArray(value);
+      if (isArr) {
+        result = initCloneArray(value);
+        if (!isDeep) {
+          return copyArray(value, result);
+        }
+      } else {
+        var tag = getTag(value),
+            isFunc = tag == funcTag || tag == genTag;
+ 
+        if (isBuffer(value)) {
+          return cloneBuffer(value, isDeep);
+        }
+        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
+          result = (isFlat || isFunc) ? {} : initCloneObject(value);
+          if (!isDeep) {
+            return isFlat
+              ? copySymbolsIn(value, baseAssignIn(result, value))
+              : copySymbols(value, baseAssign(result, value));
+          }
+        } else {
+          if (!cloneableTags[tag]) {
+            return object ? value : {};
+          }
+          result = initCloneByTag(value, tag, baseClone, isDeep);
+        }
+      }
+      // Check for circular references and return its corresponding clone.
+      stack || (stack = new Stack);
+      var stacked = stack.get(value);
+      if (stacked) {
+        return stacked;
+      }
+      stack.set(value, result);
+ 
+      var keysFunc = isFull
+        ? (isFlat ? getAllKeysIn : getAllKeys)
+        : (isFlat ? keysIn : keys);
+ 
+      var props = isArr ? undefined : keysFunc(value);
+      arrayEach(props || value, function(subValue, key) {
+        if (props) {
+          key = subValue;
+          subValue = value[key];
+        }
+        // Recursively populate clone (susceptible to call stack limits).
+        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
+      });
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.conforms` which doesn't clone `source`.
+     *
+     * @private
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {Function} Returns the new spec function.
+     */
+    function baseConforms(source) {
+      var props = keys(source);
+      return function(object) {
+        return baseConformsTo(object, source, props);
+      };
+    }
+ 
+    /**
+     * The base implementation of `_.conformsTo` which accepts `props` to check.
+     *
+     * @private
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+     */
+    function baseConformsTo(object, source, props) {
+      var length = props.length;
+      if (object == null) {
+        return !length;
+      }
+      object = Object(object);
+      while (length--) {
+        var key = props[length],
+            predicate = source[key],
+            value = object[key];
+ 
+        if ((value === undefined && !(key in object)) || !predicate(value)) {
+          return false;
+        }
+      }
+      return true;
+    }
+ 
+    /**
+     * The base implementation of `_.delay` and `_.defer` which accepts `args`
+     * to provide to `func`.
+     *
+     * @private
+     * @param {Function} func The function to delay.
+     * @param {number} wait The number of milliseconds to delay invocation.
+     * @param {Array} args The arguments to provide to `func`.
+     * @returns {number|Object} Returns the timer id or timeout object.
+     */
+    function baseDelay(func, wait, args) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      return setTimeout(function() { func.apply(undefined, args); }, wait);
+    }
+ 
+    /**
+     * The base implementation of methods like `_.difference` without support
+     * for excluding multiple arrays or iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {Array} values The values to exclude.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     */
+    function baseDifference(array, values, iteratee, comparator) {
+      var index = -1,
+          includes = arrayIncludes,
+          isCommon = true,
+          length = array.length,
+          result = [],
+          valuesLength = values.length;
+ 
+      if (!length) {
+        return result;
+      }
+      if (iteratee) {
+        values = arrayMap(values, baseUnary(iteratee));
+      }
+      if (comparator) {
+        includes = arrayIncludesWith;
+        isCommon = false;
+      }
+      else if (values.length >= LARGE_ARRAY_SIZE) {
+        includes = cacheHas;
+        isCommon = false;
+        values = new SetCache(values);
+      }
+      outer:
+      while (++index < length) {
+        var value = array[index],
+            computed = iteratee == null ? value : iteratee(value);
+ 
+        value = (comparator || value !== 0) ? value : 0;
+        if (isCommon && computed === computed) {
+          var valuesIndex = valuesLength;
+          while (valuesIndex--) {
+            if (values[valuesIndex] === computed) {
+              continue outer;
+            }
+          }
+          result.push(value);
+        }
+        else if (!includes(values, computed, comparator)) {
+          result.push(value);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.forEach` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     */
+    var baseEach = createBaseEach(baseForOwn);
+ 
+    /**
+     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     */
+    var baseEachRight = createBaseEach(baseForOwnRight, true);
+ 
+    /**
+     * The base implementation of `_.every` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} predicate The function invoked per iteration.
+     * @returns {boolean} Returns `true` if all elements pass the predicate check,
+     *  else `false`
+     */
+    function baseEvery(collection, predicate) {
+      var result = true;
+      baseEach(collection, function(value, index, collection) {
+        result = !!predicate(value, index, collection);
+        return result;
+      });
+      return result;
+    }
+ 
+    /**
+     * The base implementation of methods like `_.max` and `_.min` which accepts a
+     * `comparator` to determine the extremum value.
+     *
+     * @private
+     * @param {Array} array The array to iterate over.
+     * @param {Function} iteratee The iteratee invoked per iteration.
+     * @param {Function} comparator The comparator used to compare values.
+     * @returns {*} Returns the extremum value.
+     */
+    function baseExtremum(array, iteratee, comparator) {
+      var index = -1,
+          length = array.length;
+ 
+      while (++index < length) {
+        var value = array[index],
+            current = iteratee(value);
+ 
+        if (current != null && (computed === undefined
+              ? (current === current && !isSymbol(current))
+              : comparator(current, computed)
+            )) {
+          var computed = current,
+              result = value;
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.fill` without an iteratee call guard.
+     *
+     * @private
+     * @param {Array} array The array to fill.
+     * @param {*} value The value to fill `array` with.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns `array`.
+     */
+    function baseFill(array, value, start, end) {
+      var length = array.length;
+ 
+      start = toInteger(start);
+      if (start < 0) {
+        start = -start > length ? 0 : (length + start);
+      }
+      end = (end === undefined || end > length) ? length : toInteger(end);
+      if (end < 0) {
+        end += length;
+      }
+      end = start > end ? 0 : toLength(end);
+      while (start < end) {
+        array[start++] = value;
+      }
+      return array;
+    }
+ 
+    /**
+     * The base implementation of `_.filter` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} predicate The function invoked per iteration.
+     * @returns {Array} Returns the new filtered array.
+     */
+    function baseFilter(collection, predicate) {
+      var result = [];
+      baseEach(collection, function(value, index, collection) {
+        if (predicate(value, index, collection)) {
+          result.push(value);
+        }
+      });
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.flatten` with support for restricting flattening.
+     *
+     * @private
+     * @param {Array} array The array to flatten.
+     * @param {number} depth The maximum recursion depth.
+     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
+     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
+     * @param {Array} [result=[]] The initial result value.
+     * @returns {Array} Returns the new flattened array.
+     */
+    function baseFlatten(array, depth, predicate, isStrict, result) {
+      var index = -1,
+          length = array.length;
+ 
+      predicate || (predicate = isFlattenable);
+      result || (result = []);
+ 
+      while (++index < length) {
+        var value = array[index];
+        if (depth > 0 && predicate(value)) {
+          if (depth > 1) {
+            // Recursively flatten arrays (susceptible to call stack limits).
+            baseFlatten(value, depth - 1, predicate, isStrict, result);
+          } else {
+            arrayPush(result, value);
+          }
+        } else if (!isStrict) {
+          result[result.length] = value;
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `baseForOwn` which iterates over `object`
+     * properties returned by `keysFunc` and invokes `iteratee` for each property.
+     * Iteratee functions may exit iteration early by explicitly returning `false`.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @param {Function} keysFunc The function to get the keys of `object`.
+     * @returns {Object} Returns `object`.
+     */
+    var baseFor = createBaseFor();
+ 
+    /**
+     * This function is like `baseFor` except that it iterates over properties
+     * in the opposite order.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @param {Function} keysFunc The function to get the keys of `object`.
+     * @returns {Object} Returns `object`.
+     */
+    var baseForRight = createBaseFor(true);
+ 
+    /**
+     * The base implementation of `_.forOwn` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     */
+    function baseForOwn(object, iteratee) {
+      return object && baseFor(object, iteratee, keys);
+    }
+ 
+    /**
+     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     */
+    function baseForOwnRight(object, iteratee) {
+      return object && baseForRight(object, iteratee, keys);
+    }
+ 
+    /**
+     * The base implementation of `_.functions` which creates an array of
+     * `object` function property names filtered from `props`.
+     *
+     * @private
+     * @param {Object} object The object to inspect.
+     * @param {Array} props The property names to filter.
+     * @returns {Array} Returns the function names.
+     */
+    function baseFunctions(object, props) {
+      return arrayFilter(props, function(key) {
+        return isFunction(object[key]);
+      });
+    }
+ 
+    /**
+     * The base implementation of `_.get` without support for default values.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the property to get.
+     * @returns {*} Returns the resolved value.
+     */
+    function baseGet(object, path) {
+      path = castPath(path, object);
+ 
+      var index = 0,
+          length = path.length;
+ 
+      while (object != null && index < length) {
+        object = object[toKey(path[index++])];
+      }
+      return (index && index == length) ? object : undefined;
+    }
+ 
+    /**
+     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+     * symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Function} keysFunc The function to get the keys of `object`.
+     * @param {Function} symbolsFunc The function to get the symbols of `object`.
+     * @returns {Array} Returns the array of property names and symbols.
+     */
+    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+      var result = keysFunc(object);
+      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+    }
+ 
+    /**
+     * The base implementation of `getTag` without fallbacks for buggy environments.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @returns {string} Returns the `toStringTag`.
+     */
+    function baseGetTag(value) {
+      if (value == null) {
+        return value === undefined ? undefinedTag : nullTag;
+      }
+      return (symToStringTag && symToStringTag in Object(value))
+        ? getRawTag(value)
+        : objectToString(value);
+    }
+ 
+    /**
+     * The base implementation of `_.gt` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is greater than `other`,
+     *  else `false`.
+     */
+    function baseGt(value, other) {
+      return value > other;
+    }
+ 
+    /**
+     * The base implementation of `_.has` without support for deep paths.
+     *
+     * @private
+     * @param {Object} [object] The object to query.
+     * @param {Array|string} key The key to check.
+     * @returns {boolean} Returns `true` if `key` exists, else `false`.
+     */
+    function baseHas(object, key) {
+      return object != null && hasOwnProperty.call(object, key);
+    }
+ 
+    /**
+     * The base implementation of `_.hasIn` without support for deep paths.
+     *
+     * @private
+     * @param {Object} [object] The object to query.
+     * @param {Array|string} key The key to check.
+     * @returns {boolean} Returns `true` if `key` exists, else `false`.
+     */
+    function baseHasIn(object, key) {
+      return object != null && key in Object(object);
+    }
+ 
+    /**
+     * The base implementation of `_.inRange` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {number} number The number to check.
+     * @param {number} start The start of the range.
+     * @param {number} end The end of the range.
+     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+     */
+    function baseInRange(number, start, end) {
+      return number >= nativeMin(start, end) && number < nativeMax(start, end);
+    }
+ 
+    /**
+     * The base implementation of methods like `_.intersection`, without support
+     * for iteratee shorthands, that accepts an array of arrays to inspect.
+     *
+     * @private
+     * @param {Array} arrays The arrays to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of shared values.
+     */
+    function baseIntersection(arrays, iteratee, comparator) {
+      var includes = comparator ? arrayIncludesWith : arrayIncludes,
+          length = arrays[0].length,
+          othLength = arrays.length,
+          othIndex = othLength,
+          caches = Array(othLength),
+          maxLength = Infinity,
+          result = [];
+ 
+      while (othIndex--) {
+        var array = arrays[othIndex];
+        if (othIndex && iteratee) {
+          array = arrayMap(array, baseUnary(iteratee));
+        }
+        maxLength = nativeMin(array.length, maxLength);
+        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
+          ? new SetCache(othIndex && array)
+          : undefined;
+      }
+      array = arrays[0];
+ 
+      var index = -1,
+          seen = caches[0];
+ 
+      outer:
+      while (++index < length && result.length < maxLength) {
+        var value = array[index],
+            computed = iteratee ? iteratee(value) : value;
+ 
+        value = (comparator || value !== 0) ? value : 0;
+        if (!(seen
+              ? cacheHas(seen, computed)
+              : includes(result, computed, comparator)
+            )) {
+          othIndex = othLength;
+          while (--othIndex) {
+            var cache = caches[othIndex];
+            if (!(cache
+                  ? cacheHas(cache, computed)
+                  : includes(arrays[othIndex], computed, comparator))
+                ) {
+              continue outer;
+            }
+          }
+          if (seen) {
+            seen.push(computed);
+          }
+          result.push(value);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.invert` and `_.invertBy` which inverts
+     * `object` with values transformed by `iteratee` and set by `setter`.
+     *
+     * @private
+     * @param {Object} object The object to iterate over.
+     * @param {Function} setter The function to set `accumulator` values.
+     * @param {Function} iteratee The iteratee to transform values.
+     * @param {Object} accumulator The initial inverted object.
+     * @returns {Function} Returns `accumulator`.
+     */
+    function baseInverter(object, setter, iteratee, accumulator) {
+      baseForOwn(object, function(value, key, object) {
+        setter(accumulator, iteratee(value), key, object);
+      });
+      return accumulator;
+    }
+ 
+    /**
+     * The base implementation of `_.invoke` without support for individual
+     * method arguments.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the method to invoke.
+     * @param {Array} args The arguments to invoke the method with.
+     * @returns {*} Returns the result of the invoked method.
+     */
+    function baseInvoke(object, path, args) {
+      path = castPath(path, object);
+      object = parent(object, path);
+      var func = object == null ? object : object[toKey(last(path))];
+      return func == null ? undefined : apply(func, object, args);
+    }
+ 
+    /**
+     * The base implementation of `_.isArguments`.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+     */
+    function baseIsArguments(value) {
+      return isObjectLike(value) && baseGetTag(value) == argsTag;
+    }
+ 
+    /**
+     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+     */
+    function baseIsArrayBuffer(value) {
+      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
+    }
+ 
+    /**
+     * The base implementation of `_.isDate` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+     */
+    function baseIsDate(value) {
+      return isObjectLike(value) && baseGetTag(value) == dateTag;
+    }
+ 
+    /**
+     * The base implementation of `_.isEqual` which supports partial comparisons
+     * and tracks traversed objects.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @param {boolean} bitmask The bitmask flags.
+     *  1 - Unordered comparison
+     *  2 - Partial comparison
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     */
+    function baseIsEqual(value, other, bitmask, customizer, stack) {
+      if (value === other) {
+        return true;
+      }
+      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
+        return value !== value && other !== other;
+      }
+      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+    }
+ 
+    /**
+     * A specialized version of `baseIsEqual` for arrays and objects which performs
+     * deep comparisons and tracks traversed objects enabling objects with circular
+     * references to be compared.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
+     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+     */
+    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+      var objIsArr = isArray(object),
+          othIsArr = isArray(other),
+          objTag = objIsArr ? arrayTag : getTag(object),
+          othTag = othIsArr ? arrayTag : getTag(other);
+ 
+      objTag = objTag == argsTag ? objectTag : objTag;
+      othTag = othTag == argsTag ? objectTag : othTag;
+ 
+      var objIsObj = objTag == objectTag,
+          othIsObj = othTag == objectTag,
+          isSameTag = objTag == othTag;
+ 
+      if (isSameTag && isBuffer(object)) {
+        if (!isBuffer(other)) {
+          return false;
+        }
+        objIsArr = true;
+        objIsObj = false;
+      }
+      if (isSameTag && !objIsObj) {
+        stack || (stack = new Stack);
+        return (objIsArr || isTypedArray(object))
+          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
+          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+      }
+      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+ 
+        if (objIsWrapped || othIsWrapped) {
+          var objUnwrapped = objIsWrapped ? object.value() : object,
+              othUnwrapped = othIsWrapped ? other.value() : other;
+ 
+          stack || (stack = new Stack);
+          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+        }
+      }
+      if (!isSameTag) {
+        return false;
+      }
+      stack || (stack = new Stack);
+      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+    }
+ 
+    /**
+     * The base implementation of `_.isMap` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+     */
+    function baseIsMap(value) {
+      return isObjectLike(value) && getTag(value) == mapTag;
+    }
+ 
+    /**
+     * The base implementation of `_.isMatch` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property values to match.
+     * @param {Array} matchData The property names, values, and compare flags to match.
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+     */
+    function baseIsMatch(object, source, matchData, customizer) {
+      var index = matchData.length,
+          length = index,
+          noCustomizer = !customizer;
+ 
+      if (object == null) {
+        return !length;
+      }
+      object = Object(object);
+      while (index--) {
+        var data = matchData[index];
+        if ((noCustomizer && data[2])
+              ? data[1] !== object[data[0]]
+              : !(data[0] in object)
+            ) {
+          return false;
+        }
+      }
+      while (++index < length) {
+        data = matchData[index];
+        var key = data[0],
+            objValue = object[key],
+            srcValue = data[1];
+ 
+        if (noCustomizer && data[2]) {
+          if (objValue === undefined && !(key in object)) {
+            return false;
+          }
+        } else {
+          var stack = new Stack;
+          if (customizer) {
+            var result = customizer(objValue, srcValue, key, object, source, stack);
+          }
+          if (!(result === undefined
+                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
+                : result
+              )) {
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+ 
+    /**
+     * The base implementation of `_.isNative` without bad shim checks.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a native function,
+     *  else `false`.
+     */
+    function baseIsNative(value) {
+      if (!isObject(value) || isMasked(value)) {
+        return false;
+      }
+      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+      return pattern.test(toSource(value));
+    }
+ 
+    /**
+     * The base implementation of `_.isRegExp` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+     */
+    function baseIsRegExp(value) {
+      return isObjectLike(value) && baseGetTag(value) == regexpTag;
+    }
+ 
+    /**
+     * The base implementation of `_.isSet` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+     */
+    function baseIsSet(value) {
+      return isObjectLike(value) && getTag(value) == setTag;
+    }
+ 
+    /**
+     * The base implementation of `_.isTypedArray` without Node.js optimizations.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+     */
+    function baseIsTypedArray(value) {
+      return isObjectLike(value) &&
+        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+    }
+ 
+    /**
+     * The base implementation of `_.iteratee`.
+     *
+     * @private
+     * @param {*} [value=_.identity] The value to convert to an iteratee.
+     * @returns {Function} Returns the iteratee.
+     */
+    function baseIteratee(value) {
+      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
+      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
+      if (typeof value == 'function') {
+        return value;
+      }
+      if (value == null) {
+        return identity;
+      }
+      if (typeof value == 'object') {
+        return isArray(value)
+          ? baseMatchesProperty(value[0], value[1])
+          : baseMatches(value);
+      }
+      return property(value);
+    }
+ 
+    /**
+     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     */
+    function baseKeys(object) {
+      if (!isPrototype(object)) {
+        return nativeKeys(object);
+      }
+      var result = [];
+      for (var key in Object(object)) {
+        if (hasOwnProperty.call(object, key) && key != 'constructor') {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     */
+    function baseKeysIn(object) {
+      if (!isObject(object)) {
+        return nativeKeysIn(object);
+      }
+      var isProto = isPrototype(object),
+          result = [];
+ 
+      for (var key in object) {
+        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.lt` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is less than `other`,
+     *  else `false`.
+     */
+    function baseLt(value, other) {
+      return value < other;
+    }
+ 
+    /**
+     * The base implementation of `_.map` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} iteratee The function invoked per iteration.
+     * @returns {Array} Returns the new mapped array.
+     */
+    function baseMap(collection, iteratee) {
+      var index = -1,
+          result = isArrayLike(collection) ? Array(collection.length) : [];
+ 
+      baseEach(collection, function(value, key, collection) {
+        result[++index] = iteratee(value, key, collection);
+      });
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.matches` which doesn't clone `source`.
+     *
+     * @private
+     * @param {Object} source The object of property values to match.
+     * @returns {Function} Returns the new spec function.
+     */
+    function baseMatches(source) {
+      var matchData = getMatchData(source);
+      if (matchData.length == 1 && matchData[0][2]) {
+        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
+      }
+      return function(object) {
+        return object === source || baseIsMatch(object, source, matchData);
+      };
+    }
+ 
+    /**
+     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+     *
+     * @private
+     * @param {string} path The path of the property to get.
+     * @param {*} srcValue The value to match.
+     * @returns {Function} Returns the new spec function.
+     */
+    function baseMatchesProperty(path, srcValue) {
+      if (isKey(path) && isStrictComparable(srcValue)) {
+        return matchesStrictComparable(toKey(path), srcValue);
+      }
+      return function(object) {
+        var objValue = get(object, path);
+        return (objValue === undefined && objValue === srcValue)
+          ? hasIn(object, path)
+          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+      };
+    }
+ 
+    /**
+     * The base implementation of `_.merge` without support for multiple sources.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @param {number} srcIndex The index of `source`.
+     * @param {Function} [customizer] The function to customize merged values.
+     * @param {Object} [stack] Tracks traversed source values and their merged
+     *  counterparts.
+     */
+    function baseMerge(object, source, srcIndex, customizer, stack) {
+      if (object === source) {
+        return;
+      }
+      baseFor(source, function(srcValue, key) {
+        if (isObject(srcValue)) {
+          stack || (stack = new Stack);
+          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+        }
+        else {
+          var newValue = customizer
+            ? customizer(object[key], srcValue, (key + ''), object, source, stack)
+            : undefined;
+ 
+          if (newValue === undefined) {
+            newValue = srcValue;
+          }
+          assignMergeValue(object, key, newValue);
+        }
+      }, keysIn);
+    }
+ 
+    /**
+     * A specialized version of `baseMerge` for arrays and objects which performs
+     * deep merges and tracks traversed objects enabling objects with circular
+     * references to be merged.
+     *
+     * @private
+     * @param {Object} object The destination object.
+     * @param {Object} source The source object.
+     * @param {string} key The key of the value to merge.
+     * @param {number} srcIndex The index of `source`.
+     * @param {Function} mergeFunc The function to merge values.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @param {Object} [stack] Tracks traversed source values and their merged
+     *  counterparts.
+     */
+    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+      var objValue = object[key],
+          srcValue = source[key],
+          stacked = stack.get(srcValue);
+ 
+      if (stacked) {
+        assignMergeValue(object, key, stacked);
+        return;
+      }
+      var newValue = customizer
+        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
+        : undefined;
+ 
+      var isCommon = newValue === undefined;
+ 
+      if (isCommon) {
+        var isArr = isArray(srcValue),
+            isBuff = !isArr && isBuffer(srcValue),
+            isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+ 
+        newValue = srcValue;
+        if (isArr || isBuff || isTyped) {
+          if (isArray(objValue)) {
+            newValue = objValue;
+          }
+          else if (isArrayLikeObject(objValue)) {
+            newValue = copyArray(objValue);
+          }
+          else if (isBuff) {
+            isCommon = false;
+            newValue = cloneBuffer(srcValue, true);
+          }
+          else if (isTyped) {
+            isCommon = false;
+            newValue = cloneTypedArray(srcValue, true);
+          }
+          else {
+            newValue = [];
+          }
+        }
+        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+          newValue = objValue;
+          if (isArguments(objValue)) {
+            newValue = toPlainObject(objValue);
+          }
+          else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
+            newValue = initCloneObject(srcValue);
+          }
+        }
+        else {
+          isCommon = false;
+        }
+      }
+      if (isCommon) {
+        // Recursively merge objects and arrays (susceptible to call stack limits).
+        stack.set(srcValue, newValue);
+        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+        stack['delete'](srcValue);
+      }
+      assignMergeValue(object, key, newValue);
+    }
+ 
+    /**
+     * The base implementation of `_.nth` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {Array} array The array to query.
+     * @param {number} n The index of the element to return.
+     * @returns {*} Returns the nth element of `array`.
+     */
+    function baseNth(array, n) {
+      var length = array.length;
+      if (!length) {
+        return;
+      }
+      n += n < 0 ? length : 0;
+      return isIndex(n, length) ? array[n] : undefined;
+    }
+ 
+    /**
+     * The base implementation of `_.orderBy` without param guards.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+     * @param {string[]} orders The sort orders of `iteratees`.
+     * @returns {Array} Returns the new sorted array.
+     */
+    function baseOrderBy(collection, iteratees, orders) {
+      var index = -1;
+      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));
+ 
+      var result = baseMap(collection, function(value, key, collection) {
+        var criteria = arrayMap(iteratees, function(iteratee) {
+          return iteratee(value);
+        });
+        return { 'criteria': criteria, 'index': ++index, 'value': value };
+      });
+ 
+      return baseSortBy(result, function(object, other) {
+        return compareMultiple(object, other, orders);
+      });
+    }
+ 
+    /**
+     * The base implementation of `_.pick` without support for individual
+     * property identifiers.
+     *
+     * @private
+     * @param {Object} object The source object.
+     * @param {string[]} paths The property paths to pick.
+     * @returns {Object} Returns the new object.
+     */
+    function basePick(object, paths) {
+      return basePickBy(object, paths, function(value, path) {
+        return hasIn(object, path);
+      });
+    }
+ 
+    /**
+     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Object} object The source object.
+     * @param {string[]} paths The property paths to pick.
+     * @param {Function} predicate The function invoked per property.
+     * @returns {Object} Returns the new object.
+     */
+    function basePickBy(object, paths, predicate) {
+      var index = -1,
+          length = paths.length,
+          result = {};
+ 
+      while (++index < length) {
+        var path = paths[index],
+            value = baseGet(object, path);
+ 
+        if (predicate(value, path)) {
+          baseSet(result, castPath(path, object), value);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * A specialized version of `baseProperty` which supports deep paths.
+     *
+     * @private
+     * @param {Array|string} path The path of the property to get.
+     * @returns {Function} Returns the new accessor function.
+     */
+    function basePropertyDeep(path) {
+      return function(object) {
+        return baseGet(object, path);
+      };
+    }
+ 
+    /**
+     * The base implementation of `_.pullAllBy` without support for iteratee
+     * shorthands.
+     *
+     * @private
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns `array`.
+     */
+    function basePullAll(array, values, iteratee, comparator) {
+      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
+          index = -1,
+          length = values.length,
+          seen = array;
+ 
+      if (array === values) {
+        values = copyArray(values);
+      }
+      if (iteratee) {
+        seen = arrayMap(array, baseUnary(iteratee));
+      }
+      while (++index < length) {
+        var fromIndex = 0,
+            value = values[index],
+            computed = iteratee ? iteratee(value) : value;
+ 
+        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
+          if (seen !== array) {
+            splice.call(seen, fromIndex, 1);
+          }
+          splice.call(array, fromIndex, 1);
+        }
+      }
+      return array;
+    }
+ 
+    /**
+     * The base implementation of `_.pullAt` without support for individual
+     * indexes or capturing the removed elements.
+     *
+     * @private
+     * @param {Array} array The array to modify.
+     * @param {number[]} indexes The indexes of elements to remove.
+     * @returns {Array} Returns `array`.
+     */
+    function basePullAt(array, indexes) {
+      var length = array ? indexes.length : 0,
+          lastIndex = length - 1;
+ 
+      while (length--) {
+        var index = indexes[length];
+        if (length == lastIndex || index !== previous) {
+          var previous = index;
+          if (isIndex(index)) {
+            splice.call(array, index, 1);
+          } else {
+            baseUnset(array, index);
+          }
+        }
+      }
+      return array;
+    }
+ 
+    /**
+     * The base implementation of `_.random` without support for returning
+     * floating-point numbers.
+     *
+     * @private
+     * @param {number} lower The lower bound.
+     * @param {number} upper The upper bound.
+     * @returns {number} Returns the random number.
+     */
+    function baseRandom(lower, upper) {
+      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
+    }
+ 
+    /**
+     * The base implementation of `_.range` and `_.rangeRight` which doesn't
+     * coerce arguments.
+     *
+     * @private
+     * @param {number} start The start of the range.
+     * @param {number} end The end of the range.
+     * @param {number} step The value to increment or decrement by.
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Array} Returns the range of numbers.
+     */
+    function baseRange(start, end, step, fromRight) {
+      var index = -1,
+          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
+          result = Array(length);
+ 
+      while (length--) {
+        result[fromRight ? length : ++index] = start;
+        start += step;
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.repeat` which doesn't coerce arguments.
+     *
+     * @private
+     * @param {string} string The string to repeat.
+     * @param {number} n The number of times to repeat the string.
+     * @returns {string} Returns the repeated string.
+     */
+    function baseRepeat(string, n) {
+      var result = '';
+      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
+        return result;
+      }
+      // Leverage the exponentiation by squaring algorithm for a faster repeat.
+      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
+      do {
+        if (n % 2) {
+          result += string;
+        }
+        n = nativeFloor(n / 2);
+        if (n) {
+          string += string;
+        }
+      } while (n);
+ 
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+     *
+     * @private
+     * @param {Function} func The function to apply a rest parameter to.
+     * @param {number} [start=func.length-1] The start position of the rest parameter.
+     * @returns {Function} Returns the new function.
+     */
+    function baseRest(func, start) {
+      return setToString(overRest(func, start, identity), func + '');
+    }
+ 
+    /**
+     * The base implementation of `_.sample`.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to sample.
+     * @returns {*} Returns the random element.
+     */
+    function baseSample(collection) {
+      return arraySample(values(collection));
+    }
+ 
+    /**
+     * The base implementation of `_.sampleSize` without param guards.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to sample.
+     * @param {number} n The number of elements to sample.
+     * @returns {Array} Returns the random elements.
+     */
+    function baseSampleSize(collection, n) {
+      var array = values(collection);
+      return shuffleSelf(array, baseClamp(n, 0, array.length));
+    }
+ 
+    /**
+     * The base implementation of `_.set`.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {*} value The value to set.
+     * @param {Function} [customizer] The function to customize path creation.
+     * @returns {Object} Returns `object`.
+     */
+    function baseSet(object, path, value, customizer) {
+      if (!isObject(object)) {
+        return object;
+      }
+      path = castPath(path, object);
+ 
+      var index = -1,
+          length = path.length,
+          lastIndex = length - 1,
+          nested = object;
+ 
+      while (nested != null && ++index < length) {
+        var key = toKey(path[index]),
+            newValue = value;
+ 
+        if (index != lastIndex) {
+          var objValue = nested[key];
+          newValue = customizer ? customizer(objValue, key, nested) : undefined;
+          if (newValue === undefined) {
+            newValue = isObject(objValue)
+              ? objValue
+              : (isIndex(path[index + 1]) ? [] : {});
+          }
+        }
+        assignValue(nested, key, newValue);
+        nested = nested[key];
+      }
+      return object;
+    }
+ 
+    /**
+     * The base implementation of `setData` without support for hot loop shorting.
+     *
+     * @private
+     * @param {Function} func The function to associate metadata with.
+     * @param {*} data The metadata.
+     * @returns {Function} Returns `func`.
+     */
+    var baseSetData = !metaMap ? identity : function(func, data) {
+      metaMap.set(func, data);
+      return func;
+    };
+ 
+    /**
+     * The base implementation of `setToString` without support for hot loop shorting.
+     *
+     * @private
+     * @param {Function} func The function to modify.
+     * @param {Function} string The `toString` result.
+     * @returns {Function} Returns `func`.
+     */
+    var baseSetToString = !defineProperty ? identity : function(func, string) {
+      return defineProperty(func, 'toString', {
+        'configurable': true,
+        'enumerable': false,
+        'value': constant(string),
+        'writable': true
+      });
+    };
+ 
+    /**
+     * The base implementation of `_.shuffle`.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to shuffle.
+     * @returns {Array} Returns the new shuffled array.
+     */
+    function baseShuffle(collection) {
+      return shuffleSelf(values(collection));
+    }
+ 
+    /**
+     * The base implementation of `_.slice` without an iteratee call guard.
+     *
+     * @private
+     * @param {Array} array The array to slice.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns the slice of `array`.
+     */
+    function baseSlice(array, start, end) {
+      var index = -1,
+          length = array.length;
+ 
+      if (start < 0) {
+        start = -start > length ? 0 : (length + start);
+      }
+      end = end > length ? length : end;
+      if (end < 0) {
+        end += length;
+      }
+      length = start > end ? 0 : ((end - start) >>> 0);
+      start >>>= 0;
+ 
+      var result = Array(length);
+      while (++index < length) {
+        result[index] = array[index + start];
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.some` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} predicate The function invoked per iteration.
+     * @returns {boolean} Returns `true` if any element passes the predicate check,
+     *  else `false`.
+     */
+    function baseSome(collection, predicate) {
+      var result;
+ 
+      baseEach(collection, function(value, index, collection) {
+        result = predicate(value, index, collection);
+        return !result;
+      });
+      return !!result;
+    }
+ 
+    /**
+     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
+     * performs a binary search of `array` to determine the index at which `value`
+     * should be inserted into `array` in order to maintain its sort order.
+     *
+     * @private
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {boolean} [retHighest] Specify returning the highest qualified index.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     */
+    function baseSortedIndex(array, value, retHighest) {
+      var low = 0,
+          high = array == null ? low : array.length;
+ 
+      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
+        while (low < high) {
+          var mid = (low + high) >>> 1,
+              computed = array[mid];
+ 
+          if (computed !== null && !isSymbol(computed) &&
+              (retHighest ? (computed <= value) : (computed < value))) {
+            low = mid + 1;
+          } else {
+            high = mid;
+          }
+        }
+        return high;
+      }
+      return baseSortedIndexBy(array, value, identity, retHighest);
+    }
+ 
+    /**
+     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
+     * which invokes `iteratee` for `value` and each element of `array` to compute
+     * their sort ranking. The iteratee is invoked with one argument; (value).
+     *
+     * @private
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {Function} iteratee The iteratee invoked per element.
+     * @param {boolean} [retHighest] Specify returning the highest qualified index.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     */
+    function baseSortedIndexBy(array, value, iteratee, retHighest) {
+      value = iteratee(value);
+ 
+      var low = 0,
+          high = array == null ? 0 : array.length,
+          valIsNaN = value !== value,
+          valIsNull = value === null,
+          valIsSymbol = isSymbol(value),
+          valIsUndefined = value === undefined;
+ 
+      while (low < high) {
+        var mid = nativeFloor((low + high) / 2),
+            computed = iteratee(array[mid]),
+            othIsDefined = computed !== undefined,
+            othIsNull = computed === null,
+            othIsReflexive = computed === computed,
+            othIsSymbol = isSymbol(computed);
+ 
+        if (valIsNaN) {
+          var setLow = retHighest || othIsReflexive;
+        } else if (valIsUndefined) {
+          setLow = othIsReflexive && (retHighest || othIsDefined);
+        } else if (valIsNull) {
+          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
+        } else if (valIsSymbol) {
+          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
+        } else if (othIsNull || othIsSymbol) {
+          setLow = false;
+        } else {
+          setLow = retHighest ? (computed <= value) : (computed < value);
+        }
+        if (setLow) {
+          low = mid + 1;
+        } else {
+          high = mid;
+        }
+      }
+      return nativeMin(high, MAX_ARRAY_INDEX);
+    }
+ 
+    /**
+     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
+     * support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     */
+    function baseSortedUniq(array, iteratee) {
+      var index = -1,
+          length = array.length,
+          resIndex = 0,
+          result = [];
+ 
+      while (++index < length) {
+        var value = array[index],
+            computed = iteratee ? iteratee(value) : value;
+ 
+        if (!index || !eq(computed, seen)) {
+          var seen = computed;
+          result[resIndex++] = value === 0 ? 0 : value;
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.toNumber` which doesn't ensure correct
+     * conversions of binary, hexadecimal, or octal string values.
+     *
+     * @private
+     * @param {*} value The value to process.
+     * @returns {number} Returns the number.
+     */
+    function baseToNumber(value) {
+      if (typeof value == 'number') {
+        return value;
+      }
+      if (isSymbol(value)) {
+        return NAN;
+      }
+      return +value;
+    }
+ 
+    /**
+     * The base implementation of `_.toString` which doesn't convert nullish
+     * values to empty strings.
+     *
+     * @private
+     * @param {*} value The value to process.
+     * @returns {string} Returns the string.
+     */
+    function baseToString(value) {
+      // Exit early for strings to avoid a performance hit in some environments.
+      if (typeof value == 'string') {
+        return value;
+      }
+      if (isArray(value)) {
+        // Recursively convert values (susceptible to call stack limits).
+        return arrayMap(value, baseToString) + '';
+      }
+      if (isSymbol(value)) {
+        return symbolToString ? symbolToString.call(value) : '';
+      }
+      var result = (value + '');
+      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+    }
+ 
+    /**
+     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     */
+    function baseUniq(array, iteratee, comparator) {
+      var index = -1,
+          includes = arrayIncludes,
+          length = array.length,
+          isCommon = true,
+          result = [],
+          seen = result;
+ 
+      if (comparator) {
+        isCommon = false;
+        includes = arrayIncludesWith;
+      }
+      else if (length >= LARGE_ARRAY_SIZE) {
+        var set = iteratee ? null : createSet(array);
+        if (set) {
+          return setToArray(set);
+        }
+        isCommon = false;
+        includes = cacheHas;
+        seen = new SetCache;
+      }
+      else {
+        seen = iteratee ? [] : result;
+      }
+      outer:
+      while (++index < length) {
+        var value = array[index],
+            computed = iteratee ? iteratee(value) : value;
+ 
+        value = (comparator || value !== 0) ? value : 0;
+        if (isCommon && computed === computed) {
+          var seenIndex = seen.length;
+          while (seenIndex--) {
+            if (seen[seenIndex] === computed) {
+              continue outer;
+            }
+          }
+          if (iteratee) {
+            seen.push(computed);
+          }
+          result.push(value);
+        }
+        else if (!includes(seen, computed, comparator)) {
+          if (seen !== result) {
+            seen.push(computed);
+          }
+          result.push(value);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * The base implementation of `_.unset`.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The property path to unset.
+     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+     */
+    function baseUnset(object, path) {
+      path = castPath(path, object);
+      object = parent(object, path);
+      return object == null || delete object[toKey(last(path))];
+    }
+ 
+    /**
+     * The base implementation of `_.update`.
+     *
+     * @private
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to update.
+     * @param {Function} updater The function to produce the updated value.
+     * @param {Function} [customizer] The function to customize path creation.
+     * @returns {Object} Returns `object`.
+     */
+    function baseUpdate(object, path, updater, customizer) {
+      return baseSet(object, path, updater(baseGet(object, path)), customizer);
+    }
+ 
+    /**
+     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
+     * without support for iteratee shorthands.
+     *
+     * @private
+     * @param {Array} array The array to query.
+     * @param {Function} predicate The function invoked per iteration.
+     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Array} Returns the slice of `array`.
+     */
+    function baseWhile(array, predicate, isDrop, fromRight) {
+      var length = array.length,
+          index = fromRight ? length : -1;
+ 
+      while ((fromRight ? index-- : ++index < length) &&
+        predicate(array[index], index, array)) {}
+ 
+      return isDrop
+        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
+        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
+    }
+ 
+    /**
+     * The base implementation of `wrapperValue` which returns the result of
+     * performing a sequence of actions on the unwrapped `value`, where each
+     * successive action is supplied the return value of the previous.
+     *
+     * @private
+     * @param {*} value The unwrapped value.
+     * @param {Array} actions Actions to perform to resolve the unwrapped value.
+     * @returns {*} Returns the resolved value.
+     */
+    function baseWrapperValue(value, actions) {
+      var result = value;
+      if (result instanceof LazyWrapper) {
+        result = result.value();
+      }
+      return arrayReduce(actions, function(result, action) {
+        return action.func.apply(action.thisArg, arrayPush([result], action.args));
+      }, result);
+    }
+ 
+    /**
+     * The base implementation of methods like `_.xor`, without support for
+     * iteratee shorthands, that accepts an array of arrays to inspect.
+     *
+     * @private
+     * @param {Array} arrays The arrays to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of values.
+     */
+    function baseXor(arrays, iteratee, comparator) {
+      var length = arrays.length;
+      if (length < 2) {
+        return length ? baseUniq(arrays[0]) : [];
+      }
+      var index = -1,
+          result = Array(length);
+ 
+      while (++index < length) {
+        var array = arrays[index],
+            othIndex = -1;
+ 
+        while (++othIndex < length) {
+          if (othIndex != index) {
+            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
+          }
+        }
+      }
+      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
+    }
+ 
+    /**
+     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
+     *
+     * @private
+     * @param {Array} props The property identifiers.
+     * @param {Array} values The property values.
+     * @param {Function} assignFunc The function to assign values.
+     * @returns {Object} Returns the new object.
+     */
+    function baseZipObject(props, values, assignFunc) {
+      var index = -1,
+          length = props.length,
+          valsLength = values.length,
+          result = {};
+ 
+      while (++index < length) {
+        var value = index < valsLength ? values[index] : undefined;
+        assignFunc(result, props[index], value);
+      }
+      return result;
+    }
+ 
+    /**
+     * Casts `value` to an empty array if it's not an array like object.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @returns {Array|Object} Returns the cast array-like object.
+     */
+    function castArrayLikeObject(value) {
+      return isArrayLikeObject(value) ? value : [];
+    }
+ 
+    /**
+     * Casts `value` to `identity` if it's not a function.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @returns {Function} Returns cast function.
+     */
+    function castFunction(value) {
+      return typeof value == 'function' ? value : identity;
+    }
+ 
+    /**
+     * Casts `value` to a path array if it's not one.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @param {Object} [object] The object to query keys on.
+     * @returns {Array} Returns the cast property path array.
+     */
+    function castPath(value, object) {
+      if (isArray(value)) {
+        return value;
+      }
+      return isKey(value, object) ? [value] : stringToPath(toString(value));
+    }
+ 
+    /**
+     * A `baseRest` alias which can be replaced with `identity` by module
+     * replacement plugins.
+     *
+     * @private
+     * @type {Function}
+     * @param {Function} func The function to apply a rest parameter to.
+     * @returns {Function} Returns the new function.
+     */
+    var castRest = baseRest;
+ 
+    /**
+     * Casts `array` to a slice if it's needed.
+     *
+     * @private
+     * @param {Array} array The array to inspect.
+     * @param {number} start The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns the cast slice.
+     */
+    function castSlice(array, start, end) {
+      var length = array.length;
+      end = end === undefined ? length : end;
+      return (!start && end >= length) ? array : baseSlice(array, start, end);
+    }
+ 
+    /**
+     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
+     *
+     * @private
+     * @param {number|Object} id The timer id or timeout object of the timer to clear.
+     */
+    var clearTimeout = ctxClearTimeout || function(id) {
+      return root.clearTimeout(id);
+    };
+ 
+    /**
+     * Creates a clone of  `buffer`.
+     *
+     * @private
+     * @param {Buffer} buffer The buffer to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Buffer} Returns the cloned buffer.
+     */
+    function cloneBuffer(buffer, isDeep) {
+      if (isDeep) {
+        return buffer.slice();
+      }
+      var length = buffer.length,
+          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+ 
+      buffer.copy(result);
+      return result;
+    }
+ 
+    /**
+     * Creates a clone of `arrayBuffer`.
+     *
+     * @private
+     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+     * @returns {ArrayBuffer} Returns the cloned array buffer.
+     */
+    function cloneArrayBuffer(arrayBuffer) {
+      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+      return result;
+    }
+ 
+    /**
+     * Creates a clone of `dataView`.
+     *
+     * @private
+     * @param {Object} dataView The data view to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the cloned data view.
+     */
+    function cloneDataView(dataView, isDeep) {
+      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+    }
+ 
+    /**
+     * Creates a clone of `map`.
+     *
+     * @private
+     * @param {Object} map The map to clone.
+     * @param {Function} cloneFunc The function to clone values.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the cloned map.
+     */
+    function cloneMap(map, isDeep, cloneFunc) {
+      var array = isDeep ? cloneFunc(mapToArray(map), CLONE_DEEP_FLAG) : mapToArray(map);
+      return arrayReduce(array, addMapEntry, new map.constructor);
+    }
+ 
+    /**
+     * Creates a clone of `regexp`.
+     *
+     * @private
+     * @param {Object} regexp The regexp to clone.
+     * @returns {Object} Returns the cloned regexp.
+     */
+    function cloneRegExp(regexp) {
+      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+      result.lastIndex = regexp.lastIndex;
+      return result;
+    }
+ 
+    /**
+     * Creates a clone of `set`.
+     *
+     * @private
+     * @param {Object} set The set to clone.
+     * @param {Function} cloneFunc The function to clone values.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the cloned set.
+     */
+    function cloneSet(set, isDeep, cloneFunc) {
+      var array = isDeep ? cloneFunc(setToArray(set), CLONE_DEEP_FLAG) : setToArray(set);
+      return arrayReduce(array, addSetEntry, new set.constructor);
+    }
+ 
+    /**
+     * Creates a clone of the `symbol` object.
+     *
+     * @private
+     * @param {Object} symbol The symbol object to clone.
+     * @returns {Object} Returns the cloned symbol object.
+     */
+    function cloneSymbol(symbol) {
+      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+    }
+ 
+    /**
+     * Creates a clone of `typedArray`.
+     *
+     * @private
+     * @param {Object} typedArray The typed array to clone.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the cloned typed array.
+     */
+    function cloneTypedArray(typedArray, isDeep) {
+      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+    }
+ 
+    /**
+     * Compares values to sort them in ascending order.
+     *
+     * @private
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {number} Returns the sort order indicator for `value`.
+     */
+    function compareAscending(value, other) {
+      if (value !== other) {
+        var valIsDefined = value !== undefined,
+            valIsNull = value === null,
+            valIsReflexive = value === value,
+            valIsSymbol = isSymbol(value);
+ 
+        var othIsDefined = other !== undefined,
+            othIsNull = other === null,
+            othIsReflexive = other === other,
+            othIsSymbol = isSymbol(other);
+ 
+        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
+            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
+            (valIsNull && othIsDefined && othIsReflexive) ||
+            (!valIsDefined && othIsReflexive) ||
+            !valIsReflexive) {
+          return 1;
+        }
+        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
+            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
+            (othIsNull && valIsDefined && valIsReflexive) ||
+            (!othIsDefined && valIsReflexive) ||
+            !othIsReflexive) {
+          return -1;
+        }
+      }
+      return 0;
+    }
+ 
+    /**
+     * Used by `_.orderBy` to compare multiple properties of a value to another
+     * and stable sort them.
+     *
+     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
+     * specify an order of "desc" for descending or "asc" for ascending sort order
+     * of corresponding values.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {boolean[]|string[]} orders The order to sort by for each property.
+     * @returns {number} Returns the sort order indicator for `object`.
+     */
+    function compareMultiple(object, other, orders) {
+      var index = -1,
+          objCriteria = object.criteria,
+          othCriteria = other.criteria,
+          length = objCriteria.length,
+          ordersLength = orders.length;
+ 
+      while (++index < length) {
+        var result = compareAscending(objCriteria[index], othCriteria[index]);
+        if (result) {
+          if (index >= ordersLength) {
+            return result;
+          }
+          var order = orders[index];
+          return result * (order == 'desc' ? -1 : 1);
+        }
+      }
+      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+      // that causes it, under certain circumstances, to provide the same value for
+      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+      // for more details.
+      //
+      // This also ensures a stable sort in V8 and other engines.
+      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
+      return object.index - other.index;
+    }
+ 
+    /**
+     * Creates an array that is the composition of partially applied arguments,
+     * placeholders, and provided arguments into a single array of arguments.
+     *
+     * @private
+     * @param {Array} args The provided arguments.
+     * @param {Array} partials The arguments to prepend to those provided.
+     * @param {Array} holders The `partials` placeholder indexes.
+     * @params {boolean} [isCurried] Specify composing for a curried function.
+     * @returns {Array} Returns the new array of composed arguments.
+     */
+    function composeArgs(args, partials, holders, isCurried) {
+      var argsIndex = -1,
+          argsLength = args.length,
+          holdersLength = holders.length,
+          leftIndex = -1,
+          leftLength = partials.length,
+          rangeLength = nativeMax(argsLength - holdersLength, 0),
+          result = Array(leftLength + rangeLength),
+          isUncurried = !isCurried;
+ 
+      while (++leftIndex < leftLength) {
+        result[leftIndex] = partials[leftIndex];
+      }
+      while (++argsIndex < holdersLength) {
+        if (isUncurried || argsIndex < argsLength) {
+          result[holders[argsIndex]] = args[argsIndex];
+        }
+      }
+      while (rangeLength--) {
+        result[leftIndex++] = args[argsIndex++];
+      }
+      return result;
+    }
+ 
+    /**
+     * This function is like `composeArgs` except that the arguments composition
+     * is tailored for `_.partialRight`.
+     *
+     * @private
+     * @param {Array} args The provided arguments.
+     * @param {Array} partials The arguments to append to those provided.
+     * @param {Array} holders The `partials` placeholder indexes.
+     * @params {boolean} [isCurried] Specify composing for a curried function.
+     * @returns {Array} Returns the new array of composed arguments.
+     */
+    function composeArgsRight(args, partials, holders, isCurried) {
+      var argsIndex = -1,
+          argsLength = args.length,
+          holdersIndex = -1,
+          holdersLength = holders.length,
+          rightIndex = -1,
+          rightLength = partials.length,
+          rangeLength = nativeMax(argsLength - holdersLength, 0),
+          result = Array(rangeLength + rightLength),
+          isUncurried = !isCurried;
+ 
+      while (++argsIndex < rangeLength) {
+        result[argsIndex] = args[argsIndex];
+      }
+      var offset = argsIndex;
+      while (++rightIndex < rightLength) {
+        result[offset + rightIndex] = partials[rightIndex];
+      }
+      while (++holdersIndex < holdersLength) {
+        if (isUncurried || argsIndex < argsLength) {
+          result[offset + holders[holdersIndex]] = args[argsIndex++];
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * Copies the values of `source` to `array`.
+     *
+     * @private
+     * @param {Array} source The array to copy values from.
+     * @param {Array} [array=[]] The array to copy values to.
+     * @returns {Array} Returns `array`.
+     */
+    function copyArray(source, array) {
+      var index = -1,
+          length = source.length;
+ 
+      array || (array = Array(length));
+      while (++index < length) {
+        array[index] = source[index];
+      }
+      return array;
+    }
+ 
+    /**
+     * Copies properties of `source` to `object`.
+     *
+     * @private
+     * @param {Object} source The object to copy properties from.
+     * @param {Array} props The property identifiers to copy.
+     * @param {Object} [object={}] The object to copy properties to.
+     * @param {Function} [customizer] The function to customize copied values.
+     * @returns {Object} Returns `object`.
+     */
+    function copyObject(source, props, object, customizer) {
+      var isNew = !object;
+      object || (object = {});
+ 
+      var index = -1,
+          length = props.length;
+ 
+      while (++index < length) {
+        var key = props[index];
+ 
+        var newValue = customizer
+          ? customizer(object[key], source[key], key, object, source)
+          : undefined;
+ 
+        if (newValue === undefined) {
+          newValue = source[key];
+        }
+        if (isNew) {
+          baseAssignValue(object, key, newValue);
+        } else {
+          assignValue(object, key, newValue);
+        }
+      }
+      return object;
+    }
+ 
+    /**
+     * Copies own symbols of `source` to `object`.
+     *
+     * @private
+     * @param {Object} source The object to copy symbols from.
+     * @param {Object} [object={}] The object to copy symbols to.
+     * @returns {Object} Returns `object`.
+     */
+    function copySymbols(source, object) {
+      return copyObject(source, getSymbols(source), object);
+    }
+ 
+    /**
+     * Copies own and inherited symbols of `source` to `object`.
+     *
+     * @private
+     * @param {Object} source The object to copy symbols from.
+     * @param {Object} [object={}] The object to copy symbols to.
+     * @returns {Object} Returns `object`.
+     */
+    function copySymbolsIn(source, object) {
+      return copyObject(source, getSymbolsIn(source), object);
+    }
+ 
+    /**
+     * Creates a function like `_.groupBy`.
+     *
+     * @private
+     * @param {Function} setter The function to set accumulator values.
+     * @param {Function} [initializer] The accumulator object initializer.
+     * @returns {Function} Returns the new aggregator function.
+     */
+    function createAggregator(setter, initializer) {
+      return function(collection, iteratee) {
+        var func = isArray(collection) ? arrayAggregator : baseAggregator,
+            accumulator = initializer ? initializer() : {};
+ 
+        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
+      };
+    }
+ 
+    /**
+     * Creates a function like `_.assign`.
+     *
+     * @private
+     * @param {Function} assigner The function to assign values.
+     * @returns {Function} Returns the new assigner function.
+     */
+    function createAssigner(assigner) {
+      return baseRest(function(object, sources) {
+        var index = -1,
+            length = sources.length,
+            customizer = length > 1 ? sources[length - 1] : undefined,
+            guard = length > 2 ? sources[2] : undefined;
+ 
+        customizer = (assigner.length > 3 && typeof customizer == 'function')
+          ? (length--, customizer)
+          : undefined;
+ 
+        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+          customizer = length < 3 ? undefined : customizer;
+          length = 1;
+        }
+        object = Object(object);
+        while (++index < length) {
+          var source = sources[index];
+          if (source) {
+            assigner(object, source, index, customizer);
+          }
+        }
+        return object;
+      });
+    }
+ 
+    /**
+     * Creates a `baseEach` or `baseEachRight` function.
+     *
+     * @private
+     * @param {Function} eachFunc The function to iterate over a collection.
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new base function.
+     */
+    function createBaseEach(eachFunc, fromRight) {
+      return function(collection, iteratee) {
+        if (collection == null) {
+          return collection;
+        }
+        if (!isArrayLike(collection)) {
+          return eachFunc(collection, iteratee);
+        }
+        var length = collection.length,
+            index = fromRight ? length : -1,
+            iterable = Object(collection);
+ 
+        while ((fromRight ? index-- : ++index < length)) {
+          if (iteratee(iterable[index], index, iterable) === false) {
+            break;
+          }
+        }
+        return collection;
+      };
+    }
+ 
+    /**
+     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
+     *
+     * @private
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new base function.
+     */
+    function createBaseFor(fromRight) {
+      return function(object, iteratee, keysFunc) {
+        var index = -1,
+            iterable = Object(object),
+            props = keysFunc(object),
+            length = props.length;
+ 
+        while (length--) {
+          var key = props[fromRight ? length : ++index];
+          if (iteratee(iterable[key], key, iterable) === false) {
+            break;
+          }
+        }
+        return object;
+      };
+    }
+ 
+    /**
+     * Creates a function that wraps `func` to invoke it with the optional `this`
+     * binding of `thisArg`.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createBind(func, bitmask, thisArg) {
+      var isBind = bitmask & WRAP_BIND_FLAG,
+          Ctor = createCtor(func);
+ 
+      function wrapper() {
+        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+        return fn.apply(isBind ? thisArg : this, arguments);
+      }
+      return wrapper;
+    }
+ 
+    /**
+     * Creates a function like `_.lowerFirst`.
+     *
+     * @private
+     * @param {string} methodName The name of the `String` case method to use.
+     * @returns {Function} Returns the new case function.
+     */
+    function createCaseFirst(methodName) {
+      return function(string) {
+        string = toString(string);
+ 
+        var strSymbols = hasUnicode(string)
+          ? stringToArray(string)
+          : undefined;
+ 
+        var chr = strSymbols
+          ? strSymbols[0]
+          : string.charAt(0);
+ 
+        var trailing = strSymbols
+          ? castSlice(strSymbols, 1).join('')
+          : string.slice(1);
+ 
+        return chr[methodName]() + trailing;
+      };
+    }
+ 
+    /**
+     * Creates a function like `_.camelCase`.
+     *
+     * @private
+     * @param {Function} callback The function to combine each word.
+     * @returns {Function} Returns the new compounder function.
+     */
+    function createCompounder(callback) {
+      return function(string) {
+        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
+      };
+    }
+ 
+    /**
+     * Creates a function that produces an instance of `Ctor` regardless of
+     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
+     *
+     * @private
+     * @param {Function} Ctor The constructor to wrap.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createCtor(Ctor) {
+      return function() {
+        // Use a `switch` statement to work with class constructors. See
+        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
+        // for more details.
+        var args = arguments;
+        switch (args.length) {
+          case 0: return new Ctor;
+          case 1: return new Ctor(args[0]);
+          case 2: return new Ctor(args[0], args[1]);
+          case 3: return new Ctor(args[0], args[1], args[2]);
+          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
+          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
+          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
+          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+        }
+        var thisBinding = baseCreate(Ctor.prototype),
+            result = Ctor.apply(thisBinding, args);
+ 
+        // Mimic the constructor's `return` behavior.
+        // See https://es5.github.io/#x13.2.2 for more details.
+        return isObject(result) ? result : thisBinding;
+      };
+    }
+ 
+    /**
+     * Creates a function that wraps `func` to enable currying.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {number} arity The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createCurry(func, bitmask, arity) {
+      var Ctor = createCtor(func);
+ 
+      function wrapper() {
+        var length = arguments.length,
+            args = Array(length),
+            index = length,
+            placeholder = getHolder(wrapper);
+ 
+        while (index--) {
+          args[index] = arguments[index];
+        }
+        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
+          ? []
+          : replaceHolders(args, placeholder);
+ 
+        length -= holders.length;
+        if (length < arity) {
+          return createRecurry(
+            func, bitmask, createHybrid, wrapper.placeholder, undefined,
+            args, holders, undefined, undefined, arity - length);
+        }
+        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+        return apply(fn, this, args);
+      }
+      return wrapper;
+    }
+ 
+    /**
+     * Creates a `_.find` or `_.findLast` function.
+     *
+     * @private
+     * @param {Function} findIndexFunc The function to find the collection index.
+     * @returns {Function} Returns the new find function.
+     */
+    function createFind(findIndexFunc) {
+      return function(collection, predicate, fromIndex) {
+        var iterable = Object(collection);
+        if (!isArrayLike(collection)) {
+          var iteratee = getIteratee(predicate, 3);
+          collection = keys(collection);
+          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
+        }
+        var index = findIndexFunc(collection, predicate, fromIndex);
+        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
+      };
+    }
+ 
+    /**
+     * Creates a `_.flow` or `_.flowRight` function.
+     *
+     * @private
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new flow function.
+     */
+    function createFlow(fromRight) {
+      return flatRest(function(funcs) {
+        var length = funcs.length,
+            index = length,
+            prereq = LodashWrapper.prototype.thru;
+ 
+        if (fromRight) {
+          funcs.reverse();
+        }
+        while (index--) {
+          var func = funcs[index];
+          if (typeof func != 'function') {
+            throw new TypeError(FUNC_ERROR_TEXT);
+          }
+          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
+            var wrapper = new LodashWrapper([], true);
+          }
+        }
+        index = wrapper ? index : length;
+        while (++index < length) {
+          func = funcs[index];
+ 
+          var funcName = getFuncName(func),
+              data = funcName == 'wrapper' ? getData(func) : undefined;
+ 
+          if (data && isLaziable(data[0]) &&
+                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
+                !data[4].length && data[9] == 1
+              ) {
+            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+          } else {
+            wrapper = (func.length == 1 && isLaziable(func))
+              ? wrapper[funcName]()
+              : wrapper.thru(func);
+          }
+        }
+        return function() {
+          var args = arguments,
+              value = args[0];
+ 
+          if (wrapper && args.length == 1 && isArray(value)) {
+            return wrapper.plant(value).value();
+          }
+          var index = 0,
+              result = length ? funcs[index].apply(this, args) : value;
+ 
+          while (++index < length) {
+            result = funcs[index].call(this, result);
+          }
+          return result;
+        };
+      });
+    }
+ 
+    /**
+     * Creates a function that wraps `func` to invoke it with optional `this`
+     * binding of `thisArg`, partial application, and currying.
+     *
+     * @private
+     * @param {Function|string} func The function or method name to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @param {Array} [partials] The arguments to prepend to those provided to
+     *  the new function.
+     * @param {Array} [holders] The `partials` placeholder indexes.
+     * @param {Array} [partialsRight] The arguments to append to those provided
+     *  to the new function.
+     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
+     * @param {Array} [argPos] The argument positions of the new function.
+     * @param {number} [ary] The arity cap of `func`.
+     * @param {number} [arity] The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
+      var isAry = bitmask & WRAP_ARY_FLAG,
+          isBind = bitmask & WRAP_BIND_FLAG,
+          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
+          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
+          isFlip = bitmask & WRAP_FLIP_FLAG,
+          Ctor = isBindKey ? undefined : createCtor(func);
+ 
+      function wrapper() {
+        var length = arguments.length,
+            args = Array(length),
+            index = length;
+ 
+        while (index--) {
+          args[index] = arguments[index];
+        }
+        if (isCurried) {
+          var placeholder = getHolder(wrapper),
+              holdersCount = countHolders(args, placeholder);
+        }
+        if (partials) {
+          args = composeArgs(args, partials, holders, isCurried);
+        }
+        if (partialsRight) {
+          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
+        }
+        length -= holdersCount;
+        if (isCurried && length < arity) {
+          var newHolders = replaceHolders(args, placeholder);
+          return createRecurry(
+            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
+            args, newHolders, argPos, ary, arity - length
+          );
+        }
+        var thisBinding = isBind ? thisArg : this,
+            fn = isBindKey ? thisBinding[func] : func;
+ 
+        length = args.length;
+        if (argPos) {
+          args = reorder(args, argPos);
+        } else if (isFlip && length > 1) {
+          args.reverse();
+        }
+        if (isAry && ary < length) {
+          args.length = ary;
+        }
+        if (this && this !== root && this instanceof wrapper) {
+          fn = Ctor || createCtor(fn);
+        }
+        return fn.apply(thisBinding, args);
+      }
+      return wrapper;
+    }
+ 
+    /**
+     * Creates a function like `_.invertBy`.
+     *
+     * @private
+     * @param {Function} setter The function to set accumulator values.
+     * @param {Function} toIteratee The function to resolve iteratees.
+     * @returns {Function} Returns the new inverter function.
+     */
+    function createInverter(setter, toIteratee) {
+      return function(object, iteratee) {
+        return baseInverter(object, setter, toIteratee(iteratee), {});
+      };
+    }
+ 
+    /**
+     * Creates a function that performs a mathematical operation on two values.
+     *
+     * @private
+     * @param {Function} operator The function to perform the operation.
+     * @param {number} [defaultValue] The value used for `undefined` arguments.
+     * @returns {Function} Returns the new mathematical operation function.
+     */
+    function createMathOperation(operator, defaultValue) {
+      return function(value, other) {
+        var result;
+        if (value === undefined && other === undefined) {
+          return defaultValue;
+        }
+        if (value !== undefined) {
+          result = value;
+        }
+        if (other !== undefined) {
+          if (result === undefined) {
+            return other;
+          }
+          if (typeof value == 'string' || typeof other == 'string') {
+            value = baseToString(value);
+            other = baseToString(other);
+          } else {
+            value = baseToNumber(value);
+            other = baseToNumber(other);
+          }
+          result = operator(value, other);
+        }
+        return result;
+      };
+    }
+ 
+    /**
+     * Creates a function like `_.over`.
+     *
+     * @private
+     * @param {Function} arrayFunc The function to iterate over iteratees.
+     * @returns {Function} Returns the new over function.
+     */
+    function createOver(arrayFunc) {
+      return flatRest(function(iteratees) {
+        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
+        return baseRest(function(args) {
+          var thisArg = this;
+          return arrayFunc(iteratees, function(iteratee) {
+            return apply(iteratee, thisArg, args);
+          });
+        });
+      });
+    }
+ 
+    /**
+     * Creates the padding for `string` based on `length`. The `chars` string
+     * is truncated if the number of characters exceeds `length`.
+     *
+     * @private
+     * @param {number} length The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padding for `string`.
+     */
+    function createPadding(length, chars) {
+      chars = chars === undefined ? ' ' : baseToString(chars);
+ 
+      var charsLength = chars.length;
+      if (charsLength < 2) {
+        return charsLength ? baseRepeat(chars, length) : chars;
+      }
+      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
+      return hasUnicode(chars)
+        ? castSlice(stringToArray(result), 0, length).join('')
+        : result.slice(0, length);
+    }
+ 
+    /**
+     * Creates a function that wraps `func` to invoke it with the `this` binding
+     * of `thisArg` and `partials` prepended to the arguments it receives.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {*} thisArg The `this` binding of `func`.
+     * @param {Array} partials The arguments to prepend to those provided to
+     *  the new function.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createPartial(func, bitmask, thisArg, partials) {
+      var isBind = bitmask & WRAP_BIND_FLAG,
+          Ctor = createCtor(func);
+ 
+      function wrapper() {
+        var argsIndex = -1,
+            argsLength = arguments.length,
+            leftIndex = -1,
+            leftLength = partials.length,
+            args = Array(leftLength + argsLength),
+            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
+ 
+        while (++leftIndex < leftLength) {
+          args[leftIndex] = partials[leftIndex];
+        }
+        while (argsLength--) {
+          args[leftIndex++] = arguments[++argsIndex];
+        }
+        return apply(fn, isBind ? thisArg : this, args);
+      }
+      return wrapper;
+    }
+ 
+    /**
+     * Creates a `_.range` or `_.rangeRight` function.
+     *
+     * @private
+     * @param {boolean} [fromRight] Specify iterating from right to left.
+     * @returns {Function} Returns the new range function.
+     */
+    function createRange(fromRight) {
+      return function(start, end, step) {
+        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
+          end = step = undefined;
+        }
+        // Ensure the sign of `-0` is preserved.
+        start = toFinite(start);
+        if (end === undefined) {
+          end = start;
+          start = 0;
+        } else {
+          end = toFinite(end);
+        }
+        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
+        return baseRange(start, end, step, fromRight);
+      };
+    }
+ 
+    /**
+     * Creates a function that performs a relational operation on two values.
+     *
+     * @private
+     * @param {Function} operator The function to perform the operation.
+     * @returns {Function} Returns the new relational operation function.
+     */
+    function createRelationalOperation(operator) {
+      return function(value, other) {
+        if (!(typeof value == 'string' && typeof other == 'string')) {
+          value = toNumber(value);
+          other = toNumber(other);
+        }
+        return operator(value, other);
+      };
+    }
+ 
+    /**
+     * Creates a function that wraps `func` to continue currying.
+     *
+     * @private
+     * @param {Function} func The function to wrap.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @param {Function} wrapFunc The function to create the `func` wrapper.
+     * @param {*} placeholder The placeholder value.
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @param {Array} [partials] The arguments to prepend to those provided to
+     *  the new function.
+     * @param {Array} [holders] The `partials` placeholder indexes.
+     * @param {Array} [argPos] The argument positions of the new function.
+     * @param {number} [ary] The arity cap of `func`.
+     * @param {number} [arity] The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
+      var isCurry = bitmask & WRAP_CURRY_FLAG,
+          newHolders = isCurry ? holders : undefined,
+          newHoldersRight = isCurry ? undefined : holders,
+          newPartials = isCurry ? partials : undefined,
+          newPartialsRight = isCurry ? undefined : partials;
+ 
+      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
+      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
+ 
+      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
+        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
+      }
+      var newData = [
+        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
+        newHoldersRight, argPos, ary, arity
+      ];
+ 
+      var result = wrapFunc.apply(undefined, newData);
+      if (isLaziable(func)) {
+        setData(result, newData);
+      }
+      result.placeholder = placeholder;
+      return setWrapToString(result, func, bitmask);
+    }
+ 
+    /**
+     * Creates a function like `_.round`.
+     *
+     * @private
+     * @param {string} methodName The name of the `Math` method to use when rounding.
+     * @returns {Function} Returns the new round function.
+     */
+    function createRound(methodName) {
+      var func = Math[methodName];
+      return function(number, precision) {
+        number = toNumber(number);
+        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
+        if (precision) {
+          // Shift with exponential notation to avoid floating-point issues.
+          // See [MDN](https://mdn.io/round#Examples) for more details.
+          var pair = (toString(number) + 'e').split('e'),
+              value = func(pair[0] + 'e' + (+pair[1] + precision));
+ 
+          pair = (toString(value) + 'e').split('e');
+          return +(pair[0] + 'e' + (+pair[1] - precision));
+        }
+        return func(number);
+      };
+    }
+ 
+    /**
+     * Creates a set object of `values`.
+     *
+     * @private
+     * @param {Array} values The values to add to the set.
+     * @returns {Object} Returns the new set.
+     */
+    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
+      return new Set(values);
+    };
+ 
+    /**
+     * Creates a `_.toPairs` or `_.toPairsIn` function.
+     *
+     * @private
+     * @param {Function} keysFunc The function to get the keys of a given object.
+     * @returns {Function} Returns the new pairs function.
+     */
+    function createToPairs(keysFunc) {
+      return function(object) {
+        var tag = getTag(object);
+        if (tag == mapTag) {
+          return mapToArray(object);
+        }
+        if (tag == setTag) {
+          return setToPairs(object);
+        }
+        return baseToPairs(object, keysFunc(object));
+      };
+    }
+ 
+    /**
+     * Creates a function that either curries or invokes `func` with optional
+     * `this` binding and partially applied arguments.
+     *
+     * @private
+     * @param {Function|string} func The function or method name to wrap.
+     * @param {number} bitmask The bitmask flags.
+     *    1 - `_.bind`
+     *    2 - `_.bindKey`
+     *    4 - `_.curry` or `_.curryRight` of a bound function
+     *    8 - `_.curry`
+     *   16 - `_.curryRight`
+     *   32 - `_.partial`
+     *   64 - `_.partialRight`
+     *  128 - `_.rearg`
+     *  256 - `_.ary`
+     *  512 - `_.flip`
+     * @param {*} [thisArg] The `this` binding of `func`.
+     * @param {Array} [partials] The arguments to be partially applied.
+     * @param {Array} [holders] The `partials` placeholder indexes.
+     * @param {Array} [argPos] The argument positions of the new function.
+     * @param {number} [ary] The arity cap of `func`.
+     * @param {number} [arity] The arity of `func`.
+     * @returns {Function} Returns the new wrapped function.
+     */
+    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
+      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
+      if (!isBindKey && typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      var length = partials ? partials.length : 0;
+      if (!length) {
+        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
+        partials = holders = undefined;
+      }
+      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
+      arity = arity === undefined ? arity : toInteger(arity);
+      length -= holders ? holders.length : 0;
+ 
+      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
+        var partialsRight = partials,
+            holdersRight = holders;
+ 
+        partials = holders = undefined;
+      }
+      var data = isBindKey ? undefined : getData(func);
+ 
+      var newData = [
+        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
+        argPos, ary, arity
+      ];
+ 
+      if (data) {
+        mergeData(newData, data);
+      }
+      func = newData[0];
+      bitmask = newData[1];
+      thisArg = newData[2];
+      partials = newData[3];
+      holders = newData[4];
+      arity = newData[9] = newData[9] === undefined
+        ? (isBindKey ? 0 : func.length)
+        : nativeMax(newData[9] - length, 0);
+ 
+      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
+        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
+      }
+      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
+        var result = createBind(func, bitmask, thisArg);
+      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
+        result = createCurry(func, bitmask, arity);
+      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
+        result = createPartial(func, bitmask, thisArg, partials);
+      } else {
+        result = createHybrid.apply(undefined, newData);
+      }
+      var setter = data ? baseSetData : setData;
+      return setWrapToString(setter(result, newData), func, bitmask);
+    }
+ 
+    /**
+     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
+     * of source objects to the destination object for all destination properties
+     * that resolve to `undefined`.
+     *
+     * @private
+     * @param {*} objValue The destination value.
+     * @param {*} srcValue The source value.
+     * @param {string} key The key of the property to assign.
+     * @param {Object} object The parent object of `objValue`.
+     * @returns {*} Returns the value to assign.
+     */
+    function customDefaultsAssignIn(objValue, srcValue, key, object) {
+      if (objValue === undefined ||
+          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
+        return srcValue;
+      }
+      return objValue;
+    }
+ 
+    /**
+     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
+     * objects into destination objects that are passed thru.
+     *
+     * @private
+     * @param {*} objValue The destination value.
+     * @param {*} srcValue The source value.
+     * @param {string} key The key of the property to merge.
+     * @param {Object} object The parent object of `objValue`.
+     * @param {Object} source The parent object of `srcValue`.
+     * @param {Object} [stack] Tracks traversed source values and their merged
+     *  counterparts.
+     * @returns {*} Returns the value to assign.
+     */
+    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
+      if (isObject(objValue) && isObject(srcValue)) {
+        // Recursively merge objects and arrays (susceptible to call stack limits).
+        stack.set(srcValue, objValue);
+        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
+        stack['delete'](srcValue);
+      }
+      return objValue;
+    }
+ 
+    /**
+     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
+     * objects.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @param {string} key The key of the property to inspect.
+     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
+     */
+    function customOmitClone(value, key) {
+      return (key !== undefined && isPlainObject(value)) ? undefined : value;
+    }
+ 
+    /**
+     * A specialized version of `baseIsEqualDeep` for arrays with support for
+     * partial deep comparisons.
+     *
+     * @private
+     * @param {Array} array The array to compare.
+     * @param {Array} other The other array to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} stack Tracks traversed `array` and `other` objects.
+     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+     */
+    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+          arrLength = array.length,
+          othLength = other.length;
+ 
+      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+        return false;
+      }
+      // Assume cyclic values are equal.
+      var stacked = stack.get(array);
+      if (stacked && stack.get(other)) {
+        return stacked == other;
+      }
+      var index = -1,
+          result = true,
+          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
+ 
+      stack.set(array, other);
+      stack.set(other, array);
+ 
+      // Ignore non-index properties.
+      while (++index < arrLength) {
+        var arrValue = array[index],
+            othValue = other[index];
+ 
+        if (customizer) {
+          var compared = isPartial
+            ? customizer(othValue, arrValue, index, other, array, stack)
+            : customizer(arrValue, othValue, index, array, other, stack);
+        }
+        if (compared !== undefined) {
+          if (compared) {
+            continue;
+          }
+          result = false;
+          break;
+        }
+        // Recursively compare arrays (susceptible to call stack limits).
+        if (seen) {
+          if (!arraySome(other, function(othValue, othIndex) {
+                if (!cacheHas(seen, othIndex) &&
+                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+                  return seen.push(othIndex);
+                }
+              })) {
+            result = false;
+            break;
+          }
+        } else if (!(
+              arrValue === othValue ||
+                equalFunc(arrValue, othValue, bitmask, customizer, stack)
+            )) {
+          result = false;
+          break;
+        }
+      }
+      stack['delete'](array);
+      stack['delete'](other);
+      return result;
+    }
+ 
+    /**
+     * A specialized version of `baseIsEqualDeep` for comparing objects of
+     * the same `toStringTag`.
+     *
+     * **Note:** This function only supports comparing values with tags of
+     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {string} tag The `toStringTag` of the objects to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} stack Tracks traversed `object` and `other` objects.
+     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+     */
+    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+      switch (tag) {
+        case dataViewTag:
+          if ((object.byteLength != other.byteLength) ||
+              (object.byteOffset != other.byteOffset)) {
+            return false;
+          }
+          object = object.buffer;
+          other = other.buffer;
+ 
+        case arrayBufferTag:
+          if ((object.byteLength != other.byteLength) ||
+              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
+            return false;
+          }
+          return true;
+ 
+        case boolTag:
+        case dateTag:
+        case numberTag:
+          // Coerce booleans to `1` or `0` and dates to milliseconds.
+          // Invalid dates are coerced to `NaN`.
+          return eq(+object, +other);
+ 
+        case errorTag:
+          return object.name == other.name && object.message == other.message;
+ 
+        case regexpTag:
+        case stringTag:
+          // Coerce regexes to strings and treat strings, primitives and objects,
+          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
+          // for more details.
+          return object == (other + '');
+ 
+        case mapTag:
+          var convert = mapToArray;
+ 
+        case setTag:
+          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+          convert || (convert = setToArray);
+ 
+          if (object.size != other.size && !isPartial) {
+            return false;
+          }
+          // Assume cyclic values are equal.
+          var stacked = stack.get(object);
+          if (stacked) {
+            return stacked == other;
+          }
+          bitmask |= COMPARE_UNORDERED_FLAG;
+ 
+          // Recursively compare objects (susceptible to call stack limits).
+          stack.set(object, other);
+          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+          stack['delete'](object);
+          return result;
+ 
+        case symbolTag:
+          if (symbolValueOf) {
+            return symbolValueOf.call(object) == symbolValueOf.call(other);
+          }
+      }
+      return false;
+    }
+ 
+    /**
+     * A specialized version of `baseIsEqualDeep` for objects with support for
+     * partial deep comparisons.
+     *
+     * @private
+     * @param {Object} object The object to compare.
+     * @param {Object} other The other object to compare.
+     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+     * @param {Function} customizer The function to customize comparisons.
+     * @param {Function} equalFunc The function to determine equivalents of values.
+     * @param {Object} stack Tracks traversed `object` and `other` objects.
+     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+     */
+    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+          objProps = getAllKeys(object),
+          objLength = objProps.length,
+          othProps = getAllKeys(other),
+          othLength = othProps.length;
+ 
+      if (objLength != othLength && !isPartial) {
+        return false;
+      }
+      var index = objLength;
+      while (index--) {
+        var key = objProps[index];
+        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
+          return false;
+        }
+      }
+      // Assume cyclic values are equal.
+      var stacked = stack.get(object);
+      if (stacked && stack.get(other)) {
+        return stacked == other;
+      }
+      var result = true;
+      stack.set(object, other);
+      stack.set(other, object);
+ 
+      var skipCtor = isPartial;
+      while (++index < objLength) {
+        key = objProps[index];
+        var objValue = object[key],
+            othValue = other[key];
+ 
+        if (customizer) {
+          var compared = isPartial
+            ? customizer(othValue, objValue, key, other, object, stack)
+            : customizer(objValue, othValue, key, object, other, stack);
+        }
+        // Recursively compare objects (susceptible to call stack limits).
+        if (!(compared === undefined
+              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
+              : compared
+            )) {
+          result = false;
+          break;
+        }
+        skipCtor || (skipCtor = key == 'constructor');
+      }
+      if (result && !skipCtor) {
+        var objCtor = object.constructor,
+            othCtor = other.constructor;
+ 
+        // Non `Object` object instances with different constructors are not equal.
+        if (objCtor != othCtor &&
+            ('constructor' in object && 'constructor' in other) &&
+            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
+              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+          result = false;
+        }
+      }
+      stack['delete'](object);
+      stack['delete'](other);
+      return result;
+    }
+ 
+    /**
+     * A specialized version of `baseRest` which flattens the rest array.
+     *
+     * @private
+     * @param {Function} func The function to apply a rest parameter to.
+     * @returns {Function} Returns the new function.
+     */
+    function flatRest(func) {
+      return setToString(overRest(func, undefined, flatten), func + '');
+    }
+ 
+    /**
+     * Creates an array of own enumerable property names and symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names and symbols.
+     */
+    function getAllKeys(object) {
+      return baseGetAllKeys(object, keys, getSymbols);
+    }
+ 
+    /**
+     * Creates an array of own and inherited enumerable property names and
+     * symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names and symbols.
+     */
+    function getAllKeysIn(object) {
+      return baseGetAllKeys(object, keysIn, getSymbolsIn);
+    }
+ 
+    /**
+     * Gets metadata for `func`.
+     *
+     * @private
+     * @param {Function} func The function to query.
+     * @returns {*} Returns the metadata for `func`.
+     */
+    var getData = !metaMap ? noop : function(func) {
+      return metaMap.get(func);
+    };
+ 
+    /**
+     * Gets the name of `func`.
+     *
+     * @private
+     * @param {Function} func The function to query.
+     * @returns {string} Returns the function name.
+     */
+    function getFuncName(func) {
+      var result = (func.name + ''),
+          array = realNames[result],
+          length = hasOwnProperty.call(realNames, result) ? array.length : 0;
+ 
+      while (length--) {
+        var data = array[length],
+            otherFunc = data.func;
+        if (otherFunc == null || otherFunc == func) {
+          return data.name;
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * Gets the argument placeholder value for `func`.
+     *
+     * @private
+     * @param {Function} func The function to inspect.
+     * @returns {*} Returns the placeholder value.
+     */
+    function getHolder(func) {
+      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
+      return object.placeholder;
+    }
+ 
+    /**
+     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
+     * this function returns the custom method, otherwise it returns `baseIteratee`.
+     * If arguments are provided, the chosen function is invoked with them and
+     * its result is returned.
+     *
+     * @private
+     * @param {*} [value] The value to convert to an iteratee.
+     * @param {number} [arity] The arity of the created iteratee.
+     * @returns {Function} Returns the chosen function or its result.
+     */
+    function getIteratee() {
+      var result = lodash.iteratee || iteratee;
+      result = result === iteratee ? baseIteratee : result;
+      return arguments.length ? result(arguments[0], arguments[1]) : result;
+    }
+ 
+    /**
+     * Gets the data for `map`.
+     *
+     * @private
+     * @param {Object} map The map to query.
+     * @param {string} key The reference key.
+     * @returns {*} Returns the map data.
+     */
+    function getMapData(map, key) {
+      var data = map.__data__;
+      return isKeyable(key)
+        ? data[typeof key == 'string' ? 'string' : 'hash']
+        : data.map;
+    }
+ 
+    /**
+     * Gets the property names, values, and compare flags of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the match data of `object`.
+     */
+    function getMatchData(object) {
+      var result = keys(object),
+          length = result.length;
+ 
+      while (length--) {
+        var key = result[length],
+            value = object[key];
+ 
+        result[length] = [key, value, isStrictComparable(value)];
+      }
+      return result;
+    }
+ 
+    /**
+     * Gets the native function at `key` of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {string} key The key of the method to get.
+     * @returns {*} Returns the function if it's native, else `undefined`.
+     */
+    function getNative(object, key) {
+      var value = getValue(object, key);
+      return baseIsNative(value) ? value : undefined;
+    }
+ 
+    /**
+     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @returns {string} Returns the raw `toStringTag`.
+     */
+    function getRawTag(value) {
+      var isOwn = hasOwnProperty.call(value, symToStringTag),
+          tag = value[symToStringTag];
+ 
+      try {
+        value[symToStringTag] = undefined;
+        var unmasked = true;
+      } catch (e) {}
+ 
+      var result = nativeObjectToString.call(value);
+      if (unmasked) {
+        if (isOwn) {
+          value[symToStringTag] = tag;
+        } else {
+          delete value[symToStringTag];
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * Creates an array of the own enumerable symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of symbols.
+     */
+    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
+      if (object == null) {
+        return [];
+      }
+      object = Object(object);
+      return arrayFilter(nativeGetSymbols(object), function(symbol) {
+        return propertyIsEnumerable.call(object, symbol);
+      });
+    };
+ 
+    /**
+     * Creates an array of the own and inherited enumerable symbols of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of symbols.
+     */
+    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
+      var result = [];
+      while (object) {
+        arrayPush(result, getSymbols(object));
+        object = getPrototype(object);
+      }
+      return result;
+    };
+ 
+    /**
+     * Gets the `toStringTag` of `value`.
+     *
+     * @private
+     * @param {*} value The value to query.
+     * @returns {string} Returns the `toStringTag`.
+     */
+    var getTag = baseGetTag;
+ 
+    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
+    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
+        (Map && getTag(new Map) != mapTag) ||
+        (Promise && getTag(Promise.resolve()) != promiseTag) ||
+        (Set && getTag(new Set) != setTag) ||
+        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
+      getTag = function(value) {
+        var result = baseGetTag(value),
+            Ctor = result == objectTag ? value.constructor : undefined,
+            ctorString = Ctor ? toSource(Ctor) : '';
+ 
+        if (ctorString) {
+          switch (ctorString) {
+            case dataViewCtorString: return dataViewTag;
+            case mapCtorString: return mapTag;
+            case promiseCtorString: return promiseTag;
+            case setCtorString: return setTag;
+            case weakMapCtorString: return weakMapTag;
+          }
+        }
+        return result;
+      };
+    }
+ 
+    /**
+     * Gets the view, applying any `transforms` to the `start` and `end` positions.
+     *
+     * @private
+     * @param {number} start The start of the view.
+     * @param {number} end The end of the view.
+     * @param {Array} transforms The transformations to apply to the view.
+     * @returns {Object} Returns an object containing the `start` and `end`
+     *  positions of the view.
+     */
+    function getView(start, end, transforms) {
+      var index = -1,
+          length = transforms.length;
+ 
+      while (++index < length) {
+        var data = transforms[index],
+            size = data.size;
+ 
+        switch (data.type) {
+          case 'drop':      start += size; break;
+          case 'dropRight': end -= size; break;
+          case 'take':      end = nativeMin(end, start + size); break;
+          case 'takeRight': start = nativeMax(start, end - size); break;
+        }
+      }
+      return { 'start': start, 'end': end };
+    }
+ 
+    /**
+     * Extracts wrapper details from the `source` body comment.
+     *
+     * @private
+     * @param {string} source The source to inspect.
+     * @returns {Array} Returns the wrapper details.
+     */
+    function getWrapDetails(source) {
+      var match = source.match(reWrapDetails);
+      return match ? match[1].split(reSplitDetails) : [];
+    }
+ 
+    /**
+     * Checks if `path` exists on `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path to check.
+     * @param {Function} hasFunc The function to check properties.
+     * @returns {boolean} Returns `true` if `path` exists, else `false`.
+     */
+    function hasPath(object, path, hasFunc) {
+      path = castPath(path, object);
+ 
+      var index = -1,
+          length = path.length,
+          result = false;
+ 
+      while (++index < length) {
+        var key = toKey(path[index]);
+        if (!(result = object != null && hasFunc(object, key))) {
+          break;
+        }
+        object = object[key];
+      }
+      if (result || ++index != length) {
+        return result;
+      }
+      length = object == null ? 0 : object.length;
+      return !!length && isLength(length) && isIndex(key, length) &&
+        (isArray(object) || isArguments(object));
+    }
+ 
+    /**
+     * Initializes an array clone.
+     *
+     * @private
+     * @param {Array} array The array to clone.
+     * @returns {Array} Returns the initialized clone.
+     */
+    function initCloneArray(array) {
+      var length = array.length,
+          result = array.constructor(length);
+ 
+      // Add properties assigned by `RegExp#exec`.
+      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+        result.index = array.index;
+        result.input = array.input;
+      }
+      return result;
+    }
+ 
+    /**
+     * Initializes an object clone.
+     *
+     * @private
+     * @param {Object} object The object to clone.
+     * @returns {Object} Returns the initialized clone.
+     */
+    function initCloneObject(object) {
+      return (typeof object.constructor == 'function' && !isPrototype(object))
+        ? baseCreate(getPrototype(object))
+        : {};
+    }
+ 
+    /**
+     * Initializes an object clone based on its `toStringTag`.
+     *
+     * **Note:** This function only supports cloning values with tags of
+     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+     *
+     * @private
+     * @param {Object} object The object to clone.
+     * @param {string} tag The `toStringTag` of the object to clone.
+     * @param {Function} cloneFunc The function to clone values.
+     * @param {boolean} [isDeep] Specify a deep clone.
+     * @returns {Object} Returns the initialized clone.
+     */
+    function initCloneByTag(object, tag, cloneFunc, isDeep) {
+      var Ctor = object.constructor;
+      switch (tag) {
+        case arrayBufferTag:
+          return cloneArrayBuffer(object);
+ 
+        case boolTag:
+        case dateTag:
+          return new Ctor(+object);
+ 
+        case dataViewTag:
+          return cloneDataView(object, isDeep);
+ 
+        case float32Tag: case float64Tag:
+        case int8Tag: case int16Tag: case int32Tag:
+        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
+          return cloneTypedArray(object, isDeep);
+ 
+        case mapTag:
+          return cloneMap(object, isDeep, cloneFunc);
+ 
+        case numberTag:
+        case stringTag:
+          return new Ctor(object);
+ 
+        case regexpTag:
+          return cloneRegExp(object);
+ 
+        case setTag:
+          return cloneSet(object, isDeep, cloneFunc);
+ 
+        case symbolTag:
+          return cloneSymbol(object);
+      }
+    }
+ 
+    /**
+     * Inserts wrapper `details` in a comment at the top of the `source` body.
+     *
+     * @private
+     * @param {string} source The source to modify.
+     * @returns {Array} details The details to insert.
+     * @returns {string} Returns the modified source.
+     */
+    function insertWrapDetails(source, details) {
+      var length = details.length;
+      if (!length) {
+        return source;
+      }
+      var lastIndex = length - 1;
+      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
+      details = details.join(length > 2 ? ', ' : ' ');
+      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
+    }
+ 
+    /**
+     * Checks if `value` is a flattenable `arguments` object or array.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+     */
+    function isFlattenable(value) {
+      return isArray(value) || isArguments(value) ||
+        !!(spreadableSymbol && value && value[spreadableSymbol]);
+    }
+ 
+    /**
+     * Checks if `value` is a valid array-like index.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+     */
+    function isIndex(value, length) {
+      length = length == null ? MAX_SAFE_INTEGER : length;
+      return !!length &&
+        (typeof value == 'number' || reIsUint.test(value)) &&
+        (value > -1 && value % 1 == 0 && value < length);
+    }
+ 
+    /**
+     * Checks if the given arguments are from an iteratee call.
+     *
+     * @private
+     * @param {*} value The potential iteratee value argument.
+     * @param {*} index The potential iteratee index or key argument.
+     * @param {*} object The potential iteratee object argument.
+     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+     *  else `false`.
+     */
+    function isIterateeCall(value, index, object) {
+      if (!isObject(object)) {
+        return false;
+      }
+      var type = typeof index;
+      if (type == 'number'
+            ? (isArrayLike(object) && isIndex(index, object.length))
+            : (type == 'string' && index in object)
+          ) {
+        return eq(object[index], value);
+      }
+      return false;
+    }
+ 
+    /**
+     * Checks if `value` is a property name and not a property path.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @param {Object} [object] The object to query keys on.
+     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+     */
+    function isKey(value, object) {
+      if (isArray(value)) {
+        return false;
+      }
+      var type = typeof value;
+      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
+          value == null || isSymbol(value)) {
+        return true;
+      }
+      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
+        (object != null && value in Object(object));
+    }
+ 
+    /**
+     * Checks if `value` is suitable for use as unique object key.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+     */
+    function isKeyable(value) {
+      var type = typeof value;
+      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+        ? (value !== '__proto__')
+        : (value === null);
+    }
+ 
+    /**
+     * Checks if `func` has a lazy counterpart.
+     *
+     * @private
+     * @param {Function} func The function to check.
+     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
+     *  else `false`.
+     */
+    function isLaziable(func) {
+      var funcName = getFuncName(func),
+          other = lodash[funcName];
+ 
+      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
+        return false;
+      }
+      if (func === other) {
+        return true;
+      }
+      var data = getData(other);
+      return !!data && func === data[0];
+    }
+ 
+    /**
+     * Checks if `func` has its source masked.
+     *
+     * @private
+     * @param {Function} func The function to check.
+     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+     */
+    function isMasked(func) {
+      return !!maskSrcKey && (maskSrcKey in func);
+    }
+ 
+    /**
+     * Checks if `func` is capable of being masked.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
+     */
+    var isMaskable = coreJsData ? isFunction : stubFalse;
+ 
+    /**
+     * Checks if `value` is likely a prototype object.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+     */
+    function isPrototype(value) {
+      var Ctor = value && value.constructor,
+          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+ 
+      return value === proto;
+    }
+ 
+    /**
+     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+     *
+     * @private
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` if suitable for strict
+     *  equality comparisons, else `false`.
+     */
+    function isStrictComparable(value) {
+      return value === value && !isObject(value);
+    }
+ 
+    /**
+     * A specialized version of `matchesProperty` for source values suitable
+     * for strict equality comparisons, i.e. `===`.
+     *
+     * @private
+     * @param {string} key The key of the property to get.
+     * @param {*} srcValue The value to match.
+     * @returns {Function} Returns the new spec function.
+     */
+    function matchesStrictComparable(key, srcValue) {
+      return function(object) {
+        if (object == null) {
+          return false;
+        }
+        return object[key] === srcValue &&
+          (srcValue !== undefined || (key in Object(object)));
+      };
+    }
+ 
+    /**
+     * A specialized version of `_.memoize` which clears the memoized function's
+     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
+     *
+     * @private
+     * @param {Function} func The function to have its output memoized.
+     * @returns {Function} Returns the new memoized function.
+     */
+    function memoizeCapped(func) {
+      var result = memoize(func, function(key) {
+        if (cache.size === MAX_MEMOIZE_SIZE) {
+          cache.clear();
+        }
+        return key;
+      });
+ 
+      var cache = result.cache;
+      return result;
+    }
+ 
+    /**
+     * Merges the function metadata of `source` into `data`.
+     *
+     * Merging metadata reduces the number of wrappers used to invoke a function.
+     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
+     * may be applied regardless of execution order. Methods like `_.ary` and
+     * `_.rearg` modify function arguments, making the order in which they are
+     * executed important, preventing the merging of metadata. However, we make
+     * an exception for a safe combined case where curried functions have `_.ary`
+     * and or `_.rearg` applied.
+     *
+     * @private
+     * @param {Array} data The destination metadata.
+     * @param {Array} source The source metadata.
+     * @returns {Array} Returns `data`.
+     */
+    function mergeData(data, source) {
+      var bitmask = data[1],
+          srcBitmask = source[1],
+          newBitmask = bitmask | srcBitmask,
+          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
+ 
+      var isCombo =
+        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
+        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
+        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
+ 
+      // Exit early if metadata can't be merged.
+      if (!(isCommon || isCombo)) {
+        return data;
+      }
+      // Use source `thisArg` if available.
+      if (srcBitmask & WRAP_BIND_FLAG) {
+        data[2] = source[2];
+        // Set when currying a bound function.
+        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
+      }
+      // Compose partial arguments.
+      var value = source[3];
+      if (value) {
+        var partials = data[3];
+        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
+        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
+      }
+      // Compose partial right arguments.
+      value = source[5];
+      if (value) {
+        partials = data[5];
+        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
+        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
+      }
+      // Use source `argPos` if available.
+      value = source[7];
+      if (value) {
+        data[7] = value;
+      }
+      // Use source `ary` if it's smaller.
+      if (srcBitmask & WRAP_ARY_FLAG) {
+        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
+      }
+      // Use source `arity` if one is not provided.
+      if (data[9] == null) {
+        data[9] = source[9];
+      }
+      // Use source `func` and merge bitmasks.
+      data[0] = source[0];
+      data[1] = newBitmask;
+ 
+      return data;
+    }
+ 
+    /**
+     * This function is like
+     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+     * except that it includes inherited enumerable properties.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     */
+    function nativeKeysIn(object) {
+      var result = [];
+      if (object != null) {
+        for (var key in Object(object)) {
+          result.push(key);
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * Converts `value` to a string using `Object.prototype.toString`.
+     *
+     * @private
+     * @param {*} value The value to convert.
+     * @returns {string} Returns the converted string.
+     */
+    function objectToString(value) {
+      return nativeObjectToString.call(value);
+    }
+ 
+    /**
+     * A specialized version of `baseRest` which transforms the rest array.
+     *
+     * @private
+     * @param {Function} func The function to apply a rest parameter to.
+     * @param {number} [start=func.length-1] The start position of the rest parameter.
+     * @param {Function} transform The rest array transform.
+     * @returns {Function} Returns the new function.
+     */
+    function overRest(func, start, transform) {
+      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+      return function() {
+        var args = arguments,
+            index = -1,
+            length = nativeMax(args.length - start, 0),
+            array = Array(length);
+ 
+        while (++index < length) {
+          array[index] = args[start + index];
+        }
+        index = -1;
+        var otherArgs = Array(start + 1);
+        while (++index < start) {
+          otherArgs[index] = args[index];
+        }
+        otherArgs[start] = transform(array);
+        return apply(func, this, otherArgs);
+      };
+    }
+ 
+    /**
+     * Gets the parent value at `path` of `object`.
+     *
+     * @private
+     * @param {Object} object The object to query.
+     * @param {Array} path The path to get the parent value of.
+     * @returns {*} Returns the parent value.
+     */
+    function parent(object, path) {
+      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
+    }
+ 
+    /**
+     * Reorder `array` according to the specified indexes where the element at
+     * the first index is assigned as the first element, the element at
+     * the second index is assigned as the second element, and so on.
+     *
+     * @private
+     * @param {Array} array The array to reorder.
+     * @param {Array} indexes The arranged array indexes.
+     * @returns {Array} Returns `array`.
+     */
+    function reorder(array, indexes) {
+      var arrLength = array.length,
+          length = nativeMin(indexes.length, arrLength),
+          oldArray = copyArray(array);
+ 
+      while (length--) {
+        var index = indexes[length];
+        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
+      }
+      return array;
+    }
+ 
+    /**
+     * Sets metadata for `func`.
+     *
+     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
+     * period of time, it will trip its breaker and transition to an identity
+     * function to avoid garbage collection pauses in V8. See
+     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
+     * for more details.
+     *
+     * @private
+     * @param {Function} func The function to associate metadata with.
+     * @param {*} data The metadata.
+     * @returns {Function} Returns `func`.
+     */
+    var setData = shortOut(baseSetData);
+ 
+    /**
+     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
+     *
+     * @private
+     * @param {Function} func The function to delay.
+     * @param {number} wait The number of milliseconds to delay invocation.
+     * @returns {number|Object} Returns the timer id or timeout object.
+     */
+    var setTimeout = ctxSetTimeout || function(func, wait) {
+      return root.setTimeout(func, wait);
+    };
+ 
+    /**
+     * Sets the `toString` method of `func` to return `string`.
+     *
+     * @private
+     * @param {Function} func The function to modify.
+     * @param {Function} string The `toString` result.
+     * @returns {Function} Returns `func`.
+     */
+    var setToString = shortOut(baseSetToString);
+ 
+    /**
+     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
+     * with wrapper details in a comment at the top of the source body.
+     *
+     * @private
+     * @param {Function} wrapper The function to modify.
+     * @param {Function} reference The reference function.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @returns {Function} Returns `wrapper`.
+     */
+    function setWrapToString(wrapper, reference, bitmask) {
+      var source = (reference + '');
+      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
+    }
+ 
+    /**
+     * Creates a function that'll short out and invoke `identity` instead
+     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
+     * milliseconds.
+     *
+     * @private
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new shortable function.
+     */
+    function shortOut(func) {
+      var count = 0,
+          lastCalled = 0;
+ 
+      return function() {
+        var stamp = nativeNow(),
+            remaining = HOT_SPAN - (stamp - lastCalled);
+ 
+        lastCalled = stamp;
+        if (remaining > 0) {
+          if (++count >= HOT_COUNT) {
+            return arguments[0];
+          }
+        } else {
+          count = 0;
+        }
+        return func.apply(undefined, arguments);
+      };
+    }
+ 
+    /**
+     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
+     *
+     * @private
+     * @param {Array} array The array to shuffle.
+     * @param {number} [size=array.length] The size of `array`.
+     * @returns {Array} Returns `array`.
+     */
+    function shuffleSelf(array, size) {
+      var index = -1,
+          length = array.length,
+          lastIndex = length - 1;
+ 
+      size = size === undefined ? length : size;
+      while (++index < size) {
+        var rand = baseRandom(index, lastIndex),
+            value = array[rand];
+ 
+        array[rand] = array[index];
+        array[index] = value;
+      }
+      array.length = size;
+      return array;
+    }
+ 
+    /**
+     * Converts `string` to a property path array.
+     *
+     * @private
+     * @param {string} string The string to convert.
+     * @returns {Array} Returns the property path array.
+     */
+    var stringToPath = memoizeCapped(function(string) {
+      var result = [];
+      if (reLeadingDot.test(string)) {
+        result.push('');
+      }
+      string.replace(rePropName, function(match, number, quote, string) {
+        result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
+      });
+      return result;
+    });
+ 
+    /**
+     * Converts `value` to a string key if it's not a string or symbol.
+     *
+     * @private
+     * @param {*} value The value to inspect.
+     * @returns {string|symbol} Returns the key.
+     */
+    function toKey(value) {
+      if (typeof value == 'string' || isSymbol(value)) {
+        return value;
+      }
+      var result = (value + '');
+      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+    }
+ 
+    /**
+     * Converts `func` to its source code.
+     *
+     * @private
+     * @param {Function} func The function to convert.
+     * @returns {string} Returns the source code.
+     */
+    function toSource(func) {
+      if (func != null) {
+        try {
+          return funcToString.call(func);
+        } catch (e) {}
+        try {
+          return (func + '');
+        } catch (e) {}
+      }
+      return '';
+    }
+ 
+    /**
+     * Updates wrapper `details` based on `bitmask` flags.
+     *
+     * @private
+     * @returns {Array} details The details to modify.
+     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
+     * @returns {Array} Returns `details`.
+     */
+    function updateWrapDetails(details, bitmask) {
+      arrayEach(wrapFlags, function(pair) {
+        var value = '_.' + pair[0];
+        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
+          details.push(value);
+        }
+      });
+      return details.sort();
+    }
+ 
+    /**
+     * Creates a clone of `wrapper`.
+     *
+     * @private
+     * @param {Object} wrapper The wrapper to clone.
+     * @returns {Object} Returns the cloned wrapper.
+     */
+    function wrapperClone(wrapper) {
+      if (wrapper instanceof LazyWrapper) {
+        return wrapper.clone();
+      }
+      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
+      result.__actions__ = copyArray(wrapper.__actions__);
+      result.__index__  = wrapper.__index__;
+      result.__values__ = wrapper.__values__;
+      return result;
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates an array of elements split into groups the length of `size`.
+     * If `array` can't be split evenly, the final chunk will be the remaining
+     * elements.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to process.
+     * @param {number} [size=1] The length of each chunk
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the new array of chunks.
+     * @example
+     *
+     * _.chunk(['a', 'b', 'c', 'd'], 2);
+     * // => [['a', 'b'], ['c', 'd']]
+     *
+     * _.chunk(['a', 'b', 'c', 'd'], 3);
+     * // => [['a', 'b', 'c'], ['d']]
+     */
+    function chunk(array, size, guard) {
+      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
+        size = 1;
+      } else {
+        size = nativeMax(toInteger(size), 0);
+      }
+      var length = array == null ? 0 : array.length;
+      if (!length || size < 1) {
+        return [];
+      }
+      var index = 0,
+          resIndex = 0,
+          result = Array(nativeCeil(length / size));
+ 
+      while (index < length) {
+        result[resIndex++] = baseSlice(array, index, (index += size));
+      }
+      return result;
+    }
+ 
+    /**
+     * Creates an array with all falsey values removed. The values `false`, `null`,
+     * `0`, `""`, `undefined`, and `NaN` are falsey.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to compact.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * _.compact([0, 1, false, 2, '', 3]);
+     * // => [1, 2, 3]
+     */
+    function compact(array) {
+      var index = -1,
+          length = array == null ? 0 : array.length,
+          resIndex = 0,
+          result = [];
+ 
+      while (++index < length) {
+        var value = array[index];
+        if (value) {
+          result[resIndex++] = value;
+        }
+      }
+      return result;
+    }
+ 
+    /**
+     * Creates a new array concatenating `array` with any additional arrays
+     * and/or values.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to concatenate.
+     * @param {...*} [values] The values to concatenate.
+     * @returns {Array} Returns the new concatenated array.
+     * @example
+     *
+     * var array = [1];
+     * var other = _.concat(array, 2, [3], [[4]]);
+     *
+     * console.log(other);
+     * // => [1, 2, 3, [4]]
+     *
+     * console.log(array);
+     * // => [1]
+     */
+    function concat() {
+      var length = arguments.length;
+      if (!length) {
+        return [];
+      }
+      var args = Array(length - 1),
+          array = arguments[0],
+          index = length;
+ 
+      while (index--) {
+        args[index - 1] = arguments[index];
+      }
+      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
+    }
+ 
+    /**
+     * Creates an array of `array` values not included in the other given arrays
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons. The order and references of result values are
+     * determined by the first array.
+     *
+     * **Note:** Unlike `_.pullAll`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...Array} [values] The values to exclude.
+     * @returns {Array} Returns the new array of filtered values.
+     * @see _.without, _.xor
+     * @example
+     *
+     * _.difference([2, 1], [2, 3]);
+     * // => [1]
+     */
+    var difference = baseRest(function(array, values) {
+      return isArrayLikeObject(array)
+        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
+        : [];
+    });
+ 
+    /**
+     * This method is like `_.difference` except that it accepts `iteratee` which
+     * is invoked for each element of `array` and `values` to generate the criterion
+     * by which they're compared. The order and references of result values are
+     * determined by the first array. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...Array} [values] The values to exclude.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+     * // => [1.2]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
+     * // => [{ 'x': 2 }]
+     */
+    var differenceBy = baseRest(function(array, values) {
+      var iteratee = last(values);
+      if (isArrayLikeObject(iteratee)) {
+        iteratee = undefined;
+      }
+      return isArrayLikeObject(array)
+        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
+        : [];
+    });
+ 
+    /**
+     * This method is like `_.difference` except that it accepts `comparator`
+     * which is invoked to compare elements of `array` to `values`. The order and
+     * references of result values are determined by the first array. The comparator
+     * is invoked with two arguments: (arrVal, othVal).
+     *
+     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...Array} [values] The values to exclude.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     *
+     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
+     * // => [{ 'x': 2, 'y': 1 }]
+     */
+    var differenceWith = baseRest(function(array, values) {
+      var comparator = last(values);
+      if (isArrayLikeObject(comparator)) {
+        comparator = undefined;
+      }
+      return isArrayLikeObject(array)
+        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
+        : [];
+    });
+ 
+    /**
+     * Creates a slice of `array` with `n` elements dropped from the beginning.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.5.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to drop.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.drop([1, 2, 3]);
+     * // => [2, 3]
+     *
+     * _.drop([1, 2, 3], 2);
+     * // => [3]
+     *
+     * _.drop([1, 2, 3], 5);
+     * // => []
+     *
+     * _.drop([1, 2, 3], 0);
+     * // => [1, 2, 3]
+     */
+    function drop(array, n, guard) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      return baseSlice(array, n < 0 ? 0 : n, length);
+    }
+ 
+    /**
+     * Creates a slice of `array` with `n` elements dropped from the end.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to drop.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.dropRight([1, 2, 3]);
+     * // => [1, 2]
+     *
+     * _.dropRight([1, 2, 3], 2);
+     * // => [1]
+     *
+     * _.dropRight([1, 2, 3], 5);
+     * // => []
+     *
+     * _.dropRight([1, 2, 3], 0);
+     * // => [1, 2, 3]
+     */
+    function dropRight(array, n, guard) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      n = length - n;
+      return baseSlice(array, 0, n < 0 ? 0 : n);
+    }
+ 
+    /**
+     * Creates a slice of `array` excluding elements dropped from the end.
+     * Elements are dropped until `predicate` returns falsey. The predicate is
+     * invoked with three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': true },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': false }
+     * ];
+     *
+     * _.dropRightWhile(users, function(o) { return !o.active; });
+     * // => objects for ['barney']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
+     * // => objects for ['barney', 'fred']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.dropRightWhile(users, ['active', false]);
+     * // => objects for ['barney']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.dropRightWhile(users, 'active');
+     * // => objects for ['barney', 'fred', 'pebbles']
+     */
+    function dropRightWhile(array, predicate) {
+      return (array && array.length)
+        ? baseWhile(array, getIteratee(predicate, 3), true, true)
+        : [];
+    }
+ 
+    /**
+     * Creates a slice of `array` excluding elements dropped from the beginning.
+     * Elements are dropped until `predicate` returns falsey. The predicate is
+     * invoked with three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': false },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': true }
+     * ];
+     *
+     * _.dropWhile(users, function(o) { return !o.active; });
+     * // => objects for ['pebbles']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.dropWhile(users, { 'user': 'barney', 'active': false });
+     * // => objects for ['fred', 'pebbles']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.dropWhile(users, ['active', false]);
+     * // => objects for ['pebbles']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.dropWhile(users, 'active');
+     * // => objects for ['barney', 'fred', 'pebbles']
+     */
+    function dropWhile(array, predicate) {
+      return (array && array.length)
+        ? baseWhile(array, getIteratee(predicate, 3), true)
+        : [];
+    }
+ 
+    /**
+     * Fills elements of `array` with `value` from `start` up to, but not
+     * including, `end`.
+     *
+     * **Note:** This method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.2.0
+     * @category Array
+     * @param {Array} array The array to fill.
+     * @param {*} value The value to fill `array` with.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [1, 2, 3];
+     *
+     * _.fill(array, 'a');
+     * console.log(array);
+     * // => ['a', 'a', 'a']
+     *
+     * _.fill(Array(3), 2);
+     * // => [2, 2, 2]
+     *
+     * _.fill([4, 6, 8, 10], '*', 1, 3);
+     * // => [4, '*', '*', 10]
+     */
+    function fill(array, value, start, end) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
+        start = 0;
+        end = length;
+      }
+      return baseFill(array, value, start, end);
+    }
+ 
+    /**
+     * This method is like `_.find` except that it returns the index of the first
+     * element `predicate` returns truthy for instead of the element itself.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @returns {number} Returns the index of the found element, else `-1`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': false },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': true }
+     * ];
+     *
+     * _.findIndex(users, function(o) { return o.user == 'barney'; });
+     * // => 0
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findIndex(users, { 'user': 'fred', 'active': false });
+     * // => 1
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findIndex(users, ['active', false]);
+     * // => 0
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findIndex(users, 'active');
+     * // => 2
+     */
+    function findIndex(array, predicate, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = fromIndex == null ? 0 : toInteger(fromIndex);
+      if (index < 0) {
+        index = nativeMax(length + index, 0);
+      }
+      return baseFindIndex(array, getIteratee(predicate, 3), index);
+    }
+ 
+    /**
+     * This method is like `_.findIndex` except that it iterates over elements
+     * of `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=array.length-1] The index to search from.
+     * @returns {number} Returns the index of the found element, else `-1`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': true },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': false }
+     * ];
+     *
+     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
+     * // => 2
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
+     * // => 0
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findLastIndex(users, ['active', false]);
+     * // => 2
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findLastIndex(users, 'active');
+     * // => 0
+     */
+    function findLastIndex(array, predicate, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = length - 1;
+      if (fromIndex !== undefined) {
+        index = toInteger(fromIndex);
+        index = fromIndex < 0
+          ? nativeMax(length + index, 0)
+          : nativeMin(index, length - 1);
+      }
+      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
+    }
+ 
+    /**
+     * Flattens `array` a single level deep.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to flatten.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * _.flatten([1, [2, [3, [4]], 5]]);
+     * // => [1, 2, [3, [4]], 5]
+     */
+    function flatten(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseFlatten(array, 1) : [];
+    }
+ 
+    /**
+     * Recursively flattens `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to flatten.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * _.flattenDeep([1, [2, [3, [4]], 5]]);
+     * // => [1, 2, 3, 4, 5]
+     */
+    function flattenDeep(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseFlatten(array, INFINITY) : [];
+    }
+ 
+    /**
+     * Recursively flatten `array` up to `depth` times.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.4.0
+     * @category Array
+     * @param {Array} array The array to flatten.
+     * @param {number} [depth=1] The maximum recursion depth.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * var array = [1, [2, [3, [4]], 5]];
+     *
+     * _.flattenDepth(array, 1);
+     * // => [1, 2, [3, [4]], 5]
+     *
+     * _.flattenDepth(array, 2);
+     * // => [1, 2, 3, [4], 5]
+     */
+    function flattenDepth(array, depth) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      depth = depth === undefined ? 1 : toInteger(depth);
+      return baseFlatten(array, depth);
+    }
+ 
+    /**
+     * The inverse of `_.toPairs`; this method returns an object composed
+     * from key-value `pairs`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} pairs The key-value pairs.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * _.fromPairs([['a', 1], ['b', 2]]);
+     * // => { 'a': 1, 'b': 2 }
+     */
+    function fromPairs(pairs) {
+      var index = -1,
+          length = pairs == null ? 0 : pairs.length,
+          result = {};
+ 
+      while (++index < length) {
+        var pair = pairs[index];
+        result[pair[0]] = pair[1];
+      }
+      return result;
+    }
+ 
+    /**
+     * Gets the first element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @alias first
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {*} Returns the first element of `array`.
+     * @example
+     *
+     * _.head([1, 2, 3]);
+     * // => 1
+     *
+     * _.head([]);
+     * // => undefined
+     */
+    function head(array) {
+      return (array && array.length) ? array[0] : undefined;
+    }
+ 
+    /**
+     * Gets the index at which the first occurrence of `value` is found in `array`
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons. If `fromIndex` is negative, it's used as the
+     * offset from the end of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.indexOf([1, 2, 1, 2], 2);
+     * // => 1
+     *
+     * // Search from the `fromIndex`.
+     * _.indexOf([1, 2, 1, 2], 2, 2);
+     * // => 3
+     */
+    function indexOf(array, value, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = fromIndex == null ? 0 : toInteger(fromIndex);
+      if (index < 0) {
+        index = nativeMax(length + index, 0);
+      }
+      return baseIndexOf(array, value, index);
+    }
+ 
+    /**
+     * Gets all but the last element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.initial([1, 2, 3]);
+     * // => [1, 2]
+     */
+    function initial(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseSlice(array, 0, -1) : [];
+    }
+ 
+    /**
+     * Creates an array of unique values that are included in all given arrays
+     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons. The order and references of result values are
+     * determined by the first array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @returns {Array} Returns the new array of intersecting values.
+     * @example
+     *
+     * _.intersection([2, 1], [2, 3]);
+     * // => [2]
+     */
+    var intersection = baseRest(function(arrays) {
+      var mapped = arrayMap(arrays, castArrayLikeObject);
+      return (mapped.length && mapped[0] === arrays[0])
+        ? baseIntersection(mapped)
+        : [];
+    });
+ 
+    /**
+     * This method is like `_.intersection` except that it accepts `iteratee`
+     * which is invoked for each element of each `arrays` to generate the criterion
+     * by which they're compared. The order and references of result values are
+     * determined by the first array. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of intersecting values.
+     * @example
+     *
+     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+     * // => [2.1]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 1 }]
+     */
+    var intersectionBy = baseRest(function(arrays) {
+      var iteratee = last(arrays),
+          mapped = arrayMap(arrays, castArrayLikeObject);
+ 
+      if (iteratee === last(mapped)) {
+        iteratee = undefined;
+      } else {
+        mapped.pop();
+      }
+      return (mapped.length && mapped[0] === arrays[0])
+        ? baseIntersection(mapped, getIteratee(iteratee, 2))
+        : [];
+    });
+ 
+    /**
+     * This method is like `_.intersection` except that it accepts `comparator`
+     * which is invoked to compare elements of `arrays`. The order and references
+     * of result values are determined by the first array. The comparator is
+     * invoked with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of intersecting values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.intersectionWith(objects, others, _.isEqual);
+     * // => [{ 'x': 1, 'y': 2 }]
+     */
+    var intersectionWith = baseRest(function(arrays) {
+      var comparator = last(arrays),
+          mapped = arrayMap(arrays, castArrayLikeObject);
+ 
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      if (comparator) {
+        mapped.pop();
+      }
+      return (mapped.length && mapped[0] === arrays[0])
+        ? baseIntersection(mapped, undefined, comparator)
+        : [];
+    });
+ 
+    /**
+     * Converts all elements in `array` into a string separated by `separator`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to convert.
+     * @param {string} [separator=','] The element separator.
+     * @returns {string} Returns the joined string.
+     * @example
+     *
+     * _.join(['a', 'b', 'c'], '~');
+     * // => 'a~b~c'
+     */
+    function join(array, separator) {
+      return array == null ? '' : nativeJoin.call(array, separator);
+    }
+ 
+    /**
+     * Gets the last element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {*} Returns the last element of `array`.
+     * @example
+     *
+     * _.last([1, 2, 3]);
+     * // => 3
+     */
+    function last(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? array[length - 1] : undefined;
+    }
+ 
+    /**
+     * This method is like `_.indexOf` except that it iterates over elements of
+     * `array` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @param {number} [fromIndex=array.length-1] The index to search from.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.lastIndexOf([1, 2, 1, 2], 2);
+     * // => 3
+     *
+     * // Search from the `fromIndex`.
+     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
+     * // => 1
+     */
+    function lastIndexOf(array, value, fromIndex) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return -1;
+      }
+      var index = length;
+      if (fromIndex !== undefined) {
+        index = toInteger(fromIndex);
+        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
+      }
+      return value === value
+        ? strictLastIndexOf(array, value, index)
+        : baseFindIndex(array, baseIsNaN, index, true);
+    }
+ 
+    /**
+     * Gets the element at index `n` of `array`. If `n` is negative, the nth
+     * element from the end is returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.11.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=0] The index of the element to return.
+     * @returns {*} Returns the nth element of `array`.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'd'];
+     *
+     * _.nth(array, 1);
+     * // => 'b'
+     *
+     * _.nth(array, -2);
+     * // => 'c';
+     */
+    function nth(array, n) {
+      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
+    }
+ 
+    /**
+     * Removes all given values from `array` using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
+     * to remove elements from an array by predicate.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {...*} [values] The values to remove.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+     *
+     * _.pull(array, 'a', 'c');
+     * console.log(array);
+     * // => ['b', 'b']
+     */
+    var pull = baseRest(pullAll);
+ 
+    /**
+     * This method is like `_.pull` except that it accepts an array of values to remove.
+     *
+     * **Note:** Unlike `_.difference`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
+     *
+     * _.pullAll(array, ['a', 'c']);
+     * console.log(array);
+     * // => ['b', 'b']
+     */
+    function pullAll(array, values) {
+      return (array && array.length && values && values.length)
+        ? basePullAll(array, values)
+        : array;
+    }
+ 
+    /**
+     * This method is like `_.pullAll` except that it accepts `iteratee` which is
+     * invoked for each element of `array` and `values` to generate the criterion
+     * by which they're compared. The iteratee is invoked with one argument: (value).
+     *
+     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
+     *
+     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
+     * console.log(array);
+     * // => [{ 'x': 2 }]
+     */
+    function pullAllBy(array, values, iteratee) {
+      return (array && array.length && values && values.length)
+        ? basePullAll(array, values, getIteratee(iteratee, 2))
+        : array;
+    }
+ 
+    /**
+     * This method is like `_.pullAll` except that it accepts `comparator` which
+     * is invoked to compare elements of `array` to `values`. The comparator is
+     * invoked with two arguments: (arrVal, othVal).
+     *
+     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.6.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Array} values The values to remove.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
+     *
+     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
+     * console.log(array);
+     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
+     */
+    function pullAllWith(array, values, comparator) {
+      return (array && array.length && values && values.length)
+        ? basePullAll(array, values, undefined, comparator)
+        : array;
+    }
+ 
+    /**
+     * Removes elements from `array` corresponding to `indexes` and returns an
+     * array of removed elements.
+     *
+     * **Note:** Unlike `_.at`, this method mutates `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
+     * @returns {Array} Returns the new array of removed elements.
+     * @example
+     *
+     * var array = ['a', 'b', 'c', 'd'];
+     * var pulled = _.pullAt(array, [1, 3]);
+     *
+     * console.log(array);
+     * // => ['a', 'c']
+     *
+     * console.log(pulled);
+     * // => ['b', 'd']
+     */
+    var pullAt = flatRest(function(array, indexes) {
+      var length = array == null ? 0 : array.length,
+          result = baseAt(array, indexes);
+ 
+      basePullAt(array, arrayMap(indexes, function(index) {
+        return isIndex(index, length) ? +index : index;
+      }).sort(compareAscending));
+ 
+      return result;
+    });
+ 
+    /**
+     * Removes all elements from `array` that `predicate` returns truthy for
+     * and returns an array of the removed elements. The predicate is invoked
+     * with three arguments: (value, index, array).
+     *
+     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
+     * to pull elements from an array by value.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new array of removed elements.
+     * @example
+     *
+     * var array = [1, 2, 3, 4];
+     * var evens = _.remove(array, function(n) {
+     *   return n % 2 == 0;
+     * });
+     *
+     * console.log(array);
+     * // => [1, 3]
+     *
+     * console.log(evens);
+     * // => [2, 4]
+     */
+    function remove(array, predicate) {
+      var result = [];
+      if (!(array && array.length)) {
+        return result;
+      }
+      var index = -1,
+          indexes = [],
+          length = array.length;
+ 
+      predicate = getIteratee(predicate, 3);
+      while (++index < length) {
+        var value = array[index];
+        if (predicate(value, index, array)) {
+          result.push(value);
+          indexes.push(index);
+        }
+      }
+      basePullAt(array, indexes);
+      return result;
+    }
+ 
+    /**
+     * Reverses `array` so that the first element becomes the last, the second
+     * element becomes the second to last, and so on.
+     *
+     * **Note:** This method mutates `array` and is based on
+     * [`Array#reverse`](https://mdn.io/Array/reverse).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to modify.
+     * @returns {Array} Returns `array`.
+     * @example
+     *
+     * var array = [1, 2, 3];
+     *
+     * _.reverse(array);
+     * // => [3, 2, 1]
+     *
+     * console.log(array);
+     * // => [3, 2, 1]
+     */
+    function reverse(array) {
+      return array == null ? array : nativeReverse.call(array);
+    }
+ 
+    /**
+     * Creates a slice of `array` from `start` up to, but not including, `end`.
+     *
+     * **Note:** This method is used instead of
+     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
+     * returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to slice.
+     * @param {number} [start=0] The start position.
+     * @param {number} [end=array.length] The end position.
+     * @returns {Array} Returns the slice of `array`.
+     */
+    function slice(array, start, end) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
+        start = 0;
+        end = length;
+      }
+      else {
+        start = start == null ? 0 : toInteger(start);
+        end = end === undefined ? length : toInteger(end);
+      }
+      return baseSlice(array, start, end);
+    }
+ 
+    /**
+     * Uses a binary search to determine the lowest index at which `value`
+     * should be inserted into `array` in order to maintain its sort order.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * _.sortedIndex([30, 50], 40);
+     * // => 1
+     */
+    function sortedIndex(array, value) {
+      return baseSortedIndex(array, value);
+    }
+ 
+    /**
+     * This method is like `_.sortedIndex` except that it accepts `iteratee`
+     * which is invoked for `value` and each element of `array` to compute their
+     * sort ranking. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * var objects = [{ 'x': 4 }, { 'x': 5 }];
+     *
+     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+     * // => 0
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
+     * // => 0
+     */
+    function sortedIndexBy(array, value, iteratee) {
+      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
+    }
+ 
+    /**
+     * This method is like `_.indexOf` except that it performs a binary
+     * search on a sorted `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
+     * // => 1
+     */
+    function sortedIndexOf(array, value) {
+      var length = array == null ? 0 : array.length;
+      if (length) {
+        var index = baseSortedIndex(array, value);
+        if (index < length && eq(array[index], value)) {
+          return index;
+        }
+      }
+      return -1;
+    }
+ 
+    /**
+     * This method is like `_.sortedIndex` except that it returns the highest
+     * index at which `value` should be inserted into `array` in order to
+     * maintain its sort order.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
+     * // => 4
+     */
+    function sortedLastIndex(array, value) {
+      return baseSortedIndex(array, value, true);
+    }
+ 
+    /**
+     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
+     * which is invoked for `value` and each element of `array` to compute their
+     * sort ranking. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The sorted array to inspect.
+     * @param {*} value The value to evaluate.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the index at which `value` should be inserted
+     *  into `array`.
+     * @example
+     *
+     * var objects = [{ 'x': 4 }, { 'x': 5 }];
+     *
+     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
+     * // => 1
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
+     * // => 1
+     */
+    function sortedLastIndexBy(array, value, iteratee) {
+      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
+    }
+ 
+    /**
+     * This method is like `_.lastIndexOf` except that it performs a binary
+     * search on a sorted `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {*} value The value to search for.
+     * @returns {number} Returns the index of the matched value, else `-1`.
+     * @example
+     *
+     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
+     * // => 3
+     */
+    function sortedLastIndexOf(array, value) {
+      var length = array == null ? 0 : array.length;
+      if (length) {
+        var index = baseSortedIndex(array, value, true) - 1;
+        if (eq(array[index], value)) {
+          return index;
+        }
+      }
+      return -1;
+    }
+ 
+    /**
+     * This method is like `_.uniq` except that it's designed and optimized
+     * for sorted arrays.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.sortedUniq([1, 1, 2]);
+     * // => [1, 2]
+     */
+    function sortedUniq(array) {
+      return (array && array.length)
+        ? baseSortedUniq(array)
+        : [];
+    }
+ 
+    /**
+     * This method is like `_.uniqBy` except that it's designed and optimized
+     * for sorted arrays.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee] The iteratee invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
+     * // => [1.1, 2.3]
+     */
+    function sortedUniqBy(array, iteratee) {
+      return (array && array.length)
+        ? baseSortedUniq(array, getIteratee(iteratee, 2))
+        : [];
+    }
+ 
+    /**
+     * Gets all but the first element of `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.tail([1, 2, 3]);
+     * // => [2, 3]
+     */
+    function tail(array) {
+      var length = array == null ? 0 : array.length;
+      return length ? baseSlice(array, 1, length) : [];
+    }
+ 
+    /**
+     * Creates a slice of `array` with `n` elements taken from the beginning.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to take.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.take([1, 2, 3]);
+     * // => [1]
+     *
+     * _.take([1, 2, 3], 2);
+     * // => [1, 2]
+     *
+     * _.take([1, 2, 3], 5);
+     * // => [1, 2, 3]
+     *
+     * _.take([1, 2, 3], 0);
+     * // => []
+     */
+    function take(array, n, guard) {
+      if (!(array && array.length)) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      return baseSlice(array, 0, n < 0 ? 0 : n);
+    }
+ 
+    /**
+     * Creates a slice of `array` with `n` elements taken from the end.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {number} [n=1] The number of elements to take.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * _.takeRight([1, 2, 3]);
+     * // => [3]
+     *
+     * _.takeRight([1, 2, 3], 2);
+     * // => [2, 3]
+     *
+     * _.takeRight([1, 2, 3], 5);
+     * // => [1, 2, 3]
+     *
+     * _.takeRight([1, 2, 3], 0);
+     * // => []
+     */
+    function takeRight(array, n, guard) {
+      var length = array == null ? 0 : array.length;
+      if (!length) {
+        return [];
+      }
+      n = (guard || n === undefined) ? 1 : toInteger(n);
+      n = length - n;
+      return baseSlice(array, n < 0 ? 0 : n, length);
+    }
+ 
+    /**
+     * Creates a slice of `array` with elements taken from the end. Elements are
+     * taken until `predicate` returns falsey. The predicate is invoked with
+     * three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': true },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': false }
+     * ];
+     *
+     * _.takeRightWhile(users, function(o) { return !o.active; });
+     * // => objects for ['fred', 'pebbles']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
+     * // => objects for ['pebbles']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.takeRightWhile(users, ['active', false]);
+     * // => objects for ['fred', 'pebbles']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.takeRightWhile(users, 'active');
+     * // => []
+     */
+    function takeRightWhile(array, predicate) {
+      return (array && array.length)
+        ? baseWhile(array, getIteratee(predicate, 3), false, true)
+        : [];
+    }
+ 
+    /**
+     * Creates a slice of `array` with elements taken from the beginning. Elements
+     * are taken until `predicate` returns falsey. The predicate is invoked with
+     * three arguments: (value, index, array).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Array
+     * @param {Array} array The array to query.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the slice of `array`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'active': false },
+     *   { 'user': 'fred',    'active': false },
+     *   { 'user': 'pebbles', 'active': true }
+     * ];
+     *
+     * _.takeWhile(users, function(o) { return !o.active; });
+     * // => objects for ['barney', 'fred']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.takeWhile(users, { 'user': 'barney', 'active': false });
+     * // => objects for ['barney']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.takeWhile(users, ['active', false]);
+     * // => objects for ['barney', 'fred']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.takeWhile(users, 'active');
+     * // => []
+     */
+    function takeWhile(array, predicate) {
+      return (array && array.length)
+        ? baseWhile(array, getIteratee(predicate, 3))
+        : [];
+    }
+ 
+    /**
+     * Creates an array of unique values, in order, from all given arrays using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @returns {Array} Returns the new array of combined values.
+     * @example
+     *
+     * _.union([2], [1, 2]);
+     * // => [2, 1]
+     */
+    var union = baseRest(function(arrays) {
+      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
+    });
+ 
+    /**
+     * This method is like `_.union` except that it accepts `iteratee` which is
+     * invoked for each element of each `arrays` to generate the criterion by
+     * which uniqueness is computed. Result values are chosen from the first
+     * array in which the value occurs. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of combined values.
+     * @example
+     *
+     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
+     * // => [2.1, 1.2]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 1 }, { 'x': 2 }]
+     */
+    var unionBy = baseRest(function(arrays) {
+      var iteratee = last(arrays);
+      if (isArrayLikeObject(iteratee)) {
+        iteratee = undefined;
+      }
+      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
+    });
+ 
+    /**
+     * This method is like `_.union` except that it accepts `comparator` which
+     * is invoked to compare elements of `arrays`. Result values are chosen from
+     * the first array in which the value occurs. The comparator is invoked
+     * with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of combined values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.unionWith(objects, others, _.isEqual);
+     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+     */
+    var unionWith = baseRest(function(arrays) {
+      var comparator = last(arrays);
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
+    });
+ 
+    /**
+     * Creates a duplicate-free version of an array, using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons, in which only the first occurrence of each element
+     * is kept. The order of result values is determined by the order they occur
+     * in the array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.uniq([2, 1, 2]);
+     * // => [2, 1]
+     */
+    function uniq(array) {
+      return (array && array.length) ? baseUniq(array) : [];
+    }
+ 
+    /**
+     * This method is like `_.uniq` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the criterion by which
+     * uniqueness is computed. The order of result values is determined by the
+     * order they occur in the array. The iteratee is invoked with one argument:
+     * (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
+     * // => [2.1, 1.2]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 1 }, { 'x': 2 }]
+     */
+    function uniqBy(array, iteratee) {
+      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
+    }
+ 
+    /**
+     * This method is like `_.uniq` except that it accepts `comparator` which
+     * is invoked to compare elements of `array`. The order of result values is
+     * determined by the order they occur in the array.The comparator is invoked
+     * with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new duplicate free array.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.uniqWith(objects, _.isEqual);
+     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
+     */
+    function uniqWith(array, comparator) {
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
+    }
+ 
+    /**
+     * This method is like `_.zip` except that it accepts an array of grouped
+     * elements and creates an array regrouping the elements to their pre-zip
+     * configuration.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.2.0
+     * @category Array
+     * @param {Array} array The array of grouped elements to process.
+     * @returns {Array} Returns the new array of regrouped elements.
+     * @example
+     *
+     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
+     * // => [['a', 1, true], ['b', 2, false]]
+     *
+     * _.unzip(zipped);
+     * // => [['a', 'b'], [1, 2], [true, false]]
+     */
+    function unzip(array) {
+      if (!(array && array.length)) {
+        return [];
+      }
+      var length = 0;
+      array = arrayFilter(array, function(group) {
+        if (isArrayLikeObject(group)) {
+          length = nativeMax(group.length, length);
+          return true;
+        }
+      });
+      return baseTimes(length, function(index) {
+        return arrayMap(array, baseProperty(index));
+      });
+    }
+ 
+    /**
+     * This method is like `_.unzip` except that it accepts `iteratee` to specify
+     * how regrouped values should be combined. The iteratee is invoked with the
+     * elements of each group: (...group).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.8.0
+     * @category Array
+     * @param {Array} array The array of grouped elements to process.
+     * @param {Function} [iteratee=_.identity] The function to combine
+     *  regrouped values.
+     * @returns {Array} Returns the new array of regrouped elements.
+     * @example
+     *
+     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
+     * // => [[1, 10, 100], [2, 20, 200]]
+     *
+     * _.unzipWith(zipped, _.add);
+     * // => [3, 30, 300]
+     */
+    function unzipWith(array, iteratee) {
+      if (!(array && array.length)) {
+        return [];
+      }
+      var result = unzip(array);
+      if (iteratee == null) {
+        return result;
+      }
+      return arrayMap(result, function(group) {
+        return apply(iteratee, undefined, group);
+      });
+    }
+ 
+    /**
+     * Creates an array excluding all given values using
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * for equality comparisons.
+     *
+     * **Note:** Unlike `_.pull`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {Array} array The array to inspect.
+     * @param {...*} [values] The values to exclude.
+     * @returns {Array} Returns the new array of filtered values.
+     * @see _.difference, _.xor
+     * @example
+     *
+     * _.without([2, 1, 2, 3], 1, 2);
+     * // => [3]
+     */
+    var without = baseRest(function(array, values) {
+      return isArrayLikeObject(array)
+        ? baseDifference(array, values)
+        : [];
+    });
+ 
+    /**
+     * Creates an array of unique values that is the
+     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+     * of the given arrays. The order of result values is determined by the order
+     * they occur in the arrays.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @returns {Array} Returns the new array of filtered values.
+     * @see _.difference, _.without
+     * @example
+     *
+     * _.xor([2, 1], [2, 3]);
+     * // => [1, 3]
+     */
+    var xor = baseRest(function(arrays) {
+      return baseXor(arrayFilter(arrays, isArrayLikeObject));
+    });
+ 
+    /**
+     * This method is like `_.xor` except that it accepts `iteratee` which is
+     * invoked for each element of each `arrays` to generate the criterion by
+     * which by which they're compared. The order of result values is determined
+     * by the order they occur in the arrays. The iteratee is invoked with one
+     * argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
+     * // => [1.2, 3.4]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
+     * // => [{ 'x': 2 }]
+     */
+    var xorBy = baseRest(function(arrays) {
+      var iteratee = last(arrays);
+      if (isArrayLikeObject(iteratee)) {
+        iteratee = undefined;
+      }
+      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
+    });
+ 
+    /**
+     * This method is like `_.xor` except that it accepts `comparator` which is
+     * invoked to compare elements of `arrays`. The order of result values is
+     * determined by the order they occur in the arrays. The comparator is invoked
+     * with two arguments: (arrVal, othVal).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to inspect.
+     * @param {Function} [comparator] The comparator invoked per element.
+     * @returns {Array} Returns the new array of filtered values.
+     * @example
+     *
+     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
+     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
+     *
+     * _.xorWith(objects, others, _.isEqual);
+     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
+     */
+    var xorWith = baseRest(function(arrays) {
+      var comparator = last(arrays);
+      comparator = typeof comparator == 'function' ? comparator : undefined;
+      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
+    });
+ 
+    /**
+     * Creates an array of grouped elements, the first of which contains the
+     * first elements of the given arrays, the second of which contains the
+     * second elements of the given arrays, and so on.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to process.
+     * @returns {Array} Returns the new array of grouped elements.
+     * @example
+     *
+     * _.zip(['a', 'b'], [1, 2], [true, false]);
+     * // => [['a', 1, true], ['b', 2, false]]
+     */
+    var zip = baseRest(unzip);
+ 
+    /**
+     * This method is like `_.fromPairs` except that it accepts two arrays,
+     * one of property identifiers and one of corresponding values.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.4.0
+     * @category Array
+     * @param {Array} [props=[]] The property identifiers.
+     * @param {Array} [values=[]] The property values.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * _.zipObject(['a', 'b'], [1, 2]);
+     * // => { 'a': 1, 'b': 2 }
+     */
+    function zipObject(props, values) {
+      return baseZipObject(props || [], values || [], assignValue);
+    }
+ 
+    /**
+     * This method is like `_.zipObject` except that it supports property paths.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.1.0
+     * @category Array
+     * @param {Array} [props=[]] The property identifiers.
+     * @param {Array} [values=[]] The property values.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
+     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
+     */
+    function zipObjectDeep(props, values) {
+      return baseZipObject(props || [], values || [], baseSet);
+    }
+ 
+    /**
+     * This method is like `_.zip` except that it accepts `iteratee` to specify
+     * how grouped values should be combined. The iteratee is invoked with the
+     * elements of each group: (...group).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.8.0
+     * @category Array
+     * @param {...Array} [arrays] The arrays to process.
+     * @param {Function} [iteratee=_.identity] The function to combine
+     *  grouped values.
+     * @returns {Array} Returns the new array of grouped elements.
+     * @example
+     *
+     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
+     *   return a + b + c;
+     * });
+     * // => [111, 222]
+     */
+    var zipWith = baseRest(function(arrays) {
+      var length = arrays.length,
+          iteratee = length > 1 ? arrays[length - 1] : undefined;
+ 
+      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
+      return unzipWith(arrays, iteratee);
+    });
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
+     * chain sequences enabled. The result of such sequences must be unwrapped
+     * with `_#value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.3.0
+     * @category Seq
+     * @param {*} value The value to wrap.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'age': 36 },
+     *   { 'user': 'fred',    'age': 40 },
+     *   { 'user': 'pebbles', 'age': 1 }
+     * ];
+     *
+     * var youngest = _
+     *   .chain(users)
+     *   .sortBy('age')
+     *   .map(function(o) {
+     *     return o.user + ' is ' + o.age;
+     *   })
+     *   .head()
+     *   .value();
+     * // => 'pebbles is 1'
+     */
+    function chain(value) {
+      var result = lodash(value);
+      result.__chain__ = true;
+      return result;
+    }
+ 
+    /**
+     * This method invokes `interceptor` and returns `value`. The interceptor
+     * is invoked with one argument; (value). The purpose of this method is to
+     * "tap into" a method chain sequence in order to modify intermediate results.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Seq
+     * @param {*} value The value to provide to `interceptor`.
+     * @param {Function} interceptor The function to invoke.
+     * @returns {*} Returns `value`.
+     * @example
+     *
+     * _([1, 2, 3])
+     *  .tap(function(array) {
+     *    // Mutate input array.
+     *    array.pop();
+     *  })
+     *  .reverse()
+     *  .value();
+     * // => [2, 1]
+     */
+    function tap(value, interceptor) {
+      interceptor(value);
+      return value;
+    }
+ 
+    /**
+     * This method is like `_.tap` except that it returns the result of `interceptor`.
+     * The purpose of this method is to "pass thru" values replacing intermediate
+     * results in a method chain sequence.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Seq
+     * @param {*} value The value to provide to `interceptor`.
+     * @param {Function} interceptor The function to invoke.
+     * @returns {*} Returns the result of `interceptor`.
+     * @example
+     *
+     * _('  abc  ')
+     *  .chain()
+     *  .trim()
+     *  .thru(function(value) {
+     *    return [value];
+     *  })
+     *  .value();
+     * // => ['abc']
+     */
+    function thru(value, interceptor) {
+      return interceptor(value);
+    }
+ 
+    /**
+     * This method is the wrapper version of `_.at`.
+     *
+     * @name at
+     * @memberOf _
+     * @since 1.0.0
+     * @category Seq
+     * @param {...(string|string[])} [paths] The property paths to pick.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+     *
+     * _(object).at(['a[0].b.c', 'a[1]']).value();
+     * // => [3, 4]
+     */
+    var wrapperAt = flatRest(function(paths) {
+      var length = paths.length,
+          start = length ? paths[0] : 0,
+          value = this.__wrapped__,
+          interceptor = function(object) { return baseAt(object, paths); };
+ 
+      if (length > 1 || this.__actions__.length ||
+          !(value instanceof LazyWrapper) || !isIndex(start)) {
+        return this.thru(interceptor);
+      }
+      value = value.slice(start, +start + (length ? 1 : 0));
+      value.__actions__.push({
+        'func': thru,
+        'args': [interceptor],
+        'thisArg': undefined
+      });
+      return new LodashWrapper(value, this.__chain__).thru(function(array) {
+        if (length && !array.length) {
+          array.push(undefined);
+        }
+        return array;
+      });
+    });
+ 
+    /**
+     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
+     *
+     * @name chain
+     * @memberOf _
+     * @since 0.1.0
+     * @category Seq
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36 },
+     *   { 'user': 'fred',   'age': 40 }
+     * ];
+     *
+     * // A sequence without explicit chaining.
+     * _(users).head();
+     * // => { 'user': 'barney', 'age': 36 }
+     *
+     * // A sequence with explicit chaining.
+     * _(users)
+     *   .chain()
+     *   .head()
+     *   .pick('user')
+     *   .value();
+     * // => { 'user': 'barney' }
+     */
+    function wrapperChain() {
+      return chain(this);
+    }
+ 
+    /**
+     * Executes the chain sequence and returns the wrapped result.
+     *
+     * @name commit
+     * @memberOf _
+     * @since 3.2.0
+     * @category Seq
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var array = [1, 2];
+     * var wrapped = _(array).push(3);
+     *
+     * console.log(array);
+     * // => [1, 2]
+     *
+     * wrapped = wrapped.commit();
+     * console.log(array);
+     * // => [1, 2, 3]
+     *
+     * wrapped.last();
+     * // => 3
+     *
+     * console.log(array);
+     * // => [1, 2, 3]
+     */
+    function wrapperCommit() {
+      return new LodashWrapper(this.value(), this.__chain__);
+    }
+ 
+    /**
+     * Gets the next value on a wrapped object following the
+     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
+     *
+     * @name next
+     * @memberOf _
+     * @since 4.0.0
+     * @category Seq
+     * @returns {Object} Returns the next iterator value.
+     * @example
+     *
+     * var wrapped = _([1, 2]);
+     *
+     * wrapped.next();
+     * // => { 'done': false, 'value': 1 }
+     *
+     * wrapped.next();
+     * // => { 'done': false, 'value': 2 }
+     *
+     * wrapped.next();
+     * // => { 'done': true, 'value': undefined }
+     */
+    function wrapperNext() {
+      if (this.__values__ === undefined) {
+        this.__values__ = toArray(this.value());
+      }
+      var done = this.__index__ >= this.__values__.length,
+          value = done ? undefined : this.__values__[this.__index__++];
+ 
+      return { 'done': done, 'value': value };
+    }
+ 
+    /**
+     * Enables the wrapper to be iterable.
+     *
+     * @name Symbol.iterator
+     * @memberOf _
+     * @since 4.0.0
+     * @category Seq
+     * @returns {Object} Returns the wrapper object.
+     * @example
+     *
+     * var wrapped = _([1, 2]);
+     *
+     * wrapped[Symbol.iterator]() === wrapped;
+     * // => true
+     *
+     * Array.from(wrapped);
+     * // => [1, 2]
+     */
+    function wrapperToIterator() {
+      return this;
+    }
+ 
+    /**
+     * Creates a clone of the chain sequence planting `value` as the wrapped value.
+     *
+     * @name plant
+     * @memberOf _
+     * @since 3.2.0
+     * @category Seq
+     * @param {*} value The value to plant.
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var wrapped = _([1, 2]).map(square);
+     * var other = wrapped.plant([3, 4]);
+     *
+     * other.value();
+     * // => [9, 16]
+     *
+     * wrapped.value();
+     * // => [1, 4]
+     */
+    function wrapperPlant(value) {
+      var result,
+          parent = this;
+ 
+      while (parent instanceof baseLodash) {
+        var clone = wrapperClone(parent);
+        clone.__index__ = 0;
+        clone.__values__ = undefined;
+        if (result) {
+          previous.__wrapped__ = clone;
+        } else {
+          result = clone;
+        }
+        var previous = clone;
+        parent = parent.__wrapped__;
+      }
+      previous.__wrapped__ = value;
+      return result;
+    }
+ 
+    /**
+     * This method is the wrapper version of `_.reverse`.
+     *
+     * **Note:** This method mutates the wrapped array.
+     *
+     * @name reverse
+     * @memberOf _
+     * @since 0.1.0
+     * @category Seq
+     * @returns {Object} Returns the new `lodash` wrapper instance.
+     * @example
+     *
+     * var array = [1, 2, 3];
+     *
+     * _(array).reverse().value()
+     * // => [3, 2, 1]
+     *
+     * console.log(array);
+     * // => [3, 2, 1]
+     */
+    function wrapperReverse() {
+      var value = this.__wrapped__;
+      if (value instanceof LazyWrapper) {
+        var wrapped = value;
+        if (this.__actions__.length) {
+          wrapped = new LazyWrapper(this);
+        }
+        wrapped = wrapped.reverse();
+        wrapped.__actions__.push({
+          'func': thru,
+          'args': [reverse],
+          'thisArg': undefined
+        });
+        return new LodashWrapper(wrapped, this.__chain__);
+      }
+      return this.thru(reverse);
+    }
+ 
+    /**
+     * Executes the chain sequence to resolve the unwrapped value.
+     *
+     * @name value
+     * @memberOf _
+     * @since 0.1.0
+     * @alias toJSON, valueOf
+     * @category Seq
+     * @returns {*} Returns the resolved unwrapped value.
+     * @example
+     *
+     * _([1, 2, 3]).value();
+     * // => [1, 2, 3]
+     */
+    function wrapperValue() {
+      return baseWrapperValue(this.__wrapped__, this.__actions__);
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Creates an object composed of keys generated from the results of running
+     * each element of `collection` thru `iteratee`. The corresponding value of
+     * each key is the number of times the key was returned by `iteratee`. The
+     * iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.5.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+     * @returns {Object} Returns the composed aggregate object.
+     * @example
+     *
+     * _.countBy([6.1, 4.2, 6.3], Math.floor);
+     * // => { '4': 1, '6': 2 }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.countBy(['one', 'two', 'three'], 'length');
+     * // => { '3': 2, '5': 1 }
+     */
+    var countBy = createAggregator(function(result, value, key) {
+      if (hasOwnProperty.call(result, key)) {
+        ++result[key];
+      } else {
+        baseAssignValue(result, key, 1);
+      }
+    });
+ 
+    /**
+     * Checks if `predicate` returns truthy for **all** elements of `collection`.
+     * Iteration is stopped once `predicate` returns falsey. The predicate is
+     * invoked with three arguments: (value, index|key, collection).
+     *
+     * **Note:** This method returns `true` for
+     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
+     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
+     * elements of empty collections.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {boolean} Returns `true` if all elements pass the predicate check,
+     *  else `false`.
+     * @example
+     *
+     * _.every([true, 1, null, 'yes'], Boolean);
+     * // => false
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': false },
+     *   { 'user': 'fred',   'age': 40, 'active': false }
+     * ];
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.every(users, { 'user': 'barney', 'active': false });
+     * // => false
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.every(users, ['active', false]);
+     * // => true
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.every(users, 'active');
+     * // => false
+     */
+    function every(collection, predicate, guard) {
+      var func = isArray(collection) ? arrayEvery : baseEvery;
+      if (guard && isIterateeCall(collection, predicate, guard)) {
+        predicate = undefined;
+      }
+      return func(collection, getIteratee(predicate, 3));
+    }
+ 
+    /**
+     * Iterates over elements of `collection`, returning an array of all elements
+     * `predicate` returns truthy for. The predicate is invoked with three
+     * arguments: (value, index|key, collection).
+     *
+     * **Note:** Unlike `_.remove`, this method returns a new array.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new filtered array.
+     * @see _.reject
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': true },
+     *   { 'user': 'fred',   'age': 40, 'active': false }
+     * ];
+     *
+     * _.filter(users, function(o) { return !o.active; });
+     * // => objects for ['fred']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.filter(users, { 'age': 36, 'active': true });
+     * // => objects for ['barney']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.filter(users, ['active', false]);
+     * // => objects for ['fred']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.filter(users, 'active');
+     * // => objects for ['barney']
+     */
+    function filter(collection, predicate) {
+      var func = isArray(collection) ? arrayFilter : baseFilter;
+      return func(collection, getIteratee(predicate, 3));
+    }
+ 
+    /**
+     * Iterates over elements of `collection`, returning the first element
+     * `predicate` returns truthy for. The predicate is invoked with three
+     * arguments: (value, index|key, collection).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @returns {*} Returns the matched element, else `undefined`.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'age': 36, 'active': true },
+     *   { 'user': 'fred',    'age': 40, 'active': false },
+     *   { 'user': 'pebbles', 'age': 1,  'active': true }
+     * ];
+     *
+     * _.find(users, function(o) { return o.age < 40; });
+     * // => object for 'barney'
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.find(users, { 'age': 1, 'active': true });
+     * // => object for 'pebbles'
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.find(users, ['active', false]);
+     * // => object for 'fred'
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.find(users, 'active');
+     * // => object for 'barney'
+     */
+    var find = createFind(findIndex);
+ 
+    /**
+     * This method is like `_.find` except that it iterates over elements of
+     * `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param {number} [fromIndex=collection.length-1] The index to search from.
+     * @returns {*} Returns the matched element, else `undefined`.
+     * @example
+     *
+     * _.findLast([1, 2, 3, 4], function(n) {
+     *   return n % 2 == 1;
+     * });
+     * // => 3
+     */
+    var findLast = createFind(findLastIndex);
+ 
+    /**
+     * Creates a flattened array of values by running each element in `collection`
+     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
+     * with three arguments: (value, index|key, collection).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * function duplicate(n) {
+     *   return [n, n];
+     * }
+     *
+     * _.flatMap([1, 2], duplicate);
+     * // => [1, 1, 2, 2]
+     */
+    function flatMap(collection, iteratee) {
+      return baseFlatten(map(collection, iteratee), 1);
+    }
+ 
+    /**
+     * This method is like `_.flatMap` except that it recursively flattens the
+     * mapped results.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * function duplicate(n) {
+     *   return [[[n, n]]];
+     * }
+     *
+     * _.flatMapDeep([1, 2], duplicate);
+     * // => [1, 1, 2, 2]
+     */
+    function flatMapDeep(collection, iteratee) {
+      return baseFlatten(map(collection, iteratee), INFINITY);
+    }
+ 
+    /**
+     * This method is like `_.flatMap` except that it recursively flattens the
+     * mapped results up to `depth` times.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {number} [depth=1] The maximum recursion depth.
+     * @returns {Array} Returns the new flattened array.
+     * @example
+     *
+     * function duplicate(n) {
+     *   return [[[n, n]]];
+     * }
+     *
+     * _.flatMapDepth([1, 2], duplicate, 2);
+     * // => [[1, 1], [2, 2]]
+     */
+    function flatMapDepth(collection, iteratee, depth) {
+      depth = depth === undefined ? 1 : toInteger(depth);
+      return baseFlatten(map(collection, iteratee), depth);
+    }
+ 
+    /**
+     * Iterates over elements of `collection` and invokes `iteratee` for each element.
+     * The iteratee is invoked with three arguments: (value, index|key, collection).
+     * Iteratee functions may exit iteration early by explicitly returning `false`.
+     *
+     * **Note:** As with other "Collections" methods, objects with a "length"
+     * property are iterated like arrays. To avoid this behavior use `_.forIn`
+     * or `_.forOwn` for object iteration.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @alias each
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     * @see _.forEachRight
+     * @example
+     *
+     * _.forEach([1, 2], function(value) {
+     *   console.log(value);
+     * });
+     * // => Logs `1` then `2`.
+     *
+     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+     */
+    function forEach(collection, iteratee) {
+      var func = isArray(collection) ? arrayEach : baseEach;
+      return func(collection, getIteratee(iteratee, 3));
+    }
+ 
+    /**
+     * This method is like `_.forEach` except that it iterates over elements of
+     * `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @alias eachRight
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array|Object} Returns `collection`.
+     * @see _.forEach
+     * @example
+     *
+     * _.forEachRight([1, 2], function(value) {
+     *   console.log(value);
+     * });
+     * // => Logs `2` then `1`.
+     */
+    function forEachRight(collection, iteratee) {
+      var func = isArray(collection) ? arrayEachRight : baseEachRight;
+      return func(collection, getIteratee(iteratee, 3));
+    }
+ 
+    /**
+     * Creates an object composed of keys generated from the results of running
+     * each element of `collection` thru `iteratee`. The order of grouped values
+     * is determined by the order they occur in `collection`. The corresponding
+     * value of each key is an array of elements responsible for generating the
+     * key. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+     * @returns {Object} Returns the composed aggregate object.
+     * @example
+     *
+     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
+     * // => { '4': [4.2], '6': [6.1, 6.3] }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.groupBy(['one', 'two', 'three'], 'length');
+     * // => { '3': ['one', 'two'], '5': ['three'] }
+     */
+    var groupBy = createAggregator(function(result, value, key) {
+      if (hasOwnProperty.call(result, key)) {
+        result[key].push(value);
+      } else {
+        baseAssignValue(result, key, [value]);
+      }
+    });
+ 
+    /**
+     * Checks if `value` is in `collection`. If `collection` is a string, it's
+     * checked for a substring of `value`, otherwise
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * is used for equality comparisons. If `fromIndex` is negative, it's used as
+     * the offset from the end of `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object|string} collection The collection to inspect.
+     * @param {*} value The value to search for.
+     * @param {number} [fromIndex=0] The index to search from.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+     * @returns {boolean} Returns `true` if `value` is found, else `false`.
+     * @example
+     *
+     * _.includes([1, 2, 3], 1);
+     * // => true
+     *
+     * _.includes([1, 2, 3], 1, 2);
+     * // => false
+     *
+     * _.includes({ 'a': 1, 'b': 2 }, 1);
+     * // => true
+     *
+     * _.includes('abcd', 'bc');
+     * // => true
+     */
+    function includes(collection, value, fromIndex, guard) {
+      collection = isArrayLike(collection) ? collection : values(collection);
+      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
+ 
+      var length = collection.length;
+      if (fromIndex < 0) {
+        fromIndex = nativeMax(length + fromIndex, 0);
+      }
+      return isString(collection)
+        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
+        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
+    }
+ 
+    /**
+     * Invokes the method at `path` of each element in `collection`, returning
+     * an array of the results of each invoked method. Any additional arguments
+     * are provided to each invoked method. If `path` is a function, it's invoked
+     * for, and `this` bound to, each element in `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Array|Function|string} path The path of the method to invoke or
+     *  the function invoked per iteration.
+     * @param {...*} [args] The arguments to invoke each method with.
+     * @returns {Array} Returns the array of results.
+     * @example
+     *
+     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
+     * // => [[1, 5, 7], [1, 2, 3]]
+     *
+     * _.invokeMap([123, 456], String.prototype.split, '');
+     * // => [['1', '2', '3'], ['4', '5', '6']]
+     */
+    var invokeMap = baseRest(function(collection, path, args) {
+      var index = -1,
+          isFunc = typeof path == 'function',
+          result = isArrayLike(collection) ? Array(collection.length) : [];
+ 
+      baseEach(collection, function(value) {
+        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
+      });
+      return result;
+    });
+ 
+    /**
+     * Creates an object composed of keys generated from the results of running
+     * each element of `collection` thru `iteratee`. The corresponding value of
+     * each key is the last element responsible for generating the key. The
+     * iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
+     * @returns {Object} Returns the composed aggregate object.
+     * @example
+     *
+     * var array = [
+     *   { 'dir': 'left', 'code': 97 },
+     *   { 'dir': 'right', 'code': 100 }
+     * ];
+     *
+     * _.keyBy(array, function(o) {
+     *   return String.fromCharCode(o.code);
+     * });
+     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
+     *
+     * _.keyBy(array, 'dir');
+     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
+     */
+    var keyBy = createAggregator(function(result, value, key) {
+      baseAssignValue(result, key, value);
+    });
+ 
+    /**
+     * Creates an array of values by running each element in `collection` thru
+     * `iteratee`. The iteratee is invoked with three arguments:
+     * (value, index|key, collection).
+     *
+     * Many lodash methods are guarded to work as iteratees for methods like
+     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+     *
+     * The guarded methods are:
+     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new mapped array.
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * _.map([4, 8], square);
+     * // => [16, 64]
+     *
+     * _.map({ 'a': 4, 'b': 8 }, square);
+     * // => [16, 64] (iteration order is not guaranteed)
+     *
+     * var users = [
+     *   { 'user': 'barney' },
+     *   { 'user': 'fred' }
+     * ];
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.map(users, 'user');
+     * // => ['barney', 'fred']
+     */
+    function map(collection, iteratee) {
+      var func = isArray(collection) ? arrayMap : baseMap;
+      return func(collection, getIteratee(iteratee, 3));
+    }
+ 
+    /**
+     * This method is like `_.sortBy` except that it allows specifying the sort
+     * orders of the iteratees to sort by. If `orders` is unspecified, all values
+     * are sorted in ascending order. Otherwise, specify an order of "desc" for
+     * descending or "asc" for ascending sort order of corresponding values.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
+     *  The iteratees to sort by.
+     * @param {string[]} [orders] The sort orders of `iteratees`.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
+     * @returns {Array} Returns the new sorted array.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'fred',   'age': 48 },
+     *   { 'user': 'barney', 'age': 34 },
+     *   { 'user': 'fred',   'age': 40 },
+     *   { 'user': 'barney', 'age': 36 }
+     * ];
+     *
+     * // Sort by `user` in ascending order and by `age` in descending order.
+     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
+     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+     */
+    function orderBy(collection, iteratees, orders, guard) {
+      if (collection == null) {
+        return [];
+      }
+      if (!isArray(iteratees)) {
+        iteratees = iteratees == null ? [] : [iteratees];
+      }
+      orders = guard ? undefined : orders;
+      if (!isArray(orders)) {
+        orders = orders == null ? [] : [orders];
+      }
+      return baseOrderBy(collection, iteratees, orders);
+    }
+ 
+    /**
+     * Creates an array of elements split into two groups, the first of which
+     * contains elements `predicate` returns truthy for, the second of which
+     * contains elements `predicate` returns falsey for. The predicate is
+     * invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the array of grouped elements.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney',  'age': 36, 'active': false },
+     *   { 'user': 'fred',    'age': 40, 'active': true },
+     *   { 'user': 'pebbles', 'age': 1,  'active': false }
+     * ];
+     *
+     * _.partition(users, function(o) { return o.active; });
+     * // => objects for [['fred'], ['barney', 'pebbles']]
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.partition(users, { 'age': 1, 'active': false });
+     * // => objects for [['pebbles'], ['barney', 'fred']]
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.partition(users, ['active', false]);
+     * // => objects for [['barney', 'pebbles'], ['fred']]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.partition(users, 'active');
+     * // => objects for [['fred'], ['barney', 'pebbles']]
+     */
+    var partition = createAggregator(function(result, value, key) {
+      result[key ? 0 : 1].push(value);
+    }, function() { return [[], []]; });
+ 
+    /**
+     * Reduces `collection` to a value which is the accumulated result of running
+     * each element in `collection` thru `iteratee`, where each successive
+     * invocation is supplied the return value of the previous. If `accumulator`
+     * is not given, the first element of `collection` is used as the initial
+     * value. The iteratee is invoked with four arguments:
+     * (accumulator, value, index|key, collection).
+     *
+     * Many lodash methods are guarded to work as iteratees for methods like
+     * `_.reduce`, `_.reduceRight`, and `_.transform`.
+     *
+     * The guarded methods are:
+     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
+     * and `sortBy`
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {*} [accumulator] The initial value.
+     * @returns {*} Returns the accumulated value.
+     * @see _.reduceRight
+     * @example
+     *
+     * _.reduce([1, 2], function(sum, n) {
+     *   return sum + n;
+     * }, 0);
+     * // => 3
+     *
+     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+     *   (result[value] || (result[value] = [])).push(key);
+     *   return result;
+     * }, {});
+     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
+     */
+    function reduce(collection, iteratee, accumulator) {
+      var func = isArray(collection) ? arrayReduce : baseReduce,
+          initAccum = arguments.length < 3;
+ 
+      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
+    }
+ 
+    /**
+     * This method is like `_.reduce` except that it iterates over elements of
+     * `collection` from right to left.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {*} [accumulator] The initial value.
+     * @returns {*} Returns the accumulated value.
+     * @see _.reduce
+     * @example
+     *
+     * var array = [[0, 1], [2, 3], [4, 5]];
+     *
+     * _.reduceRight(array, function(flattened, other) {
+     *   return flattened.concat(other);
+     * }, []);
+     * // => [4, 5, 2, 3, 0, 1]
+     */
+    function reduceRight(collection, iteratee, accumulator) {
+      var func = isArray(collection) ? arrayReduceRight : baseReduce,
+          initAccum = arguments.length < 3;
+ 
+      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
+    }
+ 
+    /**
+     * The opposite of `_.filter`; this method returns the elements of `collection`
+     * that `predicate` does **not** return truthy for.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the new filtered array.
+     * @see _.filter
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': false },
+     *   { 'user': 'fred',   'age': 40, 'active': true }
+     * ];
+     *
+     * _.reject(users, function(o) { return !o.active; });
+     * // => objects for ['fred']
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.reject(users, { 'age': 40, 'active': true });
+     * // => objects for ['barney']
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.reject(users, ['active', false]);
+     * // => objects for ['fred']
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.reject(users, 'active');
+     * // => objects for ['barney']
+     */
+    function reject(collection, predicate) {
+      var func = isArray(collection) ? arrayFilter : baseFilter;
+      return func(collection, negate(getIteratee(predicate, 3)));
+    }
+ 
+    /**
+     * Gets a random element from `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to sample.
+     * @returns {*} Returns the random element.
+     * @example
+     *
+     * _.sample([1, 2, 3, 4]);
+     * // => 2
+     */
+    function sample(collection) {
+      var func = isArray(collection) ? arraySample : baseSample;
+      return func(collection);
+    }
+ 
+    /**
+     * Gets `n` random elements at unique keys from `collection` up to the
+     * size of `collection`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to sample.
+     * @param {number} [n=1] The number of elements to sample.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the random elements.
+     * @example
+     *
+     * _.sampleSize([1, 2, 3], 2);
+     * // => [3, 1]
+     *
+     * _.sampleSize([1, 2, 3], 4);
+     * // => [2, 3, 1]
+     */
+    function sampleSize(collection, n, guard) {
+      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
+        n = 1;
+      } else {
+        n = toInteger(n);
+      }
+      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
+      return func(collection, n);
+    }
+ 
+    /**
+     * Creates an array of shuffled values, using a version of the
+     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to shuffle.
+     * @returns {Array} Returns the new shuffled array.
+     * @example
+     *
+     * _.shuffle([1, 2, 3, 4]);
+     * // => [4, 1, 3, 2]
+     */
+    function shuffle(collection) {
+      var func = isArray(collection) ? arrayShuffle : baseShuffle;
+      return func(collection);
+    }
+ 
+    /**
+     * Gets the size of `collection` by returning its length for array-like
+     * values or the number of own enumerable string keyed properties for objects.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object|string} collection The collection to inspect.
+     * @returns {number} Returns the collection size.
+     * @example
+     *
+     * _.size([1, 2, 3]);
+     * // => 3
+     *
+     * _.size({ 'a': 1, 'b': 2 });
+     * // => 2
+     *
+     * _.size('pebbles');
+     * // => 7
+     */
+    function size(collection) {
+      if (collection == null) {
+        return 0;
+      }
+      if (isArrayLike(collection)) {
+        return isString(collection) ? stringSize(collection) : collection.length;
+      }
+      var tag = getTag(collection);
+      if (tag == mapTag || tag == setTag) {
+        return collection.size;
+      }
+      return baseKeys(collection).length;
+    }
+ 
+    /**
+     * Checks if `predicate` returns truthy for **any** element of `collection`.
+     * Iteration is stopped once `predicate` returns truthy. The predicate is
+     * invoked with three arguments: (value, index|key, collection).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {boolean} Returns `true` if any element passes the predicate check,
+     *  else `false`.
+     * @example
+     *
+     * _.some([null, 0, 'yes', false], Boolean);
+     * // => true
+     *
+     * var users = [
+     *   { 'user': 'barney', 'active': true },
+     *   { 'user': 'fred',   'active': false }
+     * ];
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.some(users, { 'user': 'barney', 'active': false });
+     * // => false
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.some(users, ['active', false]);
+     * // => true
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.some(users, 'active');
+     * // => true
+     */
+    function some(collection, predicate, guard) {
+      var func = isArray(collection) ? arraySome : baseSome;
+      if (guard && isIterateeCall(collection, predicate, guard)) {
+        predicate = undefined;
+      }
+      return func(collection, getIteratee(predicate, 3));
+    }
+ 
+    /**
+     * Creates an array of elements, sorted in ascending order by the results of
+     * running each element in a collection thru each iteratee. This method
+     * performs a stable sort, that is, it preserves the original sort order of
+     * equal elements. The iteratees are invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Collection
+     * @param {Array|Object} collection The collection to iterate over.
+     * @param {...(Function|Function[])} [iteratees=[_.identity]]
+     *  The iteratees to sort by.
+     * @returns {Array} Returns the new sorted array.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'fred',   'age': 48 },
+     *   { 'user': 'barney', 'age': 36 },
+     *   { 'user': 'fred',   'age': 40 },
+     *   { 'user': 'barney', 'age': 34 }
+     * ];
+     *
+     * _.sortBy(users, [function(o) { return o.user; }]);
+     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+     *
+     * _.sortBy(users, ['user', 'age']);
+     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
+     */
+    var sortBy = baseRest(function(collection, iteratees) {
+      if (collection == null) {
+        return [];
+      }
+      var length = iteratees.length;
+      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
+        iteratees = [];
+      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
+        iteratees = [iteratees[0]];
+      }
+      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+    });
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Gets the timestamp of the number of milliseconds that have elapsed since
+     * the Unix epoch (1 January 1970 00:00:00 UTC).
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Date
+     * @returns {number} Returns the timestamp.
+     * @example
+     *
+     * _.defer(function(stamp) {
+     *   console.log(_.now() - stamp);
+     * }, _.now());
+     * // => Logs the number of milliseconds it took for the deferred invocation.
+     */
+    var now = ctxNow || function() {
+      return root.Date.now();
+    };
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * The opposite of `_.before`; this method creates a function that invokes
+     * `func` once it's called `n` or more times.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {number} n The number of calls before `func` is invoked.
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new restricted function.
+     * @example
+     *
+     * var saves = ['profile', 'settings'];
+     *
+     * var done = _.after(saves.length, function() {
+     *   console.log('done saving!');
+     * });
+     *
+     * _.forEach(saves, function(type) {
+     *   asyncSave({ 'type': type, 'complete': done });
+     * });
+     * // => Logs 'done saving!' after the two async saves have completed.
+     */
+    function after(n, func) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      n = toInteger(n);
+      return function() {
+        if (--n < 1) {
+          return func.apply(this, arguments);
+        }
+      };
+    }
+ 
+    /**
+     * Creates a function that invokes `func`, with up to `n` arguments,
+     * ignoring any additional arguments.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} func The function to cap arguments for.
+     * @param {number} [n=func.length] The arity cap.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the new capped function.
+     * @example
+     *
+     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
+     * // => [6, 8, 10]
+     */
+    function ary(func, n, guard) {
+      n = guard ? undefined : n;
+      n = (func && n == null) ? func.length : n;
+      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
+    }
+ 
+    /**
+     * Creates a function that invokes `func`, with the `this` binding and arguments
+     * of the created function, while it's called less than `n` times. Subsequent
+     * calls to the created function return the result of the last `func` invocation.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {number} n The number of calls at which `func` is no longer invoked.
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new restricted function.
+     * @example
+     *
+     * jQuery(element).on('click', _.before(5, addContactToList));
+     * // => Allows adding up to 4 contacts to the list.
+     */
+    function before(n, func) {
+      var result;
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      n = toInteger(n);
+      return function() {
+        if (--n > 0) {
+          result = func.apply(this, arguments);
+        }
+        if (n <= 1) {
+          func = undefined;
+        }
+        return result;
+      };
+    }
+ 
+    /**
+     * Creates a function that invokes `func` with the `this` binding of `thisArg`
+     * and `partials` prepended to the arguments it receives.
+     *
+     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
+     * may be used as a placeholder for partially applied arguments.
+     *
+     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
+     * property of bound functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to bind.
+     * @param {*} thisArg The `this` binding of `func`.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new bound function.
+     * @example
+     *
+     * function greet(greeting, punctuation) {
+     *   return greeting + ' ' + this.user + punctuation;
+     * }
+     *
+     * var object = { 'user': 'fred' };
+     *
+     * var bound = _.bind(greet, object, 'hi');
+     * bound('!');
+     * // => 'hi fred!'
+     *
+     * // Bound with placeholders.
+     * var bound = _.bind(greet, object, _, '!');
+     * bound('hi');
+     * // => 'hi fred!'
+     */
+    var bind = baseRest(function(func, thisArg, partials) {
+      var bitmask = WRAP_BIND_FLAG;
+      if (partials.length) {
+        var holders = replaceHolders(partials, getHolder(bind));
+        bitmask |= WRAP_PARTIAL_FLAG;
+      }
+      return createWrap(func, bitmask, thisArg, partials, holders);
+    });
+ 
+    /**
+     * Creates a function that invokes the method at `object[key]` with `partials`
+     * prepended to the arguments it receives.
+     *
+     * This method differs from `_.bind` by allowing bound functions to reference
+     * methods that may be redefined or don't yet exist. See
+     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
+     * for more details.
+     *
+     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for partially applied arguments.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.10.0
+     * @category Function
+     * @param {Object} object The object to invoke the method on.
+     * @param {string} key The key of the method.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new bound function.
+     * @example
+     *
+     * var object = {
+     *   'user': 'fred',
+     *   'greet': function(greeting, punctuation) {
+     *     return greeting + ' ' + this.user + punctuation;
+     *   }
+     * };
+     *
+     * var bound = _.bindKey(object, 'greet', 'hi');
+     * bound('!');
+     * // => 'hi fred!'
+     *
+     * object.greet = function(greeting, punctuation) {
+     *   return greeting + 'ya ' + this.user + punctuation;
+     * };
+     *
+     * bound('!');
+     * // => 'hiya fred!'
+     *
+     * // Bound with placeholders.
+     * var bound = _.bindKey(object, 'greet', _, '!');
+     * bound('hi');
+     * // => 'hiya fred!'
+     */
+    var bindKey = baseRest(function(object, key, partials) {
+      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
+      if (partials.length) {
+        var holders = replaceHolders(partials, getHolder(bindKey));
+        bitmask |= WRAP_PARTIAL_FLAG;
+      }
+      return createWrap(key, bitmask, object, partials, holders);
+    });
+ 
+    /**
+     * Creates a function that accepts arguments of `func` and either invokes
+     * `func` returning its result, if at least `arity` number of arguments have
+     * been provided, or returns a function that accepts the remaining `func`
+     * arguments, and so on. The arity of `func` may be specified if `func.length`
+     * is not sufficient.
+     *
+     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
+     * may be used as a placeholder for provided arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of curried functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Function
+     * @param {Function} func The function to curry.
+     * @param {number} [arity=func.length] The arity of `func`.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the new curried function.
+     * @example
+     *
+     * var abc = function(a, b, c) {
+     *   return [a, b, c];
+     * };
+     *
+     * var curried = _.curry(abc);
+     *
+     * curried(1)(2)(3);
+     * // => [1, 2, 3]
+     *
+     * curried(1, 2)(3);
+     * // => [1, 2, 3]
+     *
+     * curried(1, 2, 3);
+     * // => [1, 2, 3]
+     *
+     * // Curried with placeholders.
+     * curried(1)(_, 3)(2);
+     * // => [1, 2, 3]
+     */
+    function curry(func, arity, guard) {
+      arity = guard ? undefined : arity;
+      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
+      result.placeholder = curry.placeholder;
+      return result;
+    }
+ 
+    /**
+     * This method is like `_.curry` except that arguments are applied to `func`
+     * in the manner of `_.partialRight` instead of `_.partial`.
+     *
+     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for provided arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of curried functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} func The function to curry.
+     * @param {number} [arity=func.length] The arity of `func`.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the new curried function.
+     * @example
+     *
+     * var abc = function(a, b, c) {
+     *   return [a, b, c];
+     * };
+     *
+     * var curried = _.curryRight(abc);
+     *
+     * curried(3)(2)(1);
+     * // => [1, 2, 3]
+     *
+     * curried(2, 3)(1);
+     * // => [1, 2, 3]
+     *
+     * curried(1, 2, 3);
+     * // => [1, 2, 3]
+     *
+     * // Curried with placeholders.
+     * curried(3)(1, _)(2);
+     * // => [1, 2, 3]
+     */
+    function curryRight(func, arity, guard) {
+      arity = guard ? undefined : arity;
+      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
+      result.placeholder = curryRight.placeholder;
+      return result;
+    }
+ 
+    /**
+     * Creates a debounced function that delays invoking `func` until after `wait`
+     * milliseconds have elapsed since the last time the debounced function was
+     * invoked. The debounced function comes with a `cancel` method to cancel
+     * delayed `func` invocations and a `flush` method to immediately invoke them.
+     * Provide `options` to indicate whether `func` should be invoked on the
+     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
+     * with the last arguments provided to the debounced function. Subsequent
+     * calls to the debounced function return the result of the last `func`
+     * invocation.
+     *
+     * **Note:** If `leading` and `trailing` options are `true`, `func` is
+     * invoked on the trailing edge of the timeout only if the debounced function
+     * is invoked more than once during the `wait` timeout.
+     *
+     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+     *
+     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+     * for details over the differences between `_.debounce` and `_.throttle`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to debounce.
+     * @param {number} [wait=0] The number of milliseconds to delay.
+     * @param {Object} [options={}] The options object.
+     * @param {boolean} [options.leading=false]
+     *  Specify invoking on the leading edge of the timeout.
+     * @param {number} [options.maxWait]
+     *  The maximum time `func` is allowed to be delayed before it's invoked.
+     * @param {boolean} [options.trailing=true]
+     *  Specify invoking on the trailing edge of the timeout.
+     * @returns {Function} Returns the new debounced function.
+     * @example
+     *
+     * // Avoid costly calculations while the window size is in flux.
+     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
+     *
+     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
+     * jQuery(element).on('click', _.debounce(sendMail, 300, {
+     *   'leading': true,
+     *   'trailing': false
+     * }));
+     *
+     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
+     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
+     * var source = new EventSource('/stream');
+     * jQuery(source).on('message', debounced);
+     *
+     * // Cancel the trailing debounced invocation.
+     * jQuery(window).on('popstate', debounced.cancel);
+     */
+    function debounce(func, wait, options) {
+      var lastArgs,
+          lastThis,
+          maxWait,
+          result,
+          timerId,
+          lastCallTime,
+          lastInvokeTime = 0,
+          leading = false,
+          maxing = false,
+          trailing = true;
+ 
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      wait = toNumber(wait) || 0;
+      if (isObject(options)) {
+        leading = !!options.leading;
+        maxing = 'maxWait' in options;
+        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
+        trailing = 'trailing' in options ? !!options.trailing : trailing;
+      }
+ 
+      function invokeFunc(time) {
+        var args = lastArgs,
+            thisArg = lastThis;
+ 
+        lastArgs = lastThis = undefined;
+        lastInvokeTime = time;
+        result = func.apply(thisArg, args);
+        return result;
+      }
+ 
+      function leadingEdge(time) {
+        // Reset any `maxWait` timer.
+        lastInvokeTime = time;
+        // Start the timer for the trailing edge.
+        timerId = setTimeout(timerExpired, wait);
+        // Invoke the leading edge.
+        return leading ? invokeFunc(time) : result;
+      }
+ 
+      function remainingWait(time) {
+        var timeSinceLastCall = time - lastCallTime,
+            timeSinceLastInvoke = time - lastInvokeTime,
+            result = wait - timeSinceLastCall;
+ 
+        return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
+      }
+ 
+      function shouldInvoke(time) {
+        var timeSinceLastCall = time - lastCallTime,
+            timeSinceLastInvoke = time - lastInvokeTime;
+ 
+        // Either this is the first call, activity has stopped and we're at the
+        // trailing edge, the system time has gone backwards and we're treating
+        // it as the trailing edge, or we've hit the `maxWait` limit.
+        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
+          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+      }
+ 
+      function timerExpired() {
+        var time = now();
+        if (shouldInvoke(time)) {
+          return trailingEdge(time);
+        }
+        // Restart the timer.
+        timerId = setTimeout(timerExpired, remainingWait(time));
+      }
+ 
+      function trailingEdge(time) {
+        timerId = undefined;
+ 
+        // Only invoke if we have `lastArgs` which means `func` has been
+        // debounced at least once.
+        if (trailing && lastArgs) {
+          return invokeFunc(time);
+        }
+        lastArgs = lastThis = undefined;
+        return result;
+      }
+ 
+      function cancel() {
+        if (timerId !== undefined) {
+          clearTimeout(timerId);
+        }
+        lastInvokeTime = 0;
+        lastArgs = lastCallTime = lastThis = timerId = undefined;
+      }
+ 
+      function flush() {
+        return timerId === undefined ? result : trailingEdge(now());
+      }
+ 
+      function debounced() {
+        var time = now(),
+            isInvoking = shouldInvoke(time);
+ 
+        lastArgs = arguments;
+        lastThis = this;
+        lastCallTime = time;
+ 
+        if (isInvoking) {
+          if (timerId === undefined) {
+            return leadingEdge(lastCallTime);
+          }
+          if (maxing) {
+            // Handle invocations in a tight loop.
+            timerId = setTimeout(timerExpired, wait);
+            return invokeFunc(lastCallTime);
+          }
+        }
+        if (timerId === undefined) {
+          timerId = setTimeout(timerExpired, wait);
+        }
+        return result;
+      }
+      debounced.cancel = cancel;
+      debounced.flush = flush;
+      return debounced;
+    }
+ 
+    /**
+     * Defers invoking the `func` until the current call stack has cleared. Any
+     * additional arguments are provided to `func` when it's invoked.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to defer.
+     * @param {...*} [args] The arguments to invoke `func` with.
+     * @returns {number} Returns the timer id.
+     * @example
+     *
+     * _.defer(function(text) {
+     *   console.log(text);
+     * }, 'deferred');
+     * // => Logs 'deferred' after one millisecond.
+     */
+    var defer = baseRest(function(func, args) {
+      return baseDelay(func, 1, args);
+    });
+ 
+    /**
+     * Invokes `func` after `wait` milliseconds. Any additional arguments are
+     * provided to `func` when it's invoked.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to delay.
+     * @param {number} wait The number of milliseconds to delay invocation.
+     * @param {...*} [args] The arguments to invoke `func` with.
+     * @returns {number} Returns the timer id.
+     * @example
+     *
+     * _.delay(function(text) {
+     *   console.log(text);
+     * }, 1000, 'later');
+     * // => Logs 'later' after one second.
+     */
+    var delay = baseRest(function(func, wait, args) {
+      return baseDelay(func, toNumber(wait) || 0, args);
+    });
+ 
+    /**
+     * Creates a function that invokes `func` with arguments reversed.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Function
+     * @param {Function} func The function to flip arguments for.
+     * @returns {Function} Returns the new flipped function.
+     * @example
+     *
+     * var flipped = _.flip(function() {
+     *   return _.toArray(arguments);
+     * });
+     *
+     * flipped('a', 'b', 'c', 'd');
+     * // => ['d', 'c', 'b', 'a']
+     */
+    function flip(func) {
+      return createWrap(func, WRAP_FLIP_FLAG);
+    }
+ 
+    /**
+     * Creates a function that memoizes the result of `func`. If `resolver` is
+     * provided, it determines the cache key for storing the result based on the
+     * arguments provided to the memoized function. By default, the first argument
+     * provided to the memoized function is used as the map cache key. The `func`
+     * is invoked with the `this` binding of the memoized function.
+     *
+     * **Note:** The cache is exposed as the `cache` property on the memoized
+     * function. Its creation may be customized by replacing the `_.memoize.Cache`
+     * constructor with one whose instances implement the
+     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to have its output memoized.
+     * @param {Function} [resolver] The function to resolve the cache key.
+     * @returns {Function} Returns the new memoized function.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2 };
+     * var other = { 'c': 3, 'd': 4 };
+     *
+     * var values = _.memoize(_.values);
+     * values(object);
+     * // => [1, 2]
+     *
+     * values(other);
+     * // => [3, 4]
+     *
+     * object.a = 2;
+     * values(object);
+     * // => [1, 2]
+     *
+     * // Modify the result cache.
+     * values.cache.set(object, ['a', 'b']);
+     * values(object);
+     * // => ['a', 'b']
+     *
+     * // Replace `_.memoize.Cache`.
+     * _.memoize.Cache = WeakMap;
+     */
+    function memoize(func, resolver) {
+      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      var memoized = function() {
+        var args = arguments,
+            key = resolver ? resolver.apply(this, args) : args[0],
+            cache = memoized.cache;
+ 
+        if (cache.has(key)) {
+          return cache.get(key);
+        }
+        var result = func.apply(this, args);
+        memoized.cache = cache.set(key, result) || cache;
+        return result;
+      };
+      memoized.cache = new (memoize.Cache || MapCache);
+      return memoized;
+    }
+ 
+    // Expose `MapCache`.
+    memoize.Cache = MapCache;
+ 
+    /**
+     * Creates a function that negates the result of the predicate `func`. The
+     * `func` predicate is invoked with the `this` binding and arguments of the
+     * created function.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} predicate The predicate to negate.
+     * @returns {Function} Returns the new negated function.
+     * @example
+     *
+     * function isEven(n) {
+     *   return n % 2 == 0;
+     * }
+     *
+     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
+     * // => [1, 3, 5]
+     */
+    function negate(predicate) {
+      if (typeof predicate != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      return function() {
+        var args = arguments;
+        switch (args.length) {
+          case 0: return !predicate.call(this);
+          case 1: return !predicate.call(this, args[0]);
+          case 2: return !predicate.call(this, args[0], args[1]);
+          case 3: return !predicate.call(this, args[0], args[1], args[2]);
+        }
+        return !predicate.apply(this, args);
+      };
+    }
+ 
+    /**
+     * Creates a function that is restricted to invoking `func` once. Repeat calls
+     * to the function return the value of the first invocation. The `func` is
+     * invoked with the `this` binding and arguments of the created function.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to restrict.
+     * @returns {Function} Returns the new restricted function.
+     * @example
+     *
+     * var initialize = _.once(createApplication);
+     * initialize();
+     * initialize();
+     * // => `createApplication` is invoked once
+     */
+    function once(func) {
+      return before(2, func);
+    }
+ 
+    /**
+     * Creates a function that invokes `func` with its arguments transformed.
+     *
+     * @static
+     * @since 4.0.0
+     * @memberOf _
+     * @category Function
+     * @param {Function} func The function to wrap.
+     * @param {...(Function|Function[])} [transforms=[_.identity]]
+     *  The argument transforms.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * function doubled(n) {
+     *   return n * 2;
+     * }
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var func = _.overArgs(function(x, y) {
+     *   return [x, y];
+     * }, [square, doubled]);
+     *
+     * func(9, 3);
+     * // => [81, 6]
+     *
+     * func(10, 5);
+     * // => [100, 10]
+     */
+    var overArgs = castRest(function(func, transforms) {
+      transforms = (transforms.length == 1 && isArray(transforms[0]))
+        ? arrayMap(transforms[0], baseUnary(getIteratee()))
+        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
+ 
+      var funcsLength = transforms.length;
+      return baseRest(function(args) {
+        var index = -1,
+            length = nativeMin(args.length, funcsLength);
+ 
+        while (++index < length) {
+          args[index] = transforms[index].call(this, args[index]);
+        }
+        return apply(func, this, args);
+      });
+    });
+ 
+    /**
+     * Creates a function that invokes `func` with `partials` prepended to the
+     * arguments it receives. This method is like `_.bind` except it does **not**
+     * alter the `this` binding.
+     *
+     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for partially applied arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of partially
+     * applied functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.2.0
+     * @category Function
+     * @param {Function} func The function to partially apply arguments to.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new partially applied function.
+     * @example
+     *
+     * function greet(greeting, name) {
+     *   return greeting + ' ' + name;
+     * }
+     *
+     * var sayHelloTo = _.partial(greet, 'hello');
+     * sayHelloTo('fred');
+     * // => 'hello fred'
+     *
+     * // Partially applied with placeholders.
+     * var greetFred = _.partial(greet, _, 'fred');
+     * greetFred('hi');
+     * // => 'hi fred'
+     */
+    var partial = baseRest(function(func, partials) {
+      var holders = replaceHolders(partials, getHolder(partial));
+      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
+    });
+ 
+    /**
+     * This method is like `_.partial` except that partially applied arguments
+     * are appended to the arguments it receives.
+     *
+     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
+     * builds, may be used as a placeholder for partially applied arguments.
+     *
+     * **Note:** This method doesn't set the "length" property of partially
+     * applied functions.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.0.0
+     * @category Function
+     * @param {Function} func The function to partially apply arguments to.
+     * @param {...*} [partials] The arguments to be partially applied.
+     * @returns {Function} Returns the new partially applied function.
+     * @example
+     *
+     * function greet(greeting, name) {
+     *   return greeting + ' ' + name;
+     * }
+     *
+     * var greetFred = _.partialRight(greet, 'fred');
+     * greetFred('hi');
+     * // => 'hi fred'
+     *
+     * // Partially applied with placeholders.
+     * var sayHelloTo = _.partialRight(greet, 'hello', _);
+     * sayHelloTo('fred');
+     * // => 'hello fred'
+     */
+    var partialRight = baseRest(function(func, partials) {
+      var holders = replaceHolders(partials, getHolder(partialRight));
+      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
+    });
+ 
+    /**
+     * Creates a function that invokes `func` with arguments arranged according
+     * to the specified `indexes` where the argument value at the first index is
+     * provided as the first argument, the argument value at the second index is
+     * provided as the second argument, and so on.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Function
+     * @param {Function} func The function to rearrange arguments for.
+     * @param {...(number|number[])} indexes The arranged argument indexes.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var rearged = _.rearg(function(a, b, c) {
+     *   return [a, b, c];
+     * }, [2, 0, 1]);
+     *
+     * rearged('b', 'c', 'a')
+     * // => ['a', 'b', 'c']
+     */
+    var rearg = flatRest(function(func, indexes) {
+      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
+    });
+ 
+    /**
+     * Creates a function that invokes `func` with the `this` binding of the
+     * created function and arguments from `start` and beyond provided as
+     * an array.
+     *
+     * **Note:** This method is based on the
+     * [rest parameter](https://mdn.io/rest_parameters).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Function
+     * @param {Function} func The function to apply a rest parameter to.
+     * @param {number} [start=func.length-1] The start position of the rest parameter.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var say = _.rest(function(what, names) {
+     *   return what + ' ' + _.initial(names).join(', ') +
+     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+     * });
+     *
+     * say('hello', 'fred', 'barney', 'pebbles');
+     * // => 'hello fred, barney, & pebbles'
+     */
+    function rest(func, start) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      start = start === undefined ? start : toInteger(start);
+      return baseRest(func, start);
+    }
+ 
+    /**
+     * Creates a function that invokes `func` with the `this` binding of the
+     * create function and an array of arguments much like
+     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
+     *
+     * **Note:** This method is based on the
+     * [spread operator](https://mdn.io/spread_operator).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.2.0
+     * @category Function
+     * @param {Function} func The function to spread arguments over.
+     * @param {number} [start=0] The start position of the spread.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var say = _.spread(function(who, what) {
+     *   return who + ' says ' + what;
+     * });
+     *
+     * say(['fred', 'hello']);
+     * // => 'fred says hello'
+     *
+     * var numbers = Promise.all([
+     *   Promise.resolve(40),
+     *   Promise.resolve(36)
+     * ]);
+     *
+     * numbers.then(_.spread(function(x, y) {
+     *   return x + y;
+     * }));
+     * // => a Promise of 76
+     */
+    function spread(func, start) {
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      start = start == null ? 0 : nativeMax(toInteger(start), 0);
+      return baseRest(function(args) {
+        var array = args[start],
+            otherArgs = castSlice(args, 0, start);
+ 
+        if (array) {
+          arrayPush(otherArgs, array);
+        }
+        return apply(func, this, otherArgs);
+      });
+    }
+ 
+    /**
+     * Creates a throttled function that only invokes `func` at most once per
+     * every `wait` milliseconds. The throttled function comes with a `cancel`
+     * method to cancel delayed `func` invocations and a `flush` method to
+     * immediately invoke them. Provide `options` to indicate whether `func`
+     * should be invoked on the leading and/or trailing edge of the `wait`
+     * timeout. The `func` is invoked with the last arguments provided to the
+     * throttled function. Subsequent calls to the throttled function return the
+     * result of the last `func` invocation.
+     *
+     * **Note:** If `leading` and `trailing` options are `true`, `func` is
+     * invoked on the trailing edge of the timeout only if the throttled function
+     * is invoked more than once during the `wait` timeout.
+     *
+     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
+     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
+     *
+     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
+     * for details over the differences between `_.throttle` and `_.debounce`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {Function} func The function to throttle.
+     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
+     * @param {Object} [options={}] The options object.
+     * @param {boolean} [options.leading=true]
+     *  Specify invoking on the leading edge of the timeout.
+     * @param {boolean} [options.trailing=true]
+     *  Specify invoking on the trailing edge of the timeout.
+     * @returns {Function} Returns the new throttled function.
+     * @example
+     *
+     * // Avoid excessively updating the position while scrolling.
+     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
+     *
+     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
+     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
+     * jQuery(element).on('click', throttled);
+     *
+     * // Cancel the trailing throttled invocation.
+     * jQuery(window).on('popstate', throttled.cancel);
+     */
+    function throttle(func, wait, options) {
+      var leading = true,
+          trailing = true;
+ 
+      if (typeof func != 'function') {
+        throw new TypeError(FUNC_ERROR_TEXT);
+      }
+      if (isObject(options)) {
+        leading = 'leading' in options ? !!options.leading : leading;
+        trailing = 'trailing' in options ? !!options.trailing : trailing;
+      }
+      return debounce(func, wait, {
+        'leading': leading,
+        'maxWait': wait,
+        'trailing': trailing
+      });
+    }
+ 
+    /**
+     * Creates a function that accepts up to one argument, ignoring any
+     * additional arguments.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Function
+     * @param {Function} func The function to cap arguments for.
+     * @returns {Function} Returns the new capped function.
+     * @example
+     *
+     * _.map(['6', '8', '10'], _.unary(parseInt));
+     * // => [6, 8, 10]
+     */
+    function unary(func) {
+      return ary(func, 1);
+    }
+ 
+    /**
+     * Creates a function that provides `value` to `wrapper` as its first
+     * argument. Any additional arguments provided to the function are appended
+     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
+     * binding of the created function.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Function
+     * @param {*} value The value to wrap.
+     * @param {Function} [wrapper=identity] The wrapper function.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var p = _.wrap(_.escape, function(func, text) {
+     *   return '<p>' + func(text) + '</p>';
+     * });
+     *
+     * p('fred, barney, & pebbles');
+     * // => '<p>fred, barney, &amp; pebbles</p>'
+     */
+    function wrap(value, wrapper) {
+      return partial(castFunction(wrapper), value);
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Casts `value` as an array if it's not one.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.4.0
+     * @category Lang
+     * @param {*} value The value to inspect.
+     * @returns {Array} Returns the cast array.
+     * @example
+     *
+     * _.castArray(1);
+     * // => [1]
+     *
+     * _.castArray({ 'a': 1 });
+     * // => [{ 'a': 1 }]
+     *
+     * _.castArray('abc');
+     * // => ['abc']
+     *
+     * _.castArray(null);
+     * // => [null]
+     *
+     * _.castArray(undefined);
+     * // => [undefined]
+     *
+     * _.castArray();
+     * // => []
+     *
+     * var array = [1, 2, 3];
+     * console.log(_.castArray(array) === array);
+     * // => true
+     */
+    function castArray() {
+      if (!arguments.length) {
+        return [];
+      }
+      var value = arguments[0];
+      return isArray(value) ? value : [value];
+    }
+ 
+    /**
+     * Creates a shallow clone of `value`.
+     *
+     * **Note:** This method is loosely based on the
+     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+     * and supports cloning arrays, array buffers, booleans, date objects, maps,
+     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+     * arrays. The own enumerable properties of `arguments` objects are cloned
+     * as plain objects. An empty object is returned for uncloneable values such
+     * as error objects, functions, DOM nodes, and WeakMaps.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to clone.
+     * @returns {*} Returns the cloned value.
+     * @see _.cloneDeep
+     * @example
+     *
+     * var objects = [{ 'a': 1 }, { 'b': 2 }];
+     *
+     * var shallow = _.clone(objects);
+     * console.log(shallow[0] === objects[0]);
+     * // => true
+     */
+    function clone(value) {
+      return baseClone(value, CLONE_SYMBOLS_FLAG);
+    }
+ 
+    /**
+     * This method is like `_.clone` except that it accepts `customizer` which
+     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
+     * cloning is handled by the method instead. The `customizer` is invoked with
+     * up to four arguments; (value [, index|key, object, stack]).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to clone.
+     * @param {Function} [customizer] The function to customize cloning.
+     * @returns {*} Returns the cloned value.
+     * @see _.cloneDeepWith
+     * @example
+     *
+     * function customizer(value) {
+     *   if (_.isElement(value)) {
+     *     return value.cloneNode(false);
+     *   }
+     * }
+     *
+     * var el = _.cloneWith(document.body, customizer);
+     *
+     * console.log(el === document.body);
+     * // => false
+     * console.log(el.nodeName);
+     * // => 'BODY'
+     * console.log(el.childNodes.length);
+     * // => 0
+     */
+    function cloneWith(value, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
+    }
+ 
+    /**
+     * This method is like `_.clone` except that it recursively clones `value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.0.0
+     * @category Lang
+     * @param {*} value The value to recursively clone.
+     * @returns {*} Returns the deep cloned value.
+     * @see _.clone
+     * @example
+     *
+     * var objects = [{ 'a': 1 }, { 'b': 2 }];
+     *
+     * var deep = _.cloneDeep(objects);
+     * console.log(deep[0] === objects[0]);
+     * // => false
+     */
+    function cloneDeep(value) {
+      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
+    }
+ 
+    /**
+     * This method is like `_.cloneWith` except that it recursively clones `value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to recursively clone.
+     * @param {Function} [customizer] The function to customize cloning.
+     * @returns {*} Returns the deep cloned value.
+     * @see _.cloneWith
+     * @example
+     *
+     * function customizer(value) {
+     *   if (_.isElement(value)) {
+     *     return value.cloneNode(true);
+     *   }
+     * }
+     *
+     * var el = _.cloneDeepWith(document.body, customizer);
+     *
+     * console.log(el === document.body);
+     * // => false
+     * console.log(el.nodeName);
+     * // => 'BODY'
+     * console.log(el.childNodes.length);
+     * // => 20
+     */
+    function cloneDeepWith(value, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
+    }
+ 
+    /**
+     * Checks if `object` conforms to `source` by invoking the predicate
+     * properties of `source` with the corresponding property values of `object`.
+     *
+     * **Note:** This method is equivalent to `_.conforms` when `source` is
+     * partially applied.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.14.0
+     * @category Lang
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2 };
+     *
+     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
+     * // => true
+     *
+     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
+     * // => false
+     */
+    function conformsTo(object, source) {
+      return source == null || baseConformsTo(object, source, keys(source));
+    }
+ 
+    /**
+     * Performs a
+     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+     * comparison between two values to determine if they are equivalent.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1 };
+     * var other = { 'a': 1 };
+     *
+     * _.eq(object, object);
+     * // => true
+     *
+     * _.eq(object, other);
+     * // => false
+     *
+     * _.eq('a', 'a');
+     * // => true
+     *
+     * _.eq('a', Object('a'));
+     * // => false
+     *
+     * _.eq(NaN, NaN);
+     * // => true
+     */
+    function eq(value, other) {
+      return value === other || (value !== value && other !== other);
+    }
+ 
+    /**
+     * Checks if `value` is greater than `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is greater than `other`,
+     *  else `false`.
+     * @see _.lt
+     * @example
+     *
+     * _.gt(3, 1);
+     * // => true
+     *
+     * _.gt(3, 3);
+     * // => false
+     *
+     * _.gt(1, 3);
+     * // => false
+     */
+    var gt = createRelationalOperation(baseGt);
+ 
+    /**
+     * Checks if `value` is greater than or equal to `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is greater than or equal to
+     *  `other`, else `false`.
+     * @see _.lte
+     * @example
+     *
+     * _.gte(3, 1);
+     * // => true
+     *
+     * _.gte(3, 3);
+     * // => true
+     *
+     * _.gte(1, 3);
+     * // => false
+     */
+    var gte = createRelationalOperation(function(value, other) {
+      return value >= other;
+    });
+ 
+    /**
+     * Checks if `value` is likely an `arguments` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+     *  else `false`.
+     * @example
+     *
+     * _.isArguments(function() { return arguments; }());
+     * // => true
+     *
+     * _.isArguments([1, 2, 3]);
+     * // => false
+     */
+    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
+      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
+        !propertyIsEnumerable.call(value, 'callee');
+    };
+ 
+    /**
+     * Checks if `value` is classified as an `Array` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+     * @example
+     *
+     * _.isArray([1, 2, 3]);
+     * // => true
+     *
+     * _.isArray(document.body.children);
+     * // => false
+     *
+     * _.isArray('abc');
+     * // => false
+     *
+     * _.isArray(_.noop);
+     * // => false
+     */
+    var isArray = Array.isArray;
+ 
+    /**
+     * Checks if `value` is classified as an `ArrayBuffer` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
+     * @example
+     *
+     * _.isArrayBuffer(new ArrayBuffer(2));
+     * // => true
+     *
+     * _.isArrayBuffer(new Array(2));
+     * // => false
+     */
+    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
+ 
+    /**
+     * Checks if `value` is array-like. A value is considered array-like if it's
+     * not a function and has a `value.length` that's an integer greater than or
+     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+     * @example
+     *
+     * _.isArrayLike([1, 2, 3]);
+     * // => true
+     *
+     * _.isArrayLike(document.body.children);
+     * // => true
+     *
+     * _.isArrayLike('abc');
+     * // => true
+     *
+     * _.isArrayLike(_.noop);
+     * // => false
+     */
+    function isArrayLike(value) {
+      return value != null && isLength(value.length) && !isFunction(value);
+    }
+ 
+    /**
+     * This method is like `_.isArrayLike` except that it also checks if `value`
+     * is an object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an array-like object,
+     *  else `false`.
+     * @example
+     *
+     * _.isArrayLikeObject([1, 2, 3]);
+     * // => true
+     *
+     * _.isArrayLikeObject(document.body.children);
+     * // => true
+     *
+     * _.isArrayLikeObject('abc');
+     * // => false
+     *
+     * _.isArrayLikeObject(_.noop);
+     * // => false
+     */
+    function isArrayLikeObject(value) {
+      return isObjectLike(value) && isArrayLike(value);
+    }
+ 
+    /**
+     * Checks if `value` is classified as a boolean primitive or object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
+     * @example
+     *
+     * _.isBoolean(false);
+     * // => true
+     *
+     * _.isBoolean(null);
+     * // => false
+     */
+    function isBoolean(value) {
+      return value === true || value === false ||
+        (isObjectLike(value) && baseGetTag(value) == boolTag);
+    }
+ 
+    /**
+     * Checks if `value` is a buffer.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+     * @example
+     *
+     * _.isBuffer(new Buffer(2));
+     * // => true
+     *
+     * _.isBuffer(new Uint8Array(2));
+     * // => false
+     */
+    var isBuffer = nativeIsBuffer || stubFalse;
+ 
+    /**
+     * Checks if `value` is classified as a `Date` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
+     * @example
+     *
+     * _.isDate(new Date);
+     * // => true
+     *
+     * _.isDate('Mon April 23 2012');
+     * // => false
+     */
+    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
+ 
+    /**
+     * Checks if `value` is likely a DOM element.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
+     * @example
+     *
+     * _.isElement(document.body);
+     * // => true
+     *
+     * _.isElement('<body>');
+     * // => false
+     */
+    function isElement(value) {
+      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
+    }
+ 
+    /**
+     * Checks if `value` is an empty object, collection, map, or set.
+     *
+     * Objects are considered empty if they have no own enumerable string keyed
+     * properties.
+     *
+     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+     * jQuery-like collections are considered empty if they have a `length` of `0`.
+     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+     * @example
+     *
+     * _.isEmpty(null);
+     * // => true
+     *
+     * _.isEmpty(true);
+     * // => true
+     *
+     * _.isEmpty(1);
+     * // => true
+     *
+     * _.isEmpty([1, 2, 3]);
+     * // => false
+     *
+     * _.isEmpty({ 'a': 1 });
+     * // => false
+     */
+    function isEmpty(value) {
+      if (value == null) {
+        return true;
+      }
+      if (isArrayLike(value) &&
+          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
+            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+        return !value.length;
+      }
+      var tag = getTag(value);
+      if (tag == mapTag || tag == setTag) {
+        return !value.size;
+      }
+      if (isPrototype(value)) {
+        return !baseKeys(value).length;
+      }
+      for (var key in value) {
+        if (hasOwnProperty.call(value, key)) {
+          return false;
+        }
+      }
+      return true;
+    }
+ 
+    /**
+     * Performs a deep comparison between two values to determine if they are
+     * equivalent.
+     *
+     * **Note:** This method supports comparing arrays, array buffers, booleans,
+     * date objects, error objects, maps, numbers, `Object` objects, regexes,
+     * sets, strings, symbols, and typed arrays. `Object` objects are compared
+     * by their own, not inherited, enumerable properties. Functions and DOM
+     * nodes are compared by strict equality, i.e. `===`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1 };
+     * var other = { 'a': 1 };
+     *
+     * _.isEqual(object, other);
+     * // => true
+     *
+     * object === other;
+     * // => false
+     */
+    function isEqual(value, other) {
+      return baseIsEqual(value, other);
+    }
+ 
+    /**
+     * This method is like `_.isEqual` except that it accepts `customizer` which
+     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+     * are handled by the method instead. The `customizer` is invoked with up to
+     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+     * @example
+     *
+     * function isGreeting(value) {
+     *   return /^h(?:i|ello)$/.test(value);
+     * }
+     *
+     * function customizer(objValue, othValue) {
+     *   if (isGreeting(objValue) && isGreeting(othValue)) {
+     *     return true;
+     *   }
+     * }
+     *
+     * var array = ['hello', 'goodbye'];
+     * var other = ['hi', 'goodbye'];
+     *
+     * _.isEqualWith(array, other, customizer);
+     * // => true
+     */
+    function isEqualWith(value, other, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      var result = customizer ? customizer(value, other) : undefined;
+      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
+    }
+ 
+    /**
+     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
+     * `SyntaxError`, `TypeError`, or `URIError` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
+     * @example
+     *
+     * _.isError(new Error);
+     * // => true
+     *
+     * _.isError(Error);
+     * // => false
+     */
+    function isError(value) {
+      if (!isObjectLike(value)) {
+        return false;
+      }
+      var tag = baseGetTag(value);
+      return tag == errorTag || tag == domExcTag ||
+        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
+    }
+ 
+    /**
+     * Checks if `value` is a finite primitive number.
+     *
+     * **Note:** This method is based on
+     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
+     * @example
+     *
+     * _.isFinite(3);
+     * // => true
+     *
+     * _.isFinite(Number.MIN_VALUE);
+     * // => true
+     *
+     * _.isFinite(Infinity);
+     * // => false
+     *
+     * _.isFinite('3');
+     * // => false
+     */
+    function isFinite(value) {
+      return typeof value == 'number' && nativeIsFinite(value);
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `Function` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+     * @example
+     *
+     * _.isFunction(_);
+     * // => true
+     *
+     * _.isFunction(/abc/);
+     * // => false
+     */
+    function isFunction(value) {
+      if (!isObject(value)) {
+        return false;
+      }
+      // The use of `Object#toString` avoids issues with the `typeof` operator
+      // in Safari 9 which returns 'object' for typed arrays and other constructors.
+      var tag = baseGetTag(value);
+      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+    }
+ 
+    /**
+     * Checks if `value` is an integer.
+     *
+     * **Note:** This method is based on
+     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
+     * @example
+     *
+     * _.isInteger(3);
+     * // => true
+     *
+     * _.isInteger(Number.MIN_VALUE);
+     * // => false
+     *
+     * _.isInteger(Infinity);
+     * // => false
+     *
+     * _.isInteger('3');
+     * // => false
+     */
+    function isInteger(value) {
+      return typeof value == 'number' && value == toInteger(value);
+    }
+ 
+    /**
+     * Checks if `value` is a valid array-like length.
+     *
+     * **Note:** This method is loosely based on
+     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+     * @example
+     *
+     * _.isLength(3);
+     * // => true
+     *
+     * _.isLength(Number.MIN_VALUE);
+     * // => false
+     *
+     * _.isLength(Infinity);
+     * // => false
+     *
+     * _.isLength('3');
+     * // => false
+     */
+    function isLength(value) {
+      return typeof value == 'number' &&
+        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+    }
+ 
+    /**
+     * Checks if `value` is the
+     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+     * @example
+     *
+     * _.isObject({});
+     * // => true
+     *
+     * _.isObject([1, 2, 3]);
+     * // => true
+     *
+     * _.isObject(_.noop);
+     * // => true
+     *
+     * _.isObject(null);
+     * // => false
+     */
+    function isObject(value) {
+      var type = typeof value;
+      return value != null && (type == 'object' || type == 'function');
+    }
+ 
+    /**
+     * Checks if `value` is object-like. A value is object-like if it's not `null`
+     * and has a `typeof` result of "object".
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+     * @example
+     *
+     * _.isObjectLike({});
+     * // => true
+     *
+     * _.isObjectLike([1, 2, 3]);
+     * // => true
+     *
+     * _.isObjectLike(_.noop);
+     * // => false
+     *
+     * _.isObjectLike(null);
+     * // => false
+     */
+    function isObjectLike(value) {
+      return value != null && typeof value == 'object';
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `Map` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+     * @example
+     *
+     * _.isMap(new Map);
+     * // => true
+     *
+     * _.isMap(new WeakMap);
+     * // => false
+     */
+    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
+ 
+    /**
+     * Performs a partial deep comparison between `object` and `source` to
+     * determine if `object` contains equivalent property values.
+     *
+     * **Note:** This method is equivalent to `_.matches` when `source` is
+     * partially applied.
+     *
+     * Partial comparisons will match empty array and empty object `source`
+     * values against any array or object value, respectively. See `_.isEqual`
+     * for a list of supported value comparisons.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property values to match.
+     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2 };
+     *
+     * _.isMatch(object, { 'b': 2 });
+     * // => true
+     *
+     * _.isMatch(object, { 'b': 1 });
+     * // => false
+     */
+    function isMatch(object, source) {
+      return object === source || baseIsMatch(object, source, getMatchData(source));
+    }
+ 
+    /**
+     * This method is like `_.isMatch` except that it accepts `customizer` which
+     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
+     * are handled by the method instead. The `customizer` is invoked with five
+     * arguments: (objValue, srcValue, index|key, object, source).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {Object} object The object to inspect.
+     * @param {Object} source The object of property values to match.
+     * @param {Function} [customizer] The function to customize comparisons.
+     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+     * @example
+     *
+     * function isGreeting(value) {
+     *   return /^h(?:i|ello)$/.test(value);
+     * }
+     *
+     * function customizer(objValue, srcValue) {
+     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
+     *     return true;
+     *   }
+     * }
+     *
+     * var object = { 'greeting': 'hello' };
+     * var source = { 'greeting': 'hi' };
+     *
+     * _.isMatchWith(object, source, customizer);
+     * // => true
+     */
+    function isMatchWith(object, source, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return baseIsMatch(object, source, getMatchData(source), customizer);
+    }
+ 
+    /**
+     * Checks if `value` is `NaN`.
+     *
+     * **Note:** This method is based on
+     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
+     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
+     * `undefined` and other non-number values.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+     * @example
+     *
+     * _.isNaN(NaN);
+     * // => true
+     *
+     * _.isNaN(new Number(NaN));
+     * // => true
+     *
+     * isNaN(undefined);
+     * // => true
+     *
+     * _.isNaN(undefined);
+     * // => false
+     */
+    function isNaN(value) {
+      // An `NaN` primitive is the only value that is not equal to itself.
+      // Perform the `toStringTag` check first to avoid errors with some
+      // ActiveX objects in IE.
+      return isNumber(value) && value != +value;
+    }
+ 
+    /**
+     * Checks if `value` is a pristine native function.
+     *
+     * **Note:** This method can't reliably detect native functions in the presence
+     * of the core-js package because core-js circumvents this kind of detection.
+     * Despite multiple requests, the core-js maintainer has made it clear: any
+     * attempt to fix the detection will be obstructed. As a result, we're left
+     * with little choice but to throw an error. Unfortunately, this also affects
+     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
+     * which rely on core-js.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a native function,
+     *  else `false`.
+     * @example
+     *
+     * _.isNative(Array.prototype.push);
+     * // => true
+     *
+     * _.isNative(_);
+     * // => false
+     */
+    function isNative(value) {
+      if (isMaskable(value)) {
+        throw new Error(CORE_ERROR_TEXT);
+      }
+      return baseIsNative(value);
+    }
+ 
+    /**
+     * Checks if `value` is `null`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
+     * @example
+     *
+     * _.isNull(null);
+     * // => true
+     *
+     * _.isNull(void 0);
+     * // => false
+     */
+    function isNull(value) {
+      return value === null;
+    }
+ 
+    /**
+     * Checks if `value` is `null` or `undefined`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
+     * @example
+     *
+     * _.isNil(null);
+     * // => true
+     *
+     * _.isNil(void 0);
+     * // => true
+     *
+     * _.isNil(NaN);
+     * // => false
+     */
+    function isNil(value) {
+      return value == null;
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `Number` primitive or object.
+     *
+     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
+     * classified as numbers, use the `_.isFinite` method.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
+     * @example
+     *
+     * _.isNumber(3);
+     * // => true
+     *
+     * _.isNumber(Number.MIN_VALUE);
+     * // => true
+     *
+     * _.isNumber(Infinity);
+     * // => true
+     *
+     * _.isNumber('3');
+     * // => false
+     */
+    function isNumber(value) {
+      return typeof value == 'number' ||
+        (isObjectLike(value) && baseGetTag(value) == numberTag);
+    }
+ 
+    /**
+     * Checks if `value` is a plain object, that is, an object created by the
+     * `Object` constructor or one with a `[[Prototype]]` of `null`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.8.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     * }
+     *
+     * _.isPlainObject(new Foo);
+     * // => false
+     *
+     * _.isPlainObject([1, 2, 3]);
+     * // => false
+     *
+     * _.isPlainObject({ 'x': 0, 'y': 0 });
+     * // => true
+     *
+     * _.isPlainObject(Object.create(null));
+     * // => true
+     */
+    function isPlainObject(value) {
+      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+        return false;
+      }
+      var proto = getPrototype(value);
+      if (proto === null) {
+        return true;
+      }
+      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+        funcToString.call(Ctor) == objectCtorString;
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `RegExp` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.1.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
+     * @example
+     *
+     * _.isRegExp(/abc/);
+     * // => true
+     *
+     * _.isRegExp('/abc/');
+     * // => false
+     */
+    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
+ 
+    /**
+     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
+     * double precision number which isn't the result of a rounded unsafe integer.
+     *
+     * **Note:** This method is based on
+     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
+     * @example
+     *
+     * _.isSafeInteger(3);
+     * // => true
+     *
+     * _.isSafeInteger(Number.MIN_VALUE);
+     * // => false
+     *
+     * _.isSafeInteger(Infinity);
+     * // => false
+     *
+     * _.isSafeInteger('3');
+     * // => false
+     */
+    function isSafeInteger(value) {
+      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `Set` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+     * @example
+     *
+     * _.isSet(new Set);
+     * // => true
+     *
+     * _.isSet(new WeakSet);
+     * // => false
+     */
+    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
+ 
+    /**
+     * Checks if `value` is classified as a `String` primitive or object.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
+     * @example
+     *
+     * _.isString('abc');
+     * // => true
+     *
+     * _.isString(1);
+     * // => false
+     */
+    function isString(value) {
+      return typeof value == 'string' ||
+        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `Symbol` primitive or object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+     * @example
+     *
+     * _.isSymbol(Symbol.iterator);
+     * // => true
+     *
+     * _.isSymbol('abc');
+     * // => false
+     */
+    function isSymbol(value) {
+      return typeof value == 'symbol' ||
+        (isObjectLike(value) && baseGetTag(value) == symbolTag);
+    }
+ 
+    /**
+     * Checks if `value` is classified as a typed array.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+     * @example
+     *
+     * _.isTypedArray(new Uint8Array);
+     * // => true
+     *
+     * _.isTypedArray([]);
+     * // => false
+     */
+    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+ 
+    /**
+     * Checks if `value` is `undefined`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+     * @example
+     *
+     * _.isUndefined(void 0);
+     * // => true
+     *
+     * _.isUndefined(null);
+     * // => false
+     */
+    function isUndefined(value) {
+      return value === undefined;
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `WeakMap` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
+     * @example
+     *
+     * _.isWeakMap(new WeakMap);
+     * // => true
+     *
+     * _.isWeakMap(new Map);
+     * // => false
+     */
+    function isWeakMap(value) {
+      return isObjectLike(value) && getTag(value) == weakMapTag;
+    }
+ 
+    /**
+     * Checks if `value` is classified as a `WeakSet` object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.3.0
+     * @category Lang
+     * @param {*} value The value to check.
+     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
+     * @example
+     *
+     * _.isWeakSet(new WeakSet);
+     * // => true
+     *
+     * _.isWeakSet(new Set);
+     * // => false
+     */
+    function isWeakSet(value) {
+      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
+    }
+ 
+    /**
+     * Checks if `value` is less than `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is less than `other`,
+     *  else `false`.
+     * @see _.gt
+     * @example
+     *
+     * _.lt(1, 3);
+     * // => true
+     *
+     * _.lt(3, 3);
+     * // => false
+     *
+     * _.lt(3, 1);
+     * // => false
+     */
+    var lt = createRelationalOperation(baseLt);
+ 
+    /**
+     * Checks if `value` is less than or equal to `other`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.9.0
+     * @category Lang
+     * @param {*} value The value to compare.
+     * @param {*} other The other value to compare.
+     * @returns {boolean} Returns `true` if `value` is less than or equal to
+     *  `other`, else `false`.
+     * @see _.gte
+     * @example
+     *
+     * _.lte(1, 3);
+     * // => true
+     *
+     * _.lte(3, 3);
+     * // => true
+     *
+     * _.lte(3, 1);
+     * // => false
+     */
+    var lte = createRelationalOperation(function(value, other) {
+      return value <= other;
+    });
+ 
+    /**
+     * Converts `value` to an array.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {Array} Returns the converted array.
+     * @example
+     *
+     * _.toArray({ 'a': 1, 'b': 2 });
+     * // => [1, 2]
+     *
+     * _.toArray('abc');
+     * // => ['a', 'b', 'c']
+     *
+     * _.toArray(1);
+     * // => []
+     *
+     * _.toArray(null);
+     * // => []
+     */
+    function toArray(value) {
+      if (!value) {
+        return [];
+      }
+      if (isArrayLike(value)) {
+        return isString(value) ? stringToArray(value) : copyArray(value);
+      }
+      if (symIterator && value[symIterator]) {
+        return iteratorToArray(value[symIterator]());
+      }
+      var tag = getTag(value),
+          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
+ 
+      return func(value);
+    }
+ 
+    /**
+     * Converts `value` to a finite number.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.12.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted number.
+     * @example
+     *
+     * _.toFinite(3.2);
+     * // => 3.2
+     *
+     * _.toFinite(Number.MIN_VALUE);
+     * // => 5e-324
+     *
+     * _.toFinite(Infinity);
+     * // => 1.7976931348623157e+308
+     *
+     * _.toFinite('3.2');
+     * // => 3.2
+     */
+    function toFinite(value) {
+      if (!value) {
+        return value === 0 ? value : 0;
+      }
+      value = toNumber(value);
+      if (value === INFINITY || value === -INFINITY) {
+        var sign = (value < 0 ? -1 : 1);
+        return sign * MAX_INTEGER;
+      }
+      return value === value ? value : 0;
+    }
+ 
+    /**
+     * Converts `value` to an integer.
+     *
+     * **Note:** This method is loosely based on
+     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.toInteger(3.2);
+     * // => 3
+     *
+     * _.toInteger(Number.MIN_VALUE);
+     * // => 0
+     *
+     * _.toInteger(Infinity);
+     * // => 1.7976931348623157e+308
+     *
+     * _.toInteger('3.2');
+     * // => 3
+     */
+    function toInteger(value) {
+      var result = toFinite(value),
+          remainder = result % 1;
+ 
+      return result === result ? (remainder ? result - remainder : result) : 0;
+    }
+ 
+    /**
+     * Converts `value` to an integer suitable for use as the length of an
+     * array-like object.
+     *
+     * **Note:** This method is based on
+     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.toLength(3.2);
+     * // => 3
+     *
+     * _.toLength(Number.MIN_VALUE);
+     * // => 0
+     *
+     * _.toLength(Infinity);
+     * // => 4294967295
+     *
+     * _.toLength('3.2');
+     * // => 3
+     */
+    function toLength(value) {
+      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
+    }
+ 
+    /**
+     * Converts `value` to a number.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to process.
+     * @returns {number} Returns the number.
+     * @example
+     *
+     * _.toNumber(3.2);
+     * // => 3.2
+     *
+     * _.toNumber(Number.MIN_VALUE);
+     * // => 5e-324
+     *
+     * _.toNumber(Infinity);
+     * // => Infinity
+     *
+     * _.toNumber('3.2');
+     * // => 3.2
+     */
+    function toNumber(value) {
+      if (typeof value == 'number') {
+        return value;
+      }
+      if (isSymbol(value)) {
+        return NAN;
+      }
+      if (isObject(value)) {
+        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+        value = isObject(other) ? (other + '') : other;
+      }
+      if (typeof value != 'string') {
+        return value === 0 ? value : +value;
+      }
+      value = value.replace(reTrim, '');
+      var isBinary = reIsBinary.test(value);
+      return (isBinary || reIsOctal.test(value))
+        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+        : (reIsBadHex.test(value) ? NAN : +value);
+    }
+ 
+    /**
+     * Converts `value` to a plain object flattening inherited enumerable string
+     * keyed properties of `value` to own properties of the plain object.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {Object} Returns the converted plain object.
+     * @example
+     *
+     * function Foo() {
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.assign({ 'a': 1 }, new Foo);
+     * // => { 'a': 1, 'b': 2 }
+     *
+     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+     * // => { 'a': 1, 'b': 2, 'c': 3 }
+     */
+    function toPlainObject(value) {
+      return copyObject(value, keysIn(value));
+    }
+ 
+    /**
+     * Converts `value` to a safe integer. A safe integer can be compared and
+     * represented correctly.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.toSafeInteger(3.2);
+     * // => 3
+     *
+     * _.toSafeInteger(Number.MIN_VALUE);
+     * // => 0
+     *
+     * _.toSafeInteger(Infinity);
+     * // => 9007199254740991
+     *
+     * _.toSafeInteger('3.2');
+     * // => 3
+     */
+    function toSafeInteger(value) {
+      return value
+        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
+        : (value === 0 ? value : 0);
+    }
+ 
+    /**
+     * Converts `value` to a string. An empty string is returned for `null`
+     * and `undefined` values. The sign of `-0` is preserved.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Lang
+     * @param {*} value The value to convert.
+     * @returns {string} Returns the converted string.
+     * @example
+     *
+     * _.toString(null);
+     * // => ''
+     *
+     * _.toString(-0);
+     * // => '-0'
+     *
+     * _.toString([1, 2, 3]);
+     * // => '1,2,3'
+     */
+    function toString(value) {
+      return value == null ? '' : baseToString(value);
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Assigns own enumerable string keyed properties of source objects to the
+     * destination object. Source objects are applied from left to right.
+     * Subsequent sources overwrite property assignments of previous sources.
+     *
+     * **Note:** This method mutates `object` and is loosely based on
+     * [`Object.assign`](https://mdn.io/Object/assign).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.10.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.assignIn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     * }
+     *
+     * function Bar() {
+     *   this.c = 3;
+     * }
+     *
+     * Foo.prototype.b = 2;
+     * Bar.prototype.d = 4;
+     *
+     * _.assign({ 'a': 0 }, new Foo, new Bar);
+     * // => { 'a': 1, 'c': 3 }
+     */
+    var assign = createAssigner(function(object, source) {
+      if (isPrototype(source) || isArrayLike(source)) {
+        copyObject(source, keys(source), object);
+        return;
+      }
+      for (var key in source) {
+        if (hasOwnProperty.call(source, key)) {
+          assignValue(object, key, source[key]);
+        }
+      }
+    });
+ 
+    /**
+     * This method is like `_.assign` except that it iterates over own and
+     * inherited source properties.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias extend
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.assign
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     * }
+     *
+     * function Bar() {
+     *   this.c = 3;
+     * }
+     *
+     * Foo.prototype.b = 2;
+     * Bar.prototype.d = 4;
+     *
+     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
+     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
+     */
+    var assignIn = createAssigner(function(object, source) {
+      copyObject(source, keysIn(source), object);
+    });
+ 
+    /**
+     * This method is like `_.assignIn` except that it accepts `customizer`
+     * which is invoked to produce the assigned values. If `customizer` returns
+     * `undefined`, assignment is handled by the method instead. The `customizer`
+     * is invoked with five arguments: (objValue, srcValue, key, object, source).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias extendWith
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} sources The source objects.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @see _.assignWith
+     * @example
+     *
+     * function customizer(objValue, srcValue) {
+     *   return _.isUndefined(objValue) ? srcValue : objValue;
+     * }
+     *
+     * var defaults = _.partialRight(_.assignInWith, customizer);
+     *
+     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+     * // => { 'a': 1, 'b': 2 }
+     */
+    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
+      copyObject(source, keysIn(source), object, customizer);
+    });
+ 
+    /**
+     * This method is like `_.assign` except that it accepts `customizer`
+     * which is invoked to produce the assigned values. If `customizer` returns
+     * `undefined`, assignment is handled by the method instead. The `customizer`
+     * is invoked with five arguments: (objValue, srcValue, key, object, source).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} sources The source objects.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @see _.assignInWith
+     * @example
+     *
+     * function customizer(objValue, srcValue) {
+     *   return _.isUndefined(objValue) ? srcValue : objValue;
+     * }
+     *
+     * var defaults = _.partialRight(_.assignWith, customizer);
+     *
+     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+     * // => { 'a': 1, 'b': 2 }
+     */
+    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
+      copyObject(source, keys(source), object, customizer);
+    });
+ 
+    /**
+     * Creates an array of values corresponding to `paths` of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.0.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {...(string|string[])} [paths] The property paths to pick.
+     * @returns {Array} Returns the picked values.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
+     *
+     * _.at(object, ['a[0].b.c', 'a[1]']);
+     * // => [3, 4]
+     */
+    var at = flatRest(baseAt);
+ 
+    /**
+     * Creates an object that inherits from the `prototype` object. If a
+     * `properties` object is given, its own enumerable string keyed properties
+     * are assigned to the created object.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.3.0
+     * @category Object
+     * @param {Object} prototype The object to inherit from.
+     * @param {Object} [properties] The properties to assign to the object.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * function Shape() {
+     *   this.x = 0;
+     *   this.y = 0;
+     * }
+     *
+     * function Circle() {
+     *   Shape.call(this);
+     * }
+     *
+     * Circle.prototype = _.create(Shape.prototype, {
+     *   'constructor': Circle
+     * });
+     *
+     * var circle = new Circle;
+     * circle instanceof Circle;
+     * // => true
+     *
+     * circle instanceof Shape;
+     * // => true
+     */
+    function create(prototype, properties) {
+      var result = baseCreate(prototype);
+      return properties == null ? result : baseAssign(result, properties);
+    }
+ 
+    /**
+     * Assigns own and inherited enumerable string keyed properties of source
+     * objects to the destination object for all destination properties that
+     * resolve to `undefined`. Source objects are applied from left to right.
+     * Once a property is set, additional values of the same property are ignored.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.defaultsDeep
+     * @example
+     *
+     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+     * // => { 'a': 1, 'b': 2 }
+     */
+    var defaults = baseRest(function(args) {
+      args.push(undefined, customDefaultsAssignIn);
+      return apply(assignInWith, undefined, args);
+    });
+ 
+    /**
+     * This method is like `_.defaults` except that it recursively assigns
+     * default properties.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @see _.defaults
+     * @example
+     *
+     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
+     * // => { 'a': { 'b': 2, 'c': 3 } }
+     */
+    var defaultsDeep = baseRest(function(args) {
+      args.push(undefined, customDefaultsMerge);
+      return apply(mergeWith, undefined, args);
+    });
+ 
+    /**
+     * This method is like `_.find` except that it returns the key of the first
+     * element `predicate` returns truthy for instead of the element itself.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.1.0
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {string|undefined} Returns the key of the matched element,
+     *  else `undefined`.
+     * @example
+     *
+     * var users = {
+     *   'barney':  { 'age': 36, 'active': true },
+     *   'fred':    { 'age': 40, 'active': false },
+     *   'pebbles': { 'age': 1,  'active': true }
+     * };
+     *
+     * _.findKey(users, function(o) { return o.age < 40; });
+     * // => 'barney' (iteration order is not guaranteed)
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findKey(users, { 'age': 1, 'active': true });
+     * // => 'pebbles'
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findKey(users, ['active', false]);
+     * // => 'fred'
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findKey(users, 'active');
+     * // => 'barney'
+     */
+    function findKey(object, predicate) {
+      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
+    }
+ 
+    /**
+     * This method is like `_.findKey` except that it iterates over elements of
+     * a collection in the opposite order.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @param {Function} [predicate=_.identity] The function invoked per iteration.
+     * @returns {string|undefined} Returns the key of the matched element,
+     *  else `undefined`.
+     * @example
+     *
+     * var users = {
+     *   'barney':  { 'age': 36, 'active': true },
+     *   'fred':    { 'age': 40, 'active': false },
+     *   'pebbles': { 'age': 1,  'active': true }
+     * };
+     *
+     * _.findLastKey(users, function(o) { return o.age < 40; });
+     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.findLastKey(users, { 'age': 36, 'active': true });
+     * // => 'barney'
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.findLastKey(users, ['active', false]);
+     * // => 'fred'
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.findLastKey(users, 'active');
+     * // => 'pebbles'
+     */
+    function findLastKey(object, predicate) {
+      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
+    }
+ 
+    /**
+     * Iterates over own and inherited enumerable string keyed properties of an
+     * object and invokes `iteratee` for each property. The iteratee is invoked
+     * with three arguments: (value, key, object). Iteratee functions may exit
+     * iteration early by explicitly returning `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.3.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forInRight
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forIn(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
+     */
+    function forIn(object, iteratee) {
+      return object == null
+        ? object
+        : baseFor(object, getIteratee(iteratee, 3), keysIn);
+    }
+ 
+    /**
+     * This method is like `_.forIn` except that it iterates over properties of
+     * `object` in the opposite order.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forIn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forInRight(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
+     */
+    function forInRight(object, iteratee) {
+      return object == null
+        ? object
+        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
+    }
+ 
+    /**
+     * Iterates over own enumerable string keyed properties of an object and
+     * invokes `iteratee` for each property. The iteratee is invoked with three
+     * arguments: (value, key, object). Iteratee functions may exit iteration
+     * early by explicitly returning `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.3.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forOwnRight
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forOwn(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+     */
+    function forOwn(object, iteratee) {
+      return object && baseForOwn(object, getIteratee(iteratee, 3));
+    }
+ 
+    /**
+     * This method is like `_.forOwn` except that it iterates over properties of
+     * `object` in the opposite order.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.0.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns `object`.
+     * @see _.forOwn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.forOwnRight(new Foo, function(value, key) {
+     *   console.log(key);
+     * });
+     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
+     */
+    function forOwnRight(object, iteratee) {
+      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
+    }
+ 
+    /**
+     * Creates an array of function property names from own enumerable properties
+     * of `object`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @returns {Array} Returns the function names.
+     * @see _.functionsIn
+     * @example
+     *
+     * function Foo() {
+     *   this.a = _.constant('a');
+     *   this.b = _.constant('b');
+     * }
+     *
+     * Foo.prototype.c = _.constant('c');
+     *
+     * _.functions(new Foo);
+     * // => ['a', 'b']
+     */
+    function functions(object) {
+      return object == null ? [] : baseFunctions(object, keys(object));
+    }
+ 
+    /**
+     * Creates an array of function property names from own and inherited
+     * enumerable properties of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to inspect.
+     * @returns {Array} Returns the function names.
+     * @see _.functions
+     * @example
+     *
+     * function Foo() {
+     *   this.a = _.constant('a');
+     *   this.b = _.constant('b');
+     * }
+     *
+     * Foo.prototype.c = _.constant('c');
+     *
+     * _.functionsIn(new Foo);
+     * // => ['a', 'b', 'c']
+     */
+    function functionsIn(object) {
+      return object == null ? [] : baseFunctions(object, keysIn(object));
+    }
+ 
+    /**
+     * Gets the value at `path` of `object`. If the resolved value is
+     * `undefined`, the `defaultValue` is returned in its place.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the property to get.
+     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+     * @returns {*} Returns the resolved value.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+     *
+     * _.get(object, 'a[0].b.c');
+     * // => 3
+     *
+     * _.get(object, ['a', '0', 'b', 'c']);
+     * // => 3
+     *
+     * _.get(object, 'a.b.c', 'default');
+     * // => 'default'
+     */
+    function get(object, path, defaultValue) {
+      var result = object == null ? undefined : baseGet(object, path);
+      return result === undefined ? defaultValue : result;
+    }
+ 
+    /**
+     * Checks if `path` is a direct property of `object`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path to check.
+     * @returns {boolean} Returns `true` if `path` exists, else `false`.
+     * @example
+     *
+     * var object = { 'a': { 'b': 2 } };
+     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
+     *
+     * _.has(object, 'a');
+     * // => true
+     *
+     * _.has(object, 'a.b');
+     * // => true
+     *
+     * _.has(object, ['a', 'b']);
+     * // => true
+     *
+     * _.has(other, 'a');
+     * // => false
+     */
+    function has(object, path) {
+      return object != null && hasPath(object, path, baseHas);
+    }
+ 
+    /**
+     * Checks if `path` is a direct or inherited property of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path to check.
+     * @returns {boolean} Returns `true` if `path` exists, else `false`.
+     * @example
+     *
+     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
+     *
+     * _.hasIn(object, 'a');
+     * // => true
+     *
+     * _.hasIn(object, 'a.b');
+     * // => true
+     *
+     * _.hasIn(object, ['a', 'b']);
+     * // => true
+     *
+     * _.hasIn(object, 'b');
+     * // => false
+     */
+    function hasIn(object, path) {
+      return object != null && hasPath(object, path, baseHasIn);
+    }
+ 
+    /**
+     * Creates an object composed of the inverted keys and values of `object`.
+     * If `object` contains duplicate values, subsequent values overwrite
+     * property assignments of previous values.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.7.0
+     * @category Object
+     * @param {Object} object The object to invert.
+     * @returns {Object} Returns the new inverted object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2, 'c': 1 };
+     *
+     * _.invert(object);
+     * // => { '1': 'c', '2': 'b' }
+     */
+    var invert = createInverter(function(result, value, key) {
+      result[value] = key;
+    }, constant(identity));
+ 
+    /**
+     * This method is like `_.invert` except that the inverted object is generated
+     * from the results of running each element of `object` thru `iteratee`. The
+     * corresponding inverted value of each inverted key is an array of keys
+     * responsible for generating the inverted value. The iteratee is invoked
+     * with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.1.0
+     * @category Object
+     * @param {Object} object The object to invert.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {Object} Returns the new inverted object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': 2, 'c': 1 };
+     *
+     * _.invertBy(object);
+     * // => { '1': ['a', 'c'], '2': ['b'] }
+     *
+     * _.invertBy(object, function(value) {
+     *   return 'group' + value;
+     * });
+     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
+     */
+    var invertBy = createInverter(function(result, value, key) {
+      if (hasOwnProperty.call(result, value)) {
+        result[value].push(key);
+      } else {
+        result[value] = [key];
+      }
+    }, getIteratee);
+ 
+    /**
+     * Invokes the method at `path` of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the method to invoke.
+     * @param {...*} [args] The arguments to invoke the method with.
+     * @returns {*} Returns the result of the invoked method.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
+     *
+     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
+     * // => [2, 3]
+     */
+    var invoke = baseRest(baseInvoke);
+ 
+    /**
+     * Creates an array of the own enumerable property names of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects. See the
+     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+     * for more details.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.keys(new Foo);
+     * // => ['a', 'b'] (iteration order is not guaranteed)
+     *
+     * _.keys('hi');
+     * // => ['0', '1']
+     */
+    function keys(object) {
+      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+    }
+ 
+    /**
+     * Creates an array of the own and inherited enumerable property names of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property names.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.keysIn(new Foo);
+     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+     */
+    function keysIn(object) {
+      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+    }
+ 
+    /**
+     * The opposite of `_.mapValues`; this method creates an object with the
+     * same values as `object` and keys generated by running each own enumerable
+     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
+     * with three arguments: (value, key, object).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.8.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns the new mapped object.
+     * @see _.mapValues
+     * @example
+     *
+     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
+     *   return key + value;
+     * });
+     * // => { 'a1': 1, 'b2': 2 }
+     */
+    function mapKeys(object, iteratee) {
+      var result = {};
+      iteratee = getIteratee(iteratee, 3);
+ 
+      baseForOwn(object, function(value, key, object) {
+        baseAssignValue(result, iteratee(value, key, object), value);
+      });
+      return result;
+    }
+ 
+    /**
+     * Creates an object with the same keys as `object` and values generated
+     * by running each own enumerable string keyed property of `object` thru
+     * `iteratee`. The iteratee is invoked with three arguments:
+     * (value, key, object).
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Object} Returns the new mapped object.
+     * @see _.mapKeys
+     * @example
+     *
+     * var users = {
+     *   'fred':    { 'user': 'fred',    'age': 40 },
+     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
+     * };
+     *
+     * _.mapValues(users, function(o) { return o.age; });
+     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.mapValues(users, 'age');
+     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+     */
+    function mapValues(object, iteratee) {
+      var result = {};
+      iteratee = getIteratee(iteratee, 3);
+ 
+      baseForOwn(object, function(value, key, object) {
+        baseAssignValue(result, key, iteratee(value, key, object));
+      });
+      return result;
+    }
+ 
+    /**
+     * This method is like `_.assign` except that it recursively merges own and
+     * inherited enumerable string keyed properties of source objects into the
+     * destination object. Source properties that resolve to `undefined` are
+     * skipped if a destination value exists. Array and plain object properties
+     * are merged recursively. Other objects and value types are overridden by
+     * assignment. Source objects are applied from left to right. Subsequent
+     * sources overwrite property assignments of previous sources.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.5.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} [sources] The source objects.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = {
+     *   'a': [{ 'b': 2 }, { 'd': 4 }]
+     * };
+     *
+     * var other = {
+     *   'a': [{ 'c': 3 }, { 'e': 5 }]
+     * };
+     *
+     * _.merge(object, other);
+     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+     */
+    var merge = createAssigner(function(object, source, srcIndex) {
+      baseMerge(object, source, srcIndex);
+    });
+ 
+    /**
+     * This method is like `_.merge` except that it accepts `customizer` which
+     * is invoked to produce the merged values of the destination and source
+     * properties. If `customizer` returns `undefined`, merging is handled by the
+     * method instead. The `customizer` is invoked with six arguments:
+     * (objValue, srcValue, key, object, source, stack).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The destination object.
+     * @param {...Object} sources The source objects.
+     * @param {Function} customizer The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * function customizer(objValue, srcValue) {
+     *   if (_.isArray(objValue)) {
+     *     return objValue.concat(srcValue);
+     *   }
+     * }
+     *
+     * var object = { 'a': [1], 'b': [2] };
+     * var other = { 'a': [3], 'b': [4] };
+     *
+     * _.mergeWith(object, other, customizer);
+     * // => { 'a': [1, 3], 'b': [2, 4] }
+     */
+    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
+      baseMerge(object, source, srcIndex, customizer);
+    });
+ 
+    /**
+     * The opposite of `_.pick`; this method creates an object composed of the
+     * own and inherited enumerable property paths of `object` that are not omitted.
+     *
+     * **Note:** This method is considerably slower than `_.pick`.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {...(string|string[])} [paths] The property paths to omit.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.omit(object, ['a', 'c']);
+     * // => { 'b': '2' }
+     */
+    var omit = flatRest(function(object, paths) {
+      var result = {};
+      if (object == null) {
+        return result;
+      }
+      var isDeep = false;
+      paths = arrayMap(paths, function(path) {
+        path = castPath(path, object);
+        isDeep || (isDeep = path.length > 1);
+        return path;
+      });
+      copyObject(object, getAllKeysIn(object), result);
+      if (isDeep) {
+        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
+      }
+      var length = paths.length;
+      while (length--) {
+        baseUnset(result, paths[length]);
+      }
+      return result;
+    });
+ 
+    /**
+     * The opposite of `_.pickBy`; this method creates an object composed of
+     * the own and inherited enumerable string keyed properties of `object` that
+     * `predicate` doesn't return truthy for. The predicate is invoked with two
+     * arguments: (value, key).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {Function} [predicate=_.identity] The function invoked per property.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.omitBy(object, _.isNumber);
+     * // => { 'b': '2' }
+     */
+    function omitBy(object, predicate) {
+      return pickBy(object, negate(getIteratee(predicate)));
+    }
+ 
+    /**
+     * Creates an object composed of the picked `object` properties.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {...(string|string[])} [paths] The property paths to pick.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.pick(object, ['a', 'c']);
+     * // => { 'a': 1, 'c': 3 }
+     */
+    var pick = flatRest(function(object, paths) {
+      return object == null ? {} : basePick(object, paths);
+    });
+ 
+    /**
+     * Creates an object composed of the `object` properties `predicate` returns
+     * truthy for. The predicate is invoked with two arguments: (value, key).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The source object.
+     * @param {Function} [predicate=_.identity] The function invoked per property.
+     * @returns {Object} Returns the new object.
+     * @example
+     *
+     * var object = { 'a': 1, 'b': '2', 'c': 3 };
+     *
+     * _.pickBy(object, _.isNumber);
+     * // => { 'a': 1, 'c': 3 }
+     */
+    function pickBy(object, predicate) {
+      if (object == null) {
+        return {};
+      }
+      var props = arrayMap(getAllKeysIn(object), function(prop) {
+        return [prop];
+      });
+      predicate = getIteratee(predicate);
+      return basePickBy(object, props, function(value, path) {
+        return predicate(value, path[0]);
+      });
+    }
+ 
+    /**
+     * This method is like `_.get` except that if the resolved value is a
+     * function it's invoked with the `this` binding of its parent object and
+     * its result is returned.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @param {Array|string} path The path of the property to resolve.
+     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+     * @returns {*} Returns the resolved value.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
+     *
+     * _.result(object, 'a[0].b.c1');
+     * // => 3
+     *
+     * _.result(object, 'a[0].b.c2');
+     * // => 4
+     *
+     * _.result(object, 'a[0].b.c3', 'default');
+     * // => 'default'
+     *
+     * _.result(object, 'a[0].b.c3', _.constant('default'));
+     * // => 'default'
+     */
+    function result(object, path, defaultValue) {
+      path = castPath(path, object);
+ 
+      var index = -1,
+          length = path.length;
+ 
+      // Ensure the loop is entered when path is empty.
+      if (!length) {
+        length = 1;
+        object = undefined;
+      }
+      while (++index < length) {
+        var value = object == null ? undefined : object[toKey(path[index])];
+        if (value === undefined) {
+          index = length;
+          value = defaultValue;
+        }
+        object = isFunction(value) ? value.call(object) : value;
+      }
+      return object;
+    }
+ 
+    /**
+     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
+     * it's created. Arrays are created for missing index properties while objects
+     * are created for all other missing properties. Use `_.setWith` to customize
+     * `path` creation.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {*} value The value to set.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+     *
+     * _.set(object, 'a[0].b.c', 4);
+     * console.log(object.a[0].b.c);
+     * // => 4
+     *
+     * _.set(object, ['x', '0', 'y', 'z'], 5);
+     * console.log(object.x[0].y.z);
+     * // => 5
+     */
+    function set(object, path, value) {
+      return object == null ? object : baseSet(object, path, value);
+    }
+ 
+    /**
+     * This method is like `_.set` except that it accepts `customizer` which is
+     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+     * path creation is handled by the method instead. The `customizer` is invoked
+     * with three arguments: (nsValue, key, nsObject).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {*} value The value to set.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = {};
+     *
+     * _.setWith(object, '[0][1]', 'a', Object);
+     * // => { '0': { '1': 'a' } }
+     */
+    function setWith(object, path, value, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return object == null ? object : baseSet(object, path, value, customizer);
+    }
+ 
+    /**
+     * Creates an array of own enumerable string keyed-value pairs for `object`
+     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
+     * entries are returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias entries
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the key-value pairs.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.toPairs(new Foo);
+     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
+     */
+    var toPairs = createToPairs(keys);
+ 
+    /**
+     * Creates an array of own and inherited enumerable string keyed-value pairs
+     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
+     * or set, its entries are returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @alias entriesIn
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the key-value pairs.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.toPairsIn(new Foo);
+     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
+     */
+    var toPairsIn = createToPairs(keysIn);
+ 
+    /**
+     * An alternative to `_.reduce`; this method transforms `object` to a new
+     * `accumulator` object which is the result of running each of its own
+     * enumerable string keyed properties thru `iteratee`, with each invocation
+     * potentially mutating the `accumulator` object. If `accumulator` is not
+     * provided, a new object with the same `[[Prototype]]` will be used. The
+     * iteratee is invoked with four arguments: (accumulator, value, key, object).
+     * Iteratee functions may exit iteration early by explicitly returning `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.3.0
+     * @category Object
+     * @param {Object} object The object to iterate over.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @param {*} [accumulator] The custom accumulator value.
+     * @returns {*} Returns the accumulated value.
+     * @example
+     *
+     * _.transform([2, 3, 4], function(result, n) {
+     *   result.push(n *= n);
+     *   return n % 2 == 0;
+     * }, []);
+     * // => [4, 9]
+     *
+     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+     *   (result[value] || (result[value] = [])).push(key);
+     * }, {});
+     * // => { '1': ['a', 'c'], '2': ['b'] }
+     */
+    function transform(object, iteratee, accumulator) {
+      var isArr = isArray(object),
+          isArrLike = isArr || isBuffer(object) || isTypedArray(object);
+ 
+      iteratee = getIteratee(iteratee, 4);
+      if (accumulator == null) {
+        var Ctor = object && object.constructor;
+        if (isArrLike) {
+          accumulator = isArr ? new Ctor : [];
+        }
+        else if (isObject(object)) {
+          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
+        }
+        else {
+          accumulator = {};
+        }
+      }
+      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
+        return iteratee(accumulator, value, index, object);
+      });
+      return accumulator;
+    }
+ 
+    /**
+     * Removes the property at `path` of `object`.
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to unset.
+     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
+     * _.unset(object, 'a[0].b.c');
+     * // => true
+     *
+     * console.log(object);
+     * // => { 'a': [{ 'b': {} }] };
+     *
+     * _.unset(object, ['a', '0', 'b', 'c']);
+     * // => true
+     *
+     * console.log(object);
+     * // => { 'a': [{ 'b': {} }] };
+     */
+    function unset(object, path) {
+      return object == null ? true : baseUnset(object, path);
+    }
+ 
+    /**
+     * This method is like `_.set` except that accepts `updater` to produce the
+     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
+     * is invoked with one argument: (value).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.6.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {Function} updater The function to produce the updated value.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+     *
+     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
+     * console.log(object.a[0].b.c);
+     * // => 9
+     *
+     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
+     * console.log(object.x[0].y.z);
+     * // => 0
+     */
+    function update(object, path, updater) {
+      return object == null ? object : baseUpdate(object, path, castFunction(updater));
+    }
+ 
+    /**
+     * This method is like `_.update` except that it accepts `customizer` which is
+     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
+     * path creation is handled by the method instead. The `customizer` is invoked
+     * with three arguments: (nsValue, key, nsObject).
+     *
+     * **Note:** This method mutates `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.6.0
+     * @category Object
+     * @param {Object} object The object to modify.
+     * @param {Array|string} path The path of the property to set.
+     * @param {Function} updater The function to produce the updated value.
+     * @param {Function} [customizer] The function to customize assigned values.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var object = {};
+     *
+     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
+     * // => { '0': { '1': 'a' } }
+     */
+    function updateWith(object, path, updater, customizer) {
+      customizer = typeof customizer == 'function' ? customizer : undefined;
+      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
+    }
+ 
+    /**
+     * Creates an array of the own enumerable string keyed property values of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property values.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.values(new Foo);
+     * // => [1, 2] (iteration order is not guaranteed)
+     *
+     * _.values('hi');
+     * // => ['h', 'i']
+     */
+    function values(object) {
+      return object == null ? [] : baseValues(object, keys(object));
+    }
+ 
+    /**
+     * Creates an array of the own and inherited enumerable string keyed property
+     * values of `object`.
+     *
+     * **Note:** Non-object values are coerced to objects.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Object
+     * @param {Object} object The object to query.
+     * @returns {Array} Returns the array of property values.
+     * @example
+     *
+     * function Foo() {
+     *   this.a = 1;
+     *   this.b = 2;
+     * }
+     *
+     * Foo.prototype.c = 3;
+     *
+     * _.valuesIn(new Foo);
+     * // => [1, 2, 3] (iteration order is not guaranteed)
+     */
+    function valuesIn(object) {
+      return object == null ? [] : baseValues(object, keysIn(object));
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Clamps `number` within the inclusive `lower` and `upper` bounds.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Number
+     * @param {number} number The number to clamp.
+     * @param {number} [lower] The lower bound.
+     * @param {number} upper The upper bound.
+     * @returns {number} Returns the clamped number.
+     * @example
+     *
+     * _.clamp(-10, -5, 5);
+     * // => -5
+     *
+     * _.clamp(10, -5, 5);
+     * // => 5
+     */
+    function clamp(number, lower, upper) {
+      if (upper === undefined) {
+        upper = lower;
+        lower = undefined;
+      }
+      if (upper !== undefined) {
+        upper = toNumber(upper);
+        upper = upper === upper ? upper : 0;
+      }
+      if (lower !== undefined) {
+        lower = toNumber(lower);
+        lower = lower === lower ? lower : 0;
+      }
+      return baseClamp(toNumber(number), lower, upper);
+    }
+ 
+    /**
+     * Checks if `n` is between `start` and up to, but not including, `end`. If
+     * `end` is not specified, it's set to `start` with `start` then set to `0`.
+     * If `start` is greater than `end` the params are swapped to support
+     * negative ranges.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.3.0
+     * @category Number
+     * @param {number} number The number to check.
+     * @param {number} [start=0] The start of the range.
+     * @param {number} end The end of the range.
+     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
+     * @see _.range, _.rangeRight
+     * @example
+     *
+     * _.inRange(3, 2, 4);
+     * // => true
+     *
+     * _.inRange(4, 8);
+     * // => true
+     *
+     * _.inRange(4, 2);
+     * // => false
+     *
+     * _.inRange(2, 2);
+     * // => false
+     *
+     * _.inRange(1.2, 2);
+     * // => true
+     *
+     * _.inRange(5.2, 4);
+     * // => false
+     *
+     * _.inRange(-3, -2, -6);
+     * // => true
+     */
+    function inRange(number, start, end) {
+      start = toFinite(start);
+      if (end === undefined) {
+        end = start;
+        start = 0;
+      } else {
+        end = toFinite(end);
+      }
+      number = toNumber(number);
+      return baseInRange(number, start, end);
+    }
+ 
+    /**
+     * Produces a random number between the inclusive `lower` and `upper` bounds.
+     * If only one argument is provided a number between `0` and the given number
+     * is returned. If `floating` is `true`, or either `lower` or `upper` are
+     * floats, a floating-point number is returned instead of an integer.
+     *
+     * **Note:** JavaScript follows the IEEE-754 standard for resolving
+     * floating-point values which can produce unexpected results.
+     *
+     * @static
+     * @memberOf _
+     * @since 0.7.0
+     * @category Number
+     * @param {number} [lower=0] The lower bound.
+     * @param {number} [upper=1] The upper bound.
+     * @param {boolean} [floating] Specify returning a floating-point number.
+     * @returns {number} Returns the random number.
+     * @example
+     *
+     * _.random(0, 5);
+     * // => an integer between 0 and 5
+     *
+     * _.random(5);
+     * // => also an integer between 0 and 5
+     *
+     * _.random(5, true);
+     * // => a floating-point number between 0 and 5
+     *
+     * _.random(1.2, 5.2);
+     * // => a floating-point number between 1.2 and 5.2
+     */
+    function random(lower, upper, floating) {
+      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
+        upper = floating = undefined;
+      }
+      if (floating === undefined) {
+        if (typeof upper == 'boolean') {
+          floating = upper;
+          upper = undefined;
+        }
+        else if (typeof lower == 'boolean') {
+          floating = lower;
+          lower = undefined;
+        }
+      }
+      if (lower === undefined && upper === undefined) {
+        lower = 0;
+        upper = 1;
+      }
+      else {
+        lower = toFinite(lower);
+        if (upper === undefined) {
+          upper = lower;
+          lower = 0;
+        } else {
+          upper = toFinite(upper);
+        }
+      }
+      if (lower > upper) {
+        var temp = lower;
+        lower = upper;
+        upper = temp;
+      }
+      if (floating || lower % 1 || upper % 1) {
+        var rand = nativeRandom();
+        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
+      }
+      return baseRandom(lower, upper);
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the camel cased string.
+     * @example
+     *
+     * _.camelCase('Foo Bar');
+     * // => 'fooBar'
+     *
+     * _.camelCase('--foo-bar--');
+     * // => 'fooBar'
+     *
+     * _.camelCase('__FOO_BAR__');
+     * // => 'fooBar'
+     */
+    var camelCase = createCompounder(function(result, word, index) {
+      word = word.toLowerCase();
+      return result + (index ? capitalize(word) : word);
+    });
+ 
+    /**
+     * Converts the first character of `string` to upper case and the remaining
+     * to lower case.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to capitalize.
+     * @returns {string} Returns the capitalized string.
+     * @example
+     *
+     * _.capitalize('FRED');
+     * // => 'Fred'
+     */
+    function capitalize(string) {
+      return upperFirst(toString(string).toLowerCase());
+    }
+ 
+    /**
+     * Deburrs `string` by converting
+     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
+     * letters to basic Latin letters and removing
+     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to deburr.
+     * @returns {string} Returns the deburred string.
+     * @example
+     *
+     * _.deburr('déjà vu');
+     * // => 'deja vu'
+     */
+    function deburr(string) {
+      string = toString(string);
+      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
+    }
+ 
+    /**
+     * Checks if `string` ends with the given target string.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to inspect.
+     * @param {string} [target] The string to search for.
+     * @param {number} [position=string.length] The position to search up to.
+     * @returns {boolean} Returns `true` if `string` ends with `target`,
+     *  else `false`.
+     * @example
+     *
+     * _.endsWith('abc', 'c');
+     * // => true
+     *
+     * _.endsWith('abc', 'b');
+     * // => false
+     *
+     * _.endsWith('abc', 'b', 2);
+     * // => true
+     */
+    function endsWith(string, target, position) {
+      string = toString(string);
+      target = baseToString(target);
+ 
+      var length = string.length;
+      position = position === undefined
+        ? length
+        : baseClamp(toInteger(position), 0, length);
+ 
+      var end = position;
+      position -= target.length;
+      return position >= 0 && string.slice(position, end) == target;
+    }
+ 
+    /**
+     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
+     * corresponding HTML entities.
+     *
+     * **Note:** No other characters are escaped. To escape additional
+     * characters use a third-party library like [_he_](https://mths.be/he).
+     *
+     * Though the ">" character is escaped for symmetry, characters like
+     * ">" and "/" don't need escaping in HTML and have no special meaning
+     * unless they're part of a tag or unquoted attribute value. See
+     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
+     * (under "semi-related fun fact") for more details.
+     *
+     * When working with HTML you should always
+     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
+     * XSS vectors.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category String
+     * @param {string} [string=''] The string to escape.
+     * @returns {string} Returns the escaped string.
+     * @example
+     *
+     * _.escape('fred, barney, & pebbles');
+     * // => 'fred, barney, &amp; pebbles'
+     */
+    function escape(string) {
+      string = toString(string);
+      return (string && reHasUnescapedHtml.test(string))
+        ? string.replace(reUnescapedHtml, escapeHtmlChar)
+        : string;
+    }
+ 
+    /**
+     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
+     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to escape.
+     * @returns {string} Returns the escaped string.
+     * @example
+     *
+     * _.escapeRegExp('[lodash](https://lodash.com/)');
+     * // => '\[lodash\]\(https://lodash\.com/\)'
+     */
+    function escapeRegExp(string) {
+      string = toString(string);
+      return (string && reHasRegExpChar.test(string))
+        ? string.replace(reRegExpChar, '\\$&')
+        : string;
+    }
+ 
+    /**
+     * Converts `string` to
+     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the kebab cased string.
+     * @example
+     *
+     * _.kebabCase('Foo Bar');
+     * // => 'foo-bar'
+     *
+     * _.kebabCase('fooBar');
+     * // => 'foo-bar'
+     *
+     * _.kebabCase('__FOO_BAR__');
+     * // => 'foo-bar'
+     */
+    var kebabCase = createCompounder(function(result, word, index) {
+      return result + (index ? '-' : '') + word.toLowerCase();
+    });
+ 
+    /**
+     * Converts `string`, as space separated words, to lower case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the lower cased string.
+     * @example
+     *
+     * _.lowerCase('--Foo-Bar--');
+     * // => 'foo bar'
+     *
+     * _.lowerCase('fooBar');
+     * // => 'foo bar'
+     *
+     * _.lowerCase('__FOO_BAR__');
+     * // => 'foo bar'
+     */
+    var lowerCase = createCompounder(function(result, word, index) {
+      return result + (index ? ' ' : '') + word.toLowerCase();
+    });
+ 
+    /**
+     * Converts the first character of `string` to lower case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the converted string.
+     * @example
+     *
+     * _.lowerFirst('Fred');
+     * // => 'fred'
+     *
+     * _.lowerFirst('FRED');
+     * // => 'fRED'
+     */
+    var lowerFirst = createCaseFirst('toLowerCase');
+ 
+    /**
+     * Pads `string` on the left and right sides if it's shorter than `length`.
+     * Padding characters are truncated if they can't be evenly divided by `length`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to pad.
+     * @param {number} [length=0] The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padded string.
+     * @example
+     *
+     * _.pad('abc', 8);
+     * // => '  abc   '
+     *
+     * _.pad('abc', 8, '_-');
+     * // => '_-abc_-_'
+     *
+     * _.pad('abc', 3);
+     * // => 'abc'
+     */
+    function pad(string, length, chars) {
+      string = toString(string);
+      length = toInteger(length);
+ 
+      var strLength = length ? stringSize(string) : 0;
+      if (!length || strLength >= length) {
+        return string;
+      }
+      var mid = (length - strLength) / 2;
+      return (
+        createPadding(nativeFloor(mid), chars) +
+        string +
+        createPadding(nativeCeil(mid), chars)
+      );
+    }
+ 
+    /**
+     * Pads `string` on the right side if it's shorter than `length`. Padding
+     * characters are truncated if they exceed `length`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to pad.
+     * @param {number} [length=0] The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padded string.
+     * @example
+     *
+     * _.padEnd('abc', 6);
+     * // => 'abc   '
+     *
+     * _.padEnd('abc', 6, '_-');
+     * // => 'abc_-_'
+     *
+     * _.padEnd('abc', 3);
+     * // => 'abc'
+     */
+    function padEnd(string, length, chars) {
+      string = toString(string);
+      length = toInteger(length);
+ 
+      var strLength = length ? stringSize(string) : 0;
+      return (length && strLength < length)
+        ? (string + createPadding(length - strLength, chars))
+        : string;
+    }
+ 
+    /**
+     * Pads `string` on the left side if it's shorter than `length`. Padding
+     * characters are truncated if they exceed `length`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to pad.
+     * @param {number} [length=0] The padding length.
+     * @param {string} [chars=' '] The string used as padding.
+     * @returns {string} Returns the padded string.
+     * @example
+     *
+     * _.padStart('abc', 6);
+     * // => '   abc'
+     *
+     * _.padStart('abc', 6, '_-');
+     * // => '_-_abc'
+     *
+     * _.padStart('abc', 3);
+     * // => 'abc'
+     */
+    function padStart(string, length, chars) {
+      string = toString(string);
+      length = toInteger(length);
+ 
+      var strLength = length ? stringSize(string) : 0;
+      return (length && strLength < length)
+        ? (createPadding(length - strLength, chars) + string)
+        : string;
+    }
+ 
+    /**
+     * Converts `string` to an integer of the specified radix. If `radix` is
+     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
+     * hexadecimal, in which case a `radix` of `16` is used.
+     *
+     * **Note:** This method aligns with the
+     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
+     *
+     * @static
+     * @memberOf _
+     * @since 1.1.0
+     * @category String
+     * @param {string} string The string to convert.
+     * @param {number} [radix=10] The radix to interpret `value` by.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {number} Returns the converted integer.
+     * @example
+     *
+     * _.parseInt('08');
+     * // => 8
+     *
+     * _.map(['6', '08', '10'], _.parseInt);
+     * // => [6, 8, 10]
+     */
+    function parseInt(string, radix, guard) {
+      if (guard || radix == null) {
+        radix = 0;
+      } else if (radix) {
+        radix = +radix;
+      }
+      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
+    }
+ 
+    /**
+     * Repeats the given string `n` times.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to repeat.
+     * @param {number} [n=1] The number of times to repeat the string.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the repeated string.
+     * @example
+     *
+     * _.repeat('*', 3);
+     * // => '***'
+     *
+     * _.repeat('abc', 2);
+     * // => 'abcabc'
+     *
+     * _.repeat('abc', 0);
+     * // => ''
+     */
+    function repeat(string, n, guard) {
+      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
+        n = 1;
+      } else {
+        n = toInteger(n);
+      }
+      return baseRepeat(toString(string), n);
+    }
+ 
+    /**
+     * Replaces matches for `pattern` in `string` with `replacement`.
+     *
+     * **Note:** This method is based on
+     * [`String#replace`](https://mdn.io/String/replace).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to modify.
+     * @param {RegExp|string} pattern The pattern to replace.
+     * @param {Function|string} replacement The match replacement.
+     * @returns {string} Returns the modified string.
+     * @example
+     *
+     * _.replace('Hi Fred', 'Fred', 'Barney');
+     * // => 'Hi Barney'
+     */
+    function replace() {
+      var args = arguments,
+          string = toString(args[0]);
+ 
+      return args.length < 3 ? string : string.replace(args[1], args[2]);
+    }
+ 
+    /**
+     * Converts `string` to
+     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the snake cased string.
+     * @example
+     *
+     * _.snakeCase('Foo Bar');
+     * // => 'foo_bar'
+     *
+     * _.snakeCase('fooBar');
+     * // => 'foo_bar'
+     *
+     * _.snakeCase('--FOO-BAR--');
+     * // => 'foo_bar'
+     */
+    var snakeCase = createCompounder(function(result, word, index) {
+      return result + (index ? '_' : '') + word.toLowerCase();
+    });
+ 
+    /**
+     * Splits `string` by `separator`.
+     *
+     * **Note:** This method is based on
+     * [`String#split`](https://mdn.io/String/split).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to split.
+     * @param {RegExp|string} separator The separator pattern to split by.
+     * @param {number} [limit] The length to truncate results to.
+     * @returns {Array} Returns the string segments.
+     * @example
+     *
+     * _.split('a-b-c', '-', 2);
+     * // => ['a', 'b']
+     */
+    function split(string, separator, limit) {
+      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
+        separator = limit = undefined;
+      }
+      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
+      if (!limit) {
+        return [];
+      }
+      string = toString(string);
+      if (string && (
+            typeof separator == 'string' ||
+            (separator != null && !isRegExp(separator))
+          )) {
+        separator = baseToString(separator);
+        if (!separator && hasUnicode(string)) {
+          return castSlice(stringToArray(string), 0, limit);
+        }
+      }
+      return string.split(separator, limit);
+    }
+ 
+    /**
+     * Converts `string` to
+     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
+     *
+     * @static
+     * @memberOf _
+     * @since 3.1.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the start cased string.
+     * @example
+     *
+     * _.startCase('--foo-bar--');
+     * // => 'Foo Bar'
+     *
+     * _.startCase('fooBar');
+     * // => 'Foo Bar'
+     *
+     * _.startCase('__FOO_BAR__');
+     * // => 'FOO BAR'
+     */
+    var startCase = createCompounder(function(result, word, index) {
+      return result + (index ? ' ' : '') + upperFirst(word);
+    });
+ 
+    /**
+     * Checks if `string` starts with the given target string.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to inspect.
+     * @param {string} [target] The string to search for.
+     * @param {number} [position=0] The position to search from.
+     * @returns {boolean} Returns `true` if `string` starts with `target`,
+     *  else `false`.
+     * @example
+     *
+     * _.startsWith('abc', 'a');
+     * // => true
+     *
+     * _.startsWith('abc', 'b');
+     * // => false
+     *
+     * _.startsWith('abc', 'b', 1);
+     * // => true
+     */
+    function startsWith(string, target, position) {
+      string = toString(string);
+      position = position == null
+        ? 0
+        : baseClamp(toInteger(position), 0, string.length);
+ 
+      target = baseToString(target);
+      return string.slice(position, position + target.length) == target;
+    }
+ 
+    /**
+     * Creates a compiled template function that can interpolate data properties
+     * in "interpolate" delimiters, HTML-escape interpolated data properties in
+     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
+     * properties may be accessed as free variables in the template. If a setting
+     * object is given, it takes precedence over `_.templateSettings` values.
+     *
+     * **Note:** In the development build `_.template` utilizes
+     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+     * for easier debugging.
+     *
+     * For more information on precompiling templates see
+     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
+     *
+     * For more information on Chrome extension sandboxes see
+     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category String
+     * @param {string} [string=''] The template string.
+     * @param {Object} [options={}] The options object.
+     * @param {RegExp} [options.escape=_.templateSettings.escape]
+     *  The HTML "escape" delimiter.
+     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
+     *  The "evaluate" delimiter.
+     * @param {Object} [options.imports=_.templateSettings.imports]
+     *  An object to import into the template as free variables.
+     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
+     *  The "interpolate" delimiter.
+     * @param {string} [options.sourceURL='lodash.templateSources[n]']
+     *  The sourceURL of the compiled template.
+     * @param {string} [options.variable='obj']
+     *  The data object variable name.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Function} Returns the compiled template function.
+     * @example
+     *
+     * // Use the "interpolate" delimiter to create a compiled template.
+     * var compiled = _.template('hello <%= user %>!');
+     * compiled({ 'user': 'fred' });
+     * // => 'hello fred!'
+     *
+     * // Use the HTML "escape" delimiter to escape data property values.
+     * var compiled = _.template('<b><%- value %></b>');
+     * compiled({ 'value': '<script>' });
+     * // => '<b>&lt;script&gt;</b>'
+     *
+     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
+     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
+     * compiled({ 'users': ['fred', 'barney'] });
+     * // => '<li>fred</li><li>barney</li>'
+     *
+     * // Use the internal `print` function in "evaluate" delimiters.
+     * var compiled = _.template('<% print("hello " + user); %>!');
+     * compiled({ 'user': 'barney' });
+     * // => 'hello barney!'
+     *
+     * // Use the ES template literal delimiter as an "interpolate" delimiter.
+     * // Disable support by replacing the "interpolate" delimiter.
+     * var compiled = _.template('hello ${ user }!');
+     * compiled({ 'user': 'pebbles' });
+     * // => 'hello pebbles!'
+     *
+     * // Use backslashes to treat delimiters as plain text.
+     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
+     * compiled({ 'value': 'ignored' });
+     * // => '<%- value %>'
+     *
+     * // Use the `imports` option to import `jQuery` as `jq`.
+     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
+     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
+     * compiled({ 'users': ['fred', 'barney'] });
+     * // => '<li>fred</li><li>barney</li>'
+     *
+     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
+     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
+     * compiled(data);
+     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
+     *
+     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
+     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
+     * compiled.source;
+     * // => function(data) {
+     * //   var __t, __p = '';
+     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
+     * //   return __p;
+     * // }
+     *
+     * // Use custom template delimiters.
+     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
+     * var compiled = _.template('hello {{ user }}!');
+     * compiled({ 'user': 'mustache' });
+     * // => 'hello mustache!'
+     *
+     * // Use the `source` property to inline compiled templates for meaningful
+     * // line numbers in error messages and stack traces.
+     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
+     *   var JST = {\
+     *     "main": ' + _.template(mainText).source + '\
+     *   };\
+     * ');
+     */
+    function template(string, options, guard) {
+      // Based on John Resig's `tmpl` implementation
+      // (http://ejohn.org/blog/javascript-micro-templating/)
+      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
+      var settings = lodash.templateSettings;
+ 
+      if (guard && isIterateeCall(string, options, guard)) {
+        options = undefined;
+      }
+      string = toString(string);
+      options = assignInWith({}, options, settings, customDefaultsAssignIn);
+ 
+      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
+          importsKeys = keys(imports),
+          importsValues = baseValues(imports, importsKeys);
+ 
+      var isEscaping,
+          isEvaluating,
+          index = 0,
+          interpolate = options.interpolate || reNoMatch,
+          source = "__p += '";
+ 
+      // Compile the regexp to match each delimiter.
+      var reDelimiters = RegExp(
+        (options.escape || reNoMatch).source + '|' +
+        interpolate.source + '|' +
+        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
+        (options.evaluate || reNoMatch).source + '|$'
+      , 'g');
+ 
+      // Use a sourceURL for easier debugging.
+      var sourceURL = '//# sourceURL=' +
+        ('sourceURL' in options
+          ? options.sourceURL
+          : ('lodash.templateSources[' + (++templateCounter) + ']')
+        ) + '\n';
+ 
+      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
+        interpolateValue || (interpolateValue = esTemplateValue);
+ 
+        // Escape characters that can't be included in string literals.
+        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
+ 
+        // Replace delimiters with snippets.
+        if (escapeValue) {
+          isEscaping = true;
+          source += "' +\n__e(" + escapeValue + ") +\n'";
+        }
+        if (evaluateValue) {
+          isEvaluating = true;
+          source += "';\n" + evaluateValue + ";\n__p += '";
+        }
+        if (interpolateValue) {
+          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
+        }
+        index = offset + match.length;
+ 
+        // The JS engine embedded in Adobe products needs `match` returned in
+        // order to produce the correct `offset` value.
+        return match;
+      });
+ 
+      source += "';\n";
+ 
+      // If `variable` is not specified wrap a with-statement around the generated
+      // code to add the data object to the top of the scope chain.
+      var variable = options.variable;
+      if (!variable) {
+        source = 'with (obj) {\n' + source + '\n}\n';
+      }
+      // Cleanup code by stripping empty strings.
+      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
+        .replace(reEmptyStringMiddle, '$1')
+        .replace(reEmptyStringTrailing, '$1;');
+ 
+      // Frame code as the function body.
+      source = 'function(' + (variable || 'obj') + ') {\n' +
+        (variable
+          ? ''
+          : 'obj || (obj = {});\n'
+        ) +
+        "var __t, __p = ''" +
+        (isEscaping
+           ? ', __e = _.escape'
+           : ''
+        ) +
+        (isEvaluating
+          ? ', __j = Array.prototype.join;\n' +
+            "function print() { __p += __j.call(arguments, '') }\n"
+          : ';\n'
+        ) +
+        source +
+        'return __p\n}';
+ 
+      var result = attempt(function() {
+        return Function(importsKeys, sourceURL + 'return ' + source)
+          .apply(undefined, importsValues);
+      });
+ 
+      // Provide the compiled function's source by its `toString` method or
+      // the `source` property as a convenience for inlining compiled templates.
+      result.source = source;
+      if (isError(result)) {
+        throw result;
+      }
+      return result;
+    }
+ 
+    /**
+     * Converts `string`, as a whole, to lower case just like
+     * [String#toLowerCase](https://mdn.io/toLowerCase).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the lower cased string.
+     * @example
+     *
+     * _.toLower('--Foo-Bar--');
+     * // => '--foo-bar--'
+     *
+     * _.toLower('fooBar');
+     * // => 'foobar'
+     *
+     * _.toLower('__FOO_BAR__');
+     * // => '__foo_bar__'
+     */
+    function toLower(value) {
+      return toString(value).toLowerCase();
+    }
+ 
+    /**
+     * Converts `string`, as a whole, to upper case just like
+     * [String#toUpperCase](https://mdn.io/toUpperCase).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the upper cased string.
+     * @example
+     *
+     * _.toUpper('--foo-bar--');
+     * // => '--FOO-BAR--'
+     *
+     * _.toUpper('fooBar');
+     * // => 'FOOBAR'
+     *
+     * _.toUpper('__foo_bar__');
+     * // => '__FOO_BAR__'
+     */
+    function toUpper(value) {
+      return toString(value).toUpperCase();
+    }
+ 
+    /**
+     * Removes leading and trailing whitespace or specified characters from `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to trim.
+     * @param {string} [chars=whitespace] The characters to trim.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the trimmed string.
+     * @example
+     *
+     * _.trim('  abc  ');
+     * // => 'abc'
+     *
+     * _.trim('-_-abc-_-', '_-');
+     * // => 'abc'
+     *
+     * _.map(['  foo  ', '  bar  '], _.trim);
+     * // => ['foo', 'bar']
+     */
+    function trim(string, chars, guard) {
+      string = toString(string);
+      if (string && (guard || chars === undefined)) {
+        return string.replace(reTrim, '');
+      }
+      if (!string || !(chars = baseToString(chars))) {
+        return string;
+      }
+      var strSymbols = stringToArray(string),
+          chrSymbols = stringToArray(chars),
+          start = charsStartIndex(strSymbols, chrSymbols),
+          end = charsEndIndex(strSymbols, chrSymbols) + 1;
+ 
+      return castSlice(strSymbols, start, end).join('');
+    }
+ 
+    /**
+     * Removes trailing whitespace or specified characters from `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to trim.
+     * @param {string} [chars=whitespace] The characters to trim.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the trimmed string.
+     * @example
+     *
+     * _.trimEnd('  abc  ');
+     * // => '  abc'
+     *
+     * _.trimEnd('-_-abc-_-', '_-');
+     * // => '-_-abc'
+     */
+    function trimEnd(string, chars, guard) {
+      string = toString(string);
+      if (string && (guard || chars === undefined)) {
+        return string.replace(reTrimEnd, '');
+      }
+      if (!string || !(chars = baseToString(chars))) {
+        return string;
+      }
+      var strSymbols = stringToArray(string),
+          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
+ 
+      return castSlice(strSymbols, 0, end).join('');
+    }
+ 
+    /**
+     * Removes leading whitespace or specified characters from `string`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to trim.
+     * @param {string} [chars=whitespace] The characters to trim.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {string} Returns the trimmed string.
+     * @example
+     *
+     * _.trimStart('  abc  ');
+     * // => 'abc  '
+     *
+     * _.trimStart('-_-abc-_-', '_-');
+     * // => 'abc-_-'
+     */
+    function trimStart(string, chars, guard) {
+      string = toString(string);
+      if (string && (guard || chars === undefined)) {
+        return string.replace(reTrimStart, '');
+      }
+      if (!string || !(chars = baseToString(chars))) {
+        return string;
+      }
+      var strSymbols = stringToArray(string),
+          start = charsStartIndex(strSymbols, stringToArray(chars));
+ 
+      return castSlice(strSymbols, start).join('');
+    }
+ 
+    /**
+     * Truncates `string` if it's longer than the given maximum string length.
+     * The last characters of the truncated string are replaced with the omission
+     * string which defaults to "...".
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to truncate.
+     * @param {Object} [options={}] The options object.
+     * @param {number} [options.length=30] The maximum string length.
+     * @param {string} [options.omission='...'] The string to indicate text is omitted.
+     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
+     * @returns {string} Returns the truncated string.
+     * @example
+     *
+     * _.truncate('hi-diddly-ho there, neighborino');
+     * // => 'hi-diddly-ho there, neighbo...'
+     *
+     * _.truncate('hi-diddly-ho there, neighborino', {
+     *   'length': 24,
+     *   'separator': ' '
+     * });
+     * // => 'hi-diddly-ho there,...'
+     *
+     * _.truncate('hi-diddly-ho there, neighborino', {
+     *   'length': 24,
+     *   'separator': /,? +/
+     * });
+     * // => 'hi-diddly-ho there...'
+     *
+     * _.truncate('hi-diddly-ho there, neighborino', {
+     *   'omission': ' [...]'
+     * });
+     * // => 'hi-diddly-ho there, neig [...]'
+     */
+    function truncate(string, options) {
+      var length = DEFAULT_TRUNC_LENGTH,
+          omission = DEFAULT_TRUNC_OMISSION;
+ 
+      if (isObject(options)) {
+        var separator = 'separator' in options ? options.separator : separator;
+        length = 'length' in options ? toInteger(options.length) : length;
+        omission = 'omission' in options ? baseToString(options.omission) : omission;
+      }
+      string = toString(string);
+ 
+      var strLength = string.length;
+      if (hasUnicode(string)) {
+        var strSymbols = stringToArray(string);
+        strLength = strSymbols.length;
+      }
+      if (length >= strLength) {
+        return string;
+      }
+      var end = length - stringSize(omission);
+      if (end < 1) {
+        return omission;
+      }
+      var result = strSymbols
+        ? castSlice(strSymbols, 0, end).join('')
+        : string.slice(0, end);
+ 
+      if (separator === undefined) {
+        return result + omission;
+      }
+      if (strSymbols) {
+        end += (result.length - end);
+      }
+      if (isRegExp(separator)) {
+        if (string.slice(end).search(separator)) {
+          var match,
+              substring = result;
+ 
+          if (!separator.global) {
+            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
+          }
+          separator.lastIndex = 0;
+          while ((match = separator.exec(substring))) {
+            var newEnd = match.index;
+          }
+          result = result.slice(0, newEnd === undefined ? end : newEnd);
+        }
+      } else if (string.indexOf(baseToString(separator), end) != end) {
+        var index = result.lastIndexOf(separator);
+        if (index > -1) {
+          result = result.slice(0, index);
+        }
+      }
+      return result + omission;
+    }
+ 
+    /**
+     * The inverse of `_.escape`; this method converts the HTML entities
+     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
+     * their corresponding characters.
+     *
+     * **Note:** No other HTML entities are unescaped. To unescape additional
+     * HTML entities use a third-party library like [_he_](https://mths.be/he).
+     *
+     * @static
+     * @memberOf _
+     * @since 0.6.0
+     * @category String
+     * @param {string} [string=''] The string to unescape.
+     * @returns {string} Returns the unescaped string.
+     * @example
+     *
+     * _.unescape('fred, barney, &amp; pebbles');
+     * // => 'fred, barney, & pebbles'
+     */
+    function unescape(string) {
+      string = toString(string);
+      return (string && reHasEscapedHtml.test(string))
+        ? string.replace(reEscapedHtml, unescapeHtmlChar)
+        : string;
+    }
+ 
+    /**
+     * Converts `string`, as space separated words, to upper case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the upper cased string.
+     * @example
+     *
+     * _.upperCase('--foo-bar');
+     * // => 'FOO BAR'
+     *
+     * _.upperCase('fooBar');
+     * // => 'FOO BAR'
+     *
+     * _.upperCase('__foo_bar__');
+     * // => 'FOO BAR'
+     */
+    var upperCase = createCompounder(function(result, word, index) {
+      return result + (index ? ' ' : '') + word.toUpperCase();
+    });
+ 
+    /**
+     * Converts the first character of `string` to upper case.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category String
+     * @param {string} [string=''] The string to convert.
+     * @returns {string} Returns the converted string.
+     * @example
+     *
+     * _.upperFirst('fred');
+     * // => 'Fred'
+     *
+     * _.upperFirst('FRED');
+     * // => 'FRED'
+     */
+    var upperFirst = createCaseFirst('toUpperCase');
+ 
+    /**
+     * Splits `string` into an array of its words.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category String
+     * @param {string} [string=''] The string to inspect.
+     * @param {RegExp|string} [pattern] The pattern to match words.
+     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
+     * @returns {Array} Returns the words of `string`.
+     * @example
+     *
+     * _.words('fred, barney, & pebbles');
+     * // => ['fred', 'barney', 'pebbles']
+     *
+     * _.words('fred, barney, & pebbles', /[^, ]+/g);
+     * // => ['fred', 'barney', '&', 'pebbles']
+     */
+    function words(string, pattern, guard) {
+      string = toString(string);
+      pattern = guard ? undefined : pattern;
+ 
+      if (pattern === undefined) {
+        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
+      }
+      return string.match(pattern) || [];
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Attempts to invoke `func`, returning either the result or the caught error
+     * object. Any additional arguments are provided to `func` when it's invoked.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {Function} func The function to attempt.
+     * @param {...*} [args] The arguments to invoke `func` with.
+     * @returns {*} Returns the `func` result or error object.
+     * @example
+     *
+     * // Avoid throwing errors for invalid selectors.
+     * var elements = _.attempt(function(selector) {
+     *   return document.querySelectorAll(selector);
+     * }, '>_>');
+     *
+     * if (_.isError(elements)) {
+     *   elements = [];
+     * }
+     */
+    var attempt = baseRest(function(func, args) {
+      try {
+        return apply(func, undefined, args);
+      } catch (e) {
+        return isError(e) ? e : new Error(e);
+      }
+    });
+ 
+    /**
+     * Binds methods of an object to the object itself, overwriting the existing
+     * method.
+     *
+     * **Note:** This method doesn't set the "length" property of bound functions.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {Object} object The object to bind and assign the bound methods to.
+     * @param {...(string|string[])} methodNames The object method names to bind.
+     * @returns {Object} Returns `object`.
+     * @example
+     *
+     * var view = {
+     *   'label': 'docs',
+     *   'click': function() {
+     *     console.log('clicked ' + this.label);
+     *   }
+     * };
+     *
+     * _.bindAll(view, ['click']);
+     * jQuery(element).on('click', view.click);
+     * // => Logs 'clicked docs' when clicked.
+     */
+    var bindAll = flatRest(function(object, methodNames) {
+      arrayEach(methodNames, function(key) {
+        key = toKey(key);
+        baseAssignValue(object, key, bind(object[key], object));
+      });
+      return object;
+    });
+ 
+    /**
+     * Creates a function that iterates over `pairs` and invokes the corresponding
+     * function of the first predicate to return truthy. The predicate-function
+     * pairs are invoked with the `this` binding and arguments of the created
+     * function.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {Array} pairs The predicate-function pairs.
+     * @returns {Function} Returns the new composite function.
+     * @example
+     *
+     * var func = _.cond([
+     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
+     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
+     *   [_.stubTrue,                      _.constant('no match')]
+     * ]);
+     *
+     * func({ 'a': 1, 'b': 2 });
+     * // => 'matches A'
+     *
+     * func({ 'a': 0, 'b': 1 });
+     * // => 'matches B'
+     *
+     * func({ 'a': '1', 'b': '2' });
+     * // => 'no match'
+     */
+    function cond(pairs) {
+      var length = pairs == null ? 0 : pairs.length,
+          toIteratee = getIteratee();
+ 
+      pairs = !length ? [] : arrayMap(pairs, function(pair) {
+        if (typeof pair[1] != 'function') {
+          throw new TypeError(FUNC_ERROR_TEXT);
+        }
+        return [toIteratee(pair[0]), pair[1]];
+      });
+ 
+      return baseRest(function(args) {
+        var index = -1;
+        while (++index < length) {
+          var pair = pairs[index];
+          if (apply(pair[0], this, args)) {
+            return apply(pair[1], this, args);
+          }
+        }
+      });
+    }
+ 
+    /**
+     * Creates a function that invokes the predicate properties of `source` with
+     * the corresponding property values of a given object, returning `true` if
+     * all predicates return truthy, else `false`.
+     *
+     * **Note:** The created function is equivalent to `_.conformsTo` with
+     * `source` partially applied.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {Object} source The object of property predicates to conform to.
+     * @returns {Function} Returns the new spec function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': 2, 'b': 1 },
+     *   { 'a': 1, 'b': 2 }
+     * ];
+     *
+     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
+     * // => [{ 'a': 1, 'b': 2 }]
+     */
+    function conforms(source) {
+      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
+    }
+ 
+    /**
+     * Creates a function that returns `value`.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Util
+     * @param {*} value The value to return from the new function.
+     * @returns {Function} Returns the new constant function.
+     * @example
+     *
+     * var objects = _.times(2, _.constant({ 'a': 1 }));
+     *
+     * console.log(objects);
+     * // => [{ 'a': 1 }, { 'a': 1 }]
+     *
+     * console.log(objects[0] === objects[1]);
+     * // => true
+     */
+    function constant(value) {
+      return function() {
+        return value;
+      };
+    }
+ 
+    /**
+     * Checks `value` to determine whether a default value should be returned in
+     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
+     * or `undefined`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.14.0
+     * @category Util
+     * @param {*} value The value to check.
+     * @param {*} defaultValue The default value.
+     * @returns {*} Returns the resolved value.
+     * @example
+     *
+     * _.defaultTo(1, 10);
+     * // => 1
+     *
+     * _.defaultTo(undefined, 10);
+     * // => 10
+     */
+    function defaultTo(value, defaultValue) {
+      return (value == null || value !== value) ? defaultValue : value;
+    }
+ 
+    /**
+     * Creates a function that returns the result of invoking the given functions
+     * with the `this` binding of the created function, where each successive
+     * invocation is supplied the return value of the previous.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [funcs] The functions to invoke.
+     * @returns {Function} Returns the new composite function.
+     * @see _.flowRight
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var addSquare = _.flow([_.add, square]);
+     * addSquare(1, 2);
+     * // => 9
+     */
+    var flow = createFlow();
+ 
+    /**
+     * This method is like `_.flow` except that it creates a function that
+     * invokes the given functions from right to left.
+     *
+     * @static
+     * @since 3.0.0
+     * @memberOf _
+     * @category Util
+     * @param {...(Function|Function[])} [funcs] The functions to invoke.
+     * @returns {Function} Returns the new composite function.
+     * @see _.flow
+     * @example
+     *
+     * function square(n) {
+     *   return n * n;
+     * }
+     *
+     * var addSquare = _.flowRight([square, _.add]);
+     * addSquare(1, 2);
+     * // => 9
+     */
+    var flowRight = createFlow(true);
+ 
+    /**
+     * This method returns the first argument it receives.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {*} value Any value.
+     * @returns {*} Returns `value`.
+     * @example
+     *
+     * var object = { 'a': 1 };
+     *
+     * console.log(_.identity(object) === object);
+     * // => true
+     */
+    function identity(value) {
+      return value;
+    }
+ 
+    /**
+     * Creates a function that invokes `func` with the arguments of the created
+     * function. If `func` is a property name, the created function returns the
+     * property value for a given element. If `func` is an array or object, the
+     * created function returns `true` for elements that contain the equivalent
+     * source properties, otherwise it returns `false`.
+     *
+     * @static
+     * @since 4.0.0
+     * @memberOf _
+     * @category Util
+     * @param {*} [func=_.identity] The value to convert to a callback.
+     * @returns {Function} Returns the callback.
+     * @example
+     *
+     * var users = [
+     *   { 'user': 'barney', 'age': 36, 'active': true },
+     *   { 'user': 'fred',   'age': 40, 'active': false }
+     * ];
+     *
+     * // The `_.matches` iteratee shorthand.
+     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
+     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
+     *
+     * // The `_.matchesProperty` iteratee shorthand.
+     * _.filter(users, _.iteratee(['user', 'fred']));
+     * // => [{ 'user': 'fred', 'age': 40 }]
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.map(users, _.iteratee('user'));
+     * // => ['barney', 'fred']
+     *
+     * // Create custom iteratee shorthands.
+     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
+     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
+     *     return func.test(string);
+     *   };
+     * });
+     *
+     * _.filter(['abc', 'def'], /ef/);
+     * // => ['def']
+     */
+    function iteratee(func) {
+      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
+    }
+ 
+    /**
+     * Creates a function that performs a partial deep comparison between a given
+     * object and `source`, returning `true` if the given object has equivalent
+     * property values, else `false`.
+     *
+     * **Note:** The created function is equivalent to `_.isMatch` with `source`
+     * partially applied.
+     *
+     * Partial comparisons will match empty array and empty object `source`
+     * values against any array or object value, respectively. See `_.isEqual`
+     * for a list of supported value comparisons.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {Object} source The object of property values to match.
+     * @returns {Function} Returns the new spec function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': 1, 'b': 2, 'c': 3 },
+     *   { 'a': 4, 'b': 5, 'c': 6 }
+     * ];
+     *
+     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
+     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
+     */
+    function matches(source) {
+      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
+    }
+ 
+    /**
+     * Creates a function that performs a partial deep comparison between the
+     * value at `path` of a given object to `srcValue`, returning `true` if the
+     * object value is equivalent, else `false`.
+     *
+     * **Note:** Partial comparisons will match empty array and empty object
+     * `srcValue` values against any array or object value, respectively. See
+     * `_.isEqual` for a list of supported value comparisons.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.2.0
+     * @category Util
+     * @param {Array|string} path The path of the property to get.
+     * @param {*} srcValue The value to match.
+     * @returns {Function} Returns the new spec function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': 1, 'b': 2, 'c': 3 },
+     *   { 'a': 4, 'b': 5, 'c': 6 }
+     * ];
+     *
+     * _.find(objects, _.matchesProperty('a', 4));
+     * // => { 'a': 4, 'b': 5, 'c': 6 }
+     */
+    function matchesProperty(path, srcValue) {
+      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
+    }
+ 
+    /**
+     * Creates a function that invokes the method at `path` of a given object.
+     * Any additional arguments are provided to the invoked method.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Util
+     * @param {Array|string} path The path of the method to invoke.
+     * @param {...*} [args] The arguments to invoke the method with.
+     * @returns {Function} Returns the new invoker function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': { 'b': _.constant(2) } },
+     *   { 'a': { 'b': _.constant(1) } }
+     * ];
+     *
+     * _.map(objects, _.method('a.b'));
+     * // => [2, 1]
+     *
+     * _.map(objects, _.method(['a', 'b']));
+     * // => [2, 1]
+     */
+    var method = baseRest(function(path, args) {
+      return function(object) {
+        return baseInvoke(object, path, args);
+      };
+    });
+ 
+    /**
+     * The opposite of `_.method`; this method creates a function that invokes
+     * the method at a given path of `object`. Any additional arguments are
+     * provided to the invoked method.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.7.0
+     * @category Util
+     * @param {Object} object The object to query.
+     * @param {...*} [args] The arguments to invoke the method with.
+     * @returns {Function} Returns the new invoker function.
+     * @example
+     *
+     * var array = _.times(3, _.constant),
+     *     object = { 'a': array, 'b': array, 'c': array };
+     *
+     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
+     * // => [2, 0]
+     *
+     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
+     * // => [2, 0]
+     */
+    var methodOf = baseRest(function(object, args) {
+      return function(path) {
+        return baseInvoke(object, path, args);
+      };
+    });
+ 
+    /**
+     * Adds all own enumerable string keyed function properties of a source
+     * object to the destination object. If `object` is a function, then methods
+     * are added to its prototype as well.
+     *
+     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
+     * avoid conflicts caused by modifying the original.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {Function|Object} [object=lodash] The destination object.
+     * @param {Object} source The object of functions to add.
+     * @param {Object} [options={}] The options object.
+     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
+     * @returns {Function|Object} Returns `object`.
+     * @example
+     *
+     * function vowels(string) {
+     *   return _.filter(string, function(v) {
+     *     return /[aeiou]/i.test(v);
+     *   });
+     * }
+     *
+     * _.mixin({ 'vowels': vowels });
+     * _.vowels('fred');
+     * // => ['e']
+     *
+     * _('fred').vowels().value();
+     * // => ['e']
+     *
+     * _.mixin({ 'vowels': vowels }, { 'chain': false });
+     * _('fred').vowels();
+     * // => ['e']
+     */
+    function mixin(object, source, options) {
+      var props = keys(source),
+          methodNames = baseFunctions(source, props);
+ 
+      if (options == null &&
+          !(isObject(source) && (methodNames.length || !props.length))) {
+        options = source;
+        source = object;
+        object = this;
+        methodNames = baseFunctions(source, keys(source));
+      }
+      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
+          isFunc = isFunction(object);
+ 
+      arrayEach(methodNames, function(methodName) {
+        var func = source[methodName];
+        object[methodName] = func;
+        if (isFunc) {
+          object.prototype[methodName] = function() {
+            var chainAll = this.__chain__;
+            if (chain || chainAll) {
+              var result = object(this.__wrapped__),
+                  actions = result.__actions__ = copyArray(this.__actions__);
+ 
+              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
+              result.__chain__ = chainAll;
+              return result;
+            }
+            return func.apply(object, arrayPush([this.value()], arguments));
+          };
+        }
+      });
+ 
+      return object;
+    }
+ 
+    /**
+     * Reverts the `_` variable to its previous value and returns a reference to
+     * the `lodash` function.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @returns {Function} Returns the `lodash` function.
+     * @example
+     *
+     * var lodash = _.noConflict();
+     */
+    function noConflict() {
+      if (root._ === this) {
+        root._ = oldDash;
+      }
+      return this;
+    }
+ 
+    /**
+     * This method returns `undefined`.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.3.0
+     * @category Util
+     * @example
+     *
+     * _.times(2, _.noop);
+     * // => [undefined, undefined]
+     */
+    function noop() {
+      // No operation performed.
+    }
+ 
+    /**
+     * Creates a function that gets the argument at index `n`. If `n` is negative,
+     * the nth argument from the end is returned.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {number} [n=0] The index of the argument to return.
+     * @returns {Function} Returns the new pass-thru function.
+     * @example
+     *
+     * var func = _.nthArg(1);
+     * func('a', 'b', 'c', 'd');
+     * // => 'b'
+     *
+     * var func = _.nthArg(-2);
+     * func('a', 'b', 'c', 'd');
+     * // => 'c'
+     */
+    function nthArg(n) {
+      n = toInteger(n);
+      return baseRest(function(args) {
+        return baseNth(args, n);
+      });
+    }
+ 
+    /**
+     * Creates a function that invokes `iteratees` with the arguments it receives
+     * and returns their results.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [iteratees=[_.identity]]
+     *  The iteratees to invoke.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var func = _.over([Math.max, Math.min]);
+     *
+     * func(1, 2, 3, 4);
+     * // => [4, 1]
+     */
+    var over = createOver(arrayMap);
+ 
+    /**
+     * Creates a function that checks if **all** of the `predicates` return
+     * truthy when invoked with the arguments it receives.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [predicates=[_.identity]]
+     *  The predicates to check.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var func = _.overEvery([Boolean, isFinite]);
+     *
+     * func('1');
+     * // => true
+     *
+     * func(null);
+     * // => false
+     *
+     * func(NaN);
+     * // => false
+     */
+    var overEvery = createOver(arrayEvery);
+ 
+    /**
+     * Creates a function that checks if **any** of the `predicates` return
+     * truthy when invoked with the arguments it receives.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {...(Function|Function[])} [predicates=[_.identity]]
+     *  The predicates to check.
+     * @returns {Function} Returns the new function.
+     * @example
+     *
+     * var func = _.overSome([Boolean, isFinite]);
+     *
+     * func('1');
+     * // => true
+     *
+     * func(null);
+     * // => true
+     *
+     * func(NaN);
+     * // => false
+     */
+    var overSome = createOver(arraySome);
+ 
+    /**
+     * Creates a function that returns the value at `path` of a given object.
+     *
+     * @static
+     * @memberOf _
+     * @since 2.4.0
+     * @category Util
+     * @param {Array|string} path The path of the property to get.
+     * @returns {Function} Returns the new accessor function.
+     * @example
+     *
+     * var objects = [
+     *   { 'a': { 'b': 2 } },
+     *   { 'a': { 'b': 1 } }
+     * ];
+     *
+     * _.map(objects, _.property('a.b'));
+     * // => [2, 1]
+     *
+     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
+     * // => [1, 2]
+     */
+    function property(path) {
+      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
+    }
+ 
+    /**
+     * The opposite of `_.property`; this method creates a function that returns
+     * the value at a given path of `object`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.0.0
+     * @category Util
+     * @param {Object} object The object to query.
+     * @returns {Function} Returns the new accessor function.
+     * @example
+     *
+     * var array = [0, 1, 2],
+     *     object = { 'a': array, 'b': array, 'c': array };
+     *
+     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
+     * // => [2, 0]
+     *
+     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
+     * // => [2, 0]
+     */
+    function propertyOf(object) {
+      return function(path) {
+        return object == null ? undefined : baseGet(object, path);
+      };
+    }
+ 
+    /**
+     * Creates an array of numbers (positive and/or negative) progressing from
+     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
+     * `start` is specified without an `end` or `step`. If `end` is not specified,
+     * it's set to `start` with `start` then set to `0`.
+     *
+     * **Note:** JavaScript follows the IEEE-754 standard for resolving
+     * floating-point values which can produce unexpected results.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {number} [start=0] The start of the range.
+     * @param {number} end The end of the range.
+     * @param {number} [step=1] The value to increment or decrement by.
+     * @returns {Array} Returns the range of numbers.
+     * @see _.inRange, _.rangeRight
+     * @example
+     *
+     * _.range(4);
+     * // => [0, 1, 2, 3]
+     *
+     * _.range(-4);
+     * // => [0, -1, -2, -3]
+     *
+     * _.range(1, 5);
+     * // => [1, 2, 3, 4]
+     *
+     * _.range(0, 20, 5);
+     * // => [0, 5, 10, 15]
+     *
+     * _.range(0, -4, -1);
+     * // => [0, -1, -2, -3]
+     *
+     * _.range(1, 4, 0);
+     * // => [1, 1, 1]
+     *
+     * _.range(0);
+     * // => []
+     */
+    var range = createRange();
+ 
+    /**
+     * This method is like `_.range` except that it populates values in
+     * descending order.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {number} [start=0] The start of the range.
+     * @param {number} end The end of the range.
+     * @param {number} [step=1] The value to increment or decrement by.
+     * @returns {Array} Returns the range of numbers.
+     * @see _.inRange, _.range
+     * @example
+     *
+     * _.rangeRight(4);
+     * // => [3, 2, 1, 0]
+     *
+     * _.rangeRight(-4);
+     * // => [-3, -2, -1, 0]
+     *
+     * _.rangeRight(1, 5);
+     * // => [4, 3, 2, 1]
+     *
+     * _.rangeRight(0, 20, 5);
+     * // => [15, 10, 5, 0]
+     *
+     * _.rangeRight(0, -4, -1);
+     * // => [-3, -2, -1, 0]
+     *
+     * _.rangeRight(1, 4, 0);
+     * // => [1, 1, 1]
+     *
+     * _.rangeRight(0);
+     * // => []
+     */
+    var rangeRight = createRange(true);
+ 
+    /**
+     * This method returns a new empty array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {Array} Returns the new empty array.
+     * @example
+     *
+     * var arrays = _.times(2, _.stubArray);
+     *
+     * console.log(arrays);
+     * // => [[], []]
+     *
+     * console.log(arrays[0] === arrays[1]);
+     * // => false
+     */
+    function stubArray() {
+      return [];
+    }
+ 
+    /**
+     * This method returns `false`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {boolean} Returns `false`.
+     * @example
+     *
+     * _.times(2, _.stubFalse);
+     * // => [false, false]
+     */
+    function stubFalse() {
+      return false;
+    }
+ 
+    /**
+     * This method returns a new empty object.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {Object} Returns the new empty object.
+     * @example
+     *
+     * var objects = _.times(2, _.stubObject);
+     *
+     * console.log(objects);
+     * // => [{}, {}]
+     *
+     * console.log(objects[0] === objects[1]);
+     * // => false
+     */
+    function stubObject() {
+      return {};
+    }
+ 
+    /**
+     * This method returns an empty string.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {string} Returns the empty string.
+     * @example
+     *
+     * _.times(2, _.stubString);
+     * // => ['', '']
+     */
+    function stubString() {
+      return '';
+    }
+ 
+    /**
+     * This method returns `true`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.13.0
+     * @category Util
+     * @returns {boolean} Returns `true`.
+     * @example
+     *
+     * _.times(2, _.stubTrue);
+     * // => [true, true]
+     */
+    function stubTrue() {
+      return true;
+    }
+ 
+    /**
+     * Invokes the iteratee `n` times, returning an array of the results of
+     * each invocation. The iteratee is invoked with one argument; (index).
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {number} n The number of times to invoke `iteratee`.
+     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+     * @returns {Array} Returns the array of results.
+     * @example
+     *
+     * _.times(3, String);
+     * // => ['0', '1', '2']
+     *
+     *  _.times(4, _.constant(0));
+     * // => [0, 0, 0, 0]
+     */
+    function times(n, iteratee) {
+      n = toInteger(n);
+      if (n < 1 || n > MAX_SAFE_INTEGER) {
+        return [];
+      }
+      var index = MAX_ARRAY_LENGTH,
+          length = nativeMin(n, MAX_ARRAY_LENGTH);
+ 
+      iteratee = getIteratee(iteratee);
+      n -= MAX_ARRAY_LENGTH;
+ 
+      var result = baseTimes(length, iteratee);
+      while (++index < n) {
+        iteratee(index);
+      }
+      return result;
+    }
+ 
+    /**
+     * Converts `value` to a property path array.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Util
+     * @param {*} value The value to convert.
+     * @returns {Array} Returns the new property path array.
+     * @example
+     *
+     * _.toPath('a.b.c');
+     * // => ['a', 'b', 'c']
+     *
+     * _.toPath('a[0].b.c');
+     * // => ['a', '0', 'b', 'c']
+     */
+    function toPath(value) {
+      if (isArray(value)) {
+        return arrayMap(value, toKey);
+      }
+      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
+    }
+ 
+    /**
+     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Util
+     * @param {string} [prefix=''] The value to prefix the ID with.
+     * @returns {string} Returns the unique ID.
+     * @example
+     *
+     * _.uniqueId('contact_');
+     * // => 'contact_104'
+     *
+     * _.uniqueId();
+     * // => '105'
+     */
+    function uniqueId(prefix) {
+      var id = ++idCounter;
+      return toString(prefix) + id;
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * Adds two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.4.0
+     * @category Math
+     * @param {number} augend The first number in an addition.
+     * @param {number} addend The second number in an addition.
+     * @returns {number} Returns the total.
+     * @example
+     *
+     * _.add(6, 4);
+     * // => 10
+     */
+    var add = createMathOperation(function(augend, addend) {
+      return augend + addend;
+    }, 0);
+ 
+    /**
+     * Computes `number` rounded up to `precision`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Math
+     * @param {number} number The number to round up.
+     * @param {number} [precision=0] The precision to round up to.
+     * @returns {number} Returns the rounded up number.
+     * @example
+     *
+     * _.ceil(4.006);
+     * // => 5
+     *
+     * _.ceil(6.004, 2);
+     * // => 6.01
+     *
+     * _.ceil(6040, -2);
+     * // => 6100
+     */
+    var ceil = createRound('ceil');
+ 
+    /**
+     * Divide two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Math
+     * @param {number} dividend The first number in a division.
+     * @param {number} divisor The second number in a division.
+     * @returns {number} Returns the quotient.
+     * @example
+     *
+     * _.divide(6, 4);
+     * // => 1.5
+     */
+    var divide = createMathOperation(function(dividend, divisor) {
+      return dividend / divisor;
+    }, 1);
+ 
+    /**
+     * Computes `number` rounded down to `precision`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Math
+     * @param {number} number The number to round down.
+     * @param {number} [precision=0] The precision to round down to.
+     * @returns {number} Returns the rounded down number.
+     * @example
+     *
+     * _.floor(4.006);
+     * // => 4
+     *
+     * _.floor(0.046, 2);
+     * // => 0.04
+     *
+     * _.floor(4060, -2);
+     * // => 4000
+     */
+    var floor = createRound('floor');
+ 
+    /**
+     * Computes the maximum value of `array`. If `array` is empty or falsey,
+     * `undefined` is returned.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {*} Returns the maximum value.
+     * @example
+     *
+     * _.max([4, 2, 8, 6]);
+     * // => 8
+     *
+     * _.max([]);
+     * // => undefined
+     */
+    function max(array) {
+      return (array && array.length)
+        ? baseExtremum(array, identity, baseGt)
+        : undefined;
+    }
+ 
+    /**
+     * This method is like `_.max` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the criterion by which
+     * the value is ranked. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {*} Returns the maximum value.
+     * @example
+     *
+     * var objects = [{ 'n': 1 }, { 'n': 2 }];
+     *
+     * _.maxBy(objects, function(o) { return o.n; });
+     * // => { 'n': 2 }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.maxBy(objects, 'n');
+     * // => { 'n': 2 }
+     */
+    function maxBy(array, iteratee) {
+      return (array && array.length)
+        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
+        : undefined;
+    }
+ 
+    /**
+     * Computes the mean of the values in `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {number} Returns the mean.
+     * @example
+     *
+     * _.mean([4, 2, 8, 6]);
+     * // => 5
+     */
+    function mean(array) {
+      return baseMean(array, identity);
+    }
+ 
+    /**
+     * This method is like `_.mean` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the value to be averaged.
+     * The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the mean.
+     * @example
+     *
+     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+     *
+     * _.meanBy(objects, function(o) { return o.n; });
+     * // => 5
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.meanBy(objects, 'n');
+     * // => 5
+     */
+    function meanBy(array, iteratee) {
+      return baseMean(array, getIteratee(iteratee, 2));
+    }
+ 
+    /**
+     * Computes the minimum value of `array`. If `array` is empty or falsey,
+     * `undefined` is returned.
+     *
+     * @static
+     * @since 0.1.0
+     * @memberOf _
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {*} Returns the minimum value.
+     * @example
+     *
+     * _.min([4, 2, 8, 6]);
+     * // => 2
+     *
+     * _.min([]);
+     * // => undefined
+     */
+    function min(array) {
+      return (array && array.length)
+        ? baseExtremum(array, identity, baseLt)
+        : undefined;
+    }
+ 
+    /**
+     * This method is like `_.min` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the criterion by which
+     * the value is ranked. The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {*} Returns the minimum value.
+     * @example
+     *
+     * var objects = [{ 'n': 1 }, { 'n': 2 }];
+     *
+     * _.minBy(objects, function(o) { return o.n; });
+     * // => { 'n': 1 }
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.minBy(objects, 'n');
+     * // => { 'n': 1 }
+     */
+    function minBy(array, iteratee) {
+      return (array && array.length)
+        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
+        : undefined;
+    }
+ 
+    /**
+     * Multiply two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.7.0
+     * @category Math
+     * @param {number} multiplier The first number in a multiplication.
+     * @param {number} multiplicand The second number in a multiplication.
+     * @returns {number} Returns the product.
+     * @example
+     *
+     * _.multiply(6, 4);
+     * // => 24
+     */
+    var multiply = createMathOperation(function(multiplier, multiplicand) {
+      return multiplier * multiplicand;
+    }, 1);
+ 
+    /**
+     * Computes `number` rounded to `precision`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.10.0
+     * @category Math
+     * @param {number} number The number to round.
+     * @param {number} [precision=0] The precision to round to.
+     * @returns {number} Returns the rounded number.
+     * @example
+     *
+     * _.round(4.006);
+     * // => 4
+     *
+     * _.round(4.006, 2);
+     * // => 4.01
+     *
+     * _.round(4060, -2);
+     * // => 4100
+     */
+    var round = createRound('round');
+ 
+    /**
+     * Subtract two numbers.
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {number} minuend The first number in a subtraction.
+     * @param {number} subtrahend The second number in a subtraction.
+     * @returns {number} Returns the difference.
+     * @example
+     *
+     * _.subtract(6, 4);
+     * // => 2
+     */
+    var subtract = createMathOperation(function(minuend, subtrahend) {
+      return minuend - subtrahend;
+    }, 0);
+ 
+    /**
+     * Computes the sum of the values in `array`.
+     *
+     * @static
+     * @memberOf _
+     * @since 3.4.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @returns {number} Returns the sum.
+     * @example
+     *
+     * _.sum([4, 2, 8, 6]);
+     * // => 20
+     */
+    function sum(array) {
+      return (array && array.length)
+        ? baseSum(array, identity)
+        : 0;
+    }
+ 
+    /**
+     * This method is like `_.sum` except that it accepts `iteratee` which is
+     * invoked for each element in `array` to generate the value to be summed.
+     * The iteratee is invoked with one argument: (value).
+     *
+     * @static
+     * @memberOf _
+     * @since 4.0.0
+     * @category Math
+     * @param {Array} array The array to iterate over.
+     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+     * @returns {number} Returns the sum.
+     * @example
+     *
+     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
+     *
+     * _.sumBy(objects, function(o) { return o.n; });
+     * // => 20
+     *
+     * // The `_.property` iteratee shorthand.
+     * _.sumBy(objects, 'n');
+     * // => 20
+     */
+    function sumBy(array, iteratee) {
+      return (array && array.length)
+        ? baseSum(array, getIteratee(iteratee, 2))
+        : 0;
+    }
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    // Add methods that return wrapped values in chain sequences.
+    lodash.after = after;
+    lodash.ary = ary;
+    lodash.assign = assign;
+    lodash.assignIn = assignIn;
+    lodash.assignInWith = assignInWith;
+    lodash.assignWith = assignWith;
+    lodash.at = at;
+    lodash.before = before;
+    lodash.bind = bind;
+    lodash.bindAll = bindAll;
+    lodash.bindKey = bindKey;
+    lodash.castArray = castArray;
+    lodash.chain = chain;
+    lodash.chunk = chunk;
+    lodash.compact = compact;
+    lodash.concat = concat;
+    lodash.cond = cond;
+    lodash.conforms = conforms;
+    lodash.constant = constant;
+    lodash.countBy = countBy;
+    lodash.create = create;
+    lodash.curry = curry;
+    lodash.curryRight = curryRight;
+    lodash.debounce = debounce;
+    lodash.defaults = defaults;
+    lodash.defaultsDeep = defaultsDeep;
+    lodash.defer = defer;
+    lodash.delay = delay;
+    lodash.difference = difference;
+    lodash.differenceBy = differenceBy;
+    lodash.differenceWith = differenceWith;
+    lodash.drop = drop;
+    lodash.dropRight = dropRight;
+    lodash.dropRightWhile = dropRightWhile;
+    lodash.dropWhile = dropWhile;
+    lodash.fill = fill;
+    lodash.filter = filter;
+    lodash.flatMap = flatMap;
+    lodash.flatMapDeep = flatMapDeep;
+    lodash.flatMapDepth = flatMapDepth;
+    lodash.flatten = flatten;
+    lodash.flattenDeep = flattenDeep;
+    lodash.flattenDepth = flattenDepth;
+    lodash.flip = flip;
+    lodash.flow = flow;
+    lodash.flowRight = flowRight;
+    lodash.fromPairs = fromPairs;
+    lodash.functions = functions;
+    lodash.functionsIn = functionsIn;
+    lodash.groupBy = groupBy;
+    lodash.initial = initial;
+    lodash.intersection = intersection;
+    lodash.intersectionBy = intersectionBy;
+    lodash.intersectionWith = intersectionWith;
+    lodash.invert = invert;
+    lodash.invertBy = invertBy;
+    lodash.invokeMap = invokeMap;
+    lodash.iteratee = iteratee;
+    lodash.keyBy = keyBy;
+    lodash.keys = keys;
+    lodash.keysIn = keysIn;
+    lodash.map = map;
+    lodash.mapKeys = mapKeys;
+    lodash.mapValues = mapValues;
+    lodash.matches = matches;
+    lodash.matchesProperty = matchesProperty;
+    lodash.memoize = memoize;
+    lodash.merge = merge;
+    lodash.mergeWith = mergeWith;
+    lodash.method = method;
+    lodash.methodOf = methodOf;
+    lodash.mixin = mixin;
+    lodash.negate = negate;
+    lodash.nthArg = nthArg;
+    lodash.omit = omit;
+    lodash.omitBy = omitBy;
+    lodash.once = once;
+    lodash.orderBy = orderBy;
+    lodash.over = over;
+    lodash.overArgs = overArgs;
+    lodash.overEvery = overEvery;
+    lodash.overSome = overSome;
+    lodash.partial = partial;
+    lodash.partialRight = partialRight;
+    lodash.partition = partition;
+    lodash.pick = pick;
+    lodash.pickBy = pickBy;
+    lodash.property = property;
+    lodash.propertyOf = propertyOf;
+    lodash.pull = pull;
+    lodash.pullAll = pullAll;
+    lodash.pullAllBy = pullAllBy;
+    lodash.pullAllWith = pullAllWith;
+    lodash.pullAt = pullAt;
+    lodash.range = range;
+    lodash.rangeRight = rangeRight;
+    lodash.rearg = rearg;
+    lodash.reject = reject;
+    lodash.remove = remove;
+    lodash.rest = rest;
+    lodash.reverse = reverse;
+    lodash.sampleSize = sampleSize;
+    lodash.set = set;
+    lodash.setWith = setWith;
+    lodash.shuffle = shuffle;
+    lodash.slice = slice;
+    lodash.sortBy = sortBy;
+    lodash.sortedUniq = sortedUniq;
+    lodash.sortedUniqBy = sortedUniqBy;
+    lodash.split = split;
+    lodash.spread = spread;
+    lodash.tail = tail;
+    lodash.take = take;
+    lodash.takeRight = takeRight;
+    lodash.takeRightWhile = takeRightWhile;
+    lodash.takeWhile = takeWhile;
+    lodash.tap = tap;
+    lodash.throttle = throttle;
+    lodash.thru = thru;
+    lodash.toArray = toArray;
+    lodash.toPairs = toPairs;
+    lodash.toPairsIn = toPairsIn;
+    lodash.toPath = toPath;
+    lodash.toPlainObject = toPlainObject;
+    lodash.transform = transform;
+    lodash.unary = unary;
+    lodash.union = union;
+    lodash.unionBy = unionBy;
+    lodash.unionWith = unionWith;
+    lodash.uniq = uniq;
+    lodash.uniqBy = uniqBy;
+    lodash.uniqWith = uniqWith;
+    lodash.unset = unset;
+    lodash.unzip = unzip;
+    lodash.unzipWith = unzipWith;
+    lodash.update = update;
+    lodash.updateWith = updateWith;
+    lodash.values = values;
+    lodash.valuesIn = valuesIn;
+    lodash.without = without;
+    lodash.words = words;
+    lodash.wrap = wrap;
+    lodash.xor = xor;
+    lodash.xorBy = xorBy;
+    lodash.xorWith = xorWith;
+    lodash.zip = zip;
+    lodash.zipObject = zipObject;
+    lodash.zipObjectDeep = zipObjectDeep;
+    lodash.zipWith = zipWith;
+ 
+    // Add aliases.
+    lodash.entries = toPairs;
+    lodash.entriesIn = toPairsIn;
+    lodash.extend = assignIn;
+    lodash.extendWith = assignInWith;
+ 
+    // Add methods to `lodash.prototype`.
+    mixin(lodash, lodash);
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    // Add methods that return unwrapped values in chain sequences.
+    lodash.add = add;
+    lodash.attempt = attempt;
+    lodash.camelCase = camelCase;
+    lodash.capitalize = capitalize;
+    lodash.ceil = ceil;
+    lodash.clamp = clamp;
+    lodash.clone = clone;
+    lodash.cloneDeep = cloneDeep;
+    lodash.cloneDeepWith = cloneDeepWith;
+    lodash.cloneWith = cloneWith;
+    lodash.conformsTo = conformsTo;
+    lodash.deburr = deburr;
+    lodash.defaultTo = defaultTo;
+    lodash.divide = divide;
+    lodash.endsWith = endsWith;
+    lodash.eq = eq;
+    lodash.escape = escape;
+    lodash.escapeRegExp = escapeRegExp;
+    lodash.every = every;
+    lodash.find = find;
+    lodash.findIndex = findIndex;
+    lodash.findKey = findKey;
+    lodash.findLast = findLast;
+    lodash.findLastIndex = findLastIndex;
+    lodash.findLastKey = findLastKey;
+    lodash.floor = floor;
+    lodash.forEach = forEach;
+    lodash.forEachRight = forEachRight;
+    lodash.forIn = forIn;
+    lodash.forInRight = forInRight;
+    lodash.forOwn = forOwn;
+    lodash.forOwnRight = forOwnRight;
+    lodash.get = get;
+    lodash.gt = gt;
+    lodash.gte = gte;
+    lodash.has = has;
+    lodash.hasIn = hasIn;
+    lodash.head = head;
+    lodash.identity = identity;
+    lodash.includes = includes;
+    lodash.indexOf = indexOf;
+    lodash.inRange = inRange;
+    lodash.invoke = invoke;
+    lodash.isArguments = isArguments;
+    lodash.isArray = isArray;
+    lodash.isArrayBuffer = isArrayBuffer;
+    lodash.isArrayLike = isArrayLike;
+    lodash.isArrayLikeObject = isArrayLikeObject;
+    lodash.isBoolean = isBoolean;
+    lodash.isBuffer = isBuffer;
+    lodash.isDate = isDate;
+    lodash.isElement = isElement;
+    lodash.isEmpty = isEmpty;
+    lodash.isEqual = isEqual;
+    lodash.isEqualWith = isEqualWith;
+    lodash.isError = isError;
+    lodash.isFinite = isFinite;
+    lodash.isFunction = isFunction;
+    lodash.isInteger = isInteger;
+    lodash.isLength = isLength;
+    lodash.isMap = isMap;
+    lodash.isMatch = isMatch;
+    lodash.isMatchWith = isMatchWith;
+    lodash.isNaN = isNaN;
+    lodash.isNative = isNative;
+    lodash.isNil = isNil;
+    lodash.isNull = isNull;
+    lodash.isNumber = isNumber;
+    lodash.isObject = isObject;
+    lodash.isObjectLike = isObjectLike;
+    lodash.isPlainObject = isPlainObject;
+    lodash.isRegExp = isRegExp;
+    lodash.isSafeInteger = isSafeInteger;
+    lodash.isSet = isSet;
+    lodash.isString = isString;
+    lodash.isSymbol = isSymbol;
+    lodash.isTypedArray = isTypedArray;
+    lodash.isUndefined = isUndefined;
+    lodash.isWeakMap = isWeakMap;
+    lodash.isWeakSet = isWeakSet;
+    lodash.join = join;
+    lodash.kebabCase = kebabCase;
+    lodash.last = last;
+    lodash.lastIndexOf = lastIndexOf;
+    lodash.lowerCase = lowerCase;
+    lodash.lowerFirst = lowerFirst;
+    lodash.lt = lt;
+    lodash.lte = lte;
+    lodash.max = max;
+    lodash.maxBy = maxBy;
+    lodash.mean = mean;
+    lodash.meanBy = meanBy;
+    lodash.min = min;
+    lodash.minBy = minBy;
+    lodash.stubArray = stubArray;
+    lodash.stubFalse = stubFalse;
+    lodash.stubObject = stubObject;
+    lodash.stubString = stubString;
+    lodash.stubTrue = stubTrue;
+    lodash.multiply = multiply;
+    lodash.nth = nth;
+    lodash.noConflict = noConflict;
+    lodash.noop = noop;
+    lodash.now = now;
+    lodash.pad = pad;
+    lodash.padEnd = padEnd;
+    lodash.padStart = padStart;
+    lodash.parseInt = parseInt;
+    lodash.random = random;
+    lodash.reduce = reduce;
+    lodash.reduceRight = reduceRight;
+    lodash.repeat = repeat;
+    lodash.replace = replace;
+    lodash.result = result;
+    lodash.round = round;
+    lodash.runInContext = runInContext;
+    lodash.sample = sample;
+    lodash.size = size;
+    lodash.snakeCase = snakeCase;
+    lodash.some = some;
+    lodash.sortedIndex = sortedIndex;
+    lodash.sortedIndexBy = sortedIndexBy;
+    lodash.sortedIndexOf = sortedIndexOf;
+    lodash.sortedLastIndex = sortedLastIndex;
+    lodash.sortedLastIndexBy = sortedLastIndexBy;
+    lodash.sortedLastIndexOf = sortedLastIndexOf;
+    lodash.startCase = startCase;
+    lodash.startsWith = startsWith;
+    lodash.subtract = subtract;
+    lodash.sum = sum;
+    lodash.sumBy = sumBy;
+    lodash.template = template;
+    lodash.times = times;
+    lodash.toFinite = toFinite;
+    lodash.toInteger = toInteger;
+    lodash.toLength = toLength;
+    lodash.toLower = toLower;
+    lodash.toNumber = toNumber;
+    lodash.toSafeInteger = toSafeInteger;
+    lodash.toString = toString;
+    lodash.toUpper = toUpper;
+    lodash.trim = trim;
+    lodash.trimEnd = trimEnd;
+    lodash.trimStart = trimStart;
+    lodash.truncate = truncate;
+    lodash.unescape = unescape;
+    lodash.uniqueId = uniqueId;
+    lodash.upperCase = upperCase;
+    lodash.upperFirst = upperFirst;
+ 
+    // Add aliases.
+    lodash.each = forEach;
+    lodash.eachRight = forEachRight;
+    lodash.first = head;
+ 
+    mixin(lodash, (function() {
+      var source = {};
+      baseForOwn(lodash, function(func, methodName) {
+        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
+          source[methodName] = func;
+        }
+      });
+      return source;
+    }()), { 'chain': false });
+ 
+    /*------------------------------------------------------------------------*/
+ 
+    /**
+     * The semantic version number.
+     *
+     * @static
+     * @memberOf _
+     * @type {string}
+     */
+    lodash.VERSION = VERSION;
+ 
+    // Assign default placeholders.
+    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
+      lodash[methodName].placeholder = lodash;
+    });
+ 
+    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
+    arrayEach(['drop', 'take'], function(methodName, index) {
+      LazyWrapper.prototype[methodName] = function(n) {
+        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
+ 
+        var result = (this.__filtered__ && !index)
+          ? new LazyWrapper(this)
+          : this.clone();
+ 
+        if (result.__filtered__) {
+          result.__takeCount__ = nativeMin(n, result.__takeCount__);
+        } else {
+          result.__views__.push({
+            'size': nativeMin(n, MAX_ARRAY_LENGTH),
+            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
+          });
+        }
+        return result;
+      };
+ 
+      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
+        return this.reverse()[methodName](n).reverse();
+      };
+    });
+ 
+    // Add `LazyWrapper` methods that accept an `iteratee` value.
+    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
+      var type = index + 1,
+          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
+ 
+      LazyWrapper.prototype[methodName] = function(iteratee) {
+        var result = this.clone();
+        result.__iteratees__.push({
+          'iteratee': getIteratee(iteratee, 3),
+          'type': type
+        });
+        result.__filtered__ = result.__filtered__ || isFilter;
+        return result;
+      };
+    });
+ 
+    // Add `LazyWrapper` methods for `_.head` and `_.last`.
+    arrayEach(['head', 'last'], function(methodName, index) {
+      var takeName = 'take' + (index ? 'Right' : '');
+ 
+      LazyWrapper.prototype[methodName] = function() {
+        return this[takeName](1).value()[0];
+      };
+    });
+ 
+    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
+    arrayEach(['initial', 'tail'], function(methodName, index) {
+      var dropName = 'drop' + (index ? '' : 'Right');
+ 
+      LazyWrapper.prototype[methodName] = function() {
+        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
+      };
+    });
+ 
+    LazyWrapper.prototype.compact = function() {
+      return this.filter(identity);
+    };
+ 
+    LazyWrapper.prototype.find = function(predicate) {
+      return this.filter(predicate).head();
+    };
+ 
+    LazyWrapper.prototype.findLast = function(predicate) {
+      return this.reverse().find(predicate);
+    };
+ 
+    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
+      if (typeof path == 'function') {
+        return new LazyWrapper(this);
+      }
+      return this.map(function(value) {
+        return baseInvoke(value, path, args);
+      });
+    });
+ 
+    LazyWrapper.prototype.reject = function(predicate) {
+      return this.filter(negate(getIteratee(predicate)));
+    };
+ 
+    LazyWrapper.prototype.slice = function(start, end) {
+      start = toInteger(start);
+ 
+      var result = this;
+      if (result.__filtered__ && (start > 0 || end < 0)) {
+        return new LazyWrapper(result);
+      }
+      if (start < 0) {
+        result = result.takeRight(-start);
+      } else if (start) {
+        result = result.drop(start);
+      }
+      if (end !== undefined) {
+        end = toInteger(end);
+        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
+      }
+      return result;
+    };
+ 
+    LazyWrapper.prototype.takeRightWhile = function(predicate) {
+      return this.reverse().takeWhile(predicate).reverse();
+    };
+ 
+    LazyWrapper.prototype.toArray = function() {
+      return this.take(MAX_ARRAY_LENGTH);
+    };
+ 
+    // Add `LazyWrapper` methods to `lodash.prototype`.
+    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
+          isTaker = /^(?:head|last)$/.test(methodName),
+          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
+          retUnwrapped = isTaker || /^find/.test(methodName);
+ 
+      if (!lodashFunc) {
+        return;
+      }
+      lodash.prototype[methodName] = function() {
+        var value = this.__wrapped__,
+            args = isTaker ? [1] : arguments,
+            isLazy = value instanceof LazyWrapper,
+            iteratee = args[0],
+            useLazy = isLazy || isArray(value);
+ 
+        var interceptor = function(value) {
+          var result = lodashFunc.apply(lodash, arrayPush([value], args));
+          return (isTaker && chainAll) ? result[0] : result;
+        };
+ 
+        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
+          // Avoid lazy use if the iteratee has a "length" value other than `1`.
+          isLazy = useLazy = false;
+        }
+        var chainAll = this.__chain__,
+            isHybrid = !!this.__actions__.length,
+            isUnwrapped = retUnwrapped && !chainAll,
+            onlyLazy = isLazy && !isHybrid;
+ 
+        if (!retUnwrapped && useLazy) {
+          value = onlyLazy ? value : new LazyWrapper(this);
+          var result = func.apply(value, args);
+          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
+          return new LodashWrapper(result, chainAll);
+        }
+        if (isUnwrapped && onlyLazy) {
+          return func.apply(this, args);
+        }
+        result = this.thru(interceptor);
+        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
+      };
+    });
+ 
+    // Add `Array` methods to `lodash.prototype`.
+    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
+      var func = arrayProto[methodName],
+          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
+          retUnwrapped = /^(?:pop|shift)$/.test(methodName);
+ 
+      lodash.prototype[methodName] = function() {
+        var args = arguments;
+        if (retUnwrapped && !this.__chain__) {
+          var value = this.value();
+          return func.apply(isArray(value) ? value : [], args);
+        }
+        return this[chainName](function(value) {
+          return func.apply(isArray(value) ? value : [], args);
+        });
+      };
+    });
+ 
+    // Map minified method names to their real names.
+    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+      var lodashFunc = lodash[methodName];
+      if (lodashFunc) {
+        var key = (lodashFunc.name + ''),
+            names = realNames[key] || (realNames[key] = []);
+ 
+        names.push({ 'name': methodName, 'func': lodashFunc });
+      }
+    });
+ 
+    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
+      'name': 'wrapper',
+      'func': undefined
+    }];
+ 
+    // Add methods to `LazyWrapper`.
+    LazyWrapper.prototype.clone = lazyClone;
+    LazyWrapper.prototype.reverse = lazyReverse;
+    LazyWrapper.prototype.value = lazyValue;
+ 
+    // Add chain sequence methods to the `lodash` wrapper.
+    lodash.prototype.at = wrapperAt;
+    lodash.prototype.chain = wrapperChain;
+    lodash.prototype.commit = wrapperCommit;
+    lodash.prototype.next = wrapperNext;
+    lodash.prototype.plant = wrapperPlant;
+    lodash.prototype.reverse = wrapperReverse;
+    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
+ 
+    // Add lazy aliases.
+    lodash.prototype.first = lodash.prototype.head;
+ 
+    if (symIterator) {
+      lodash.prototype[symIterator] = wrapperToIterator;
+    }
+    return lodash;
+  });
+ 
+  /*--------------------------------------------------------------------------*/
+ 
+  // Export lodash.
+  var _ = runInContext();
+ 
+  // Some AMD build optimizers, like r.js, check for condition patterns like:
+  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
+    // Expose Lodash on the global object to prevent errors when Lodash is
+    // loaded by a script tag in the presence of an AMD loader.
+    // See http://requirejs.org/docs/errors.html#mismatch for more details.
+    // Use `_.noConflict` to remove Lodash from the global object.
+    root._ = _;
+ 
+    // Define as an anonymous module so, through path mapping, it can be
+    // referenced as the "underscore" module.
+    define(function() {
+      return _;
+    });
+  }
+  // Check for `exports` after `define` in case a build optimizer adds it.
+  else if (freeModule) {
+    // Export for Node.js.
+    (freeModule.exports = _)._ = _;
+    // Export for CommonJS support.
+    freeExports._ = _;
+  }
+  else {
+    // Export to the global object.
+    root._ = _;
+  }
+}.call(this));
+ 
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],130:[function(require,module,exports){
+var MapCache = require('./_MapCache');
+ 
+/** Error message constants. */
+var FUNC_ERROR_TEXT = 'Expected a function';
+ 
+/**
+ * Creates a function that memoizes the result of `func`. If `resolver` is
+ * provided, it determines the cache key for storing the result based on the
+ * arguments provided to the memoized function. By default, the first argument
+ * provided to the memoized function is used as the map cache key. The `func`
+ * is invoked with the `this` binding of the memoized function.
+ *
+ * **Note:** The cache is exposed as the `cache` property on the memoized
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
+ * constructor with one whose instances implement the
+ * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+ * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to have its output memoized.
+ * @param {Function} [resolver] The function to resolve the cache key.
+ * @returns {Function} Returns the new memoized function.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ * var other = { 'c': 3, 'd': 4 };
+ *
+ * var values = _.memoize(_.values);
+ * values(object);
+ * // => [1, 2]
+ *
+ * values(other);
+ * // => [3, 4]
+ *
+ * object.a = 2;
+ * values(object);
+ * // => [1, 2]
+ *
+ * // Modify the result cache.
+ * values.cache.set(object, ['a', 'b']);
+ * values(object);
+ * // => ['a', 'b']
+ *
+ * // Replace `_.memoize.Cache`.
+ * _.memoize.Cache = WeakMap;
+ */
+function memoize(func, resolver) {
+  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  var memoized = function() {
+    var args = arguments,
+        key = resolver ? resolver.apply(this, args) : args[0],
+        cache = memoized.cache;
+ 
+    if (cache.has(key)) {
+      return cache.get(key);
+    }
+    var result = func.apply(this, args);
+    memoized.cache = cache.set(key, result) || cache;
+    return result;
+  };
+  memoized.cache = new (memoize.Cache || MapCache);
+  return memoized;
+}
+ 
+// Expose `MapCache`.
+memoize.Cache = MapCache;
+ 
+module.exports = memoize;
+ 
+},{"./_MapCache":79}],131:[function(require,module,exports){
+var baseSet = require('./_baseSet');
+ 
+/**
+ * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
+ * it's created. Arrays are created for missing index properties while objects
+ * are created for all other missing properties. Use `_.setWith` to customize
+ * `path` creation.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.7.0
+ * @category Object
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.set(object, 'a[0].b.c', 4);
+ * console.log(object.a[0].b.c);
+ * // => 4
+ *
+ * _.set(object, ['x', '0', 'y', 'z'], 5);
+ * console.log(object.x[0].y.z);
+ * // => 5
+ */
+function set(object, path, value) {
+  return object == null ? object : baseSet(object, path, value);
+}
+ 
+module.exports = set;
+ 
+},{"./_baseSet":87}],132:[function(require,module,exports){
+var baseToString = require('./_baseToString');
+ 
+/**
+ * Converts `value` to a string. An empty string is returned for `null`
+ * and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */
+function toString(value) {
+  return value == null ? '' : baseToString(value);
+}
+ 
+module.exports = toString;
+ 
+},{"./_baseToString":88}],133:[function(require,module,exports){
+(function (Buffer){
+'use strict';
+var isUtf8 = require('is-utf8');
+ 
+var stripBom = module.exports = function (arg) {
+	if (typeof arg === 'string') {
+		return arg.replace(/^\ufeff/g, '');
+	}
+ 
+	if (Buffer.isBuffer(arg) && isUtf8(arg) &&
+		arg[0] === 0xef && arg[1] === 0xbb && arg[2] === 0xbf) {
+		return arg.slice(3);
+	}
+ 
+	return arg;
+};
+ 
+stripBom.stream = function () {
+	var firstChunk = require('first-chunk-stream');
+ 
+	return firstChunk({minSize: 3}, function (chunk, enc, cb) {
+		this.push(stripBom(chunk));
+		cb();
+	});
+};
+ 
+}).call(this,{"isBuffer":require("../grunt-browserify/node_modules/browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js")})
+},{"../grunt-browserify/node_modules/browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js":39,"first-chunk-stream":30,"is-utf8":75}],134:[function(require,module,exports){
+module.exports={
+  "name": "csvtojson",
+  "description": "A tool concentrating on converting csv data to JSON with customised parser supporting",
+  "author": "Keyang Xiang <keyang.xiang@gmail.com>",
+  "homepage": "https://github.com/Keyang/node-csvtojson",
+  "bugs": "https://github.com/Keyang/node-csvtojson/issues",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/Keyang/node-csvtojson.git"
+  },
+  "contributors": [
+    {
+      "name": "Daniel Cohen",
+      "email": "dcohenb@gmail.com",
+      "url": "https://github.com/dcohenb",
+      "contributions": 1,
+      "additions": 1,
+      "deletions": 6,
+      "hireable": true
+    },
+    {
+      "name": "Trang",
+      "email": "trangtungn@gmail.com",
+      "url": "https://github.com/trangtungn",
+      "contributions": 1,
+      "additions": 6,
+      "deletions": 1,
+      "hireable": true
+    },
+    {
+      "name": "Matthias Lienau",
+      "email": "matthias@mlienau.de",
+      "url": "https://github.com/atufkas",
+      "contributions": 9,
+      "additions": 74,
+      "deletions": 45,
+      "hireable": null
+    },
+    {
+      "name": "Alec Fenichel",
+      "email": "alec.fenichel@gmail.com",
+      "url": "https://github.com/fenichelar",
+      "contributions": 1,
+      "additions": 1,
+      "deletions": 1,
+      "hireable": true
+    },
+    {
+      "name": "Blake Blackshear",
+      "email": null,
+      "url": "https://github.com/blakeblackshear",
+      "contributions": 2,
+      "additions": 8,
+      "deletions": 8,
+      "hireable": null
+    },
+    {
+      "name": "Dimitri Kennedy",
+      "email": "dimitrikennedy@gmail.com",
+      "url": "https://github.com/roodboi",
+      "contributions": 2,
+      "additions": 3,
+      "deletions": 3,
+      "hireable": null
+    },
+    {
+      "name": null,
+      "email": null,
+      "url": "https://github.com/markwithers",
+      "contributions": 1,
+      "additions": 1,
+      "deletions": 1,
+      "hireable": null
+    },
+    {
+      "name": "Robert Porter",
+      "email": null,
+      "url": "https://github.com/colarob",
+      "contributions": 1,
+      "additions": 64,
+      "deletions": 21,
+      "hireable": null
+    },
+    {
+      "name": "Jessica Good",
+      "email": null,
+      "url": "https://github.com/jessicagood",
+      "contributions": 1,
+      "additions": 8,
+      "deletions": 5,
+      "hireable": null
+    },
+    {
+      "name": null,
+      "email": null,
+      "url": "https://github.com/jondayft",
+      "contributions": 1,
+      "additions": 18,
+      "deletions": 0,
+      "hireable": null
+    },
+    {
+      "name": "Dane Petersen",
+      "email": null,
+      "url": "https://github.com/thegreatsunra",
+      "contributions": 1,
+      "additions": 18920,
+      "deletions": 8429,
+      "hireable": null
+    },
+    {
+      "name": "Jimi Ford",
+      "email": null,
+      "url": "https://github.com/JimiHFord",
+      "contributions": 1,
+      "additions": 5,
+      "deletions": 5,
+      "hireable": null
+    },
+    {
+      "name": "Hocine Moukaideche",
+      "email": null,
+      "url": "https://github.com/Off76",
+      "contributions": 1,
+      "additions": 1,
+      "deletions": 1,
+      "hireable": true
+    },
+    {
+      "name": "Keyang Xiang",
+      "email": "keyang.xiang@gmail.com",
+      "url": "https://github.com/Keyang",
+      "contributions": 122,
+      "additions": 46304,
+      "deletions": 65397,
+      "hireable": null
+    },
+    {
+      "name": "Ionică Bizău",
+      "email": "contact@ionicabizau.net",
+      "url": "https://github.com/IonicaBizau",
+      "contributions": 1,
+      "additions": 98,
+      "deletions": 86,
+      "hireable": null
+    },
+    {
+      "name": "Sean Lang",
+      "email": "slang800@gmail.com",
+      "url": "https://github.com/slang800",
+      "contributions": 2,
+      "additions": 2,
+      "deletions": 1,
+      "hireable": true
+    },
+    {
+      "name": "Tom Dodson",
+      "email": "t3.dodson@gmail.com",
+      "url": "https://github.com/t3dodson",
+      "contributions": 25,
+      "additions": 1485,
+      "deletions": 1414,
+      "hireable": null
+    },
+    {
+      "name": "Jeff Johnson",
+      "email": null,
+      "url": "https://github.com/jeffcjohnson",
+      "contributions": 1,
+      "additions": 1,
+      "deletions": 1,
+      "hireable": null
+    },
+    {
+      "name": "Amila Welihinda",
+      "email": "amilajack@gmail.com",
+      "url": "https://github.com/amilajack",
+      "contributions": 1,
+      "additions": 2,
+      "deletions": 1,
+      "hireable": true
+    },
+    {
+      "name": "Zsolt R. Molnar",
+      "email": null,
+      "url": "https://github.com/molnarzs",
+      "contributions": 1,
+      "additions": 40,
+      "deletions": 2,
+      "hireable": true
+    }
+  ],
+  "version": "1.1.7",
+  "keywords": [
+    "csv",
+    "csv parser",
+    "parse csv",
+    "csvtojson",
+    "json",
+    "csv to json",
+    "csv convert",
+    "tojson",
+    "convert csv to json",
+    "csv-json"
+  ],
+  "bin": {
+    "csvtojson": "./bin/csvtojson"
+  },
+  "license": "MIT",
+  "engines": {
+    "node": ">=0.10"
+  },
+  "devDependencies": {
+    "grunt": "^0.4.5",
+    "grunt-browserify": "^4.0.1",
+    "grunt-contrib-jshint": "^0.11.2",
+    "grunt-contrib-uglify": "^0.11.0",
+    "grunt-contrib-watch": "^0.6.1",
+    "grunt-git": "^0.3.5",
+    "grunt-madge": "0.0.6",
+    "grunt-mocha-test": "^0.12.7",
+    "grunt-newer": "^1.1.0",
+    "imgur": "^0.1.5",
+    "load-grunt-tasks": "^3.4.0",
+    "minimist": "^1.2.0",
+    "mocha": "^2.4.5",
+    "request": "^2.81.0"
+  },
+  "dependencies": {
+    "lodash": "^4.17.3",
+    "strip-bom": "1.0.0"
+  },
+  "scripts": {
+    "test": "mocha ./test -R spec",
+    "test-debug": "mocha debug ./test -R spec",
+    "test-all": "mocha  ./test -R spec && CSV_WORKER=3 mocha ./test -R spec "
+  }
+}
+ 
+},{}]},{},[1]);
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/csvtojson.min.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/csvtojson.min.js.html new file mode 100644 index 0000000..6ef84fc --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/csvtojson.min.js.html @@ -0,0 +1,90 @@ + + + + Code coverage report for csv2json/dist/csvtojson.min.js + + + + + + + +
+
+

+ All files / csv2json/dist csvtojson.min.js +

+
+
+ 0% + Statements + 0/5007 +
+
+ 0% + Branches + 0/5826 +
+
+ 0% + Functions + 0/1473 +
+
+ 0% + Lines + 0/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8  +  +  +  +  +  +  + 
/*Automatically Generated. Do not modify.*/
+!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){window&&(window.csvtojson=a("./index.js"),window.csvtojson.version=a("./package.json").version)},{"./index.js":2,"./package.json":134}],2:[function(a,b,c){b.exports=a("./libs/csv2json.js")},{"./libs/csv2json.js":24}],3:[function(a,b,c){function d(a,b,c){Error.call(this,""),this.err=a,this.line=b,this.extra=c,this.message="Error: "+a+". JSON Line number: "+b+(c?" near: "+c:""),this.name="CSV Error"}var e=a("util");b.exports=d,e.inherits(d,Error),d.prototype.toString=function(){return JSON.stringify([this.err,this.line,this.extra])},d.column_mismatched=function(a,b){return new d("column_mismatched",a,b)},d.unclosed_quote=function(a,b){return new d("unclosed_quote",a,b)},d.fromArray=function(a){return new d(a[0],a[1],a[2])}},{util:73}],4:[function(a,b,c){(function(c,d){function e(a,b){return j.call(this,b),this._options=b||{},this.param=n(a),this.param._options=this._options,this.started=!1,this.recordNum=0,this.lineNumber=0,this._csvLineBuffer="",this.lastIndex=0,this.param.forked&&(this.param.forked=!1,this.workerNum=2),this.flushCb=null,this.processEnd=!1,this.sequenceBuffer=[],this._needJson=null,this._needEmitResult=null,this._needEmitFinalResult=null,this._needEmitJson=null,this._needPush=null,this._needEmitCsv=null,this._csvTransf=null,this.finalResult=[],this.on("error",f(this)),this.on("end",f(this)),this.initWorker(),c.nextTick(function(){null===this._needEmitFinalResult&&(this._needEmitFinalResult=this.listeners("end_parsed").length>0),null===this._needEmitResult&&(this._needEmitResult=this.listeners("record_parsed").length>0),null===this._needEmitJson&&(this._needEmitJson=this.listeners("json").length>0),null===this._needEmitCsv&&(this._needEmitCsv=this.listeners("csv").length>0),null===this._needJson&&(this._needJson=this._needEmitJson||this._needEmitFinalResult||this._needEmitResult||this.transform||this._options.objectMode),null===this._needPush&&(this._needPush=this.listeners("data").length>0||this.listeners("readable").length>0),this.param._needParseJson=this._needJson||this._needPush}.bind(this)),this}function f(a){return function(b){a._hasDone||(a._hasDone=!0,c.nextTick(function(){a.emit("done",b)}))}}function g(a){return v?d.from(a,"utf8"):new d(a,"utf8")}function h(a){if(a._postIgnoreColumns){for(var b=0;b<a.ignoreColumns.length;b++){var c=a.ignoreColumns[b];if("string"==typeof c){var d=a._headers.indexOf(c);d>-1?a.ignoreColumns[b]=d:a.ignoreColumns[b]=-1}}a.ignoreColumns.sort(function(a,b){return b-a})}if(a._postIncludeColumns)for(var b=0;b<a.includeColumns.length;b++){var e=a.includeColumns[b];if("string"==typeof e){var d=a._headers.indexOf(e);d>-1?a.includeColumns[b]=d:a.includeColumns[b]=-1}}a.ignoreColumns=t.uniq(a.ignoreColumns),a.includeColumns=t.uniq(a.includeColumns)}var i=a("util"),j=a("stream").Transform,k=a("os"),l=a("strip-bom"),m=k.EOL,n=a("./defParam"),o=a("./fileline"),p=a("./fileLineToCSVLine"),q=a("./linesToJson"),r=a("./CSVError"),s=null,t=a("lodash"),u=a("./rowSplit");i.inherits(e,j);var v=c.versions.node.split(".")[0]>=6;e.prototype._transform=function(a,b,c){a=this.prepareData(a);var e=a.length-1,f=null;if(0!=(128&a[e])){for(;128===(192&a[e]);)e--;e--}if(e!=a.length-1){f=a.slice(e+1),a=a.slice(0,e+1);var h=c,i=this;c=function(){i._csvLineBuffer?i._csvLineBuffer=d.concat([g(i._csvLineBuffer,"utf8"),f]):i._csvLineBuffer=f,h()}}a=a.toString("utf8"),this.started===!1&&(this.started=!0,a=l(a),this.param.toArrayString&&this._needPush&&this.push("["+m,"utf8"));var i=this;this.preProcessRaw(a,function(a){a&&a.length>0?i.processData(a,c):c()})},e.prototype.prepareData=function(a){return this._csvLineBuffer&&this._csvLineBuffer.length>0?("string"==typeof this._csvLineBuffer&&(this._csvLineBuffer=g(this._csvLineBuffer)),d.concat([this._csvLineBuffer,a])):a},e.prototype.setPartialData=function(a){this._csvLineBuffer=a},e.prototype.processData=function(a,b){var c=this.param;c.ignoreEmpty&&!c._headers&&(a=a.trimLeft());var d=o(a,this.param);if(d.lines.length>0)if(this.preProcessLine&&"function"==typeof this.preProcessLine&&(d.lines=this._preProcessLines(d.lines,this.lastIndex)),c._headers)if(c.workerNum<=1){var e=p(d,c);this.setPartialData(e.partial);var f=q(e.lines,c,this.recordNum);this.processResult(f),this.lastIndex+=f.length,this.recordNum+=f.length,b()}else this.workerProcess(d,b);else this.processHead(d,b);else this.setPartialData(d.partial),b()},e.prototype._preProcessLines=function(a,b){for(var c=[],d=0,e=a.length;e>d;d++){var f=this.preProcessLine(a[d],b+d+1);"string"==typeof f?c.push(f):(c.push(a[d]),this.emit("error",new Error("preProcessLine should return a string but got: "+JSON.stringify(f))))}return c},e.prototype.initWorker=function(){var b=this.param.workerNum-1;b>0&&(s=a("./workerMgr"),this.workerMgr=s(),this.workerMgr.initWorker(b,this.param))},e.prototype.preRawData=function(a){return this.preProcessRaw=a,this},e.prototype.preFileLine=function(a){return this.preProcessLine=a,this},e.prototype.workerProcess=function(a,b){var c=this,d=a,e=this.getEol();this.setPartialData(d.partial),this.workerMgr.sendWorker(d.lines.join(e)+e,this.lastIndex,b,function(a,b){var d,e=c.sequenceBuffer[0];if(e.idx===b){e.result=a;for(var f=[];c.sequenceBuffer[0]&&c.sequenceBuffer[0].result;)d=c.sequenceBuffer.shift(),f=f.concat(d.result);c.processResult(f),c.recordNum+=f.length}else for(var g=0,h=c.sequenceBuffer.length;h>g;g++)if(d=c.sequenceBuffer[g],d.idx===b){d.result=a;break}}),this.sequenceBuffer.push({idx:this.lastIndex,result:null}),this.lastIndex+=d.lines.length},e.prototype.processHead=function(b,c){var d=this.param;if(d._headers)return c();d._needFilterRow=!1;var e=b.lines,f="",g=[];if(!d.noheader)for(;e.length;){var i=f+e.shift(),j=u(i,d);if(j.closed){g=j.cols,f="";break}f=i+this.getEol()}if(d._needFilterRow=!0,!d.noheader&&0===g.length)return this.setPartialData(f),c();d.noheader?d.headers?d._headers=d.headers:d._headers=[]:d.headers?d._headers=d.headers:d._headers=g,h(d),d._headers=a("./filterRow")(d._headers,d);var e=p(b,d);this.setPartialData(e.partial),this.param.workerNum>1&&this.workerMgr.setParams(d);var k=q(e.lines,d,0);this.processResult(k),this.lastIndex+=k.length,this.recordNum+=k.length,c()},e.prototype.processResult=function(a){for(var b=0,c=a.length;c>b;b++){var d=a[b];d.err?this.emit("error",d.err):this.emitResult(d)}},e.prototype.emitResult=function(a){var b=a.index,c=a.row,d=a.json,e=null,f=null;"string"==typeof d?f=d:e=d,null===e&&this._needJson&&(e=JSON.parse(f),"string"==typeof c&&(c=JSON.parse(c))),this.transform&&"function"==typeof this.transform&&(this.transform(e,c,b),f=null),this._needEmitJson&&this.emit("json",e,b),this._needEmitCsv&&("string"==typeof c&&(c=JSON.parse(c)),this.emit("csv",c,b)),this.param.constructResult&&this._needEmitFinalResult&&this.finalResult.push(e),this._needEmitResult&&this.emit("record_parsed",e,c,b),this.param.toArrayString&&b>0&&this._needPush&&this.push(","+m),this._options&&this._options.objectMode?this.push(e):this._needPush&&(null===f&&(f=JSON.stringify(e)),this.push(this.param.toArrayString?f:f+m,"utf8"))},e.prototype.preProcessRaw=function(a,b){b(a)},e.prototype.preProcessLine=function(a,b){return a},e.prototype._flush=function(a){var b=this;if(this.flushCb=function(){b.emit("end_parsed",b.finalResult),b.workerMgr&&b.workerMgr.destroyWorker(),a(),b._needPush||b.emit("end")},this._csvLineBuffer.length>0){var c=this.getEol();this._csvLineBuffer[this._csvLineBuffer.length-1]!==c&&(this._csvLineBuffer+=c),this.processData(this._csvLineBuffer,function(){this.checkAndFlush()}.bind(this))}else this.checkAndFlush()},e.prototype.checkAndFlush=function(){0!==this._csvLineBuffer.length&&this.emit("error",r.unclosed_quote(this.recordNum,this._csvLineBuffer),this._csvLineBuffer),this.param.toArrayString&&this._needPush&&this.push(m+"]","utf8"),this.workerMgr&&this.workerMgr.isRunning()?this.workerMgr.drain=function(){this.flushCb()}.bind(this):this.flushCb()},e.prototype.getEol=function(a){if(!this.param.eol&&a){for(var b=0,c=a.length;c>b;b++){if("\r"===a[b])return"\n"===a[b+1]?this.param.eol="\r\n":this.param.eol="\r",this.param.eol;if("\n"===a[b])return this.param.eol="\n",this.param.eol}this.param.eol=m}return this.param.eol||m},e.prototype.fromFile=function(b,c,d){var e=a("fs"),f=null;return"object"==typeof c&&"undefined"==typeof d&&(d=c,c=null),this.wrapCallback(c,function(){f&&f.destroy&&f.destroy()}),e.exists(b,function(a){a?(f=e.createReadStream(b,d),f.pipe(this)):this.emit("error",new Error("File not exists"))}.bind(this)),this},e.prototype.fromStream=function(a,b){return b&&"function"==typeof b&&this.wrapCallback(b),a.pipe(this),this},e.prototype.transf=function(a){return this.transform=a,this},e.prototype.fromString=function(a,b){return"string"!=typeof a?b(new Error("Passed CSV Data is not a string.")):(b&&"function"==typeof b&&this.wrapCallback(b,function(){}),c.nextTick(function(){this.end(a)}.bind(this)),this)},e.prototype.wrapCallback=function(a,b){void 0===b&&(b=function(){}),a&&"function"==typeof a&&this.once("end_parsed",function(b){this.hasError||a(null,b)}.bind(this)),this.once("error",function(c){this.hasError=!0,a&&"function"==typeof a&&a(c),b()}.bind(this))},b.exports=e}).call(this,a("_process"),a("buffer").Buffer)},{"./CSVError":3,"./defParam":6,"./fileLineToCSVLine":13,"./fileline":14,"./filterRow":15,"./linesToJson":19,"./rowSplit":22,"./workerMgr":23,_process:42,buffer:33,fs:31,lodash:129,os:41,stream:60,"strip-bom":133,util:73}],5:[function(a,b,c){var d=a("./getEol"),e=a("./rowSplit");b.exports=function(a,b){for(var c=[],f="";a.length;){var g=f+a.shift(),h=e(g,b);h.closed?(c.push(h.cols),f=""):f=g+(d(g,b)||"\n")}return{lines:c,partial:f}}},{"./getEol":17,"./rowSplit":22}],6:[function(a,b,c){(function(a){function c(b,c){return a.env[b]?a.env[b]:c}var d=/^[0-9]+$/;b.exports=function(a){var b={constructResult:!0,delimiter:",",ignoreColumns:[],includeColumns:[],quote:'"',trim:!0,checkType:!1,toArrayString:!1,ignoreEmpty:!1,workerNum:c("CSV_WORKER",1),fork:!1,noheader:!1,headers:null,flatKeys:!1,maxRowLength:0,checkColumn:!1,escape:'"',colParser:{},_columnConv:[],_headerType:[],_headerTitle:[],_headerFlag:[],_headers:null,_needFilterRow:!1};a||(a={});for(var e in a)a.hasOwnProperty(e)&&(b[e]=a[e]);return b.ignoreColumns.length>0&&!d.test(b.ignoreColumns.join(""))&&(b._postIgnoreColumns=!0),b.includeColumns.length>0&&!d.test(b.includeColumns.join(""))&&(b._postIncludeColumns=!0),(b.ignoreColumns.length||b.includeColumns.length)&&(b._needFilterRow=!0,b._postIgnoreColumns||b.ignoreColumns.sort(function(a,b){return b-a})),b}}).call(this,a("_process"))},{_process:42}],7:[function(a,b,c){b.exports=[a("./parser_array.js"),a("./parser_json.js"),a("./parser_omit.js"),a("./parser_jsonarray.js"),a("./parser_flat.js")]},{"./parser_array.js":8,"./parser_flat.js":9,"./parser_json.js":10,"./parser_jsonarray.js":11,"./parser_omit.js":12}],8:[function(a,b,c){b.exports={name:"array",processSafe:!0,regExp:/^\*array\*/,parserFunc:function(a){var b=a.head.replace(this.regExp,"");void 0===a.resultRow[b]&&(a.resultRow[b]=[]),a.resultRow[b].push(a.item)}}},{}],9:[function(a,b,c){b.exports={name:"flat",processSafe:!0,regExp:/^\*flat\*/,parserFunc:function(a){var b=this.getHeadStr(),c=a.item;a.resultRow[b]=c}}},{}],10:[function(a,b,c){function d(a,b,c,d){for(var e,f,g;b.length>1;)e=b.shift(),f=d?!1:e.match(c),f?(void 0===a[e.replace(f[0],"")]&&(a[e.replace(f[0],"")]=[]),g=f[1],a=a[e.replace(f[0],"")],""===g&&(g=a.length),a[g]||(a[g]={}),a=a[g]):(void 0===a[e]&&(a[e]={}),a=a[e]);return a}var e=/\[([0-9]*)\]/;b.exports={name:"json",processSafe:!0,regExp:/^\*json\*/,parserFunc:function(a){var b,c,f,g=this.getHeadStr(),h=a.config&&a.config.flatKeys?[g]:g.split("."),i=d(a.resultRow,h,e,a.config&&a.config.flatKeys);if(f=h.shift(),b=a.config&&a.config.flatKeys?!1:f.match(e))try{f=f.replace(b[0],""),i[f]&&i[f]instanceof Array||(i[f]=[]),i[f]?(c=b[1],""===c&&(c=i[f].length),i[f][c]=a.item):a.resultRow[g]=a.item}catch(j){a.resultRow[g]=a.item}else"string"==typeof i?a.resultRow[g]=a.item:i[f]=a.item}}},{}],11:[function(a,b,c){b.exports={name:"jsonarray",processSafe:!0,regExp:/^\*jsonarray\*/,parserFunc:function(a){for(var b=a.head.replace(this.regExp,""),c=b.split("."),d=a.resultRow;c.length>1;){var e=c.shift();void 0===d[e]&&(d[e]={}),d=d[e]}var f=c.shift();void 0===d[f]&&(d[f]=[]),d[f].push(a.item)}}},{}],12:[function(a,b,c){b.exports={name:"omit",regExp:/^\*omit\*/,processSafe:!0,parserFunc:function(){}}},{}],13:[function(a,b,c){var d=a("./csvline");b.exports=function(a,b){var c=a.lines,e=d(c,b);return{lines:e.lines,partial:e.partial+a.partial}}},{"./csvline":5}],14:[function(a,b,c){var d=a("./getEol");b.exports=function(a,b){var c=d(a,b),e=a.split(c),f=e.pop();return{lines:e,partial:f}}},{"./getEol":17}],15:[function(a,b,c){b.exports=function(a,b){if(b.ignoreColumns instanceof Array&&b.ignoreColumns.length>0)for(var c=0,d=b.ignoreColumns.length;d>c;c++)b.ignoreColumns[c]>=0&&a.splice(b.ignoreColumns[c],1);if(b.includeColumns instanceof Array&&b.includeColumns.length>0){for(var e=[],f=0,g=b.includeColumns.length;g>f;f++)b.includeColumns[f]>=0&&e.push(a[b.includeColumns[f]]);a=e}return a}},{}],16:[function(a,b,c){function d(a,b){var c;if("auto"===b.delimiter)c=e;else{if(!(b.delimiter instanceof Array))return b.delimiter;c=b.delimiter}var d=0,f=",";return c.forEach(function(b){var c=a.split(b).length;c>d&&(f=b,d=c)}),f}b.exports=d;var e=[",","|","	",";",":"]},{}],17:[function(a,b,c){a("os").EOL;b.exports=function(a,b){if(!b.eol&&a)for(var c=0,d=a.length;d>c;c++){if("\r"===a[c])return"\n"===a[c+1]?b.eol="\r\n":a[c+1]&&(b.eol="\r"),b.eol;if("\n"===a[c])return b.eol="\n",b.eol}return b.eol}},{os:41}],18:[function(a,b,c){function d(a,c){return new b.exports.Converter(a,c)}b.exports=d,b.exports.Converter=a("./Converter.js")},{"./Converter.js":4}],19:[function(a,b,c){function d(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)d.push({err:null,json:{},index:c++,row:a[e]});return d}function e(a,b,c){for(var d=[],e=0,g=a.length;g>e;e++){var h=f(a[e],b,c++);h&&d.push(h)}return d}function f(a,b,c){var d=b.parseRules;if(b.checkColumn&&a.length!==d.length)return{err:s.column_mismatched(c)};var e=b._headers,f=g(a,e,b);return f?{json:f,index:c,row:a}:null}function g(a,b,c){for(var d=!1,e={},f=0,g=a.length;g>f;f++){var m,n,o;if(o=a[f],!c.ignoreEmpty||""!==o){d=!0,n=b[f],n&&""!==n||(n=b[f]="field"+(f+1));var p=h(n,f,c);if(p){var q=p(o,n,e,a,f);void 0!==q&&i(e,n,q)}else{var r=j(n,f,c);if("omit"===r)continue;c.checkType&&(m=l(o,n,f,c),o=m(o));var s=k(n,f,c);"flat"===r||c.flatKeys?e[s]=o:i(e,s,o)}}}return d?e:!1}function h(a,b,c){if(void 0!==c._columnConv[b])return c._columnConv[b];var d=c.colParser[a];if(void 0===d)return c._columnConv[b]=!1;if("string"==typeof d){d=d.trim().toLowerCase();var e=u[d];return e?c._columnConv[b]=e:c._columnConv[b]=!1}return"function"==typeof d?c._columnConv[b]=d:c._columnConv[b]=!1}function i(b,c,d){var e=a("lodash/set"),f=c.split(".");1===f.length?b[c]=d:e(b,c,d)}function j(a,b,c){return"string"==typeof c._headerFlag[b]?c._headerFlag[b]:a.indexOf("*omit*")>-1?c._headerFlag[b]="omit":a.indexOf("*flat*")>-1?c._headerFlag[b]="flat":c._headerFlag[b]=""}function k(a,b,c){if(c._headerTitle[b])return c._headerTitle[b];var d=(j(a,b,c),a.replace("*flat*","").replace("string#!","").replace("number#!",""));return c._headerTitle[b]=d}function l(a,b,c,d){return d._headerType[c]?d._headerType[c]:b.indexOf("number#!")>-1?d._headerType[c]=m:b.indexOf("string#!")>-1?d._headerType[c]=n:d.checkType?d._headerType[c]=o:d._headerType[c]=n}function m(a){var b=parseFloat(a);return isNaN(b)?a:b}function n(a){return a.toString()}function o(a){var b=a.trim();return""===b?n(a):t.test(b)?m(a):5===b.length&&"false"===b.toLowerCase()||4===b.length&&"true"===b.toLowerCase()?p(a):"{"===b[0]&&"}"===b[b.length-1]||"["===b[0]&&"]"===b[b.length-1]?q(a):n(a)}function p(a){var b=a.trim();return 5===b.length&&"false"===b.toLowerCase()?!1:!0}function q(a){try{return JSON.parse(a)}catch(b){return a}}var r=a("./parserMgr.js"),s=a("./CSVError"),t=/^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;b.exports=function(a,b,c){if(b._needParseJson){if(b._headers||(b._headers=[]),!b.parseRules){var f=b._headers;b.parseRules=r.initParsers(f,b)}return e(a,b,c)}return d(a,b,c)};var u={string:n,number:m,omit:function(){}}},{"./CSVError":3,"./parserMgr.js":21,"lodash/set":131}],20:[function(a,b,c){function d(a,b,c,d){this.name="undefined"==typeof a?"Default":a,this.regExp=null,this.type="",this.processSafe=d,"undefined"!=typeof b&&("string"==typeof b?this.regExp=new RegExp(b):this.regExp=b),"undefined"!=typeof c&&(this.parse=c)}var e=["number","string"];d.prototype.convertType=function(a){var b=this.type;if("number"===b){var c=parseFloat(a);return isNaN(c)?0:c}if(this.param&&this.param.checkType&&""===b){var d=a.trim();if(""===d)return d;if(!isNaN(d))return parseFloat(d);if(5===d.length&&"false"===d.toLowerCase())return!1;if(4===d.length&&"true"===d.toLowerCase())return!0;if(!("{"===d[0]&&"}"===d[d.length-1]||"["===d[0]&&"]"===d[d.length-1]))return a;try{return JSON.parse(d)}catch(e){return a}}return a},d.prototype.setParam=function(a){this.param=a},d.prototype.test=function(a){return this.regExp&&this.regExp.test(a)},d.prototype.parse=function(a){a.resultRow[a.head]=a.item},d.prototype.getHeadStr=function(){if(this.headStr)return this.headStr;var a=this.head;return this.headStr=a.replace(this.regExp,""),this.headStr||(this.headStr="Unknown Header"),this.getHeadStr()},d.prototype.getHead=function(){return this.head},d.prototype.initHead=function(a){this.head=a;var b=a.replace(this.regExp,""),c=b.split("#!");if(1===c.length)this.headStr=c[0];else{var d=c.shift();e.indexOf(d.toLowerCase())>-1?(this.type=d,this.headStr=c.join("#!")):this.headStr=b}this.headStr||(this.headStr=b?b:"Unknown Head")},d.prototype.clone=function(){var a=Object.create(this),b=new d;for(var c in a)b[c]=a[c];return b},d.prototype.getName=function(){return this.name},b.exports=d},{}],21:[function(a,b,c){function d(a){a instanceof i&&-1===h.indexOf(a)&&h.push(a)}function e(a,b){function c(a){var b;if(h.forEach(function(c){c.getName()===a&&(b=c)}),b){var c=b.clone();return c}return new i}var d,e;return a=a?a:"",h.forEach(function(b){b.test(a)&&(e=b)}),e?(d=e.clone(),d.head=a):d=c("json",a),d.setParam(b),d.initHead(a),d}function f(a,b,c){var e=new i(a,b,c,!1);d(e)}function g(a,b){var c=[];return a.forEach(function(a){c.push(e(a,b))}),c}var h=[],i=a("./parser.js"),j=a("./defaultParsers");j.forEach(function(a){f(a.name,a.regExp,a.parserFunc,a.processSafe)}),b.exports.addParser=f,b.exports.initParsers=g,b.exports.getParser=e},{"./defaultParsers":7,"./parser.js":20}],22:[function(a,b,c){function d(a,b){var c=b.quote,d=b.escape;return a[0]===c&&(a[1]!==c||a[1]===d&&(a[2]===c||2===a.length))}function e(a,b){for(var c=b.quote,d=0,e=a.length-1,f=b.escape;a[e]===c||a[e]===f;)e--,d++;return d%2!==0}function f(a,b,c){var d="es|"+b+"|"+c;void 0===i[d]&&("\\"===c&&(c="\\\\"),i[d]=new RegExp(c+b,"g"));var e=i[d];return a.replace(e,b)}var g=a("./getDelimiter"),h=a("./filterRow");b.exports=function(a,b){if(""===a)return{cols:[],closed:!0};var c=b.quote,i=b.trim,j=b.escape;(b.delimiter instanceof Array||"auto"===b.delimiter.toLowerCase())&&(b.delimiter=g(a,b));var k=b.delimiter,l=a.split(k);if("off"===c)return{cols:l,closed:!0};for(var m=[],n=!1,o="",p=0,q=l.length;q>p;p++){var r=l[p];!n&&i&&(r=r.trim());var s=r.length;if(n)e(r,b)?(n=!1,r=r.substr(0,s-1),o+=k+r,o=f(o,c,j),i&&(o=o.trimRight()),m.push(o),o=""):o+=k+r;else{if(d(r,b)){if(r=r.substr(1),e(r,b)){r=r.substring(0,r.length-1),r=f(r,c,j),m.push(r);continue}n=!0,o+=r;continue}m.push(r)}}return!n&&b._needFilterRow&&(m=h(m,b)),{cols:m,closed:!n}};var i={}},{"./filterRow":15,"./getDelimiter":16}],23:[function(a,b,c){(function(c,d){function e(){function a(a,b){i=[],j=0,k=null;for(var c=0;a>c;c++)i.push(new f(b))}function b(){return j>0}function d(){i.forEach(function(a){a.destroy()})}function e(a,b,d,f){if(i.length>0){var g=i.shift();j++,g.parse(a,b,function(a){i.push(g),f(a,b),j--,null===k&&0===j?h.drain():k&&(e.apply(this,k),k=null)}),c.nextTick(d)}else k=[a,b,d,f]}function g(a){i.forEach(function(b){b.setParams(a)})}var h={initWorker:a,sendWorker:e,setParams:g,drain:function(){},isRunning:b,destroyWorker:d},i=[],j=0,k=null;return h}function f(a){this.cp=g(c.execPath,[d+"/worker.js"],{env:{child:!0},stdio:["pipe","pipe",2,"ipc"]}),this.setParams(a),this.cp.on("message",this.onChildMsg.bind(this)),this.buffer="";var b=this;this.cp.stdout.on("data",function(a){for(var c=a.toString("utf8"),d=b.buffer+c,e=d.split(h);e.length>1;)b.onChildMsg(e.shift());b.buffer=e[0]})}b.exports=e;var g=a("child_process").spawn,h="",i="",j="",k=a("./CSVError");f.prototype.setParams=function(a){var b="0"+JSON.stringify(a);this.sendMsg(b)},f.prototype.onChildMsg=function(a){if(a){var b=a[0],c=a.substr(1);switch(b){case"0":if(this.cbLine){var d=c.split("|"),e=parseInt(d[0]),f=d[1];this.cbLine(e,f)}break;case"1":if(this.cbResult){var g=c.split(i);g.pop();var h=[];g.forEach(function(a){var b=a.split(j);h.push({index:b[0],row:b[1],err:b[2]?k.fromArray(JSON.parse(b[2])):null,json:b[3]})}),this.cbResult(h)}}}},f.prototype.parse=function(a,b,c){this.cbResult=c;var d="1"+b+"|"+a;this.sendMsg(d)},f.prototype.destroy=function(){this.cp.kill()},f.prototype.sendMsg=function(a){this.cp.stdin.write(a+h,"utf8")}}).call(this,a("_process"),"/libs/core")},{"./CSVError":3,_process:42,child_process:31}],24:[function(a,b,c){b.exports.core=a("./core"),b.exports=a("./core"),b.exports.interfaces=a("./interfaces")},{"./core":18,"./interfaces":27}],25:[function(a,b,c){b.exports=a("./main.js")},{"./main.js":26}],26:[function(a,b,c){(function(c){function d(){var a=new g,b=!1,d=c.stdout;return a.on("record_parsed",function(a){b&&d.write(",\n"),d.write(JSON.stringify(a)),b===!1&&(b=!0)}),d.write("[\n"),a.on("end_parsed",function(){d.write("\n]")}),a.on("error",function(a){console.error(a),c.exit(-1)}),a}function e(a){var b=d();b.from(a)}function f(a){var b=d();b.from(a)}var g=a("../../core/Converter.js");b.exports.convertFile=e,b.exports.convertString=f}).call(this,a("_process"))},{"../../core/Converter.js":4,_process:42}],27:[function(a,b,c){b.exports.web=a("./web"),b.exports.cli=a("./cli")},{"./cli":25,"./web":28}],28:[function(a,b,c){b.exports=a("./webServer.js")},{"./webServer.js":29}],29:[function(a,b,c){function d(a){a=a||{};var b={port:a.port||"8801",urlpath:a.urlpath||"/parseCSV"},c=e.createServer();return c.on("request",function(a,c){a.url===b.urlpath&&"POST"===a.method?a.pipe(new f({constructResult:!1})).pipe(c):c.end("Please post data to: "+b.urlpath)}),c.listen(b.port),console.log("CSV Web Server Listen On:"+b.port),console.log("POST to "+b.urlpath+" with CSV data to get parsed."),c}var e=a("http"),f=a("../../core/Converter.js");b.exports.startWebServer=d},{"../../core/Converter.js":4,http:61}],30:[function(a,b,c){(function(c){"use strict";function d(a,b){function d(b){return this instanceof d?(f.call(this,b),this._firstChunk=!0,this._transformCalled=!1,void(this._minSize=a.minSize)):new d(b)}if(e.inherits(d,f),"function"==typeof a&&(b=a,a={}),"function"!=typeof b)throw new Error("transform function required");return d.prototype._transform=function(a,d,e){return this._enc=d,this._firstChunk?(this._firstChunk=!1,null==this._minSize?(b.call(this,a,d,e),void(this._transformCalled=!0)):(this._buffer=a,void e())):null==this._minSize?(this.push(a),void e()):this._buffer.length<this._minSize?(this._buffer=c.concat([this._buffer,a]),void e()):this._buffer.length>=this._minSize?(b.call(this,this._buffer.slice(),d,function(){this.push(a),e()}.bind(this)),this._transformCalled=!0,void(this._buffer=!1)):(this.push(a),void e())},d.prototype._flush=function(a){return this._buffer?void(this._transformCalled?(this.push(this._buffer),a()):b.call(this,this._buffer.slice(),this._enc,a)):void a()},d}var e=a("util"),f=a("stream").Transform;b.exports=function(){return d.apply(d,arguments)()},b.exports.ctor=d}).call(this,a("buffer").Buffer)},{buffer:33,stream:60,util:73}],31:[function(a,b,c){},{}],32:[function(a,b,c){arguments[4][31][0].apply(c,arguments)},{dup:31}],33:[function(a,b,c){(function(b){"use strict";function d(){function a(){}try{var b=new Uint8Array(1);return b.foo=function(){return 42},b.constructor=a,42===b.foo()&&b.constructor===a&&"function"==typeof b.subarray&&0===b.subarray(1,1).byteLength}catch(c){return!1}}function e(){return f.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function f(a){return this instanceof f?(f.TYPED_ARRAY_SUPPORT||(this.length=0,this.parent=void 0),"number"==typeof a?g(this,a):"string"==typeof a?h(this,a,arguments.length>1?arguments[1]:"utf8"):i(this,a)):arguments.length>1?new f(a,arguments[1]):new f(a)}function g(a,b){if(a=p(a,0>b?0:0|q(b)),!f.TYPED_ARRAY_SUPPORT)for(var c=0;b>c;c++)a[c]=0;return a}function h(a,b,c){("string"!=typeof c||""===c)&&(c="utf8");var d=0|s(b,c);return a=p(a,d),a.write(b,c),a}function i(a,b){if(f.isBuffer(b))return j(a,b);if(Y(b))return k(a,b);if(null==b)throw new TypeError("must start with number, buffer, array or string");if("undefined"!=typeof ArrayBuffer){if(b.buffer instanceof ArrayBuffer)return l(a,b);if(b instanceof ArrayBuffer)return m(a,b)}return b.length?n(a,b):o(a,b)}function j(a,b){var c=0|q(b.length);return a=p(a,c),b.copy(a,0,0,c),a}function k(a,b){var c=0|q(b.length);a=p(a,c);for(var d=0;c>d;d+=1)a[d]=255&b[d];return a}function l(a,b){var c=0|q(b.length);a=p(a,c);for(var d=0;c>d;d+=1)a[d]=255&b[d];return a}function m(a,b){return f.TYPED_ARRAY_SUPPORT?(b.byteLength,a=f._augment(new Uint8Array(b))):a=l(a,new Uint8Array(b)),a}function n(a,b){var c=0|q(b.length);a=p(a,c);for(var d=0;c>d;d+=1)a[d]=255&b[d];return a}function o(a,b){var c,d=0;"Buffer"===b.type&&Y(b.data)&&(c=b.data,d=0|q(c.length)),a=p(a,d);for(var e=0;d>e;e+=1)a[e]=255&c[e];return a}function p(a,b){f.TYPED_ARRAY_SUPPORT?(a=f._augment(new Uint8Array(b)),a.__proto__=f.prototype):(a.length=b,a._isBuffer=!0);var c=0!==b&&b<=f.poolSize>>>1;return c&&(a.parent=Z),a}function q(a){if(a>=e())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+e().toString(16)+" bytes");return 0|a}function r(a,b){if(!(this instanceof r))return new r(a,b);var c=new f(a,b);return delete c.parent,c}function s(a,b){"string"!=typeof a&&(a=""+a);var c=a.length;if(0===c)return 0;for(var d=!1;;)switch(b){case"ascii":case"binary":case"raw":case"raws":return c;case"utf8":case"utf-8":return R(a).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*c;case"hex":return c>>>1;case"base64":return U(a).length;default:if(d)return R(a).length;b=(""+b).toLowerCase(),d=!0}}function t(a,b,c){var d=!1;if(b=0|b,c=void 0===c||c===1/0?this.length:0|c,a||(a="utf8"),0>b&&(b=0),c>this.length&&(c=this.length),b>=c)return"";for(;;)switch(a){case"hex":return F(this,b,c);case"utf8":case"utf-8":return B(this,b,c);case"ascii":return D(this,b,c);case"binary":return E(this,b,c);case"base64":return A(this,b,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return G(this,b,c);default:if(d)throw new TypeError("Unknown encoding: "+a);a=(a+"").toLowerCase(),d=!0}}function u(a,b,c,d){c=Number(c)||0;var e=a.length-c;d?(d=Number(d),d>e&&(d=e)):d=e;var f=b.length;if(f%2!==0)throw new Error("Invalid hex string");d>f/2&&(d=f/2);for(var g=0;d>g;g++){var h=parseInt(b.substr(2*g,2),16);if(isNaN(h))throw new Error("Invalid hex string");a[c+g]=h}return g}function v(a,b,c,d){return V(R(b,a.length-c),a,c,d)}function w(a,b,c,d){return V(S(b),a,c,d)}function x(a,b,c,d){return w(a,b,c,d)}function y(a,b,c,d){return V(U(b),a,c,d)}function z(a,b,c,d){return V(T(b,a.length-c),a,c,d)}function A(a,b,c){return 0===b&&c===a.length?W.fromByteArray(a):W.fromByteArray(a.slice(b,c))}function B(a,b,c){c=Math.min(a.length,c);for(var d=[],e=b;c>e;){var f=a[e],g=null,h=f>239?4:f>223?3:f>191?2:1;if(c>=e+h){var i,j,k,l;switch(h){case 1:128>f&&(g=f);break;case 2:i=a[e+1],128===(192&i)&&(l=(31&f)<<6|63&i,l>127&&(g=l));break;case 3:i=a[e+1],j=a[e+2],128===(192&i)&&128===(192&j)&&(l=(15&f)<<12|(63&i)<<6|63&j,l>2047&&(55296>l||l>57343)&&(g=l));break;case 4:i=a[e+1],j=a[e+2],k=a[e+3],128===(192&i)&&128===(192&j)&&128===(192&k)&&(l=(15&f)<<18|(63&i)<<12|(63&j)<<6|63&k,l>65535&&1114112>l&&(g=l))}}null===g?(g=65533,h=1):g>65535&&(g-=65536,d.push(g>>>10&1023|55296),g=56320|1023&g),d.push(g),e+=h}return C(d)}function C(a){var b=a.length;if($>=b)return String.fromCharCode.apply(String,a);for(var c="",d=0;b>d;)c+=String.fromCharCode.apply(String,a.slice(d,d+=$));return c}function D(a,b,c){var d="";c=Math.min(a.length,c);for(var e=b;c>e;e++)d+=String.fromCharCode(127&a[e]);return d}function E(a,b,c){var d="";c=Math.min(a.length,c);for(var e=b;c>e;e++)d+=String.fromCharCode(a[e]);return d}function F(a,b,c){var d=a.length;(!b||0>b)&&(b=0),(!c||0>c||c>d)&&(c=d);for(var e="",f=b;c>f;f++)e+=Q(a[f]);return e}function G(a,b,c){for(var d=a.slice(b,c),e="",f=0;f<d.length;f+=2)e+=String.fromCharCode(d[f]+256*d[f+1]);return e}function H(a,b,c){if(a%1!==0||0>a)throw new RangeError("offset is not uint");if(a+b>c)throw new RangeError("Trying to access beyond buffer length")}function I(a,b,c,d,e,g){if(!f.isBuffer(a))throw new TypeError("buffer must be a Buffer instance");if(b>e||g>b)throw new RangeError("value is out of bounds");if(c+d>a.length)throw new RangeError("index out of range")}function J(a,b,c,d){0>b&&(b=65535+b+1);for(var e=0,f=Math.min(a.length-c,2);f>e;e++)a[c+e]=(b&255<<8*(d?e:1-e))>>>8*(d?e:1-e)}function K(a,b,c,d){0>b&&(b=4294967295+b+1);for(var e=0,f=Math.min(a.length-c,4);f>e;e++)a[c+e]=b>>>8*(d?e:3-e)&255}function L(a,b,c,d,e,f){if(b>e||f>b)throw new RangeError("value is out of bounds");if(c+d>a.length)throw new RangeError("index out of range");if(0>c)throw new RangeError("index out of range")}function M(a,b,c,d,e){return e||L(a,b,c,4,3.4028234663852886e38,-3.4028234663852886e38),X.write(a,b,c,d,23,4),c+4}function N(a,b,c,d,e){return e||L(a,b,c,8,1.7976931348623157e308,-1.7976931348623157e308),X.write(a,b,c,d,52,8),c+8}function O(a){if(a=P(a).replace(aa,""),a.length<2)return"";for(;a.length%4!==0;)a+="=";return a}function P(a){return a.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}function Q(a){return 16>a?"0"+a.toString(16):a.toString(16)}function R(a,b){b=b||1/0;for(var c,d=a.length,e=null,f=[],g=0;d>g;g++){if(c=a.charCodeAt(g),c>55295&&57344>c){if(!e){if(c>56319){(b-=3)>-1&&f.push(239,191,189);continue}if(g+1===d){(b-=3)>-1&&f.push(239,191,189);continue}e=c;continue}if(56320>c){(b-=3)>-1&&f.push(239,191,189),e=c;continue}c=(e-55296<<10|c-56320)+65536}else e&&(b-=3)>-1&&f.push(239,191,189);if(e=null,128>c){if((b-=1)<0)break;f.push(c)}else if(2048>c){if((b-=2)<0)break;f.push(c>>6|192,63&c|128)}else if(65536>c){if((b-=3)<0)break;f.push(c>>12|224,c>>6&63|128,63&c|128)}else{if(!(1114112>c))throw new Error("Invalid code point");if((b-=4)<0)break;f.push(c>>18|240,c>>12&63|128,c>>6&63|128,63&c|128)}}return f}function S(a){for(var b=[],c=0;c<a.length;c++)b.push(255&a.charCodeAt(c));return b}function T(a,b){for(var c,d,e,f=[],g=0;g<a.length&&!((b-=2)<0);g++)c=a.charCodeAt(g),d=c>>8,e=c%256,f.push(e),f.push(d);return f}function U(a){return W.toByteArray(O(a))}function V(a,b,c,d){for(var e=0;d>e&&!(e+c>=b.length||e>=a.length);e++)b[e+c]=a[e];return e}var W=a("base64-js"),X=a("ieee754"),Y=a("isarray");c.Buffer=f,c.SlowBuffer=r,c.INSPECT_MAX_BYTES=50,f.poolSize=8192;var Z={};f.TYPED_ARRAY_SUPPORT=void 0!==b.TYPED_ARRAY_SUPPORT?b.TYPED_ARRAY_SUPPORT:d(),f.TYPED_ARRAY_SUPPORT?(f.prototype.__proto__=Uint8Array.prototype,f.__proto__=Uint8Array):(f.prototype.length=void 0,f.prototype.parent=void 0),f.isBuffer=function(a){return!(null==a||!a._isBuffer);
+},f.compare=function(a,b){if(!f.isBuffer(a)||!f.isBuffer(b))throw new TypeError("Arguments must be Buffers");if(a===b)return 0;for(var c=a.length,d=b.length,e=0,g=Math.min(c,d);g>e&&a[e]===b[e];)++e;return e!==g&&(c=a[e],d=b[e]),d>c?-1:c>d?1:0},f.isEncoding=function(a){switch(String(a).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"raw":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},f.concat=function(a,b){if(!Y(a))throw new TypeError("list argument must be an Array of Buffers.");if(0===a.length)return new f(0);var c;if(void 0===b)for(b=0,c=0;c<a.length;c++)b+=a[c].length;var d=new f(b),e=0;for(c=0;c<a.length;c++){var g=a[c];g.copy(d,e),e+=g.length}return d},f.byteLength=s,f.prototype.toString=function(){var a=0|this.length;return 0===a?"":0===arguments.length?B(this,0,a):t.apply(this,arguments)},f.prototype.equals=function(a){if(!f.isBuffer(a))throw new TypeError("Argument must be a Buffer");return this===a?!0:0===f.compare(this,a)},f.prototype.inspect=function(){var a="",b=c.INSPECT_MAX_BYTES;return this.length>0&&(a=this.toString("hex",0,b).match(/.{2}/g).join(" "),this.length>b&&(a+=" ... ")),"<Buffer "+a+">"},f.prototype.compare=function(a){if(!f.isBuffer(a))throw new TypeError("Argument must be a Buffer");return this===a?0:f.compare(this,a)},f.prototype.indexOf=function(a,b){function c(a,b,c){for(var d=-1,e=0;c+e<a.length;e++)if(a[c+e]===b[-1===d?0:e-d]){if(-1===d&&(d=e),e-d+1===b.length)return c+d}else d=-1;return-1}if(b>2147483647?b=2147483647:-2147483648>b&&(b=-2147483648),b>>=0,0===this.length)return-1;if(b>=this.length)return-1;if(0>b&&(b=Math.max(this.length+b,0)),"string"==typeof a)return 0===a.length?-1:String.prototype.indexOf.call(this,a,b);if(f.isBuffer(a))return c(this,a,b);if("number"==typeof a)return f.TYPED_ARRAY_SUPPORT&&"function"===Uint8Array.prototype.indexOf?Uint8Array.prototype.indexOf.call(this,a,b):c(this,[a],b);throw new TypeError("val must be string, number or Buffer")},f.prototype.get=function(a){return console.log(".get() is deprecated. Access using array indexes instead."),this.readUInt8(a)},f.prototype.set=function(a,b){return console.log(".set() is deprecated. Access using array indexes instead."),this.writeUInt8(a,b)},f.prototype.write=function(a,b,c,d){if(void 0===b)d="utf8",c=this.length,b=0;else if(void 0===c&&"string"==typeof b)d=b,c=this.length,b=0;else if(isFinite(b))b=0|b,isFinite(c)?(c=0|c,void 0===d&&(d="utf8")):(d=c,c=void 0);else{var e=d;d=b,b=0|c,c=e}var f=this.length-b;if((void 0===c||c>f)&&(c=f),a.length>0&&(0>c||0>b)||b>this.length)throw new RangeError("attempt to write outside buffer bounds");d||(d="utf8");for(var g=!1;;)switch(d){case"hex":return u(this,a,b,c);case"utf8":case"utf-8":return v(this,a,b,c);case"ascii":return w(this,a,b,c);case"binary":return x(this,a,b,c);case"base64":return y(this,a,b,c);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return z(this,a,b,c);default:if(g)throw new TypeError("Unknown encoding: "+d);d=(""+d).toLowerCase(),g=!0}},f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var $=4096;f.prototype.slice=function(a,b){var c=this.length;a=~~a,b=void 0===b?c:~~b,0>a?(a+=c,0>a&&(a=0)):a>c&&(a=c),0>b?(b+=c,0>b&&(b=0)):b>c&&(b=c),a>b&&(b=a);var d;if(f.TYPED_ARRAY_SUPPORT)d=f._augment(this.subarray(a,b));else{var e=b-a;d=new f(e,void 0);for(var g=0;e>g;g++)d[g]=this[g+a]}return d.length&&(d.parent=this.parent||this),d},f.prototype.readUIntLE=function(a,b,c){a=0|a,b=0|b,c||H(a,b,this.length);for(var d=this[a],e=1,f=0;++f<b&&(e*=256);)d+=this[a+f]*e;return d},f.prototype.readUIntBE=function(a,b,c){a=0|a,b=0|b,c||H(a,b,this.length);for(var d=this[a+--b],e=1;b>0&&(e*=256);)d+=this[a+--b]*e;return d},f.prototype.readUInt8=function(a,b){return b||H(a,1,this.length),this[a]},f.prototype.readUInt16LE=function(a,b){return b||H(a,2,this.length),this[a]|this[a+1]<<8},f.prototype.readUInt16BE=function(a,b){return b||H(a,2,this.length),this[a]<<8|this[a+1]},f.prototype.readUInt32LE=function(a,b){return b||H(a,4,this.length),(this[a]|this[a+1]<<8|this[a+2]<<16)+16777216*this[a+3]},f.prototype.readUInt32BE=function(a,b){return b||H(a,4,this.length),16777216*this[a]+(this[a+1]<<16|this[a+2]<<8|this[a+3])},f.prototype.readIntLE=function(a,b,c){a=0|a,b=0|b,c||H(a,b,this.length);for(var d=this[a],e=1,f=0;++f<b&&(e*=256);)d+=this[a+f]*e;return e*=128,d>=e&&(d-=Math.pow(2,8*b)),d},f.prototype.readIntBE=function(a,b,c){a=0|a,b=0|b,c||H(a,b,this.length);for(var d=b,e=1,f=this[a+--d];d>0&&(e*=256);)f+=this[a+--d]*e;return e*=128,f>=e&&(f-=Math.pow(2,8*b)),f},f.prototype.readInt8=function(a,b){return b||H(a,1,this.length),128&this[a]?-1*(255-this[a]+1):this[a]},f.prototype.readInt16LE=function(a,b){b||H(a,2,this.length);var c=this[a]|this[a+1]<<8;return 32768&c?4294901760|c:c},f.prototype.readInt16BE=function(a,b){b||H(a,2,this.length);var c=this[a+1]|this[a]<<8;return 32768&c?4294901760|c:c},f.prototype.readInt32LE=function(a,b){return b||H(a,4,this.length),this[a]|this[a+1]<<8|this[a+2]<<16|this[a+3]<<24},f.prototype.readInt32BE=function(a,b){return b||H(a,4,this.length),this[a]<<24|this[a+1]<<16|this[a+2]<<8|this[a+3]},f.prototype.readFloatLE=function(a,b){return b||H(a,4,this.length),X.read(this,a,!0,23,4)},f.prototype.readFloatBE=function(a,b){return b||H(a,4,this.length),X.read(this,a,!1,23,4)},f.prototype.readDoubleLE=function(a,b){return b||H(a,8,this.length),X.read(this,a,!0,52,8)},f.prototype.readDoubleBE=function(a,b){return b||H(a,8,this.length),X.read(this,a,!1,52,8)},f.prototype.writeUIntLE=function(a,b,c,d){a=+a,b=0|b,c=0|c,d||I(this,a,b,c,Math.pow(2,8*c),0);var e=1,f=0;for(this[b]=255&a;++f<c&&(e*=256);)this[b+f]=a/e&255;return b+c},f.prototype.writeUIntBE=function(a,b,c,d){a=+a,b=0|b,c=0|c,d||I(this,a,b,c,Math.pow(2,8*c),0);var e=c-1,f=1;for(this[b+e]=255&a;--e>=0&&(f*=256);)this[b+e]=a/f&255;return b+c},f.prototype.writeUInt8=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,1,255,0),f.TYPED_ARRAY_SUPPORT||(a=Math.floor(a)),this[b]=255&a,b+1},f.prototype.writeUInt16LE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8):J(this,a,b,!0),b+2},f.prototype.writeUInt16BE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,2,65535,0),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=255&a):J(this,a,b,!1),b+2},f.prototype.writeUInt32LE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[b+3]=a>>>24,this[b+2]=a>>>16,this[b+1]=a>>>8,this[b]=255&a):K(this,a,b,!0),b+4},f.prototype.writeUInt32BE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,4,4294967295,0),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=255&a):K(this,a,b,!1),b+4},f.prototype.writeIntLE=function(a,b,c,d){if(a=+a,b=0|b,!d){var e=Math.pow(2,8*c-1);I(this,a,b,c,e-1,-e)}var f=0,g=1,h=0>a?1:0;for(this[b]=255&a;++f<c&&(g*=256);)this[b+f]=(a/g>>0)-h&255;return b+c},f.prototype.writeIntBE=function(a,b,c,d){if(a=+a,b=0|b,!d){var e=Math.pow(2,8*c-1);I(this,a,b,c,e-1,-e)}var f=c-1,g=1,h=0>a?1:0;for(this[b+f]=255&a;--f>=0&&(g*=256);)this[b+f]=(a/g>>0)-h&255;return b+c},f.prototype.writeInt8=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,1,127,-128),f.TYPED_ARRAY_SUPPORT||(a=Math.floor(a)),0>a&&(a=255+a+1),this[b]=255&a,b+1},f.prototype.writeInt16LE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8):J(this,a,b,!0),b+2},f.prototype.writeInt16BE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,2,32767,-32768),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>8,this[b+1]=255&a):J(this,a,b,!1),b+2},f.prototype.writeInt32LE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,4,2147483647,-2147483648),f.TYPED_ARRAY_SUPPORT?(this[b]=255&a,this[b+1]=a>>>8,this[b+2]=a>>>16,this[b+3]=a>>>24):K(this,a,b,!0),b+4},f.prototype.writeInt32BE=function(a,b,c){return a=+a,b=0|b,c||I(this,a,b,4,2147483647,-2147483648),0>a&&(a=4294967295+a+1),f.TYPED_ARRAY_SUPPORT?(this[b]=a>>>24,this[b+1]=a>>>16,this[b+2]=a>>>8,this[b+3]=255&a):K(this,a,b,!1),b+4},f.prototype.writeFloatLE=function(a,b,c){return M(this,a,b,!0,c)},f.prototype.writeFloatBE=function(a,b,c){return M(this,a,b,!1,c)},f.prototype.writeDoubleLE=function(a,b,c){return N(this,a,b,!0,c)},f.prototype.writeDoubleBE=function(a,b,c){return N(this,a,b,!1,c)},f.prototype.copy=function(a,b,c,d){if(c||(c=0),d||0===d||(d=this.length),b>=a.length&&(b=a.length),b||(b=0),d>0&&c>d&&(d=c),d===c)return 0;if(0===a.length||0===this.length)return 0;if(0>b)throw new RangeError("targetStart out of bounds");if(0>c||c>=this.length)throw new RangeError("sourceStart out of bounds");if(0>d)throw new RangeError("sourceEnd out of bounds");d>this.length&&(d=this.length),a.length-b<d-c&&(d=a.length-b+c);var e,g=d-c;if(this===a&&b>c&&d>b)for(e=g-1;e>=0;e--)a[e+b]=this[e+c];else if(1e3>g||!f.TYPED_ARRAY_SUPPORT)for(e=0;g>e;e++)a[e+b]=this[e+c];else a._set(this.subarray(c,c+g),b);return g},f.prototype.fill=function(a,b,c){if(a||(a=0),b||(b=0),c||(c=this.length),b>c)throw new RangeError("end < start");if(c!==b&&0!==this.length){if(0>b||b>=this.length)throw new RangeError("start out of bounds");if(0>c||c>this.length)throw new RangeError("end out of bounds");var d;if("number"==typeof a)for(d=b;c>d;d++)this[d]=a;else{var e=R(a.toString()),f=e.length;for(d=b;c>d;d++)this[d]=e[d%f]}return this}},f.prototype.toArrayBuffer=function(){if("undefined"!=typeof Uint8Array){if(f.TYPED_ARRAY_SUPPORT)return new f(this).buffer;for(var a=new Uint8Array(this.length),b=0,c=a.length;c>b;b+=1)a[b]=this[b];return a.buffer}throw new TypeError("Buffer.toArrayBuffer not supported in this browser")};var _=f.prototype;f._augment=function(a){return a.constructor=f,a._isBuffer=!0,a._set=a.set,a.get=_.get,a.set=_.set,a.write=_.write,a.toString=_.toString,a.toLocaleString=_.toString,a.toJSON=_.toJSON,a.equals=_.equals,a.compare=_.compare,a.indexOf=_.indexOf,a.copy=_.copy,a.slice=_.slice,a.readUIntLE=_.readUIntLE,a.readUIntBE=_.readUIntBE,a.readUInt8=_.readUInt8,a.readUInt16LE=_.readUInt16LE,a.readUInt16BE=_.readUInt16BE,a.readUInt32LE=_.readUInt32LE,a.readUInt32BE=_.readUInt32BE,a.readIntLE=_.readIntLE,a.readIntBE=_.readIntBE,a.readInt8=_.readInt8,a.readInt16LE=_.readInt16LE,a.readInt16BE=_.readInt16BE,a.readInt32LE=_.readInt32LE,a.readInt32BE=_.readInt32BE,a.readFloatLE=_.readFloatLE,a.readFloatBE=_.readFloatBE,a.readDoubleLE=_.readDoubleLE,a.readDoubleBE=_.readDoubleBE,a.writeUInt8=_.writeUInt8,a.writeUIntLE=_.writeUIntLE,a.writeUIntBE=_.writeUIntBE,a.writeUInt16LE=_.writeUInt16LE,a.writeUInt16BE=_.writeUInt16BE,a.writeUInt32LE=_.writeUInt32LE,a.writeUInt32BE=_.writeUInt32BE,a.writeIntLE=_.writeIntLE,a.writeIntBE=_.writeIntBE,a.writeInt8=_.writeInt8,a.writeInt16LE=_.writeInt16LE,a.writeInt16BE=_.writeInt16BE,a.writeInt32LE=_.writeInt32LE,a.writeInt32BE=_.writeInt32BE,a.writeFloatLE=_.writeFloatLE,a.writeFloatBE=_.writeFloatBE,a.writeDoubleLE=_.writeDoubleLE,a.writeDoubleBE=_.writeDoubleBE,a.fill=_.fill,a.inspect=_.inspect,a.toArrayBuffer=_.toArrayBuffer,a};var aa=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":34,ieee754:35,isarray:36}],34:[function(a,b,c){var d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";!function(a){"use strict";function b(a){var b=a.charCodeAt(0);return b===g||b===l?62:b===h||b===m?63:i>b?-1:i+10>b?b-i+26+26:k+26>b?b-k:j+26>b?b-j+26:void 0}function c(a){function c(a){j[l++]=a}var d,e,g,h,i,j;if(a.length%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var k=a.length;i="="===a.charAt(k-2)?2:"="===a.charAt(k-1)?1:0,j=new f(3*a.length/4-i),g=i>0?a.length-4:a.length;var l=0;for(d=0,e=0;g>d;d+=4,e+=3)h=b(a.charAt(d))<<18|b(a.charAt(d+1))<<12|b(a.charAt(d+2))<<6|b(a.charAt(d+3)),c((16711680&h)>>16),c((65280&h)>>8),c(255&h);return 2===i?(h=b(a.charAt(d))<<2|b(a.charAt(d+1))>>4,c(255&h)):1===i&&(h=b(a.charAt(d))<<10|b(a.charAt(d+1))<<4|b(a.charAt(d+2))>>2,c(h>>8&255),c(255&h)),j}function e(a){function b(a){return d.charAt(a)}function c(a){return b(a>>18&63)+b(a>>12&63)+b(a>>6&63)+b(63&a)}var e,f,g,h=a.length%3,i="";for(e=0,g=a.length-h;g>e;e+=3)f=(a[e]<<16)+(a[e+1]<<8)+a[e+2],i+=c(f);switch(h){case 1:f=a[a.length-1],i+=b(f>>2),i+=b(f<<4&63),i+="==";break;case 2:f=(a[a.length-2]<<8)+a[a.length-1],i+=b(f>>10),i+=b(f>>4&63),i+=b(f<<2&63),i+="="}return i}var f="undefined"!=typeof Uint8Array?Uint8Array:Array,g="+".charCodeAt(0),h="/".charCodeAt(0),i="0".charCodeAt(0),j="a".charCodeAt(0),k="A".charCodeAt(0),l="-".charCodeAt(0),m="_".charCodeAt(0);a.toByteArray=c,a.fromByteArray=e}("undefined"==typeof c?this.base64js={}:c)},{}],35:[function(a,b,c){c.read=function(a,b,c,d,e){var f,g,h=8*e-d-1,i=(1<<h)-1,j=i>>1,k=-7,l=c?e-1:0,m=c?-1:1,n=a[b+l];for(l+=m,f=n&(1<<-k)-1,n>>=-k,k+=h;k>0;f=256*f+a[b+l],l+=m,k-=8);for(g=f&(1<<-k)-1,f>>=-k,k+=d;k>0;g=256*g+a[b+l],l+=m,k-=8);if(0===f)f=1-j;else{if(f===i)return g?NaN:(n?-1:1)*(1/0);g+=Math.pow(2,d),f-=j}return(n?-1:1)*g*Math.pow(2,f-d)},c.write=function(a,b,c,d,e,f){var g,h,i,j=8*f-e-1,k=(1<<j)-1,l=k>>1,m=23===e?Math.pow(2,-24)-Math.pow(2,-77):0,n=d?0:f-1,o=d?1:-1,p=0>b||0===b&&0>1/b?1:0;for(b=Math.abs(b),isNaN(b)||b===1/0?(h=isNaN(b)?1:0,g=k):(g=Math.floor(Math.log(b)/Math.LN2),b*(i=Math.pow(2,-g))<1&&(g--,i*=2),b+=g+l>=1?m/i:m*Math.pow(2,1-l),b*i>=2&&(g++,i/=2),g+l>=k?(h=0,g=k):g+l>=1?(h=(b*i-1)*Math.pow(2,e),g+=l):(h=b*Math.pow(2,l-1)*Math.pow(2,e),g=0));e>=8;a[c+n]=255&h,n+=o,h/=256,e-=8);for(g=g<<e|h,j+=e;j>0;a[c+n]=255&g,n+=o,g/=256,j-=8);a[c+n-o]|=128*p}},{}],36:[function(a,b,c){var d={}.toString;b.exports=Array.isArray||function(a){return"[object Array]"==d.call(a)}},{}],37:[function(a,b,c){function d(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function e(a){return"function"==typeof a}function f(a){return"number"==typeof a}function g(a){return"object"==typeof a&&null!==a}function h(a){return void 0===a}b.exports=d,d.EventEmitter=d,d.prototype._events=void 0,d.prototype._maxListeners=void 0,d.defaultMaxListeners=10,d.prototype.setMaxListeners=function(a){if(!f(a)||0>a||isNaN(a))throw TypeError("n must be a positive number");return this._maxListeners=a,this},d.prototype.emit=function(a){var b,c,d,f,i,j;if(this._events||(this._events={}),"error"===a&&(!this._events.error||g(this._events.error)&&!this._events.error.length)){if(b=arguments[1],b instanceof Error)throw b;throw TypeError('Uncaught, unspecified "error" event.')}if(c=this._events[a],h(c))return!1;if(e(c))switch(arguments.length){case 1:c.call(this);break;case 2:c.call(this,arguments[1]);break;case 3:c.call(this,arguments[1],arguments[2]);break;default:for(d=arguments.length,f=new Array(d-1),i=1;d>i;i++)f[i-1]=arguments[i];c.apply(this,f)}else if(g(c)){for(d=arguments.length,f=new Array(d-1),i=1;d>i;i++)f[i-1]=arguments[i];for(j=c.slice(),d=j.length,i=0;d>i;i++)j[i].apply(this,f)}return!0},d.prototype.addListener=function(a,b){var c;if(!e(b))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",a,e(b.listener)?b.listener:b),this._events[a]?g(this._events[a])?this._events[a].push(b):this._events[a]=[this._events[a],b]:this._events[a]=b,g(this._events[a])&&!this._events[a].warned){var c;c=h(this._maxListeners)?d.defaultMaxListeners:this._maxListeners,c&&c>0&&this._events[a].length>c&&(this._events[a].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[a].length),"function"==typeof console.trace&&console.trace())}return this},d.prototype.on=d.prototype.addListener,d.prototype.once=function(a,b){function c(){this.removeListener(a,c),d||(d=!0,b.apply(this,arguments))}if(!e(b))throw TypeError("listener must be a function");var d=!1;return c.listener=b,this.on(a,c),this},d.prototype.removeListener=function(a,b){var c,d,f,h;if(!e(b))throw TypeError("listener must be a function");if(!this._events||!this._events[a])return this;if(c=this._events[a],f=c.length,d=-1,c===b||e(c.listener)&&c.listener===b)delete this._events[a],this._events.removeListener&&this.emit("removeListener",a,b);else if(g(c)){for(h=f;h-- >0;)if(c[h]===b||c[h].listener&&c[h].listener===b){d=h;break}if(0>d)return this;1===c.length?(c.length=0,delete this._events[a]):c.splice(d,1),this._events.removeListener&&this.emit("removeListener",a,b)}return this},d.prototype.removeAllListeners=function(a){var b,c;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[a]&&delete this._events[a],this;if(0===arguments.length){for(b in this._events)"removeListener"!==b&&this.removeAllListeners(b);return this.removeAllListeners("removeListener"),this._events={},this}if(c=this._events[a],e(c))this.removeListener(a,c);else for(;c.length;)this.removeListener(a,c[c.length-1]);return delete this._events[a],this},d.prototype.listeners=function(a){var b;return b=this._events&&this._events[a]?e(this._events[a])?[this._events[a]]:this._events[a].slice():[]},d.listenerCount=function(a,b){var c;return c=a._events&&a._events[b]?e(a._events[b])?1:a._events[b].length:0}},{}],38:[function(a,b,c){"function"==typeof Object.create?b.exports=function(a,b){a.super_=b,a.prototype=Object.create(b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}})}:b.exports=function(a,b){a.super_=b;var c=function(){};c.prototype=b.prototype,a.prototype=new c,a.prototype.constructor=a}},{}],39:[function(a,b,c){b.exports=function(a){return!(null==a||!(a._isBuffer||a.constructor&&"function"==typeof a.constructor.isBuffer&&a.constructor.isBuffer(a)))}},{}],40:[function(a,b,c){b.exports=Array.isArray||function(a){return"[object Array]"==Object.prototype.toString.call(a)}},{}],41:[function(a,b,c){c.endianness=function(){return"LE"},c.hostname=function(){return"undefined"!=typeof location?location.hostname:""},c.loadavg=function(){return[]},c.uptime=function(){return 0},c.freemem=function(){return Number.MAX_VALUE},c.totalmem=function(){return Number.MAX_VALUE},c.cpus=function(){return[]},c.type=function(){return"Browser"},c.release=function(){return"undefined"!=typeof navigator?navigator.appVersion:""},c.networkInterfaces=c.getNetworkInterfaces=function(){return{}},c.arch=function(){return"javascript"},c.platform=function(){return"browser"},c.tmpdir=c.tmpDir=function(){return"/tmp"},c.EOL="\n"},{}],42:[function(a,b,c){function d(){k=!1,h.length?j=h.concat(j):l=-1,j.length&&e()}function e(){if(!k){var a=setTimeout(d);k=!0;for(var b=j.length;b;){for(h=j,j=[];++l<b;)h&&h[l].run();l=-1,b=j.length}h=null,k=!1,clearTimeout(a)}}function f(a,b){this.fun=a,this.array=b}function g(){}var h,i=b.exports={},j=[],k=!1,l=-1;i.nextTick=function(a){var b=new Array(arguments.length-1);if(arguments.length>1)for(var c=1;c<arguments.length;c++)b[c-1]=arguments[c];j.push(new f(a,b)),1!==j.length||k||setTimeout(e,0)},f.prototype.run=function(){this.fun.apply(null,this.array)},i.title="browser",i.browser=!0,i.env={},i.argv=[],i.version="",i.versions={},i.on=g,i.addListener=g,i.once=g,i.off=g,i.removeListener=g,i.removeAllListeners=g,i.emit=g,i.binding=function(a){throw new Error("process.binding is not supported")},i.cwd=function(){return"/"},i.chdir=function(a){throw new Error("process.chdir is not supported")},i.umask=function(){return 0}},{}],43:[function(a,b,c){(function(a){!function(d){function e(a){throw new RangeError(H[a])}function f(a,b){for(var c=a.length,d=[];c--;)d[c]=b(a[c]);return d}function g(a,b){var c=a.split("@"),d="";c.length>1&&(d=c[0]+"@",a=c[1]),a=a.replace(G,".");var e=a.split("."),g=f(e,b).join(".");return d+g}function h(a){for(var b,c,d=[],e=0,f=a.length;f>e;)b=a.charCodeAt(e++),b>=55296&&56319>=b&&f>e?(c=a.charCodeAt(e++),56320==(64512&c)?d.push(((1023&b)<<10)+(1023&c)+65536):(d.push(b),e--)):d.push(b);return d}function i(a){return f(a,function(a){var b="";return a>65535&&(a-=65536,b+=K(a>>>10&1023|55296),a=56320|1023&a),b+=K(a)}).join("")}function j(a){return 10>a-48?a-22:26>a-65?a-65:26>a-97?a-97:w}function k(a,b){return a+22+75*(26>a)-((0!=b)<<5)}function l(a,b,c){var d=0;for(a=c?J(a/A):a>>1,a+=J(a/b);a>I*y>>1;d+=w)a=J(a/I);return J(d+(I+1)*a/(a+z))}function m(a){var b,c,d,f,g,h,k,m,n,o,p=[],q=a.length,r=0,s=C,t=B;for(c=a.lastIndexOf(D),0>c&&(c=0),d=0;c>d;++d)a.charCodeAt(d)>=128&&e("not-basic"),p.push(a.charCodeAt(d));for(f=c>0?c+1:0;q>f;){for(g=r,h=1,k=w;f>=q&&e("invalid-input"),m=j(a.charCodeAt(f++)),(m>=w||m>J((v-r)/h))&&e("overflow"),r+=m*h,n=t>=k?x:k>=t+y?y:k-t,!(n>m);k+=w)o=w-n,h>J(v/o)&&e("overflow"),h*=o;b=p.length+1,t=l(r-g,b,0==g),J(r/b)>v-s&&e("overflow"),s+=J(r/b),r%=b,p.splice(r++,0,s)}return i(p)}function n(a){var b,c,d,f,g,i,j,m,n,o,p,q,r,s,t,u=[];for(a=h(a),q=a.length,b=C,c=0,g=B,i=0;q>i;++i)p=a[i],128>p&&u.push(K(p));for(d=f=u.length,f&&u.push(D);q>d;){for(j=v,i=0;q>i;++i)p=a[i],p>=b&&j>p&&(j=p);for(r=d+1,j-b>J((v-c)/r)&&e("overflow"),c+=(j-b)*r,b=j,i=0;q>i;++i)if(p=a[i],b>p&&++c>v&&e("overflow"),p==b){for(m=c,n=w;o=g>=n?x:n>=g+y?y:n-g,!(o>m);n+=w)t=m-o,s=w-o,u.push(K(k(o+t%s,0))),m=J(t/s);u.push(K(k(m,0))),g=l(c,r,d==f),c=0,++d}++c,++b}return u.join("")}function o(a){return g(a,function(a){return E.test(a)?m(a.slice(4).toLowerCase()):a})}function p(a){return g(a,function(a){return F.test(a)?"xn--"+n(a):a})}var q="object"==typeof c&&c&&!c.nodeType&&c,r="object"==typeof b&&b&&!b.nodeType&&b,s="object"==typeof a&&a;(s.global===s||s.window===s||s.self===s)&&(d=s);var t,u,v=2147483647,w=36,x=1,y=26,z=38,A=700,B=72,C=128,D="-",E=/^xn--/,F=/[^\x20-\x7E]/,G=/[\x2E\u3002\uFF0E\uFF61]/g,H={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},I=w-x,J=Math.floor,K=String.fromCharCode;if(t={version:"1.3.2",ucs2:{decode:h,encode:i},decode:m,encode:n,toASCII:p,toUnicode:o},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return t});else if(q&&r)if(b.exports==q)r.exports=t;else for(u in t)t.hasOwnProperty(u)&&(q[u]=t[u]);else d.punycode=t}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],44:[function(a,b,c){"use strict";function d(a,b){return Object.prototype.hasOwnProperty.call(a,b)}b.exports=function(a,b,c,f){b=b||"&",c=c||"=";var g={};if("string"!=typeof a||0===a.length)return g;var h=/\+/g;a=a.split(b);var i=1e3;f&&"number"==typeof f.maxKeys&&(i=f.maxKeys);var j=a.length;i>0&&j>i&&(j=i);for(var k=0;j>k;++k){var l,m,n,o,p=a[k].replace(h,"%20"),q=p.indexOf(c);q>=0?(l=p.substr(0,q),m=p.substr(q+1)):(l=p,m=""),n=decodeURIComponent(l),o=decodeURIComponent(m),d(g,n)?e(g[n])?g[n].push(o):g[n]=[g[n],o]:g[n]=o}return g};var e=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)}},{}],45:[function(a,b,c){"use strict";function d(a,b){if(a.map)return a.map(b);for(var c=[],d=0;d<a.length;d++)c.push(b(a[d],d));return c}var e=function(a){switch(typeof a){case"string":return a;case"boolean":return a?"true":"false";case"number":return isFinite(a)?a:"";default:return""}};b.exports=function(a,b,c,h){return b=b||"&",c=c||"=",null===a&&(a=void 0),"object"==typeof a?d(g(a),function(g){var h=encodeURIComponent(e(g))+c;return f(a[g])?d(a[g],function(a){return h+encodeURIComponent(e(a))}).join(b):h+encodeURIComponent(e(a[g]))}).join(b):h?encodeURIComponent(e(h))+c+encodeURIComponent(e(a)):""};var f=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},g=Object.keys||function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}},{}],46:[function(a,b,c){"use strict";c.decode=c.parse=a("./decode"),c.encode=c.stringify=a("./encode")},{"./decode":44,"./encode":45}],47:[function(a,b,c){b.exports=a("./lib/_stream_duplex.js")},{"./lib/_stream_duplex.js":48}],48:[function(a,b,c){"use strict";function d(a){return this instanceof d?(j.call(this,a),k.call(this,a),a&&a.readable===!1&&(this.readable=!1),a&&a.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,a&&a.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",e)):new d(a)}function e(){this.allowHalfOpen||this._writableState.ended||h(f,this)}function f(a){a.end()}var g=Object.keys||function(a){var b=[];for(var c in a)b.push(c);return b};b.exports=d;var h=a("process-nextick-args"),i=a("core-util-is");i.inherits=a("inherits");var j=a("./_stream_readable"),k=a("./_stream_writable");i.inherits(d,j);for(var l=g(k.prototype),m=0;m<l.length;m++){var n=l[m];d.prototype[n]||(d.prototype[n]=k.prototype[n])}},{"./_stream_readable":50,"./_stream_writable":52,"core-util-is":53,inherits:38,"process-nextick-args":54}],49:[function(a,b,c){"use strict";function d(a){return this instanceof d?void e.call(this,a):new d(a)}b.exports=d;var e=a("./_stream_transform"),f=a("core-util-is");f.inherits=a("inherits"),f.inherits(d,e),d.prototype._transform=function(a,b,c){c(null,a)}},{"./_stream_transform":51,"core-util-is":53,inherits:38}],50:[function(a,b,c){(function(c){"use strict";function d(b,c){I=I||a("./_stream_duplex"),b=b||{},this.objectMode=!!b.objectMode,c instanceof I&&(this.objectMode=this.objectMode||!!b.readableObjectMode);var d=b.highWaterMark,e=this.objectMode?16:16384;this.highWaterMark=d||0===d?d:e,this.highWaterMark=~~this.highWaterMark,this.buffer=[],this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.defaultEncoding=b.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,b.encoding&&(H||(H=a("string_decoder/").StringDecoder),this.decoder=new H(b.encoding),this.encoding=b.encoding)}function e(b){return I=I||a("./_stream_duplex"),this instanceof e?(this._readableState=new d(b,this),this.readable=!0,b&&"function"==typeof b.read&&(this._read=b.read),void C.call(this)):new e(b)}function f(a,b,c,d,e){var f=j(b,c);if(f)a.emit("error",f);else if(null===c)b.reading=!1,k(a,b);else if(b.objectMode||c&&c.length>0)if(b.ended&&!e){var h=new Error("stream.push() after EOF");a.emit("error",h)}else if(b.endEmitted&&e){var h=new Error("stream.unshift() after end event");a.emit("error",h)}else!b.decoder||e||d||(c=b.decoder.write(c)),e||(b.reading=!1),b.flowing&&0===b.length&&!b.sync?(a.emit("data",c),a.read(0)):(b.length+=b.objectMode?1:c.length,e?b.buffer.unshift(c):b.buffer.push(c),b.needReadable&&l(a)),n(a,b);else e||(b.reading=!1);return g(b)}function g(a){return!a.ended&&(a.needReadable||a.length<a.highWaterMark||0===a.length)}function h(a){return a>=J?a=J:(a--,a|=a>>>1,a|=a>>>2,a|=a>>>4,a|=a>>>8,a|=a>>>16,a++),a}function i(a,b){return 0===b.length&&b.ended?0:b.objectMode?0===a?0:1:null===a||isNaN(a)?b.flowing&&b.buffer.length?b.buffer[0].length:b.length:0>=a?0:(a>b.highWaterMark&&(b.highWaterMark=h(a)),a>b.length?b.ended?b.length:(b.needReadable=!0,0):a)}function j(a,b){var c=null;return B.isBuffer(b)||"string"==typeof b||null===b||void 0===b||a.objectMode||(c=new TypeError("Invalid non-string/buffer chunk")),c}function k(a,b){if(!b.ended){if(b.decoder){var c=b.decoder.end();c&&c.length&&(b.buffer.push(c),b.length+=b.objectMode?1:c.length)}b.ended=!0,l(a)}}function l(a){var b=a._readableState;b.needReadable=!1,b.emittedReadable||(F("emitReadable",b.flowing),b.emittedReadable=!0,b.sync?z(m,a):m(a))}function m(a){F("emit readable"),a.emit("readable"),t(a)}function n(a,b){b.readingMore||(b.readingMore=!0,z(o,a,b))}function o(a,b){for(var c=b.length;!b.reading&&!b.flowing&&!b.ended&&b.length<b.highWaterMark&&(F("maybeReadMore read 0"),a.read(0),c!==b.length);)c=b.length;b.readingMore=!1}function p(a){return function(){var b=a._readableState;F("pipeOnDrain",b.awaitDrain),b.awaitDrain&&b.awaitDrain--,0===b.awaitDrain&&D(a,"data")&&(b.flowing=!0,t(a))}}function q(a){F("readable nexttick read 0"),a.read(0)}function r(a,b){b.resumeScheduled||(b.resumeScheduled=!0,z(s,a,b))}function s(a,b){b.reading||(F("resume read 0"),a.read(0)),b.resumeScheduled=!1,a.emit("resume"),t(a),b.flowing&&!b.reading&&a.read(0)}function t(a){var b=a._readableState;if(F("flow",b.flowing),b.flowing)do var c=a.read();while(null!==c&&b.flowing)}function u(a,b){var c,d=b.buffer,e=b.length,f=!!b.decoder,g=!!b.objectMode;if(0===d.length)return null;if(0===e)c=null;else if(g)c=d.shift();else if(!a||a>=e)c=f?d.join(""):1===d.length?d[0]:B.concat(d,e),d.length=0;else if(a<d[0].length){var h=d[0];c=h.slice(0,a),d[0]=h.slice(a)}else if(a===d[0].length)c=d.shift();else{c=f?"":new B(a);for(var i=0,j=0,k=d.length;k>j&&a>i;j++){var h=d[0],l=Math.min(a-i,h.length);f?c+=h.slice(0,l):h.copy(c,i,0,l),l<h.length?d[0]=h.slice(l):d.shift(),i+=l}}return c}function v(a){var b=a._readableState;if(b.length>0)throw new Error("endReadable called on non-empty stream");b.endEmitted||(b.ended=!0,z(w,b,a))}function w(a,b){a.endEmitted||0!==a.length||(a.endEmitted=!0,b.readable=!1,b.emit("end"))}function x(a,b){for(var c=0,d=a.length;d>c;c++)b(a[c],c)}function y(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1}b.exports=e;var z=a("process-nextick-args"),A=a("isarray"),B=a("buffer").Buffer;e.ReadableState=d;var C,D=(a("events"),function(a,b){return a.listeners(b).length});!function(){try{C=a("stream")}catch(b){}finally{C||(C=a("events").EventEmitter)}}();var B=a("buffer").Buffer,E=a("core-util-is");E.inherits=a("inherits");var F,G=a("util");F=G&&G.debuglog?G.debuglog("stream"):function(){};var H;E.inherits(e,C);var I,I;e.prototype.push=function(a,b){var c=this._readableState;return c.objectMode||"string"!=typeof a||(b=b||c.defaultEncoding,b!==c.encoding&&(a=new B(a,b),b="")),f(this,c,a,b,!1)},e.prototype.unshift=function(a){var b=this._readableState;return f(this,b,a,"",!0)},e.prototype.isPaused=function(){return this._readableState.flowing===!1},e.prototype.setEncoding=function(b){return H||(H=a("string_decoder/").StringDecoder),this._readableState.decoder=new H(b),this._readableState.encoding=b,this};var J=8388608;e.prototype.read=function(a){F("read",a);var b=this._readableState,c=a;if(("number"!=typeof a||a>0)&&(b.emittedReadable=!1),0===a&&b.needReadable&&(b.length>=b.highWaterMark||b.ended))return F("read: emitReadable",b.length,b.ended),0===b.length&&b.ended?v(this):l(this),null;if(a=i(a,b),0===a&&b.ended)return 0===b.length&&v(this),null;var d=b.needReadable;F("need readable",d),(0===b.length||b.length-a<b.highWaterMark)&&(d=!0,F("length less than watermark",d)),(b.ended||b.reading)&&(d=!1,F("reading or ended",d)),d&&(F("do read"),b.reading=!0,b.sync=!0,0===b.length&&(b.needReadable=!0),this._read(b.highWaterMark),b.sync=!1),d&&!b.reading&&(a=i(c,b));var e;return e=a>0?u(a,b):null,null===e&&(b.needReadable=!0,a=0),b.length-=a,0!==b.length||b.ended||(b.needReadable=!0),c!==a&&b.ended&&0===b.length&&v(this),null!==e&&this.emit("data",e),e},e.prototype._read=function(a){this.emit("error",new Error("not implemented"))},e.prototype.pipe=function(a,b){function d(a){F("onunpipe"),a===l&&f()}function e(){F("onend"),a.end()}function f(){F("cleanup"),a.removeListener("close",i),a.removeListener("finish",j),a.removeListener("drain",q),a.removeListener("error",h),a.removeListener("unpipe",d),l.removeListener("end",e),l.removeListener("end",f),l.removeListener("data",g),r=!0,!m.awaitDrain||a._writableState&&!a._writableState.needDrain||q()}function g(b){F("ondata");var c=a.write(b);!1===c&&(1!==m.pipesCount||m.pipes[0]!==a||1!==l.listenerCount("data")||r||(F("false write response, pause",l._readableState.awaitDrain),l._readableState.awaitDrain++),l.pause())}function h(b){F("onerror",b),k(),a.removeListener("error",h),0===D(a,"error")&&a.emit("error",b)}function i(){a.removeListener("finish",j),k()}function j(){F("onfinish"),a.removeListener("close",i),k()}function k(){F("unpipe"),l.unpipe(a)}var l=this,m=this._readableState;switch(m.pipesCount){
+case 0:m.pipes=a;break;case 1:m.pipes=[m.pipes,a];break;default:m.pipes.push(a)}m.pipesCount+=1,F("pipe count=%d opts=%j",m.pipesCount,b);var n=(!b||b.end!==!1)&&a!==c.stdout&&a!==c.stderr,o=n?e:f;m.endEmitted?z(o):l.once("end",o),a.on("unpipe",d);var q=p(l);a.on("drain",q);var r=!1;return l.on("data",g),a._events&&a._events.error?A(a._events.error)?a._events.error.unshift(h):a._events.error=[h,a._events.error]:a.on("error",h),a.once("close",i),a.once("finish",j),a.emit("pipe",l),m.flowing||(F("pipe resume"),l.resume()),a},e.prototype.unpipe=function(a){var b=this._readableState;if(0===b.pipesCount)return this;if(1===b.pipesCount)return a&&a!==b.pipes?this:(a||(a=b.pipes),b.pipes=null,b.pipesCount=0,b.flowing=!1,a&&a.emit("unpipe",this),this);if(!a){var c=b.pipes,d=b.pipesCount;b.pipes=null,b.pipesCount=0,b.flowing=!1;for(var e=0;d>e;e++)c[e].emit("unpipe",this);return this}var e=y(b.pipes,a);return-1===e?this:(b.pipes.splice(e,1),b.pipesCount-=1,1===b.pipesCount&&(b.pipes=b.pipes[0]),a.emit("unpipe",this),this)},e.prototype.on=function(a,b){var c=C.prototype.on.call(this,a,b);if("data"===a&&!1!==this._readableState.flowing&&this.resume(),"readable"===a&&this.readable){var d=this._readableState;d.readableListening||(d.readableListening=!0,d.emittedReadable=!1,d.needReadable=!0,d.reading?d.length&&l(this,d):z(q,this))}return c},e.prototype.addListener=e.prototype.on,e.prototype.resume=function(){var a=this._readableState;return a.flowing||(F("resume"),a.flowing=!0,r(this,a)),this},e.prototype.pause=function(){return F("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(F("pause"),this._readableState.flowing=!1,this.emit("pause")),this},e.prototype.wrap=function(a){var b=this._readableState,c=!1,d=this;a.on("end",function(){if(F("wrapped end"),b.decoder&&!b.ended){var a=b.decoder.end();a&&a.length&&d.push(a)}d.push(null)}),a.on("data",function(e){if(F("wrapped data"),b.decoder&&(e=b.decoder.write(e)),(!b.objectMode||null!==e&&void 0!==e)&&(b.objectMode||e&&e.length)){var f=d.push(e);f||(c=!0,a.pause())}});for(var e in a)void 0===this[e]&&"function"==typeof a[e]&&(this[e]=function(b){return function(){return a[b].apply(a,arguments)}}(e));var f=["error","close","destroy","pause","resume"];return x(f,function(b){a.on(b,d.emit.bind(d,b))}),d._read=function(b){F("wrapped _read",b),c&&(c=!1,a.resume())},d},e._fromList=u}).call(this,a("_process"))},{"./_stream_duplex":48,_process:42,buffer:33,"core-util-is":53,events:37,inherits:38,isarray:40,"process-nextick-args":54,"string_decoder/":70,util:32}],51:[function(a,b,c){"use strict";function d(a){this.afterTransform=function(b,c){return e(a,b,c)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null}function e(a,b,c){var d=a._transformState;d.transforming=!1;var e=d.writecb;if(!e)return a.emit("error",new Error("no writecb in Transform class"));d.writechunk=null,d.writecb=null,null!==c&&void 0!==c&&a.push(c),e&&e(b);var f=a._readableState;f.reading=!1,(f.needReadable||f.length<f.highWaterMark)&&a._read(f.highWaterMark)}function f(a){if(!(this instanceof f))return new f(a);h.call(this,a),this._transformState=new d(this);var b=this;this._readableState.needReadable=!0,this._readableState.sync=!1,a&&("function"==typeof a.transform&&(this._transform=a.transform),"function"==typeof a.flush&&(this._flush=a.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(a){g(b,a)}):g(b)})}function g(a,b){if(b)return a.emit("error",b);var c=a._writableState,d=a._transformState;if(c.length)throw new Error("calling transform done when ws.length != 0");if(d.transforming)throw new Error("calling transform done when still transforming");return a.push(null)}b.exports=f;var h=a("./_stream_duplex"),i=a("core-util-is");i.inherits=a("inherits"),i.inherits(f,h),f.prototype.push=function(a,b){return this._transformState.needTransform=!1,h.prototype.push.call(this,a,b)},f.prototype._transform=function(a,b,c){throw new Error("not implemented")},f.prototype._write=function(a,b,c){var d=this._transformState;if(d.writecb=c,d.writechunk=a,d.writeencoding=b,!d.transforming){var e=this._readableState;(d.needTransform||e.needReadable||e.length<e.highWaterMark)&&this._read(e.highWaterMark)}},f.prototype._read=function(a){var b=this._transformState;null!==b.writechunk&&b.writecb&&!b.transforming?(b.transforming=!0,this._transform(b.writechunk,b.writeencoding,b.afterTransform)):b.needTransform=!0}},{"./_stream_duplex":48,"core-util-is":53,inherits:38}],52:[function(a,b,c){"use strict";function d(){}function e(a,b,c){this.chunk=a,this.encoding=b,this.callback=c,this.next=null}function f(b,c){B=B||a("./_stream_duplex"),b=b||{},this.objectMode=!!b.objectMode,c instanceof B&&(this.objectMode=this.objectMode||!!b.writableObjectMode);var d=b.highWaterMark,e=this.objectMode?16:16384;this.highWaterMark=d||0===d?d:e,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var f=b.decodeStrings===!1;this.decodeStrings=!f,this.defaultEncoding=b.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){o(c,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1}function g(b){return B=B||a("./_stream_duplex"),this instanceof g||this instanceof B?(this._writableState=new f(b,this),this.writable=!0,b&&("function"==typeof b.write&&(this._write=b.write),"function"==typeof b.writev&&(this._writev=b.writev)),void z.call(this)):new g(b)}function h(a,b){var c=new Error("write after end");a.emit("error",c),w(b,c)}function i(a,b,c,d){var e=!0;if(!x.isBuffer(c)&&"string"!=typeof c&&null!==c&&void 0!==c&&!b.objectMode){var f=new TypeError("Invalid non-string/buffer chunk");a.emit("error",f),w(d,f),e=!1}return e}function j(a,b,c){return a.objectMode||a.decodeStrings===!1||"string"!=typeof b||(b=new x(b,c)),b}function k(a,b,c,d,f){c=j(b,c,d),x.isBuffer(c)&&(d="buffer");var g=b.objectMode?1:c.length;b.length+=g;var h=b.length<b.highWaterMark;if(h||(b.needDrain=!0),b.writing||b.corked){var i=b.lastBufferedRequest;b.lastBufferedRequest=new e(c,d,f),i?i.next=b.lastBufferedRequest:b.bufferedRequest=b.lastBufferedRequest}else l(a,b,!1,g,c,d,f);return h}function l(a,b,c,d,e,f,g){b.writelen=d,b.writecb=g,b.writing=!0,b.sync=!0,c?a._writev(e,b.onwrite):a._write(e,f,b.onwrite),b.sync=!1}function m(a,b,c,d,e){--b.pendingcb,c?w(e,d):e(d),a._writableState.errorEmitted=!0,a.emit("error",d)}function n(a){a.writing=!1,a.writecb=null,a.length-=a.writelen,a.writelen=0}function o(a,b){var c=a._writableState,d=c.sync,e=c.writecb;if(n(c),b)m(a,c,d,b,e);else{var f=s(c);f||c.corked||c.bufferProcessing||!c.bufferedRequest||r(a,c),d?w(p,a,c,f,e):p(a,c,f,e)}}function p(a,b,c,d){c||q(a,b),b.pendingcb--,d(),u(a,b)}function q(a,b){0===b.length&&b.needDrain&&(b.needDrain=!1,a.emit("drain"))}function r(a,b){b.bufferProcessing=!0;var c=b.bufferedRequest;if(a._writev&&c&&c.next){for(var d=[],e=[];c;)e.push(c.callback),d.push(c),c=c.next;b.pendingcb++,b.lastBufferedRequest=null,l(a,b,!0,b.length,d,"",function(a){for(var c=0;c<e.length;c++)b.pendingcb--,e[c](a)})}else{for(;c;){var f=c.chunk,g=c.encoding,h=c.callback,i=b.objectMode?1:f.length;if(l(a,b,!1,i,f,g,h),c=c.next,b.writing)break}null===c&&(b.lastBufferedRequest=null)}b.bufferedRequest=c,b.bufferProcessing=!1}function s(a){return a.ending&&0===a.length&&null===a.bufferedRequest&&!a.finished&&!a.writing}function t(a,b){b.prefinished||(b.prefinished=!0,a.emit("prefinish"))}function u(a,b){var c=s(b);return c&&(0===b.pendingcb?(t(a,b),b.finished=!0,a.emit("finish")):t(a,b)),c}function v(a,b,c){b.ending=!0,u(a,b),c&&(b.finished?w(c):a.once("finish",c)),b.ended=!0}b.exports=g;var w=a("process-nextick-args"),x=a("buffer").Buffer;g.WritableState=f;var y=a("core-util-is");y.inherits=a("inherits");var z,A={deprecate:a("util-deprecate")};!function(){try{z=a("stream")}catch(b){}finally{z||(z=a("events").EventEmitter)}}();var x=a("buffer").Buffer;y.inherits(g,z);var B;f.prototype.getBuffer=function(){for(var a=this.bufferedRequest,b=[];a;)b.push(a),a=a.next;return b},function(){try{Object.defineProperty(f.prototype,"buffer",{get:A.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(a){}}();var B;g.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},g.prototype.write=function(a,b,c){var e=this._writableState,f=!1;return"function"==typeof b&&(c=b,b=null),x.isBuffer(a)?b="buffer":b||(b=e.defaultEncoding),"function"!=typeof c&&(c=d),e.ended?h(this,c):i(this,e,a,c)&&(e.pendingcb++,f=k(this,e,a,b,c)),f},g.prototype.cork=function(){var a=this._writableState;a.corked++},g.prototype.uncork=function(){var a=this._writableState;a.corked&&(a.corked--,a.writing||a.corked||a.finished||a.bufferProcessing||!a.bufferedRequest||r(this,a))},g.prototype.setDefaultEncoding=function(a){if("string"==typeof a&&(a=a.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((a+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+a);this._writableState.defaultEncoding=a},g.prototype._write=function(a,b,c){c(new Error("not implemented"))},g.prototype._writev=null,g.prototype.end=function(a,b,c){var d=this._writableState;"function"==typeof a?(c=a,a=null,b=null):"function"==typeof b&&(c=b,b=null),null!==a&&void 0!==a&&this.write(a,b),d.corked&&(d.corked=1,this.uncork()),d.ending||d.finished||v(this,d,c)}},{"./_stream_duplex":48,buffer:33,"core-util-is":53,events:37,inherits:38,"process-nextick-args":54,"util-deprecate":55}],53:[function(a,b,c){(function(a){function b(a){return Array.isArray?Array.isArray(a):"[object Array]"===q(a)}function d(a){return"boolean"==typeof a}function e(a){return null===a}function f(a){return null==a}function g(a){return"number"==typeof a}function h(a){return"string"==typeof a}function i(a){return"symbol"==typeof a}function j(a){return void 0===a}function k(a){return"[object RegExp]"===q(a)}function l(a){return"object"==typeof a&&null!==a}function m(a){return"[object Date]"===q(a)}function n(a){return"[object Error]"===q(a)||a instanceof Error}function o(a){return"function"==typeof a}function p(a){return null===a||"boolean"==typeof a||"number"==typeof a||"string"==typeof a||"symbol"==typeof a||"undefined"==typeof a}function q(a){return Object.prototype.toString.call(a)}c.isArray=b,c.isBoolean=d,c.isNull=e,c.isNullOrUndefined=f,c.isNumber=g,c.isString=h,c.isSymbol=i,c.isUndefined=j,c.isRegExp=k,c.isObject=l,c.isDate=m,c.isError=n,c.isFunction=o,c.isPrimitive=p,c.isBuffer=a.isBuffer}).call(this,{isBuffer:a("../../../../insert-module-globals/node_modules/is-buffer/index.js")})},{"../../../../insert-module-globals/node_modules/is-buffer/index.js":39}],54:[function(a,b,c){(function(a){"use strict";function c(b){for(var c=new Array(arguments.length-1),d=0;d<c.length;)c[d++]=arguments[d];a.nextTick(function(){b.apply(null,c)})}!a.version||0===a.version.indexOf("v0.")||0===a.version.indexOf("v1.")&&0!==a.version.indexOf("v1.8.")?b.exports=c:b.exports=a.nextTick}).call(this,a("_process"))},{_process:42}],55:[function(a,b,c){(function(a){function c(a,b){function c(){if(!e){if(d("throwDeprecation"))throw new Error(b);d("traceDeprecation")?console.trace(b):console.warn(b),e=!0}return a.apply(this,arguments)}if(d("noDeprecation"))return a;var e=!1;return c}function d(b){try{if(!a.localStorage)return!1}catch(c){return!1}var d=a.localStorage[b];return null==d?!1:"true"===String(d).toLowerCase()}b.exports=c}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],56:[function(a,b,c){b.exports=a("./lib/_stream_passthrough.js")},{"./lib/_stream_passthrough.js":49}],57:[function(a,b,c){var d=function(){try{return a("stream")}catch(b){}}();c=b.exports=a("./lib/_stream_readable.js"),c.Stream=d||c,c.Readable=c,c.Writable=a("./lib/_stream_writable.js"),c.Duplex=a("./lib/_stream_duplex.js"),c.Transform=a("./lib/_stream_transform.js"),c.PassThrough=a("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":48,"./lib/_stream_passthrough.js":49,"./lib/_stream_readable.js":50,"./lib/_stream_transform.js":51,"./lib/_stream_writable.js":52}],58:[function(a,b,c){b.exports=a("./lib/_stream_transform.js")},{"./lib/_stream_transform.js":51}],59:[function(a,b,c){b.exports=a("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":52}],60:[function(a,b,c){function d(){e.call(this)}b.exports=d;var e=a("events").EventEmitter,f=a("inherits");f(d,e),d.Readable=a("readable-stream/readable.js"),d.Writable=a("readable-stream/writable.js"),d.Duplex=a("readable-stream/duplex.js"),d.Transform=a("readable-stream/transform.js"),d.PassThrough=a("readable-stream/passthrough.js"),d.Stream=d,d.prototype.pipe=function(a,b){function c(b){a.writable&&!1===a.write(b)&&j.pause&&j.pause()}function d(){j.readable&&j.resume&&j.resume()}function f(){k||(k=!0,a.end())}function g(){k||(k=!0,"function"==typeof a.destroy&&a.destroy())}function h(a){if(i(),0===e.listenerCount(this,"error"))throw a}function i(){j.removeListener("data",c),a.removeListener("drain",d),j.removeListener("end",f),j.removeListener("close",g),j.removeListener("error",h),a.removeListener("error",h),j.removeListener("end",i),j.removeListener("close",i),a.removeListener("close",i)}var j=this;j.on("data",c),a.on("drain",d),a._isStdio||b&&b.end===!1||(j.on("end",f),j.on("close",g));var k=!1;return j.on("error",h),a.on("error",h),j.on("end",i),j.on("close",i),a.on("close",i),a.emit("pipe",j),a}},{events:37,inherits:38,"readable-stream/duplex.js":47,"readable-stream/passthrough.js":56,"readable-stream/readable.js":57,"readable-stream/transform.js":58,"readable-stream/writable.js":59}],61:[function(a,b,c){var d=a("./lib/request"),e=a("xtend"),f=a("builtin-status-codes"),g=a("url"),h=c;h.request=function(a,b){a="string"==typeof a?g.parse(a):e(a);var c=a.protocol||"",f=a.hostname||a.host,h=a.port,i=a.path||"/";f&&-1!==f.indexOf(":")&&(f="["+f+"]"),a.url=(f?c+"//"+f:"")+(h?":"+h:"")+i,a.method=(a.method||"GET").toUpperCase(),a.headers=a.headers||{};var j=new d(a);return b&&j.on("response",b),j},h.get=function(a,b){var c=h.request(a,b);return c.end(),c},h.Agent=function(){},h.Agent.defaultMaxSockets=4,h.STATUS_CODES=f,h.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]},{"./lib/request":63,"builtin-status-codes":65,url:71,xtend:74}],62:[function(a,b,c){(function(a){function b(a){try{return f.responseType=a,f.responseType===a}catch(b){}return!1}function d(a){return"function"==typeof a}c.fetch=d(a.fetch)&&d(a.ReadableByteStream),c.blobConstructor=!1;try{new Blob([new ArrayBuffer(1)]),c.blobConstructor=!0}catch(e){}var f=new a.XMLHttpRequest;f.open("GET",a.location.host?"/":"https://example.com");var g="undefined"!=typeof a.ArrayBuffer,h=g&&d(a.ArrayBuffer.prototype.slice);c.arraybuffer=g&&b("arraybuffer"),c.msstream=!c.fetch&&h&&b("ms-stream"),c.mozchunkedarraybuffer=!c.fetch&&g&&b("moz-chunked-arraybuffer"),c.overrideMimeType=d(f.overrideMimeType),c.vbArray=d(a.VBArray),f=null}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],63:[function(a,b,c){(function(c,d,e){function f(a){return h.fetch?"fetch":h.mozchunkedarraybuffer?"moz-chunked-arraybuffer":h.msstream?"ms-stream":h.arraybuffer&&a?"arraybuffer":h.vbArray&&a?"text:vbarray":"text"}function g(a){try{return null!==a.status}catch(b){return!1}}var h=a("./capability"),i=a("foreach"),j=a("indexof"),k=a("inherits"),l=a("object-keys"),m=a("./response"),n=a("stream"),o=m.IncomingMessage,p=m.readyStates,q=b.exports=function(a){var b=this;n.Writable.call(b),b._opts=a,b._body=[],b._headers={},a.auth&&b.setHeader("Authorization","Basic "+new e(a.auth).toString("base64")),i(l(a.headers),function(c){b.setHeader(c,a.headers[c])});var c;if("prefer-streaming"===a.mode)c=!1;else if("allow-wrong-content-type"===a.mode)c=!h.overrideMimeType;else{if(a.mode&&"default"!==a.mode&&"prefer-fast"!==a.mode)throw new Error("Invalid value for opts.mode");c=!0}b._mode=f(c),b.on("finish",function(){b._onFinish()})};k(q,n.Writable),q.prototype.setHeader=function(a,b){var c=this,d=a.toLowerCase();-1===j(r,d)&&(c._headers[d]={name:a,value:b})},q.prototype.getHeader=function(a){var b=this;return b._headers[a.toLowerCase()].value},q.prototype.removeHeader=function(a){var b=this;delete b._headers[a.toLowerCase()]},q.prototype._onFinish=function(){var a=this;if(!a._destroyed){var b,f=a._opts,g=a._headers;if(("POST"===f.method||"PUT"===f.method)&&(b=h.blobConstructor?new d.Blob(a._body.map(function(a){return a.toArrayBuffer()}),{type:(g["content-type"]||{}).value||""}):e.concat(a._body).toString()),"fetch"===a._mode){var j=l(g).map(function(a){return[g[a].name,g[a].value]});d.fetch(a._opts.url,{method:a._opts.method,headers:j,body:b,mode:"cors",credentials:f.withCredentials?"include":"same-origin"}).then(function(b){a._fetchResponse=b,a._connect()}).then(void 0,function(b){a.emit("error",b)})}else{var k=a._xhr=new d.XMLHttpRequest;try{k.open(a._opts.method,a._opts.url,!0)}catch(m){return void c.nextTick(function(){a.emit("error",m)})}"responseType"in k&&(k.responseType=a._mode.split(":")[0]),"withCredentials"in k&&(k.withCredentials=!!f.withCredentials),"text"===a._mode&&"overrideMimeType"in k&&k.overrideMimeType("text/plain; charset=x-user-defined"),i(l(g),function(a){k.setRequestHeader(g[a].name,g[a].value)}),a._response=null,k.onreadystatechange=function(){switch(k.readyState){case p.LOADING:case p.DONE:a._onXHRProgress()}},"moz-chunked-arraybuffer"===a._mode&&(k.onprogress=function(){a._onXHRProgress()}),k.onerror=function(){a._destroyed||a.emit("error",new Error("XHR error"))};try{k.send(b)}catch(m){return void c.nextTick(function(){a.emit("error",m)})}}}},q.prototype._onXHRProgress=function(){var a=this;g(a._xhr)&&!a._destroyed&&(a._response||a._connect(),a._response._onXHRProgress())},q.prototype._connect=function(){var a=this;a._destroyed||(a._response=new o(a._xhr,a._fetchResponse,a._mode),a.emit("response",a._response))},q.prototype._write=function(a,b,c){var d=this;d._body.push(a),c()},q.prototype.abort=q.prototype.destroy=function(){var a=this;a._destroyed=!0,a._response&&(a._response._destroyed=!0),a._xhr&&a._xhr.abort()},q.prototype.end=function(a,b,c){var d=this;"function"==typeof a&&(c=a,a=void 0),n.Writable.prototype.end.call(d,a,b,c)},q.prototype.flushHeaders=function(){},q.prototype.setTimeout=function(){},q.prototype.setNoDelay=function(){},q.prototype.setSocketKeepAlive=function(){};var r=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"]}).call(this,a("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},a("buffer").Buffer)},{"./capability":62,"./response":64,_process:42,buffer:33,foreach:66,indexof:67,inherits:38,"object-keys":68,stream:60}],64:[function(a,b,c){(function(b,d,e){var f=a("./capability"),g=a("foreach"),h=a("inherits"),i=a("stream"),j=c.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},k=c.IncomingMessage=function(a,c,d){function h(){n.read().then(function(a){if(!j._destroyed){if(a.done)return void j.push(null);j.push(new e(a.value)),h()}})}var j=this;if(i.Readable.call(j),j._mode=d,j.headers={},j.rawHeaders=[],j.trailers={},j.rawTrailers=[],j.on("end",function(){b.nextTick(function(){j.emit("close")})}),"fetch"===d){j._fetchResponse=c,j.statusCode=c.status,j.statusMessage=c.statusText;for(var k,l,m=c.headers[Symbol.iterator]();k=(l=m.next()).value,!l.done;)j.headers[k[0].toLowerCase()]=k[1],j.rawHeaders.push(k[0],k[1]);var n=c.body.getReader();h()}else{j._xhr=a,j._pos=0,j.statusCode=a.status,j.statusMessage=a.statusText;var o=a.getAllResponseHeaders().split(/\r?\n/);if(g(o,function(a){var b=a.match(/^([^:]+):\s*(.*)/);if(b){var c=b[1].toLowerCase();void 0!==j.headers[c]?j.headers[c]+=", "+b[2]:j.headers[c]=b[2],j.rawHeaders.push(b[1],b[2])}}),j._charset="x-user-defined",!f.overrideMimeType){var p=j.rawHeaders["mime-type"];if(p){var q=p.match(/;\s*charset=([^;])(;|$)/);q&&(j._charset=q[1].toLowerCase())}j._charset||(j._charset="utf-8")}}};h(k,i.Readable),k.prototype._read=function(){},k.prototype._onXHRProgress=function(){var a=this,b=a._xhr,c=null;switch(a._mode){case"text:vbarray":if(b.readyState!==j.DONE)break;try{c=new d.VBArray(b.responseBody).toArray()}catch(f){}if(null!==c){a.push(new e(c));break}case"text":try{c=b.responseText}catch(f){a._mode="text:vbarray";break}if(c.length>a._pos){var g=c.substr(a._pos);if("x-user-defined"===a._charset){for(var h=new e(g.length),i=0;i<g.length;i++)h[i]=255&g.charCodeAt(i);a.push(h)}else a.push(g,a._charset);a._pos=c.length}break;case"arraybuffer":if(b.readyState!==j.DONE)break;c=b.response,a.push(new e(new Uint8Array(c)));break;case"moz-chunked-arraybuffer":if(c=b.response,b.readyState!==j.LOADING||!c)break;a.push(new e(new Uint8Array(c)));break;case"ms-stream":if(c=b.response,b.readyState!==j.LOADING)break;var k=new d.MSStreamReader;k.onprogress=function(){k.result.byteLength>a._pos&&(a.push(new e(new Uint8Array(k.result.slice(a._pos)))),a._pos=k.result.byteLength)},k.onload=function(){a.push(null)},k.readAsArrayBuffer(c)}a._xhr.readyState===j.DONE&&"ms-stream"!==a._mode&&a.push(null)}}).call(this,a("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},a("buffer").Buffer)},{"./capability":62,_process:42,buffer:33,foreach:66,inherits:38,stream:60}],65:[function(a,b,c){b.exports={100:"Continue",101:"Switching Protocols",102:"Processing",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",300:"Multiple Choices",301:"Moved Permanently",302:"Moved Temporarily",303:"See Other",304:"Not Modified",305:"Use Proxy",307:"Temporary Redirect",308:"Permanent Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Time-out",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Request Entity Too Large",414:"Request-URI Too Large",415:"Unsupported Media Type",416:"Requested Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Unordered Collection",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Time-out",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",509:"Bandwidth Limit Exceeded",510:"Not Extended",511:"Network Authentication Required"}},{}],66:[function(a,b,c){var d=Object.prototype.hasOwnProperty,e=Object.prototype.toString;b.exports=function(a,b,c){if("[object Function]"!==e.call(b))throw new TypeError("iterator must be a function");var f=a.length;if(f===+f)for(var g=0;f>g;g++)b.call(c,a[g],g,a);else for(var h in a)d.call(a,h)&&b.call(c,a[h],h,a)}},{}],67:[function(a,b,c){var d=[].indexOf;b.exports=function(a,b){if(d)return a.indexOf(b);for(var c=0;c<a.length;++c)if(a[c]===b)return c;return-1}},{}],68:[function(a,b,c){"use strict";var d=Object.prototype.hasOwnProperty,e=Object.prototype.toString,f=Array.prototype.slice,g=a("./isArguments"),h=!{toString:null}.propertyIsEnumerable("toString"),i=function(){}.propertyIsEnumerable("prototype"),j=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],k=function(a){var b=a.constructor;return b&&b.prototype===a},l={$console:!0,$frame:!0,$frameElement:!0,$frames:!0,$parent:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},m=function(){if("undefined"==typeof window)return!1;for(var a in window)try{if(!l["$"+a]&&d.call(window,a)&&null!==window[a]&&"object"==typeof window[a])try{k(window[a])}catch(b){return!0}}catch(b){return!0}return!1}(),n=function(a){if("undefined"==typeof window||!m)return k(a);try{return k(a)}catch(b){return!1}},o=function(a){var b=null!==a&&"object"==typeof a,c="[object Function]"===e.call(a),f=g(a),k=b&&"[object String]"===e.call(a),l=[];if(!b&&!c&&!f)throw new TypeError("Object.keys called on a non-object");var m=i&&c;if(k&&a.length>0&&!d.call(a,0))for(var o=0;o<a.length;++o)l.push(String(o));if(f&&a.length>0)for(var p=0;p<a.length;++p)l.push(String(p));else for(var q in a)m&&"prototype"===q||!d.call(a,q)||l.push(String(q));if(h)for(var r=n(a),s=0;s<j.length;++s)r&&"constructor"===j[s]||!d.call(a,j[s])||l.push(j[s]);return l};o.shim=function(){if(Object.keys){var a=function(){return 2===(Object.keys(arguments)||"").length}(1,2);if(!a){var b=Object.keys;Object.keys=function(a){return b(g(a)?f.call(a):a)}}}else Object.keys=o;return Object.keys||o},b.exports=o},{"./isArguments":69}],69:[function(a,b,c){"use strict";var d=Object.prototype.toString;b.exports=function(a){var b=d.call(a),c="[object Arguments]"===b;return c||(c="[object Array]"!==b&&null!==a&&"object"==typeof a&&"number"==typeof a.length&&a.length>=0&&"[object Function]"===d.call(a.callee)),c}},{}],70:[function(a,b,c){function d(a){if(a&&!i(a))throw new Error("Unknown encoding: "+a)}function e(a){return a.toString(this.encoding)}function f(a){this.charReceived=a.length%2,this.charLength=this.charReceived?2:0}function g(a){this.charReceived=a.length%3,this.charLength=this.charReceived?3:0}var h=a("buffer").Buffer,i=h.isEncoding||function(a){switch(a&&a.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}},j=c.StringDecoder=function(a){switch(this.encoding=(a||"utf8").toLowerCase().replace(/[-_]/,""),d(a),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=f;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=g;break;default:return void(this.write=e)}this.charBuffer=new h(6),this.charReceived=0,this.charLength=0};j.prototype.write=function(a){for(var b="";this.charLength;){var c=a.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:a.length;if(a.copy(this.charBuffer,this.charReceived,0,c),this.charReceived+=c,this.charReceived<this.charLength)return"";a=a.slice(c,a.length),b=this.charBuffer.slice(0,this.charLength).toString(this.encoding);var d=b.charCodeAt(b.length-1);if(!(d>=55296&&56319>=d)){if(this.charReceived=this.charLength=0,0===a.length)return b;break}this.charLength+=this.surrogateSize,b=""}this.detectIncompleteChar(a);var e=a.length;this.charLength&&(a.copy(this.charBuffer,0,a.length-this.charReceived,e),e-=this.charReceived),b+=a.toString(this.encoding,0,e);var e=b.length-1,d=b.charCodeAt(e);if(d>=55296&&56319>=d){var f=this.surrogateSize;return this.charLength+=f,this.charReceived+=f,this.charBuffer.copy(this.charBuffer,f,0,f),a.copy(this.charBuffer,0,0,f),b.substring(0,e)}return b},j.prototype.detectIncompleteChar=function(a){for(var b=a.length>=3?3:a.length;b>0;b--){var c=a[a.length-b];if(1==b&&c>>5==6){this.charLength=2;break}if(2>=b&&c>>4==14){this.charLength=3;break}if(3>=b&&c>>3==30){this.charLength=4;break}}this.charReceived=b},j.prototype.end=function(a){var b="";if(a&&a.length&&(b=this.write(a)),this.charReceived){var c=this.charReceived,d=this.charBuffer,e=this.encoding;b+=d.slice(0,c).toString(e)}return b}},{buffer:33}],71:[function(a,b,c){function d(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}function e(a,b,c){if(a&&j(a)&&a instanceof d)return a;var e=new d;return e.parse(a,b,c),e}function f(a){return i(a)&&(a=e(a)),a instanceof d?a.format():d.prototype.format.call(a)}function g(a,b){return e(a,!1,!0).resolve(b)}function h(a,b){return a?e(a,!1,!0).resolveObject(b):b}function i(a){return"string"==typeof a}function j(a){return"object"==typeof a&&null!==a}function k(a){return null===a}function l(a){return null==a}var m=a("punycode");c.parse=e,c.resolve=g,c.resolveObject=h,c.format=f,c.Url=d;var n=/^([a-z0-9.+-]+:)/i,o=/:[0-9]*$/,p=["<",">",'"',"`"," ","\r","\n","	"],q=["{","}","|","\\","^","`"].concat(p),r=["'"].concat(q),s=["%","/","?",";","#"].concat(r),t=["/","?","#"],u=255,v=/^[a-z0-9A-Z_-]{0,63}$/,w=/^([a-z0-9A-Z_-]{0,63})(.*)$/,x={javascript:!0,"javascript:":!0},y={javascript:!0,"javascript:":!0},z={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},A=a("querystring");d.prototype.parse=function(a,b,c){if(!i(a))throw new TypeError("Parameter 'url' must be a string, not "+typeof a);var d=a;d=d.trim();var e=n.exec(d);if(e){e=e[0];var f=e.toLowerCase();this.protocol=f,d=d.substr(e.length)}if(c||e||d.match(/^\/\/[^@\/]+@[^@\/]+/)){var g="//"===d.substr(0,2);!g||e&&y[e]||(d=d.substr(2),this.slashes=!0)}if(!y[e]&&(g||e&&!z[e])){for(var h=-1,j=0;j<t.length;j++){var k=d.indexOf(t[j]);-1!==k&&(-1===h||h>k)&&(h=k)}var l,o;o=-1===h?d.lastIndexOf("@"):d.lastIndexOf("@",h),-1!==o&&(l=d.slice(0,o),d=d.slice(o+1),this.auth=decodeURIComponent(l)),h=-1;for(var j=0;j<s.length;j++){var k=d.indexOf(s[j]);-1!==k&&(-1===h||h>k)&&(h=k)}-1===h&&(h=d.length),this.host=d.slice(0,h),d=d.slice(h),this.parseHost(),this.hostname=this.hostname||"";var p="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!p)for(var q=this.hostname.split(/\./),j=0,B=q.length;B>j;j++){var C=q[j];if(C&&!C.match(v)){for(var D="",E=0,F=C.length;F>E;E++)D+=C.charCodeAt(E)>127?"x":C[E];if(!D.match(v)){var G=q.slice(0,j),H=q.slice(j+1),I=C.match(w);I&&(G.push(I[1]),H.unshift(I[2])),H.length&&(d="/"+H.join(".")+d),this.hostname=G.join(".");break}}}if(this.hostname.length>u?this.hostname="":this.hostname=this.hostname.toLowerCase(),!p){for(var J=this.hostname.split("."),K=[],j=0;j<J.length;++j){var L=J[j];K.push(L.match(/[^A-Za-z0-9_-]/)?"xn--"+m.encode(L):L)}this.hostname=K.join(".")}var M=this.port?":"+this.port:"",N=this.hostname||"";this.host=N+M,this.href+=this.host,p&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==d[0]&&(d="/"+d))}if(!x[f])for(var j=0,B=r.length;B>j;j++){var O=r[j],P=encodeURIComponent(O);P===O&&(P=escape(O)),d=d.split(O).join(P)}var Q=d.indexOf("#");-1!==Q&&(this.hash=d.substr(Q),d=d.slice(0,Q));var R=d.indexOf("?");if(-1!==R?(this.search=d.substr(R),this.query=d.substr(R+1),b&&(this.query=A.parse(this.query)),d=d.slice(0,R)):b&&(this.search="",this.query={}),d&&(this.pathname=d),z[f]&&this.hostname&&!this.pathname&&(this.pathname="/"),this.pathname||this.search){var M=this.pathname||"",L=this.search||"";this.path=M+L}return this.href=this.format(),this},d.prototype.format=function(){var a=this.auth||"";a&&(a=encodeURIComponent(a),a=a.replace(/%3A/i,":"),a+="@");var b=this.protocol||"",c=this.pathname||"",d=this.hash||"",e=!1,f="";this.host?e=a+this.host:this.hostname&&(e=a+(-1===this.hostname.indexOf(":")?this.hostname:"["+this.hostname+"]"),this.port&&(e+=":"+this.port)),this.query&&j(this.query)&&Object.keys(this.query).length&&(f=A.stringify(this.query));var g=this.search||f&&"?"+f||"";return b&&":"!==b.substr(-1)&&(b+=":"),this.slashes||(!b||z[b])&&e!==!1?(e="//"+(e||""),c&&"/"!==c.charAt(0)&&(c="/"+c)):e||(e=""),d&&"#"!==d.charAt(0)&&(d="#"+d),
+g&&"?"!==g.charAt(0)&&(g="?"+g),c=c.replace(/[?#]/g,function(a){return encodeURIComponent(a)}),g=g.replace("#","%23"),b+e+c+g+d},d.prototype.resolve=function(a){return this.resolveObject(e(a,!1,!0)).format()},d.prototype.resolveObject=function(a){if(i(a)){var b=new d;b.parse(a,!1,!0),a=b}var c=new d;if(Object.keys(this).forEach(function(a){c[a]=this[a]},this),c.hash=a.hash,""===a.href)return c.href=c.format(),c;if(a.slashes&&!a.protocol)return Object.keys(a).forEach(function(b){"protocol"!==b&&(c[b]=a[b])}),z[c.protocol]&&c.hostname&&!c.pathname&&(c.path=c.pathname="/"),c.href=c.format(),c;if(a.protocol&&a.protocol!==c.protocol){if(!z[a.protocol])return Object.keys(a).forEach(function(b){c[b]=a[b]}),c.href=c.format(),c;if(c.protocol=a.protocol,a.host||y[a.protocol])c.pathname=a.pathname;else{for(var e=(a.pathname||"").split("/");e.length&&!(a.host=e.shift()););a.host||(a.host=""),a.hostname||(a.hostname=""),""!==e[0]&&e.unshift(""),e.length<2&&e.unshift(""),c.pathname=e.join("/")}if(c.search=a.search,c.query=a.query,c.host=a.host||"",c.auth=a.auth,c.hostname=a.hostname||a.host,c.port=a.port,c.pathname||c.search){var f=c.pathname||"",g=c.search||"";c.path=f+g}return c.slashes=c.slashes||a.slashes,c.href=c.format(),c}var h=c.pathname&&"/"===c.pathname.charAt(0),j=a.host||a.pathname&&"/"===a.pathname.charAt(0),m=j||h||c.host&&a.pathname,n=m,o=c.pathname&&c.pathname.split("/")||[],e=a.pathname&&a.pathname.split("/")||[],p=c.protocol&&!z[c.protocol];if(p&&(c.hostname="",c.port=null,c.host&&(""===o[0]?o[0]=c.host:o.unshift(c.host)),c.host="",a.protocol&&(a.hostname=null,a.port=null,a.host&&(""===e[0]?e[0]=a.host:e.unshift(a.host)),a.host=null),m=m&&(""===e[0]||""===o[0])),j)c.host=a.host||""===a.host?a.host:c.host,c.hostname=a.hostname||""===a.hostname?a.hostname:c.hostname,c.search=a.search,c.query=a.query,o=e;else if(e.length)o||(o=[]),o.pop(),o=o.concat(e),c.search=a.search,c.query=a.query;else if(!l(a.search)){if(p){c.hostname=c.host=o.shift();var q=c.host&&c.host.indexOf("@")>0?c.host.split("@"):!1;q&&(c.auth=q.shift(),c.host=c.hostname=q.shift())}return c.search=a.search,c.query=a.query,k(c.pathname)&&k(c.search)||(c.path=(c.pathname?c.pathname:"")+(c.search?c.search:"")),c.href=c.format(),c}if(!o.length)return c.pathname=null,c.search?c.path="/"+c.search:c.path=null,c.href=c.format(),c;for(var r=o.slice(-1)[0],s=(c.host||a.host)&&("."===r||".."===r)||""===r,t=0,u=o.length;u>=0;u--)r=o[u],"."==r?o.splice(u,1):".."===r?(o.splice(u,1),t++):t&&(o.splice(u,1),t--);if(!m&&!n)for(;t--;t)o.unshift("..");!m||""===o[0]||o[0]&&"/"===o[0].charAt(0)||o.unshift(""),s&&"/"!==o.join("/").substr(-1)&&o.push("");var v=""===o[0]||o[0]&&"/"===o[0].charAt(0);if(p){c.hostname=c.host=v?"":o.length?o.shift():"";var q=c.host&&c.host.indexOf("@")>0?c.host.split("@"):!1;q&&(c.auth=q.shift(),c.host=c.hostname=q.shift())}return m=m||c.host&&o.length,m&&!v&&o.unshift(""),o.length?c.pathname=o.join("/"):(c.pathname=null,c.path=null),k(c.pathname)&&k(c.search)||(c.path=(c.pathname?c.pathname:"")+(c.search?c.search:"")),c.auth=a.auth||c.auth,c.slashes=c.slashes||a.slashes,c.href=c.format(),c},d.prototype.parseHost=function(){var a=this.host,b=o.exec(a);b&&(b=b[0],":"!==b&&(this.port=b.substr(1)),a=a.substr(0,a.length-b.length)),a&&(this.hostname=a)}},{punycode:43,querystring:46}],72:[function(a,b,c){b.exports=function(a){return a&&"object"==typeof a&&"function"==typeof a.copy&&"function"==typeof a.fill&&"function"==typeof a.readUInt8}},{}],73:[function(a,b,c){(function(b,d){function e(a,b){var d={seen:[],stylize:g};return arguments.length>=3&&(d.depth=arguments[2]),arguments.length>=4&&(d.colors=arguments[3]),p(b)?d.showHidden=b:b&&c._extend(d,b),v(d.showHidden)&&(d.showHidden=!1),v(d.depth)&&(d.depth=2),v(d.colors)&&(d.colors=!1),v(d.customInspect)&&(d.customInspect=!0),d.colors&&(d.stylize=f),i(d,a,d.depth)}function f(a,b){var c=e.styles[b];return c?"["+e.colors[c][0]+"m"+a+"["+e.colors[c][1]+"m":a}function g(a,b){return a}function h(a){var b={};return a.forEach(function(a,c){b[a]=!0}),b}function i(a,b,d){if(a.customInspect&&b&&A(b.inspect)&&b.inspect!==c.inspect&&(!b.constructor||b.constructor.prototype!==b)){var e=b.inspect(d,a);return t(e)||(e=i(a,e,d)),e}var f=j(a,b);if(f)return f;var g=Object.keys(b),p=h(g);if(a.showHidden&&(g=Object.getOwnPropertyNames(b)),z(b)&&(g.indexOf("message")>=0||g.indexOf("description")>=0))return k(b);if(0===g.length){if(A(b)){var q=b.name?": "+b.name:"";return a.stylize("[Function"+q+"]","special")}if(w(b))return a.stylize(RegExp.prototype.toString.call(b),"regexp");if(y(b))return a.stylize(Date.prototype.toString.call(b),"date");if(z(b))return k(b)}var r="",s=!1,u=["{","}"];if(o(b)&&(s=!0,u=["[","]"]),A(b)){var v=b.name?": "+b.name:"";r=" [Function"+v+"]"}if(w(b)&&(r=" "+RegExp.prototype.toString.call(b)),y(b)&&(r=" "+Date.prototype.toUTCString.call(b)),z(b)&&(r=" "+k(b)),0===g.length&&(!s||0==b.length))return u[0]+r+u[1];if(0>d)return w(b)?a.stylize(RegExp.prototype.toString.call(b),"regexp"):a.stylize("[Object]","special");a.seen.push(b);var x;return x=s?l(a,b,d,p,g):g.map(function(c){return m(a,b,d,p,c,s)}),a.seen.pop(),n(x,r,u)}function j(a,b){if(v(b))return a.stylize("undefined","undefined");if(t(b)){var c="'"+JSON.stringify(b).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return a.stylize(c,"string")}return s(b)?a.stylize(""+b,"number"):p(b)?a.stylize(""+b,"boolean"):q(b)?a.stylize("null","null"):void 0}function k(a){return"["+Error.prototype.toString.call(a)+"]"}function l(a,b,c,d,e){for(var f=[],g=0,h=b.length;h>g;++g)F(b,String(g))?f.push(m(a,b,c,d,String(g),!0)):f.push("");return e.forEach(function(e){e.match(/^\d+$/)||f.push(m(a,b,c,d,e,!0))}),f}function m(a,b,c,d,e,f){var g,h,j;if(j=Object.getOwnPropertyDescriptor(b,e)||{value:b[e]},j.get?h=j.set?a.stylize("[Getter/Setter]","special"):a.stylize("[Getter]","special"):j.set&&(h=a.stylize("[Setter]","special")),F(d,e)||(g="["+e+"]"),h||(a.seen.indexOf(j.value)<0?(h=q(c)?i(a,j.value,null):i(a,j.value,c-1),h.indexOf("\n")>-1&&(h=f?h.split("\n").map(function(a){return"  "+a}).join("\n").substr(2):"\n"+h.split("\n").map(function(a){return"   "+a}).join("\n"))):h=a.stylize("[Circular]","special")),v(g)){if(f&&e.match(/^\d+$/))return h;g=JSON.stringify(""+e),g.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(g=g.substr(1,g.length-2),g=a.stylize(g,"name")):(g=g.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),g=a.stylize(g,"string"))}return g+": "+h}function n(a,b,c){var d=0,e=a.reduce(function(a,b){return d++,b.indexOf("\n")>=0&&d++,a+b.replace(/\u001b\[\d\d?m/g,"").length+1},0);return e>60?c[0]+(""===b?"":b+"\n ")+" "+a.join(",\n  ")+" "+c[1]:c[0]+b+" "+a.join(", ")+" "+c[1]}function o(a){return Array.isArray(a)}function p(a){return"boolean"==typeof a}function q(a){return null===a}function r(a){return null==a}function s(a){return"number"==typeof a}function t(a){return"string"==typeof a}function u(a){return"symbol"==typeof a}function v(a){return void 0===a}function w(a){return x(a)&&"[object RegExp]"===C(a)}function x(a){return"object"==typeof a&&null!==a}function y(a){return x(a)&&"[object Date]"===C(a)}function z(a){return x(a)&&("[object Error]"===C(a)||a instanceof Error)}function A(a){return"function"==typeof a}function B(a){return null===a||"boolean"==typeof a||"number"==typeof a||"string"==typeof a||"symbol"==typeof a||"undefined"==typeof a}function C(a){return Object.prototype.toString.call(a)}function D(a){return 10>a?"0"+a.toString(10):a.toString(10)}function E(){var a=new Date,b=[D(a.getHours()),D(a.getMinutes()),D(a.getSeconds())].join(":");return[a.getDate(),J[a.getMonth()],b].join(" ")}function F(a,b){return Object.prototype.hasOwnProperty.call(a,b)}var G=/%[sdj%]/g;c.format=function(a){if(!t(a)){for(var b=[],c=0;c<arguments.length;c++)b.push(e(arguments[c]));return b.join(" ")}for(var c=1,d=arguments,f=d.length,g=String(a).replace(G,function(a){if("%%"===a)return"%";if(c>=f)return a;switch(a){case"%s":return String(d[c++]);case"%d":return Number(d[c++]);case"%j":try{return JSON.stringify(d[c++])}catch(b){return"[Circular]"}default:return a}}),h=d[c];f>c;h=d[++c])g+=q(h)||!x(h)?" "+h:" "+e(h);return g},c.deprecate=function(a,e){function f(){if(!g){if(b.throwDeprecation)throw new Error(e);b.traceDeprecation?console.trace(e):console.error(e),g=!0}return a.apply(this,arguments)}if(v(d.process))return function(){return c.deprecate(a,e).apply(this,arguments)};if(b.noDeprecation===!0)return a;var g=!1;return f};var H,I={};c.debuglog=function(a){if(v(H)&&(H=b.env.NODE_DEBUG||""),a=a.toUpperCase(),!I[a])if(new RegExp("\\b"+a+"\\b","i").test(H)){var d=b.pid;I[a]=function(){var b=c.format.apply(c,arguments);console.error("%s %d: %s",a,d,b)}}else I[a]=function(){};return I[a]},c.inspect=e,e.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},e.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},c.isArray=o,c.isBoolean=p,c.isNull=q,c.isNullOrUndefined=r,c.isNumber=s,c.isString=t,c.isSymbol=u,c.isUndefined=v,c.isRegExp=w,c.isObject=x,c.isDate=y,c.isError=z,c.isFunction=A,c.isPrimitive=B,c.isBuffer=a("./support/isBuffer");var J=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];c.log=function(){console.log("%s - %s",E(),c.format.apply(c,arguments))},c.inherits=a("inherits"),c._extend=function(a,b){if(!b||!x(b))return a;for(var c=Object.keys(b),d=c.length;d--;)a[c[d]]=b[c[d]];return a}}).call(this,a("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":72,_process:42,inherits:38}],74:[function(a,b,c){function d(){for(var a={},b=0;b<arguments.length;b++){var c=arguments[b];for(var d in c)e.call(c,d)&&(a[d]=c[d])}return a}b.exports=d;var e=Object.prototype.hasOwnProperty},{}],75:[function(a,b,c){c=b.exports=function(a){for(var b=0;b<a.length;)if(9==a[b]||10==a[b]||13==a[b]||32<=a[b]&&a[b]<=126)b+=1;else if(194<=a[b]&&a[b]<=223&&128<=a[b+1]&&a[b+1]<=191)b+=2;else if(224==a[b]&&160<=a[b+1]&&a[b+1]<=191&&128<=a[b+2]&&a[b+2]<=191||(225<=a[b]&&a[b]<=236||238==a[b]||239==a[b])&&128<=a[b+1]&&a[b+1]<=191&&128<=a[b+2]&&a[b+2]<=191||237==a[b]&&128<=a[b+1]&&a[b+1]<=159&&128<=a[b+2]&&a[b+2]<=191)b+=3;else{if(!(240==a[b]&&144<=a[b+1]&&a[b+1]<=191&&128<=a[b+2]&&a[b+2]<=191&&128<=a[b+3]&&a[b+3]<=191||241<=a[b]&&a[b]<=243&&128<=a[b+1]&&a[b+1]<=191&&128<=a[b+2]&&a[b+2]<=191&&128<=a[b+3]&&a[b+3]<=191||244==a[b]&&128<=a[b+1]&&a[b+1]<=143&&128<=a[b+2]&&a[b+2]<=191&&128<=a[b+3]&&a[b+3]<=191))return!1;b+=4}return!0}},{}],76:[function(a,b,c){function d(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}var e=a("./_hashClear"),f=a("./_hashDelete"),g=a("./_hashGet"),h=a("./_hashHas"),i=a("./_hashSet");d.prototype.clear=e,d.prototype["delete"]=f,d.prototype.get=g,d.prototype.has=h,d.prototype.set=i,b.exports=d},{"./_hashClear":97,"./_hashDelete":98,"./_hashGet":99,"./_hashHas":100,"./_hashSet":101}],77:[function(a,b,c){function d(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}var e=a("./_listCacheClear"),f=a("./_listCacheDelete"),g=a("./_listCacheGet"),h=a("./_listCacheHas"),i=a("./_listCacheSet");d.prototype.clear=e,d.prototype["delete"]=f,d.prototype.get=g,d.prototype.has=h,d.prototype.set=i,b.exports=d},{"./_listCacheClear":106,"./_listCacheDelete":107,"./_listCacheGet":108,"./_listCacheHas":109,"./_listCacheSet":110}],78:[function(a,b,c){var d=a("./_getNative"),e=a("./_root"),f=d(e,"Map");b.exports=f},{"./_getNative":94,"./_root":119}],79:[function(a,b,c){function d(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}var e=a("./_mapCacheClear"),f=a("./_mapCacheDelete"),g=a("./_mapCacheGet"),h=a("./_mapCacheHas"),i=a("./_mapCacheSet");d.prototype.clear=e,d.prototype["delete"]=f,d.prototype.get=g,d.prototype.has=h,d.prototype.set=i,b.exports=d},{"./_mapCacheClear":111,"./_mapCacheDelete":112,"./_mapCacheGet":113,"./_mapCacheHas":114,"./_mapCacheSet":115}],80:[function(a,b,c){var d=a("./_root"),e=d.Symbol;b.exports=e},{"./_root":119}],81:[function(a,b,c){function d(a,b){for(var c=-1,d=null==a?0:a.length,e=Array(d);++c<d;)e[c]=b(a[c],c,a);return e}b.exports=d},{}],82:[function(a,b,c){function d(a,b,c){var d=a[b];h.call(a,b)&&f(d,c)&&(void 0!==c||b in a)||e(a,b,c)}var e=a("./_baseAssignValue"),f=a("./eq"),g=Object.prototype,h=g.hasOwnProperty;b.exports=d},{"./_baseAssignValue":84,"./eq":123}],83:[function(a,b,c){function d(a,b){for(var c=a.length;c--;)if(e(a[c][0],b))return c;return-1}var e=a("./eq");b.exports=d},{"./eq":123}],84:[function(a,b,c){function d(a,b,c){"__proto__"==b&&e?e(a,b,{configurable:!0,enumerable:!0,value:c,writable:!0}):a[b]=c}var e=a("./_defineProperty");b.exports=d},{"./_defineProperty":91}],85:[function(a,b,c){function d(a){return null==a?void 0===a?i:h:j&&j in Object(a)?f(a):g(a)}var e=a("./_Symbol"),f=a("./_getRawTag"),g=a("./_objectToString"),h="[object Null]",i="[object Undefined]",j=e?e.toStringTag:void 0;b.exports=d},{"./_Symbol":80,"./_getRawTag":95,"./_objectToString":118}],86:[function(a,b,c){function d(a){if(!g(a)||f(a))return!1;var b=e(a)?o:j;return b.test(h(a))}var e=a("./isFunction"),f=a("./_isMasked"),g=a("./isObject"),h=a("./_toSource"),i=/[\\^$.*+?()[\]{}|]/g,j=/^\[object .+?Constructor\]$/,k=Function.prototype,l=Object.prototype,m=k.toString,n=l.hasOwnProperty,o=RegExp("^"+m.call(n).replace(i,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");b.exports=d},{"./_isMasked":105,"./_toSource":122,"./isFunction":125,"./isObject":126}],87:[function(a,b,c){function d(a,b,c,d){if(!h(a))return a;b=f(b,a);for(var j=-1,k=b.length,l=k-1,m=a;null!=m&&++j<k;){var n=i(b[j]),o=c;if(j!=l){var p=m[n];o=d?d(p,n,m):void 0,void 0===o&&(o=h(p)?p:g(b[j+1])?[]:{})}e(m,n,o),m=m[n]}return a}var e=a("./_assignValue"),f=a("./_castPath"),g=a("./_isIndex"),h=a("./isObject"),i=a("./_toKey");b.exports=d},{"./_assignValue":82,"./_castPath":89,"./_isIndex":102,"./_toKey":121,"./isObject":126}],88:[function(a,b,c){function d(a){if("string"==typeof a)return a;if(g(a))return f(a,d)+"";if(h(a))return k?k.call(a):"";var b=a+"";return"0"==b&&1/a==-i?"-0":b}var e=a("./_Symbol"),f=a("./_arrayMap"),g=a("./isArray"),h=a("./isSymbol"),i=1/0,j=e?e.prototype:void 0,k=j?j.toString:void 0;b.exports=d},{"./_Symbol":80,"./_arrayMap":81,"./isArray":124,"./isSymbol":128}],89:[function(a,b,c){function d(a,b){return e(a)?a:f(a,b)?[a]:g(h(a))}var e=a("./isArray"),f=a("./_isKey"),g=a("./_stringToPath"),h=a("./toString");b.exports=d},{"./_isKey":103,"./_stringToPath":120,"./isArray":124,"./toString":132}],90:[function(a,b,c){var d=a("./_root"),e=d["__core-js_shared__"];b.exports=e},{"./_root":119}],91:[function(a,b,c){var d=a("./_getNative"),e=function(){try{var a=d(Object,"defineProperty");return a({},"",{}),a}catch(b){}}();b.exports=e},{"./_getNative":94}],92:[function(a,b,c){(function(a){var c="object"==typeof a&&a&&a.Object===Object&&a;b.exports=c}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],93:[function(a,b,c){function d(a,b){var c=a.__data__;return e(b)?c["string"==typeof b?"string":"hash"]:c.map}var e=a("./_isKeyable");b.exports=d},{"./_isKeyable":104}],94:[function(a,b,c){function d(a,b){var c=f(a,b);return e(c)?c:void 0}var e=a("./_baseIsNative"),f=a("./_getValue");b.exports=d},{"./_baseIsNative":86,"./_getValue":96}],95:[function(a,b,c){function d(a){var b=g.call(a,i),c=a[i];try{a[i]=void 0;var d=!0}catch(e){}var f=h.call(a);return d&&(b?a[i]=c:delete a[i]),f}var e=a("./_Symbol"),f=Object.prototype,g=f.hasOwnProperty,h=f.toString,i=e?e.toStringTag:void 0;b.exports=d},{"./_Symbol":80}],96:[function(a,b,c){function d(a,b){return null==a?void 0:a[b]}b.exports=d},{}],97:[function(a,b,c){function d(){this.__data__=e?e(null):{},this.size=0}var e=a("./_nativeCreate");b.exports=d},{"./_nativeCreate":117}],98:[function(a,b,c){function d(a){var b=this.has(a)&&delete this.__data__[a];return this.size-=b?1:0,b}b.exports=d},{}],99:[function(a,b,c){function d(a){var b=this.__data__;if(e){var c=b[a];return c===f?void 0:c}return h.call(b,a)?b[a]:void 0}var e=a("./_nativeCreate"),f="__lodash_hash_undefined__",g=Object.prototype,h=g.hasOwnProperty;b.exports=d},{"./_nativeCreate":117}],100:[function(a,b,c){function d(a){var b=this.__data__;return e?void 0!==b[a]:g.call(b,a)}var e=a("./_nativeCreate"),f=Object.prototype,g=f.hasOwnProperty;b.exports=d},{"./_nativeCreate":117}],101:[function(a,b,c){function d(a,b){var c=this.__data__;return this.size+=this.has(a)?0:1,c[a]=e&&void 0===b?f:b,this}var e=a("./_nativeCreate"),f="__lodash_hash_undefined__";b.exports=d},{"./_nativeCreate":117}],102:[function(a,b,c){function d(a,b){return b=null==b?e:b,!!b&&("number"==typeof a||f.test(a))&&a>-1&&a%1==0&&b>a}var e=9007199254740991,f=/^(?:0|[1-9]\d*)$/;b.exports=d},{}],103:[function(a,b,c){function d(a,b){if(e(a))return!1;var c=typeof a;return"number"==c||"symbol"==c||"boolean"==c||null==a||f(a)?!0:h.test(a)||!g.test(a)||null!=b&&a in Object(b)}var e=a("./isArray"),f=a("./isSymbol"),g=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,h=/^\w*$/;b.exports=d},{"./isArray":124,"./isSymbol":128}],104:[function(a,b,c){function d(a){var b=typeof a;return"string"==b||"number"==b||"symbol"==b||"boolean"==b?"__proto__"!==a:null===a}b.exports=d},{}],105:[function(a,b,c){function d(a){return!!f&&f in a}var e=a("./_coreJsData"),f=function(){var a=/[^.]+$/.exec(e&&e.keys&&e.keys.IE_PROTO||"");return a?"Symbol(src)_1."+a:""}();b.exports=d},{"./_coreJsData":90}],106:[function(a,b,c){function d(){this.__data__=[],this.size=0}b.exports=d},{}],107:[function(a,b,c){function d(a){var b=this.__data__,c=e(b,a);if(0>c)return!1;var d=b.length-1;return c==d?b.pop():g.call(b,c,1),--this.size,!0}var e=a("./_assocIndexOf"),f=Array.prototype,g=f.splice;b.exports=d},{"./_assocIndexOf":83}],108:[function(a,b,c){function d(a){var b=this.__data__,c=e(b,a);return 0>c?void 0:b[c][1]}var e=a("./_assocIndexOf");b.exports=d},{"./_assocIndexOf":83}],109:[function(a,b,c){function d(a){return e(this.__data__,a)>-1}var e=a("./_assocIndexOf");b.exports=d},{"./_assocIndexOf":83}],110:[function(a,b,c){function d(a,b){var c=this.__data__,d=e(c,a);return 0>d?(++this.size,c.push([a,b])):c[d][1]=b,this}var e=a("./_assocIndexOf");b.exports=d},{"./_assocIndexOf":83}],111:[function(a,b,c){function d(){this.size=0,this.__data__={hash:new e,map:new(g||f),string:new e}}var e=a("./_Hash"),f=a("./_ListCache"),g=a("./_Map");b.exports=d},{"./_Hash":76,"./_ListCache":77,"./_Map":78}],112:[function(a,b,c){function d(a){var b=e(this,a)["delete"](a);return this.size-=b?1:0,b}var e=a("./_getMapData");b.exports=d},{"./_getMapData":93}],113:[function(a,b,c){function d(a){return e(this,a).get(a)}var e=a("./_getMapData");b.exports=d},{"./_getMapData":93}],114:[function(a,b,c){function d(a){return e(this,a).has(a)}var e=a("./_getMapData");b.exports=d},{"./_getMapData":93}],115:[function(a,b,c){function d(a,b){var c=e(this,a),d=c.size;return c.set(a,b),this.size+=c.size==d?0:1,this}var e=a("./_getMapData");b.exports=d},{"./_getMapData":93}],116:[function(a,b,c){function d(a){var b=e(a,function(a){return c.size===f&&c.clear(),a}),c=b.cache;return b}var e=a("./memoize"),f=500;b.exports=d},{"./memoize":130}],117:[function(a,b,c){var d=a("./_getNative"),e=d(Object,"create");b.exports=e},{"./_getNative":94}],118:[function(a,b,c){function d(a){return f.call(a)}var e=Object.prototype,f=e.toString;b.exports=d},{}],119:[function(a,b,c){var d=a("./_freeGlobal"),e="object"==typeof self&&self&&self.Object===Object&&self,f=d||e||Function("return this")();b.exports=f},{"./_freeGlobal":92}],120:[function(a,b,c){var d=a("./_memoizeCapped"),e=/^\./,f=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,g=/\\(\\)?/g,h=d(function(a){var b=[];return e.test(a)&&b.push(""),a.replace(f,function(a,c,d,e){b.push(d?e.replace(g,"$1"):c||a)}),b});b.exports=h},{"./_memoizeCapped":116}],121:[function(a,b,c){function d(a){if("string"==typeof a||e(a))return a;var b=a+"";return"0"==b&&1/a==-f?"-0":b}var e=a("./isSymbol"),f=1/0;b.exports=d},{"./isSymbol":128}],122:[function(a,b,c){function d(a){if(null!=a){try{return f.call(a)}catch(b){}try{return a+""}catch(b){}}return""}var e=Function.prototype,f=e.toString;b.exports=d},{}],123:[function(a,b,c){function d(a,b){return a===b||a!==a&&b!==b}b.exports=d},{}],124:[function(a,b,c){var d=Array.isArray;b.exports=d},{}],125:[function(a,b,c){function d(a){if(!f(a))return!1;var b=e(a);return b==h||b==i||b==g||b==j}var e=a("./_baseGetTag"),f=a("./isObject"),g="[object AsyncFunction]",h="[object Function]",i="[object GeneratorFunction]",j="[object Proxy]";b.exports=d},{"./_baseGetTag":85,"./isObject":126}],126:[function(a,b,c){function d(a){var b=typeof a;return null!=a&&("object"==b||"function"==b)}b.exports=d},{}],127:[function(a,b,c){function d(a){return null!=a&&"object"==typeof a}b.exports=d},{}],128:[function(a,b,c){function d(a){return"symbol"==typeof a||f(a)&&e(a)==g}var e=a("./_baseGetTag"),f=a("./isObjectLike"),g="[object Symbol]";b.exports=d},{"./_baseGetTag":85,"./isObjectLike":127}],129:[function(a,b,c){(function(a){(function(){function d(a,b){return a.set(b[0],b[1]),a}function e(a,b){return a.add(b),a}function f(a,b,c){switch(c.length){case 0:return a.call(b);case 1:return a.call(b,c[0]);case 2:return a.call(b,c[0],c[1]);case 3:return a.call(b,c[0],c[1],c[2])}return a.apply(b,c)}function g(a,b,c,d){for(var e=-1,f=null==a?0:a.length;++e<f;){var g=a[e];b(d,g,c(g),a)}return d}function h(a,b){for(var c=-1,d=null==a?0:a.length;++c<d&&b(a[c],c,a)!==!1;);return a}function i(a,b){for(var c=null==a?0:a.length;c--&&b(a[c],c,a)!==!1;);return a}function j(a,b){for(var c=-1,d=null==a?0:a.length;++c<d;)if(!b(a[c],c,a))return!1;return!0}function k(a,b){for(var c=-1,d=null==a?0:a.length,e=0,f=[];++c<d;){var g=a[c];b(g,c,a)&&(f[e++]=g)}return f}function l(a,b){var c=null==a?0:a.length;return!!c&&w(a,b,0)>-1}function m(a,b,c){for(var d=-1,e=null==a?0:a.length;++d<e;)if(c(b,a[d]))return!0;return!1}function n(a,b){for(var c=-1,d=null==a?0:a.length,e=Array(d);++c<d;)e[c]=b(a[c],c,a);return e}function o(a,b){for(var c=-1,d=b.length,e=a.length;++c<d;)a[e+c]=b[c];return a}function p(a,b,c,d){var e=-1,f=null==a?0:a.length;for(d&&f&&(c=a[++e]);++e<f;)c=b(c,a[e],e,a);return c}function q(a,b,c,d){var e=null==a?0:a.length;for(d&&e&&(c=a[--e]);e--;)c=b(c,a[e],e,a);return c}function r(a,b){for(var c=-1,d=null==a?0:a.length;++c<d;)if(b(a[c],c,a))return!0;return!1}function s(a){return a.split("")}function t(a){return a.match(Pb)||[]}function u(a,b,c){var d;return c(a,function(a,c,e){return b(a,c,e)?(d=c,!1):void 0}),d}function v(a,b,c,d){for(var e=a.length,f=c+(d?1:-1);d?f--:++f<e;)if(b(a[f],f,a))return f;return-1}function w(a,b,c){return b===b?X(a,b,c):v(a,y,c)}function x(a,b,c,d){for(var e=c-1,f=a.length;++e<f;)if(d(a[e],b))return e;return-1}function y(a){return a!==a}function z(a,b){var c=null==a?0:a.length;return c?E(a,b)/c:Ja}function A(a){return function(b){return null==b?ca:b[a]}}function B(a){return function(b){return null==a?ca:a[b]}}function C(a,b,c,d,e){return e(a,function(a,e,f){c=d?(d=!1,a):b(c,a,e,f)}),c}function D(a,b){var c=a.length;for(a.sort(b);c--;)a[c]=a[c].value;return a}function E(a,b){for(var c,d=-1,e=a.length;++d<e;){var f=b(a[d]);f!==ca&&(c=c===ca?f:c+f)}return c}function F(a,b){for(var c=-1,d=Array(a);++c<a;)d[c]=b(c);return d}function G(a,b){return n(b,function(b){return[b,a[b]]})}function H(a){return function(b){return a(b)}}function I(a,b){return n(b,function(b){return a[b]})}function J(a,b){return a.has(b)}function K(a,b){for(var c=-1,d=a.length;++c<d&&w(b,a[c],0)>-1;);return c}function L(a,b){for(var c=a.length;c--&&w(b,a[c],0)>-1;);return c}function M(a,b){for(var c=a.length,d=0;c--;)a[c]===b&&++d;return d}function N(a){return"\\"+_c[a]}function O(a,b){return null==a?ca:a[b]}function P(a){return Sc.test(a)}function Q(a){return Tc.test(a)}function R(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}function S(a){var b=-1,c=Array(a.size);return a.forEach(function(a,d){c[++b]=[d,a]}),c}function T(a,b){return function(c){return a(b(c))}}function U(a,b){for(var c=-1,d=a.length,e=0,f=[];++c<d;){var g=a[c];(g===b||g===ja)&&(a[c]=ja,f[e++]=c)}return f}function V(a){var b=-1,c=Array(a.size);return a.forEach(function(a){c[++b]=a}),c}function W(a){var b=-1,c=Array(a.size);return a.forEach(function(a){c[++b]=[a,a]}),c}function X(a,b,c){for(var d=c-1,e=a.length;++d<e;)if(a[d]===b)return d;return-1}function Y(a,b,c){for(var d=c+1;d--;)if(a[d]===b)return d;return d}function Z(a){return P(a)?_(a):qd(a)}function $(a){return P(a)?aa(a):s(a)}function _(a){for(var b=Qc.lastIndex=0;Qc.test(a);)++b;return b}function aa(a){return a.match(Qc)||[]}function ba(a){return a.match(Rc)||[]}var ca,da="4.17.3",ea=200,fa="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",ga="Expected a function",ha="__lodash_hash_undefined__",ia=500,ja="__lodash_placeholder__",ka=1,la=2,ma=4,na=1,oa=2,pa=1,qa=2,ra=4,sa=8,ta=16,ua=32,va=64,wa=128,xa=256,ya=512,za=30,Aa="...",Ba=800,Ca=16,Da=1,Ea=2,Fa=3,Ga=1/0,Ha=9007199254740991,Ia=1.7976931348623157e308,Ja=NaN,Ka=4294967295,La=Ka-1,Ma=Ka>>>1,Na=[["ary",wa],["bind",pa],["bindKey",qa],["curry",sa],["curryRight",ta],["flip",ya],["partial",ua],["partialRight",va],["rearg",xa]],Oa="[object Arguments]",Pa="[object Array]",Qa="[object AsyncFunction]",Ra="[object Boolean]",Sa="[object Date]",Ta="[object DOMException]",Ua="[object Error]",Va="[object Function]",Wa="[object GeneratorFunction]",Xa="[object Map]",Ya="[object Number]",Za="[object Null]",$a="[object Object]",_a="[object Promise]",ab="[object Proxy]",bb="[object RegExp]",cb="[object Set]",db="[object String]",eb="[object Symbol]",fb="[object Undefined]",gb="[object WeakMap]",hb="[object WeakSet]",ib="[object ArrayBuffer]",jb="[object DataView]",kb="[object Float32Array]",lb="[object Float64Array]",mb="[object Int8Array]",nb="[object Int16Array]",ob="[object Int32Array]",pb="[object Uint8Array]",qb="[object Uint8ClampedArray]",rb="[object Uint16Array]",sb="[object Uint32Array]",tb=/\b__p \+= '';/g,ub=/\b(__p \+=) '' \+/g,vb=/(__e\(.*?\)|\b__t\)) \+\n'';/g,wb=/&(?:amp|lt|gt|quot|#39);/g,xb=/[&<>"']/g,yb=RegExp(wb.source),zb=RegExp(xb.source),Ab=/<%-([\s\S]+?)%>/g,Bb=/<%([\s\S]+?)%>/g,Cb=/<%=([\s\S]+?)%>/g,Db=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Eb=/^\w*$/,Fb=/^\./,Gb=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Hb=/[\\^$.*+?()[\]{}|]/g,Ib=RegExp(Hb.source),Jb=/^\s+|\s+$/g,Kb=/^\s+/,Lb=/\s+$/,Mb=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Nb=/\{\n\/\* \[wrapped with (.+)\] \*/,Ob=/,? & /,Pb=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Qb=/\\(\\)?/g,Rb=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Sb=/\w*$/,Tb=/^[-+]0x[0-9a-f]+$/i,Ub=/^0b[01]+$/i,Vb=/^\[object .+?Constructor\]$/,Wb=/^0o[0-7]+$/i,Xb=/^(?:0|[1-9]\d*)$/,Yb=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Zb=/($^)/,$b=/['\n\r\u2028\u2029\\]/g,_b="\\ud800-\\udfff",ac="\\u0300-\\u036f",bc="\\ufe20-\\ufe2f",cc="\\u20d0-\\u20ff",dc=ac+bc+cc,ec="\\u2700-\\u27bf",fc="a-z\\xdf-\\xf6\\xf8-\\xff",gc="\\xac\\xb1\\xd7\\xf7",hc="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",ic="\\u2000-\\u206f",jc=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",kc="A-Z\\xc0-\\xd6\\xd8-\\xde",lc="\\ufe0e\\ufe0f",mc=gc+hc+ic+jc,nc="['’]",oc="["+_b+"]",pc="["+mc+"]",qc="["+dc+"]",rc="\\d+",sc="["+ec+"]",tc="["+fc+"]",uc="[^"+_b+mc+rc+ec+fc+kc+"]",vc="\\ud83c[\\udffb-\\udfff]",wc="(?:"+qc+"|"+vc+")",xc="[^"+_b+"]",yc="(?:\\ud83c[\\udde6-\\uddff]){2}",zc="[\\ud800-\\udbff][\\udc00-\\udfff]",Ac="["+kc+"]",Bc="\\u200d",Cc="(?:"+tc+"|"+uc+")",Dc="(?:"+Ac+"|"+uc+")",Ec="(?:"+nc+"(?:d|ll|m|re|s|t|ve))?",Fc="(?:"+nc+"(?:D|LL|M|RE|S|T|VE))?",Gc=wc+"?",Hc="["+lc+"]?",Ic="(?:"+Bc+"(?:"+[xc,yc,zc].join("|")+")"+Hc+Gc+")*",Jc="\\d*(?:(?:1st|2nd|3rd|(?![123])\\dth)\\b)",Kc="\\d*(?:(?:1ST|2ND|3RD|(?![123])\\dTH)\\b)",Lc=Hc+Gc+Ic,Mc="(?:"+[sc,yc,zc].join("|")+")"+Lc,Nc="(?:"+[xc+qc+"?",qc,yc,zc,oc].join("|")+")",Oc=RegExp(nc,"g"),Pc=RegExp(qc,"g"),Qc=RegExp(vc+"(?="+vc+")|"+Nc+Lc,"g"),Rc=RegExp([Ac+"?"+tc+"+"+Ec+"(?="+[pc,Ac,"$"].join("|")+")",Dc+"+"+Fc+"(?="+[pc,Ac+Cc,"$"].join("|")+")",Ac+"?"+Cc+"+"+Ec,Ac+"+"+Fc,Kc,Jc,rc,Mc].join("|"),"g"),Sc=RegExp("["+Bc+_b+dc+lc+"]"),Tc=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Uc=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Vc=-1,Wc={};Wc[kb]=Wc[lb]=Wc[mb]=Wc[nb]=Wc[ob]=Wc[pb]=Wc[qb]=Wc[rb]=Wc[sb]=!0,Wc[Oa]=Wc[Pa]=Wc[ib]=Wc[Ra]=Wc[jb]=Wc[Sa]=Wc[Ua]=Wc[Va]=Wc[Xa]=Wc[Ya]=Wc[$a]=Wc[bb]=Wc[cb]=Wc[db]=Wc[gb]=!1;var Xc={};Xc[Oa]=Xc[Pa]=Xc[ib]=Xc[jb]=Xc[Ra]=Xc[Sa]=Xc[kb]=Xc[lb]=Xc[mb]=Xc[nb]=Xc[ob]=Xc[Xa]=Xc[Ya]=Xc[$a]=Xc[bb]=Xc[cb]=Xc[db]=Xc[eb]=Xc[pb]=Xc[qb]=Xc[rb]=Xc[sb]=!0,Xc[Ua]=Xc[Va]=Xc[gb]=!1;var Yc={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},Zc={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},$c={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"},_c={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},ad=parseFloat,bd=parseInt,cd="object"==typeof a&&a&&a.Object===Object&&a,dd="object"==typeof self&&self&&self.Object===Object&&self,ed=cd||dd||Function("return this")(),fd="object"==typeof c&&c&&!c.nodeType&&c,gd=fd&&"object"==typeof b&&b&&!b.nodeType&&b,hd=gd&&gd.exports===fd,id=hd&&cd.process,jd=function(){try{return id&&id.binding&&id.binding("util")}catch(a){}}(),kd=jd&&jd.isArrayBuffer,ld=jd&&jd.isDate,md=jd&&jd.isMap,nd=jd&&jd.isRegExp,od=jd&&jd.isSet,pd=jd&&jd.isTypedArray,qd=A("length"),rd=B(Yc),sd=B(Zc),td=B($c),ud=function wd(a){function b(a){if(ii(a)&&!tm(a)&&!(a instanceof B)){if(a instanceof s)return a;if(tk.call(a,"__wrapped__"))return fg(a)}return new s(a)}function c(){}function s(a,b){this.__wrapped__=a,this.__actions__=[],this.__chain__=!!b,this.__index__=0,this.__values__=ca}function B(a){this.__wrapped__=a,this.__actions__=[],
+this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Ka,this.__views__=[]}function X(){var a=new B(this.__wrapped__);return a.__actions__=Ne(this.__actions__),a.__dir__=this.__dir__,a.__filtered__=this.__filtered__,a.__iteratees__=Ne(this.__iteratees__),a.__takeCount__=this.__takeCount__,a.__views__=Ne(this.__views__),a}function _(){if(this.__filtered__){var a=new B(this);a.__dir__=-1,a.__filtered__=!0}else a=this.clone(),a.__dir__*=-1;return a}function aa(){var a=this.__wrapped__.value(),b=this.__dir__,c=tm(a),d=0>b,e=c?a.length:0,f=Df(0,e,this.__views__),g=f.start,h=f.end,i=h-g,j=d?h:g-1,k=this.__iteratees__,l=k.length,m=0,n=Xk(i,this.__takeCount__);if(!c||!d&&e==i&&n==i)return ue(a,this.__actions__);var o=[];a:for(;i--&&n>m;){j+=b;for(var p=-1,q=a[j];++p<l;){var r=k[p],s=r.iteratee,t=r.type,u=s(q);if(t==Ea)q=u;else if(!u){if(t==Da)continue a;break a}}o[m++]=q}return o}function Pb(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}function _b(){this.__data__=fl?fl(null):{},this.size=0}function ac(a){var b=this.has(a)&&delete this.__data__[a];return this.size-=b?1:0,b}function bc(a){var b=this.__data__;if(fl){var c=b[a];return c===ha?ca:c}return tk.call(b,a)?b[a]:ca}function cc(a){var b=this.__data__;return fl?b[a]!==ca:tk.call(b,a)}function dc(a,b){var c=this.__data__;return this.size+=this.has(a)?0:1,c[a]=fl&&b===ca?ha:b,this}function ec(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}function fc(){this.__data__=[],this.size=0}function gc(a){var b=this.__data__,c=Fc(b,a);if(0>c)return!1;var d=b.length-1;return c==d?b.pop():Hk.call(b,c,1),--this.size,!0}function hc(a){var b=this.__data__,c=Fc(b,a);return 0>c?ca:b[c][1]}function ic(a){return Fc(this.__data__,a)>-1}function jc(a,b){var c=this.__data__,d=Fc(c,a);return 0>d?(++this.size,c.push([a,b])):c[d][1]=b,this}function kc(a){var b=-1,c=null==a?0:a.length;for(this.clear();++b<c;){var d=a[b];this.set(d[0],d[1])}}function lc(){this.size=0,this.__data__={hash:new Pb,map:new(bl||ec),string:new Pb}}function mc(a){var b=zf(this,a)["delete"](a);return this.size-=b?1:0,b}function nc(a){return zf(this,a).get(a)}function oc(a){return zf(this,a).has(a)}function pc(a,b){var c=zf(this,a),d=c.size;return c.set(a,b),this.size+=c.size==d?0:1,this}function qc(a){var b=-1,c=null==a?0:a.length;for(this.__data__=new kc;++b<c;)this.add(a[b])}function rc(a){return this.__data__.set(a,ha),this}function sc(a){return this.__data__.has(a)}function tc(a){var b=this.__data__=new ec(a);this.size=b.size}function uc(){this.__data__=new ec,this.size=0}function vc(a){var b=this.__data__,c=b["delete"](a);return this.size=b.size,c}function wc(a){return this.__data__.get(a)}function xc(a){return this.__data__.has(a)}function yc(a,b){var c=this.__data__;if(c instanceof ec){var d=c.__data__;if(!bl||d.length<ea-1)return d.push([a,b]),this.size=++c.size,this;c=this.__data__=new kc(d)}return c.set(a,b),this.size=c.size,this}function zc(a,b){var c=tm(a),d=!c&&sm(a),e=!c&&!d&&vm(a),f=!c&&!d&&!e&&Am(a),g=c||d||e||f,h=g?F(a.length,mk):[],i=h.length;for(var j in a)!b&&!tk.call(a,j)||g&&("length"==j||e&&("offset"==j||"parent"==j)||f&&("buffer"==j||"byteLength"==j||"byteOffset"==j)||Lf(j,i))||h.push(j);return h}function Ac(a){var b=a.length;return b?a[be(0,b-1)]:ca}function Bc(a,b){return bg(Ne(a),Lc(b,0,a.length))}function Cc(a){return bg(Ne(a))}function Dc(a,b,c){(c!==ca&&!Wh(a[b],c)||c===ca&&!(b in a))&&Jc(a,b,c)}function Ec(a,b,c){var d=a[b];tk.call(a,b)&&Wh(d,c)&&(c!==ca||b in a)||Jc(a,b,c)}function Fc(a,b){for(var c=a.length;c--;)if(Wh(a[c][0],b))return c;return-1}function Gc(a,b,c,d){return rl(a,function(a,e,f){b(d,a,c(a),f)}),d}function Hc(a,b){return a&&Oe(b,Ri(b),a)}function Ic(a,b){return a&&Oe(b,Si(b),a)}function Jc(a,b,c){"__proto__"==b&&Lk?Lk(a,b,{configurable:!0,enumerable:!0,value:c,writable:!0}):a[b]=c}function Kc(a,b){for(var c=-1,d=b.length,e=fk(d),f=null==a;++c<d;)e[c]=f?ca:Oi(a,b[c]);return e}function Lc(a,b,c){return a===a&&(c!==ca&&(a=c>=a?a:c),b!==ca&&(a=a>=b?a:b)),a}function Mc(a,b,c,d,e,f){var g,i=b&ka,j=b&la,k=b&ma;if(c&&(g=e?c(a,d,e,f):c(a)),g!==ca)return g;if(!hi(a))return a;var l=tm(a);if(l){if(g=Gf(a),!i)return Ne(a,g)}else{var m=Dl(a),n=m==Va||m==Wa;if(vm(a))return Be(a,i);if(m==$a||m==Oa||n&&!e){if(g=j||n?{}:Hf(a),!i)return j?Qe(a,Ic(g,a)):Pe(a,Hc(g,a))}else{if(!Xc[m])return e?a:{};g=If(a,m,Mc,i)}}f||(f=new tc);var o=f.get(a);if(o)return o;f.set(a,g);var p=k?j?vf:uf:j?Si:Ri,q=l?ca:p(a);return h(q||a,function(d,e){q&&(e=d,d=a[e]),Ec(g,e,Mc(d,b,c,e,a,f))}),g}function Nc(a){var b=Ri(a);return function(c){return Qc(c,a,b)}}function Qc(a,b,c){var d=c.length;if(null==a)return!d;for(a=kk(a);d--;){var e=c[d],f=b[e],g=a[e];if(g===ca&&!(e in a)||!f(g))return!1}return!0}function Rc(a,b,c){if("function"!=typeof a)throw new nk(ga);return Gl(function(){a.apply(ca,c)},b)}function Sc(a,b,c,d){var e=-1,f=l,g=!0,h=a.length,i=[],j=b.length;if(!h)return i;c&&(b=n(b,H(c))),d?(f=m,g=!1):b.length>=ea&&(f=J,g=!1,b=new qc(b));a:for(;++e<h;){var k=a[e],o=null==c?k:c(k);if(k=d||0!==k?k:0,g&&o===o){for(var p=j;p--;)if(b[p]===o)continue a;i.push(k)}else f(b,o,d)||i.push(k)}return i}function Tc(a,b){var c=!0;return rl(a,function(a,d,e){return c=!!b(a,d,e)}),c}function Yc(a,b,c){for(var d=-1,e=a.length;++d<e;){var f=a[d],g=b(f);if(null!=g&&(h===ca?g===g&&!ti(g):c(g,h)))var h=g,i=f}return i}function Zc(a,b,c,d){var e=a.length;for(c=zi(c),0>c&&(c=-c>e?0:e+c),d=d===ca||d>e?e:zi(d),0>d&&(d+=e),d=c>d?0:Ai(d);d>c;)a[c++]=b;return a}function $c(a,b){var c=[];return rl(a,function(a,d,e){b(a,d,e)&&c.push(a)}),c}function _c(a,b,c,d,e){var f=-1,g=a.length;for(c||(c=Kf),e||(e=[]);++f<g;){var h=a[f];b>0&&c(h)?b>1?_c(h,b-1,c,d,e):o(e,h):d||(e[e.length]=h)}return e}function cd(a,b){return a&&tl(a,b,Ri)}function dd(a,b){return a&&ul(a,b,Ri)}function fd(a,b){return k(b,function(b){return ei(a[b])})}function gd(a,b){b=ze(b,a);for(var c=0,d=b.length;null!=a&&d>c;)a=a[cg(b[c++])];return c&&c==d?a:ca}function id(a,b,c){var d=b(a);return tm(a)?d:o(d,c(a))}function jd(a){return null==a?a===ca?fb:Za:Kk&&Kk in kk(a)?Cf(a):Xf(a)}function qd(a,b){return a>b}function ud(a,b){return null!=a&&tk.call(a,b)}function xd(a,b){return null!=a&&b in kk(a)}function yd(a,b,c){return a>=Xk(b,c)&&a<Wk(b,c)}function zd(a,b,c){for(var d=c?m:l,e=a[0].length,f=a.length,g=f,h=fk(f),i=1/0,j=[];g--;){var k=a[g];g&&b&&(k=n(k,H(b))),i=Xk(k.length,i),h[g]=!c&&(b||e>=120&&k.length>=120)?new qc(g&&k):ca}k=a[0];var o=-1,p=h[0];a:for(;++o<e&&j.length<i;){var q=k[o],r=b?b(q):q;if(q=c||0!==q?q:0,!(p?J(p,r):d(j,r,c))){for(g=f;--g;){var s=h[g];if(!(s?J(s,r):d(a[g],r,c)))continue a}p&&p.push(r),j.push(q)}}return j}function Ad(a,b,c,d){return cd(a,function(a,e,f){b(d,c(a),e,f)}),d}function Bd(a,b,c){b=ze(b,a),a=Zf(a,b);var d=null==a?a:a[cg(yg(b))];return null==d?ca:f(d,a,c)}function Cd(a){return ii(a)&&jd(a)==Oa}function Dd(a){return ii(a)&&jd(a)==ib}function Ed(a){return ii(a)&&jd(a)==Sa}function Fd(a,b,c,d,e){return a===b?!0:null==a||null==b||!ii(a)&&!ii(b)?a!==a&&b!==b:Gd(a,b,c,d,Fd,e)}function Gd(a,b,c,d,e,f){var g=tm(a),h=tm(b),i=g?Pa:Dl(a),j=h?Pa:Dl(b);i=i==Oa?$a:i,j=j==Oa?$a:j;var k=i==$a,l=j==$a,m=i==j;if(m&&vm(a)){if(!vm(b))return!1;g=!0,k=!1}if(m&&!k)return f||(f=new tc),g||Am(a)?qf(a,b,c,d,e,f):rf(a,b,i,c,d,e,f);if(!(c&na)){var n=k&&tk.call(a,"__wrapped__"),o=l&&tk.call(b,"__wrapped__");if(n||o){var p=n?a.value():a,q=o?b.value():b;return f||(f=new tc),e(p,q,c,d,f)}}return m?(f||(f=new tc),sf(a,b,c,d,e,f)):!1}function Hd(a){return ii(a)&&Dl(a)==Xa}function Id(a,b,c,d){var e=c.length,f=e,g=!d;if(null==a)return!f;for(a=kk(a);e--;){var h=c[e];if(g&&h[2]?h[1]!==a[h[0]]:!(h[0]in a))return!1}for(;++e<f;){h=c[e];var i=h[0],j=a[i],k=h[1];if(g&&h[2]){if(j===ca&&!(i in a))return!1}else{var l=new tc;if(d)var m=d(j,k,i,a,b,l);if(!(m===ca?Fd(k,j,na|oa,d,l):m))return!1}}return!0}function Jd(a){if(!hi(a)||Qf(a))return!1;var b=ei(a)?zk:Vb;return b.test(dg(a))}function Kd(a){return ii(a)&&jd(a)==bb}function Ld(a){return ii(a)&&Dl(a)==cb}function Md(a){return ii(a)&&gi(a.length)&&!!Wc[jd(a)]}function Nd(a){return"function"==typeof a?a:null==a?Hj:"object"==typeof a?tm(a)?Td(a[0],a[1]):Sd(a):Pj(a)}function Od(a){if(!Rf(a))return Vk(a);var b=[];for(var c in kk(a))tk.call(a,c)&&"constructor"!=c&&b.push(c);return b}function Pd(a){if(!hi(a))return Wf(a);var b=Rf(a),c=[];for(var d in a)("constructor"!=d||!b&&tk.call(a,d))&&c.push(d);return c}function Qd(a,b){return b>a}function Rd(a,b){var c=-1,d=Xh(a)?fk(a.length):[];return rl(a,function(a,e,f){d[++c]=b(a,e,f)}),d}function Sd(a){var b=Af(a);return 1==b.length&&b[0][2]?Tf(b[0][0],b[0][1]):function(c){return c===a||Id(c,a,b)}}function Td(a,b){return Nf(a)&&Sf(b)?Tf(cg(a),b):function(c){var d=Oi(c,a);return d===ca&&d===b?Qi(c,a):Fd(b,d,na|oa)}}function Ud(a,b,c,d,e){a!==b&&tl(b,function(f,g){if(hi(f))e||(e=new tc),Vd(a,b,g,c,Ud,d,e);else{var h=d?d(a[g],f,g+"",a,b,e):ca;h===ca&&(h=f),Dc(a,g,h)}},Si)}function Vd(a,b,c,d,e,f,g){var h=a[c],i=b[c],j=g.get(i);if(j)return void Dc(a,c,j);var k=f?f(h,i,c+"",a,b,g):ca,l=k===ca;if(l){var m=tm(i),n=!m&&vm(i),o=!m&&!n&&Am(i);k=i,m||n||o?tm(h)?k=h:Yh(h)?k=Ne(h):n?(l=!1,k=Be(i,!0)):o?(l=!1,k=Ie(i,!0)):k=[]:qi(i)||sm(i)?(k=h,sm(h)?k=Ci(h):(!hi(h)||d&&ei(h))&&(k=Hf(i))):l=!1}l&&(g.set(i,k),e(k,i,d,f,g),g["delete"](i)),Dc(a,c,k)}function Wd(a,b){var c=a.length;if(c)return b+=0>b?c:0,Lf(b,c)?a[b]:ca}function Xd(a,b,c){var d=-1;b=n(b.length?b:[Hj],H(yf()));var e=Rd(a,function(a,c,e){var f=n(b,function(b){return b(a)});return{criteria:f,index:++d,value:a}});return D(e,function(a,b){return Ke(a,b,c)})}function Yd(a,b){return Zd(a,b,function(b,c){return Qi(a,c)})}function Zd(a,b,c){for(var d=-1,e=b.length,f={};++d<e;){var g=b[d],h=gd(a,g);c(h,g)&&he(f,ze(g,a),h)}return f}function $d(a){return function(b){return gd(b,a)}}function _d(a,b,c,d){var e=d?x:w,f=-1,g=b.length,h=a;for(a===b&&(b=Ne(b)),c&&(h=n(a,H(c)));++f<g;)for(var i=0,j=b[f],k=c?c(j):j;(i=e(h,k,i,d))>-1;)h!==a&&Hk.call(h,i,1),Hk.call(a,i,1);return a}function ae(a,b){for(var c=a?b.length:0,d=c-1;c--;){var e=b[c];if(c==d||e!==f){var f=e;Lf(e)?Hk.call(a,e,1):re(a,e)}}return a}function be(a,b){return a+Qk($k()*(b-a+1))}function ce(a,b,c,d){for(var e=-1,f=Wk(Pk((b-a)/(c||1)),0),g=fk(f);f--;)g[d?f:++e]=a,a+=c;return g}function de(a,b){var c="";if(!a||1>b||b>Ha)return c;do b%2&&(c+=a),b=Qk(b/2),b&&(a+=a);while(b);return c}function ee(a,b){return Hl(Yf(a,b,Hj),a+"")}function fe(a){return Ac(cj(a))}function ge(a,b){var c=cj(a);return bg(c,Lc(b,0,c.length))}function he(a,b,c,d){if(!hi(a))return a;b=ze(b,a);for(var e=-1,f=b.length,g=f-1,h=a;null!=h&&++e<f;){var i=cg(b[e]),j=c;if(e!=g){var k=h[i];j=d?d(k,i,h):ca,j===ca&&(j=hi(k)?k:Lf(b[e+1])?[]:{})}Ec(h,i,j),h=h[i]}return a}function ie(a){return bg(cj(a))}function je(a,b,c){var d=-1,e=a.length;0>b&&(b=-b>e?0:e+b),c=c>e?e:c,0>c&&(c+=e),e=b>c?0:c-b>>>0,b>>>=0;for(var f=fk(e);++d<e;)f[d]=a[d+b];return f}function ke(a,b){var c;return rl(a,function(a,d,e){return c=b(a,d,e),!c}),!!c}function le(a,b,c){var d=0,e=null==a?d:a.length;if("number"==typeof b&&b===b&&Ma>=e){for(;e>d;){var f=d+e>>>1,g=a[f];null!==g&&!ti(g)&&(c?b>=g:b>g)?d=f+1:e=f}return e}return me(a,b,Hj,c)}function me(a,b,c,d){b=c(b);for(var e=0,f=null==a?0:a.length,g=b!==b,h=null===b,i=ti(b),j=b===ca;f>e;){var k=Qk((e+f)/2),l=c(a[k]),m=l!==ca,n=null===l,o=l===l,p=ti(l);if(g)var q=d||o;else q=j?o&&(d||m):h?o&&m&&(d||!n):i?o&&m&&!n&&(d||!p):n||p?!1:d?b>=l:b>l;q?e=k+1:f=k}return Xk(f,La)}function ne(a,b){for(var c=-1,d=a.length,e=0,f=[];++c<d;){var g=a[c],h=b?b(g):g;if(!c||!Wh(h,i)){var i=h;f[e++]=0===g?0:g}}return f}function oe(a){return"number"==typeof a?a:ti(a)?Ja:+a}function pe(a){if("string"==typeof a)return a;if(tm(a))return n(a,pe)+"";if(ti(a))return pl?pl.call(a):"";var b=a+"";return"0"==b&&1/a==-Ga?"-0":b}function qe(a,b,c){var d=-1,e=l,f=a.length,g=!0,h=[],i=h;if(c)g=!1,e=m;else if(f>=ea){var j=b?null:zl(a);if(j)return V(j);g=!1,e=J,i=new qc}else i=b?[]:h;a:for(;++d<f;){var k=a[d],n=b?b(k):k;if(k=c||0!==k?k:0,g&&n===n){for(var o=i.length;o--;)if(i[o]===n)continue a;b&&i.push(n),h.push(k)}else e(i,n,c)||(i!==h&&i.push(n),h.push(k))}return h}function re(a,b){return b=ze(b,a),a=Zf(a,b),null==a||delete a[cg(yg(b))]}function se(a,b,c,d){return he(a,b,c(gd(a,b)),d)}function te(a,b,c,d){for(var e=a.length,f=d?e:-1;(d?f--:++f<e)&&b(a[f],f,a););return c?je(a,d?0:f,d?f+1:e):je(a,d?f+1:0,d?e:f)}function ue(a,b){var c=a;return c instanceof B&&(c=c.value()),p(b,function(a,b){return b.func.apply(b.thisArg,o([a],b.args))},c)}function ve(a,b,c){var d=a.length;if(2>d)return d?qe(a[0]):[];for(var e=-1,f=fk(d);++e<d;)for(var g=a[e],h=-1;++h<d;)h!=e&&(f[e]=Sc(f[e]||g,a[h],b,c));return qe(_c(f,1),b,c)}function we(a,b,c){for(var d=-1,e=a.length,f=b.length,g={};++d<e;){var h=f>d?b[d]:ca;c(g,a[d],h)}return g}function xe(a){return Yh(a)?a:[]}function ye(a){return"function"==typeof a?a:Hj}function ze(a,b){return tm(a)?a:Nf(a,b)?[a]:Il(Ei(a))}function Ae(a,b,c){var d=a.length;return c=c===ca?d:c,!b&&c>=d?a:je(a,b,c)}function Be(a,b){if(b)return a.slice();var c=a.length,d=Dk?Dk(c):new a.constructor(c);return a.copy(d),d}function Ce(a){var b=new a.constructor(a.byteLength);return new Ck(b).set(new Ck(a)),b}function De(a,b){var c=b?Ce(a.buffer):a.buffer;return new a.constructor(c,a.byteOffset,a.byteLength)}function Ee(a,b,c){var e=b?c(S(a),ka):S(a);return p(e,d,new a.constructor)}function Fe(a){var b=new a.constructor(a.source,Sb.exec(a));return b.lastIndex=a.lastIndex,b}function Ge(a,b,c){var d=b?c(V(a),ka):V(a);return p(d,e,new a.constructor)}function He(a){return ol?kk(ol.call(a)):{}}function Ie(a,b){var c=b?Ce(a.buffer):a.buffer;return new a.constructor(c,a.byteOffset,a.length)}function Je(a,b){if(a!==b){var c=a!==ca,d=null===a,e=a===a,f=ti(a),g=b!==ca,h=null===b,i=b===b,j=ti(b);if(!h&&!j&&!f&&a>b||f&&g&&i&&!h&&!j||d&&g&&i||!c&&i||!e)return 1;if(!d&&!f&&!j&&b>a||j&&c&&e&&!d&&!f||h&&c&&e||!g&&e||!i)return-1}return 0}function Ke(a,b,c){for(var d=-1,e=a.criteria,f=b.criteria,g=e.length,h=c.length;++d<g;){var i=Je(e[d],f[d]);if(i){if(d>=h)return i;var j=c[d];return i*("desc"==j?-1:1)}}return a.index-b.index}function Le(a,b,c,d){for(var e=-1,f=a.length,g=c.length,h=-1,i=b.length,j=Wk(f-g,0),k=fk(i+j),l=!d;++h<i;)k[h]=b[h];for(;++e<g;)(l||f>e)&&(k[c[e]]=a[e]);for(;j--;)k[h++]=a[e++];return k}function Me(a,b,c,d){for(var e=-1,f=a.length,g=-1,h=c.length,i=-1,j=b.length,k=Wk(f-h,0),l=fk(k+j),m=!d;++e<k;)l[e]=a[e];for(var n=e;++i<j;)l[n+i]=b[i];for(;++g<h;)(m||f>e)&&(l[n+c[g]]=a[e++]);return l}function Ne(a,b){var c=-1,d=a.length;for(b||(b=fk(d));++c<d;)b[c]=a[c];return b}function Oe(a,b,c,d){var e=!c;c||(c={});for(var f=-1,g=b.length;++f<g;){var h=b[f],i=d?d(c[h],a[h],h,c,a):ca;i===ca&&(i=a[h]),e?Jc(c,h,i):Ec(c,h,i)}return c}function Pe(a,b){return Oe(a,Bl(a),b)}function Qe(a,b){return Oe(a,Cl(a),b)}function Re(a,b){return function(c,d){var e=tm(c)?g:Gc,f=b?b():{};return e(c,a,yf(d,2),f)}}function Se(a){return ee(function(b,c){var d=-1,e=c.length,f=e>1?c[e-1]:ca,g=e>2?c[2]:ca;for(f=a.length>3&&"function"==typeof f?(e--,f):ca,g&&Mf(c[0],c[1],g)&&(f=3>e?ca:f,e=1),b=kk(b);++d<e;){var h=c[d];h&&a(b,h,d,f)}return b})}function Te(a,b){return function(c,d){if(null==c)return c;if(!Xh(c))return a(c,d);for(var e=c.length,f=b?e:-1,g=kk(c);(b?f--:++f<e)&&d(g[f],f,g)!==!1;);return c}}function Ue(a){return function(b,c,d){for(var e=-1,f=kk(b),g=d(b),h=g.length;h--;){var i=g[a?h:++e];if(c(f[i],i,f)===!1)break}return b}}function Ve(a,b,c){function d(){var b=this&&this!==ed&&this instanceof d?f:a;return b.apply(e?c:this,arguments)}var e=b&pa,f=Ye(a);return d}function We(a){return function(b){b=Ei(b);var c=P(b)?$(b):ca,d=c?c[0]:b.charAt(0),e=c?Ae(c,1).join(""):b.slice(1);return d[a]()+e}}function Xe(a){return function(b){return p(Cj(ij(b).replace(Oc,"")),a,"")}}function Ye(a){return function(){var b=arguments;switch(b.length){case 0:return new a;case 1:return new a(b[0]);case 2:return new a(b[0],b[1]);case 3:return new a(b[0],b[1],b[2]);case 4:return new a(b[0],b[1],b[2],b[3]);case 5:return new a(b[0],b[1],b[2],b[3],b[4]);case 6:return new a(b[0],b[1],b[2],b[3],b[4],b[5]);case 7:return new a(b[0],b[1],b[2],b[3],b[4],b[5],b[6])}var c=ql(a.prototype),d=a.apply(c,b);return hi(d)?d:c}}function Ze(a,b,c){function d(){for(var g=arguments.length,h=fk(g),i=g,j=xf(d);i--;)h[i]=arguments[i];var k=3>g&&h[0]!==j&&h[g-1]!==j?[]:U(h,j);if(g-=k.length,c>g)return jf(a,b,af,d.placeholder,ca,h,k,ca,ca,c-g);var l=this&&this!==ed&&this instanceof d?e:a;return f(l,this,h)}var e=Ye(a);return d}function $e(a){return function(b,c,d){var e=kk(b);if(!Xh(b)){var f=yf(c,3);b=Ri(b),c=function(a){return f(e[a],a,e)}}var g=a(b,c,d);return g>-1?e[f?b[g]:g]:ca}}function _e(a){return tf(function(b){var c=b.length,d=c,e=s.prototype.thru;for(a&&b.reverse();d--;){var f=b[d];if("function"!=typeof f)throw new nk(ga);if(e&&!g&&"wrapper"==wf(f))var g=new s([],!0)}for(d=g?d:c;++d<c;){f=b[d];var h=wf(f),i="wrapper"==h?Al(f):ca;g=i&&Pf(i[0])&&i[1]==(wa|sa|ua|xa)&&!i[4].length&&1==i[9]?g[wf(i[0])].apply(g,i[3]):1==f.length&&Pf(f)?g[h]():g.thru(f)}return function(){var a=arguments,d=a[0];if(g&&1==a.length&&tm(d))return g.plant(d).value();for(var e=0,f=c?b[e].apply(this,a):d;++e<c;)f=b[e].call(this,f);return f}})}function af(a,b,c,d,e,f,g,h,i,j){function k(){for(var r=arguments.length,s=fk(r),t=r;t--;)s[t]=arguments[t];if(o)var u=xf(k),v=M(s,u);if(d&&(s=Le(s,d,e,o)),f&&(s=Me(s,f,g,o)),r-=v,o&&j>r){var w=U(s,u);return jf(a,b,af,k.placeholder,c,s,w,h,i,j-r)}var x=m?c:this,y=n?x[a]:a;return r=s.length,h?s=$f(s,h):p&&r>1&&s.reverse(),l&&r>i&&(s.length=i),this&&this!==ed&&this instanceof k&&(y=q||Ye(y)),y.apply(x,s)}var l=b&wa,m=b&pa,n=b&qa,o=b&(sa|ta),p=b&ya,q=n?ca:Ye(a);return k}function bf(a,b){return function(c,d){return Ad(c,a,b(d),{})}}function cf(a,b){return function(c,d){var e;if(c===ca&&d===ca)return b;if(c!==ca&&(e=c),d!==ca){if(e===ca)return d;"string"==typeof c||"string"==typeof d?(c=pe(c),d=pe(d)):(c=oe(c),d=oe(d)),e=a(c,d)}return e}}function df(a){return tf(function(b){return b=n(b,H(yf())),ee(function(c){var d=this;return a(b,function(a){return f(a,d,c)})})})}function ef(a,b){b=b===ca?" ":pe(b);var c=b.length;if(2>c)return c?de(b,a):b;var d=de(b,Pk(a/Z(b)));return P(b)?Ae($(d),0,a).join(""):d.slice(0,a)}function ff(a,b,c,d){function e(){for(var b=-1,i=arguments.length,j=-1,k=d.length,l=fk(k+i),m=this&&this!==ed&&this instanceof e?h:a;++j<k;)l[j]=d[j];for(;i--;)l[j++]=arguments[++b];return f(m,g?c:this,l)}var g=b&pa,h=Ye(a);return e}function gf(a){return function(b,c,d){return d&&"number"!=typeof d&&Mf(b,c,d)&&(c=d=ca),b=yi(b),c===ca?(c=b,b=0):c=yi(c),d=d===ca?c>b?1:-1:yi(d),ce(b,c,d,a)}}function hf(a){return function(b,c){return("string"!=typeof b||"string"!=typeof c)&&(b=Bi(b),c=Bi(c)),a(b,c)}}function jf(a,b,c,d,e,f,g,h,i,j){var k=b&sa,l=k?g:ca,m=k?ca:g,n=k?f:ca,o=k?ca:f;b|=k?ua:va,b&=~(k?va:ua),b&ra||(b&=~(pa|qa));var p=[a,b,e,n,l,o,m,h,i,j],q=c.apply(ca,p);return Pf(a)&&Fl(q,p),q.placeholder=d,_f(q,a,b)}function kf(a){var b=jk[a];return function(a,c){if(a=Bi(a),c=null==c?0:Xk(zi(c),292)){var d=(Ei(a)+"e").split("e"),e=b(d[0]+"e"+(+d[1]+c));return d=(Ei(e)+"e").split("e"),+(d[0]+"e"+(+d[1]-c))}return b(a)}}function lf(a){return function(b){var c=Dl(b);return c==Xa?S(b):c==cb?W(b):G(b,a(b))}}function mf(a,b,c,d,e,f,g,h){var i=b&qa;if(!i&&"function"!=typeof a)throw new nk(ga);var j=d?d.length:0;if(j||(b&=~(ua|va),d=e=ca),g=g===ca?g:Wk(zi(g),0),h=h===ca?h:zi(h),j-=e?e.length:0,b&va){var k=d,l=e;d=e=ca}var m=i?ca:Al(a),n=[a,b,c,d,e,k,l,f,g,h];if(m&&Vf(n,m),a=n[0],b=n[1],c=n[2],d=n[3],e=n[4],h=n[9]=n[9]===ca?i?0:a.length:Wk(n[9]-j,0),!h&&b&(sa|ta)&&(b&=~(sa|ta)),b&&b!=pa)o=b==sa||b==ta?Ze(a,b,h):b!=ua&&b!=(pa|ua)||e.length?af.apply(ca,n):ff(a,b,c,d);else var o=Ve(a,b,c);var p=m?vl:Fl;return _f(p(o,n),a,b)}function nf(a,b,c,d){return a===ca||Wh(a,qk[c])&&!tk.call(d,c)?b:a}function of(a,b,c,d,e,f){return hi(a)&&hi(b)&&(f.set(b,a),Ud(a,b,ca,of,f),f["delete"](b)),a}function pf(a,b){return b!==ca&&qi(a)?ca:a}function qf(a,b,c,d,e,f){var g=c&na,h=a.length,i=b.length;if(h!=i&&!(g&&i>h))return!1;var j=f.get(a);if(j&&f.get(b))return j==b;var k=-1,l=!0,m=c&oa?new qc:ca;for(f.set(a,b),f.set(b,a);++k<h;){var n=a[k],o=b[k];if(d)var p=g?d(o,n,k,b,a,f):d(n,o,k,a,b,f);if(p!==ca){if(p)continue;l=!1;break}if(m){if(!r(b,function(a,b){return J(m,b)||n!==a&&!e(n,a,c,d,f)?void 0:m.push(b)})){l=!1;break}}else if(n!==o&&!e(n,o,c,d,f)){l=!1;break}}return f["delete"](a),f["delete"](b),l}function rf(a,b,c,d,e,f,g){switch(c){case jb:if(a.byteLength!=b.byteLength||a.byteOffset!=b.byteOffset)return!1;a=a.buffer,b=b.buffer;case ib:return a.byteLength==b.byteLength&&f(new Ck(a),new Ck(b))?!0:!1;case Ra:case Sa:case Ya:return Wh(+a,+b);case Ua:return a.name==b.name&&a.message==b.message;case bb:case db:return a==b+"";case Xa:var h=S;case cb:var i=d&na;if(h||(h=V),a.size!=b.size&&!i)return!1;var j=g.get(a);if(j)return j==b;d|=oa,g.set(a,b);var k=qf(h(a),h(b),d,e,f,g);return g["delete"](a),k;case eb:if(ol)return ol.call(a)==ol.call(b)}return!1}function sf(a,b,c,d,e,f){var g=c&na,h=uf(a),i=h.length,j=uf(b),k=j.length;if(i!=k&&!g)return!1;for(var l=i;l--;){var m=h[l];if(!(g?m in b:tk.call(b,m)))return!1}var n=f.get(a);if(n&&f.get(b))return n==b;var o=!0;f.set(a,b),f.set(b,a);for(var p=g;++l<i;){m=h[l];var q=a[m],r=b[m];if(d)var s=g?d(r,q,m,b,a,f):d(q,r,m,a,b,f);if(!(s===ca?q===r||e(q,r,c,d,f):s)){o=!1;break}p||(p="constructor"==m)}if(o&&!p){var t=a.constructor,u=b.constructor;t!=u&&"constructor"in a&&"constructor"in b&&!("function"==typeof t&&t instanceof t&&"function"==typeof u&&u instanceof u)&&(o=!1)}return f["delete"](a),f["delete"](b),o}function tf(a){return Hl(Yf(a,ca,qg),a+"")}function uf(a){return id(a,Ri,Bl)}function vf(a){return id(a,Si,Cl)}function wf(a){for(var b=a.name+"",c=hl[b],d=tk.call(hl,b)?c.length:0;d--;){var e=c[d],f=e.func;if(null==f||f==a)return e.name}return b}function xf(a){var c=tk.call(b,"placeholder")?b:a;return c.placeholder}function yf(){var a=b.iteratee||Ij;return a=a===Ij?Nd:a,arguments.length?a(arguments[0],arguments[1]):a}function zf(a,b){var c=a.__data__;return Of(b)?c["string"==typeof b?"string":"hash"]:c.map}function Af(a){for(var b=Ri(a),c=b.length;c--;){var d=b[c],e=a[d];b[c]=[d,e,Sf(e)]}return b}function Bf(a,b){var c=O(a,b);return Jd(c)?c:ca}function Cf(a){var b=tk.call(a,Kk),c=a[Kk];try{a[Kk]=ca;var d=!0}catch(e){}var f=wk.call(a);return d&&(b?a[Kk]=c:delete a[Kk]),f}function Df(a,b,c){for(var d=-1,e=c.length;++d<e;){var f=c[d],g=f.size;switch(f.type){case"drop":a+=g;break;case"dropRight":b-=g;break;case"take":b=Xk(b,a+g);break;case"takeRight":a=Wk(a,b-g)}}return{start:a,end:b}}function Ef(a){var b=a.match(Nb);return b?b[1].split(Ob):[]}function Ff(a,b,c){b=ze(b,a);for(var d=-1,e=b.length,f=!1;++d<e;){var g=cg(b[d]);if(!(f=null!=a&&c(a,g)))break;a=a[g]}return f||++d!=e?f:(e=null==a?0:a.length,!!e&&gi(e)&&Lf(g,e)&&(tm(a)||sm(a)))}function Gf(a){var b=a.length,c=a.constructor(b);return b&&"string"==typeof a[0]&&tk.call(a,"index")&&(c.index=a.index,c.input=a.input),c}function Hf(a){return"function"!=typeof a.constructor||Rf(a)?{}:ql(Ek(a))}function If(a,b,c,d){var e=a.constructor;switch(b){case ib:return Ce(a);case Ra:case Sa:return new e(+a);case jb:return De(a,d);case kb:case lb:case mb:case nb:case ob:case pb:case qb:case rb:case sb:return Ie(a,d);case Xa:return Ee(a,d,c);case Ya:case db:return new e(a);case bb:return Fe(a);case cb:return Ge(a,d,c);case eb:return He(a)}}function Jf(a,b){var c=b.length;if(!c)return a;var d=c-1;return b[d]=(c>1?"& ":"")+b[d],b=b.join(c>2?", ":" "),a.replace(Mb,"{\n/* [wrapped with "+b+"] */\n")}function Kf(a){return tm(a)||sm(a)||!!(Ik&&a&&a[Ik])}function Lf(a,b){return b=null==b?Ha:b,!!b&&("number"==typeof a||Xb.test(a))&&a>-1&&a%1==0&&b>a}function Mf(a,b,c){if(!hi(c))return!1;var d=typeof b;return("number"==d?Xh(c)&&Lf(b,c.length):"string"==d&&b in c)?Wh(c[b],a):!1}function Nf(a,b){if(tm(a))return!1;var c=typeof a;return"number"==c||"symbol"==c||"boolean"==c||null==a||ti(a)?!0:Eb.test(a)||!Db.test(a)||null!=b&&a in kk(b)}function Of(a){var b=typeof a;return"string"==b||"number"==b||"symbol"==b||"boolean"==b?"__proto__"!==a:null===a}function Pf(a){var c=wf(a),d=b[c];if("function"!=typeof d||!(c in B.prototype))return!1;if(a===d)return!0;var e=Al(d);return!!e&&a===e[0]}function Qf(a){return!!vk&&vk in a}function Rf(a){var b=a&&a.constructor,c="function"==typeof b&&b.prototype||qk;return a===c}function Sf(a){return a===a&&!hi(a)}function Tf(a,b){return function(c){return null==c?!1:c[a]===b&&(b!==ca||a in kk(c))}}function Uf(a){var b=Ih(a,function(a){return c.size===ia&&c.clear(),a}),c=b.cache;return b}function Vf(a,b){var c=a[1],d=b[1],e=c|d,f=(pa|qa|wa)>e,g=d==wa&&c==sa||d==wa&&c==xa&&a[7].length<=b[8]||d==(wa|xa)&&b[7].length<=b[8]&&c==sa;if(!f&&!g)return a;d&pa&&(a[2]=b[2],e|=c&pa?0:ra);var h=b[3];if(h){var i=a[3];a[3]=i?Le(i,h,b[4]):h,a[4]=i?U(a[3],ja):b[4]}return h=b[5],h&&(i=a[5],a[5]=i?Me(i,h,b[6]):h,a[6]=i?U(a[5],ja):b[6]),h=b[7],h&&(a[7]=h),d&wa&&(a[8]=null==a[8]?b[8]:Xk(a[8],b[8])),null==a[9]&&(a[9]=b[9]),a[0]=b[0],a[1]=e,a}function Wf(a){var b=[];if(null!=a)for(var c in kk(a))b.push(c);return b}function Xf(a){return wk.call(a)}function Yf(a,b,c){return b=Wk(b===ca?a.length-1:b,0),function(){for(var d=arguments,e=-1,g=Wk(d.length-b,0),h=fk(g);++e<g;)h[e]=d[b+e];e=-1;for(var i=fk(b+1);++e<b;)i[e]=d[e];return i[b]=c(h),f(a,this,i)}}function Zf(a,b){return b.length<2?a:gd(a,je(b,0,-1))}function $f(a,b){for(var c=a.length,d=Xk(b.length,c),e=Ne(a);d--;){var f=b[d];a[d]=Lf(f,c)?e[f]:ca}return a}function _f(a,b,c){var d=b+"";return Hl(a,Jf(d,eg(Ef(d),c)))}function ag(a){var b=0,c=0;return function(){var d=Yk(),e=Ca-(d-c);if(c=d,e>0){if(++b>=Ba)return arguments[0]}else b=0;return a.apply(ca,arguments)}}function bg(a,b){var c=-1,d=a.length,e=d-1;for(b=b===ca?d:b;++c<b;){var f=be(c,e),g=a[f];a[f]=a[c],a[c]=g}return a.length=b,a}function cg(a){if("string"==typeof a||ti(a))return a;var b=a+"";return"0"==b&&1/a==-Ga?"-0":b}function dg(a){if(null!=a){try{return sk.call(a)}catch(b){}try{return a+""}catch(b){}}return""}function eg(a,b){return h(Na,function(c){var d="_."+c[0];b&c[1]&&!l(a,d)&&a.push(d)}),a.sort()}function fg(a){if(a instanceof B)return a.clone();var b=new s(a.__wrapped__,a.__chain__);return b.__actions__=Ne(a.__actions__),b.__index__=a.__index__,b.__values__=a.__values__,b}function gg(a,b,c){b=(c?Mf(a,b,c):b===ca)?1:Wk(zi(b),0);var d=null==a?0:a.length;if(!d||1>b)return[];for(var e=0,f=0,g=fk(Pk(d/b));d>e;)g[f++]=je(a,e,e+=b);return g}function hg(a){for(var b=-1,c=null==a?0:a.length,d=0,e=[];++b<c;){var f=a[b];f&&(e[d++]=f)}return e}function ig(){var a=arguments.length;if(!a)return[];for(var b=fk(a-1),c=arguments[0],d=a;d--;)b[d-1]=arguments[d];return o(tm(c)?Ne(c):[c],_c(b,1))}function jg(a,b,c){var d=null==a?0:a.length;return d?(b=c||b===ca?1:zi(b),je(a,0>b?0:b,d)):[]}function kg(a,b,c){var d=null==a?0:a.length;return d?(b=c||b===ca?1:zi(b),b=d-b,je(a,0,0>b?0:b)):[]}function lg(a,b){return a&&a.length?te(a,yf(b,3),!0,!0):[]}function mg(a,b){return a&&a.length?te(a,yf(b,3),!0):[]}function ng(a,b,c,d){var e=null==a?0:a.length;return e?(c&&"number"!=typeof c&&Mf(a,b,c)&&(c=0,d=e),Zc(a,b,c,d)):[]}function og(a,b,c){var d=null==a?0:a.length;if(!d)return-1;var e=null==c?0:zi(c);return 0>e&&(e=Wk(d+e,0)),v(a,yf(b,3),e)}function pg(a,b,c){var d=null==a?0:a.length;if(!d)return-1;var e=d-1;return c!==ca&&(e=zi(c),e=0>c?Wk(d+e,0):Xk(e,d-1)),v(a,yf(b,3),e,!0)}function qg(a){var b=null==a?0:a.length;return b?_c(a,1):[]}function rg(a){var b=null==a?0:a.length;return b?_c(a,Ga):[]}function sg(a,b){var c=null==a?0:a.length;return c?(b=b===ca?1:zi(b),_c(a,b)):[]}function tg(a){for(var b=-1,c=null==a?0:a.length,d={};++b<c;){var e=a[b];d[e[0]]=e[1]}return d}function ug(a){return a&&a.length?a[0]:ca}function vg(a,b,c){var d=null==a?0:a.length;if(!d)return-1;var e=null==c?0:zi(c);return 0>e&&(e=Wk(d+e,0)),w(a,b,e)}function wg(a){var b=null==a?0:a.length;return b?je(a,0,-1):[]}function xg(a,b){return null==a?"":Uk.call(a,b)}function yg(a){var b=null==a?0:a.length;return b?a[b-1]:ca}function zg(a,b,c){var d=null==a?0:a.length;if(!d)return-1;var e=d;return c!==ca&&(e=zi(c),e=0>e?Wk(d+e,0):Xk(e,d-1)),b===b?Y(a,b,e):v(a,y,e,!0)}function Ag(a,b){return a&&a.length?Wd(a,zi(b)):ca}function Bg(a,b){return a&&a.length&&b&&b.length?_d(a,b):a}function Cg(a,b,c){return a&&a.length&&b&&b.length?_d(a,b,yf(c,2)):a}function Dg(a,b,c){return a&&a.length&&b&&b.length?_d(a,b,ca,c):a}function Eg(a,b){var c=[];if(!a||!a.length)return c;var d=-1,e=[],f=a.length;for(b=yf(b,3);++d<f;){var g=a[d];b(g,d,a)&&(c.push(g),e.push(d))}return ae(a,e),c}function Fg(a){return null==a?a:_k.call(a)}function Gg(a,b,c){var d=null==a?0:a.length;return d?(c&&"number"!=typeof c&&Mf(a,b,c)?(b=0,c=d):(b=null==b?0:zi(b),c=c===ca?d:zi(c)),je(a,b,c)):[]}function Hg(a,b){return le(a,b)}function Ig(a,b,c){return me(a,b,yf(c,2))}function Jg(a,b){var c=null==a?0:a.length;if(c){var d=le(a,b);if(c>d&&Wh(a[d],b))return d}return-1}function Kg(a,b){return le(a,b,!0)}function Lg(a,b,c){return me(a,b,yf(c,2),!0)}function Mg(a,b){var c=null==a?0:a.length;if(c){var d=le(a,b,!0)-1;if(Wh(a[d],b))return d}return-1}function Ng(a){return a&&a.length?ne(a):[]}function Og(a,b){return a&&a.length?ne(a,yf(b,2)):[]}function Pg(a){var b=null==a?0:a.length;return b?je(a,1,b):[]}function Qg(a,b,c){return a&&a.length?(b=c||b===ca?1:zi(b),je(a,0,0>b?0:b)):[]}function Rg(a,b,c){var d=null==a?0:a.length;return d?(b=c||b===ca?1:zi(b),b=d-b,je(a,0>b?0:b,d)):[]}function Sg(a,b){return a&&a.length?te(a,yf(b,3),!1,!0):[]}function Tg(a,b){return a&&a.length?te(a,yf(b,3)):[]}function Ug(a){return a&&a.length?qe(a):[]}function Vg(a,b){return a&&a.length?qe(a,yf(b,2)):[]}function Wg(a,b){return b="function"==typeof b?b:ca,a&&a.length?qe(a,ca,b):[]}function Xg(a){if(!a||!a.length)return[];var b=0;return a=k(a,function(a){return Yh(a)?(b=Wk(a.length,b),!0):void 0}),F(b,function(b){return n(a,A(b))})}function Yg(a,b){if(!a||!a.length)return[];var c=Xg(a);return null==b?c:n(c,function(a){return f(b,ca,a)})}function Zg(a,b){return we(a||[],b||[],Ec)}function $g(a,b){return we(a||[],b||[],he)}function _g(a){var c=b(a);return c.__chain__=!0,c}function ah(a,b){return b(a),a}function bh(a,b){return b(a)}function ch(){return _g(this)}function dh(){return new s(this.value(),this.__chain__)}function eh(){this.__values__===ca&&(this.__values__=xi(this.value()));var a=this.__index__>=this.__values__.length,b=a?ca:this.__values__[this.__index__++];return{done:a,value:b}}function fh(){return this}function gh(a){for(var b,d=this;d instanceof c;){var e=fg(d);e.__index__=0,e.__values__=ca,b?f.__wrapped__=e:b=e;var f=e;d=d.__wrapped__}return f.__wrapped__=a,b}function hh(){var a=this.__wrapped__;if(a instanceof B){var b=a;return this.__actions__.length&&(b=new B(this)),b=b.reverse(),b.__actions__.push({func:bh,args:[Fg],thisArg:ca}),new s(b,this.__chain__)}return this.thru(Fg)}function ih(){return ue(this.__wrapped__,this.__actions__)}function jh(a,b,c){var d=tm(a)?j:Tc;return c&&Mf(a,b,c)&&(b=ca),d(a,yf(b,3))}function kh(a,b){var c=tm(a)?k:$c;return c(a,yf(b,3))}function lh(a,b){return _c(rh(a,b),1)}function mh(a,b){return _c(rh(a,b),Ga)}function nh(a,b,c){return c=c===ca?1:zi(c),_c(rh(a,b),c)}function oh(a,b){var c=tm(a)?h:rl;return c(a,yf(b,3))}function ph(a,b){var c=tm(a)?i:sl;return c(a,yf(b,3))}function qh(a,b,c,d){a=Xh(a)?a:cj(a),c=c&&!d?zi(c):0;var e=a.length;return 0>c&&(c=Wk(e+c,0)),si(a)?e>=c&&a.indexOf(b,c)>-1:!!e&&w(a,b,c)>-1}function rh(a,b){var c=tm(a)?n:Rd;return c(a,yf(b,3))}function sh(a,b,c,d){return null==a?[]:(tm(b)||(b=null==b?[]:[b]),c=d?ca:c,tm(c)||(c=null==c?[]:[c]),Xd(a,b,c))}function th(a,b,c){var d=tm(a)?p:C,e=arguments.length<3;return d(a,yf(b,4),c,e,rl)}function uh(a,b,c){var d=tm(a)?q:C,e=arguments.length<3;return d(a,yf(b,4),c,e,sl)}function vh(a,b){var c=tm(a)?k:$c;return c(a,Jh(yf(b,3)))}function wh(a){var b=tm(a)?Ac:fe;return b(a)}function xh(a,b,c){b=(c?Mf(a,b,c):b===ca)?1:zi(b);var d=tm(a)?Bc:ge;return d(a,b)}function yh(a){var b=tm(a)?Cc:ie;
+return b(a)}function zh(a){if(null==a)return 0;if(Xh(a))return si(a)?Z(a):a.length;var b=Dl(a);return b==Xa||b==cb?a.size:Od(a).length}function Ah(a,b,c){var d=tm(a)?r:ke;return c&&Mf(a,b,c)&&(b=ca),d(a,yf(b,3))}function Bh(a,b){if("function"!=typeof b)throw new nk(ga);return a=zi(a),function(){return--a<1?b.apply(this,arguments):void 0}}function Ch(a,b,c){return b=c?ca:b,b=a&&null==b?a.length:b,mf(a,wa,ca,ca,ca,ca,b)}function Dh(a,b){var c;if("function"!=typeof b)throw new nk(ga);return a=zi(a),function(){return--a>0&&(c=b.apply(this,arguments)),1>=a&&(b=ca),c}}function Eh(a,b,c){b=c?ca:b;var d=mf(a,sa,ca,ca,ca,ca,ca,b);return d.placeholder=Eh.placeholder,d}function Fh(a,b,c){b=c?ca:b;var d=mf(a,ta,ca,ca,ca,ca,ca,b);return d.placeholder=Fh.placeholder,d}function Gh(a,b,c){function d(b){var c=m,d=n;return m=n=ca,s=b,p=a.apply(d,c)}function e(a){return s=a,q=Gl(h,b),t?d(a):p}function f(a){var c=a-r,d=a-s,e=b-c;return u?Xk(e,o-d):e}function g(a){var c=a-r,d=a-s;return r===ca||c>=b||0>c||u&&d>=o}function h(){var a=hm();return g(a)?i(a):void(q=Gl(h,f(a)))}function i(a){return q=ca,v&&m?d(a):(m=n=ca,p)}function j(){q!==ca&&yl(q),s=0,m=r=n=q=ca}function k(){return q===ca?p:i(hm())}function l(){var a=hm(),c=g(a);if(m=arguments,n=this,r=a,c){if(q===ca)return e(r);if(u)return q=Gl(h,b),d(r)}return q===ca&&(q=Gl(h,b)),p}var m,n,o,p,q,r,s=0,t=!1,u=!1,v=!0;if("function"!=typeof a)throw new nk(ga);return b=Bi(b)||0,hi(c)&&(t=!!c.leading,u="maxWait"in c,o=u?Wk(Bi(c.maxWait)||0,b):o,v="trailing"in c?!!c.trailing:v),l.cancel=j,l.flush=k,l}function Hh(a){return mf(a,ya)}function Ih(a,b){if("function"!=typeof a||null!=b&&"function"!=typeof b)throw new nk(ga);var c=function(){var d=arguments,e=b?b.apply(this,d):d[0],f=c.cache;if(f.has(e))return f.get(e);var g=a.apply(this,d);return c.cache=f.set(e,g)||f,g};return c.cache=new(Ih.Cache||kc),c}function Jh(a){if("function"!=typeof a)throw new nk(ga);return function(){var b=arguments;switch(b.length){case 0:return!a.call(this);case 1:return!a.call(this,b[0]);case 2:return!a.call(this,b[0],b[1]);case 3:return!a.call(this,b[0],b[1],b[2])}return!a.apply(this,b)}}function Kh(a){return Dh(2,a)}function Lh(a,b){if("function"!=typeof a)throw new nk(ga);return b=b===ca?b:zi(b),ee(a,b)}function Mh(a,b){if("function"!=typeof a)throw new nk(ga);return b=null==b?0:Wk(zi(b),0),ee(function(c){var d=c[b],e=Ae(c,0,b);return d&&o(e,d),f(a,this,e)})}function Nh(a,b,c){var d=!0,e=!0;if("function"!=typeof a)throw new nk(ga);return hi(c)&&(d="leading"in c?!!c.leading:d,e="trailing"in c?!!c.trailing:e),Gh(a,b,{leading:d,maxWait:b,trailing:e})}function Oh(a){return Ch(a,1)}function Ph(a,b){return nm(ye(b),a)}function Qh(){if(!arguments.length)return[];var a=arguments[0];return tm(a)?a:[a]}function Rh(a){return Mc(a,ma)}function Sh(a,b){return b="function"==typeof b?b:ca,Mc(a,ma,b)}function Th(a){return Mc(a,ka|ma)}function Uh(a,b){return b="function"==typeof b?b:ca,Mc(a,ka|ma,b)}function Vh(a,b){return null==b||Qc(a,b,Ri(b))}function Wh(a,b){return a===b||a!==a&&b!==b}function Xh(a){return null!=a&&gi(a.length)&&!ei(a)}function Yh(a){return ii(a)&&Xh(a)}function Zh(a){return a===!0||a===!1||ii(a)&&jd(a)==Ra}function $h(a){return ii(a)&&1===a.nodeType&&!qi(a)}function _h(a){if(null==a)return!0;if(Xh(a)&&(tm(a)||"string"==typeof a||"function"==typeof a.splice||vm(a)||Am(a)||sm(a)))return!a.length;var b=Dl(a);if(b==Xa||b==cb)return!a.size;if(Rf(a))return!Od(a).length;for(var c in a)if(tk.call(a,c))return!1;return!0}function ai(a,b){return Fd(a,b)}function bi(a,b,c){c="function"==typeof c?c:ca;var d=c?c(a,b):ca;return d===ca?Fd(a,b,ca,c):!!d}function ci(a){if(!ii(a))return!1;var b=jd(a);return b==Ua||b==Ta||"string"==typeof a.message&&"string"==typeof a.name&&!qi(a)}function di(a){return"number"==typeof a&&Tk(a)}function ei(a){if(!hi(a))return!1;var b=jd(a);return b==Va||b==Wa||b==Qa||b==ab}function fi(a){return"number"==typeof a&&a==zi(a)}function gi(a){return"number"==typeof a&&a>-1&&a%1==0&&Ha>=a}function hi(a){var b=typeof a;return null!=a&&("object"==b||"function"==b)}function ii(a){return null!=a&&"object"==typeof a}function ji(a,b){return a===b||Id(a,b,Af(b))}function ki(a,b,c){return c="function"==typeof c?c:ca,Id(a,b,Af(b),c)}function li(a){return pi(a)&&a!=+a}function mi(a){if(El(a))throw new hk(fa);return Jd(a)}function ni(a){return null===a}function oi(a){return null==a}function pi(a){return"number"==typeof a||ii(a)&&jd(a)==Ya}function qi(a){if(!ii(a)||jd(a)!=$a)return!1;var b=Ek(a);if(null===b)return!0;var c=tk.call(b,"constructor")&&b.constructor;return"function"==typeof c&&c instanceof c&&sk.call(c)==xk}function ri(a){return fi(a)&&a>=-Ha&&Ha>=a}function si(a){return"string"==typeof a||!tm(a)&&ii(a)&&jd(a)==db}function ti(a){return"symbol"==typeof a||ii(a)&&jd(a)==eb}function ui(a){return a===ca}function vi(a){return ii(a)&&Dl(a)==gb}function wi(a){return ii(a)&&jd(a)==hb}function xi(a){if(!a)return[];if(Xh(a))return si(a)?$(a):Ne(a);if(Jk&&a[Jk])return R(a[Jk]());var b=Dl(a),c=b==Xa?S:b==cb?V:cj;return c(a)}function yi(a){if(!a)return 0===a?a:0;if(a=Bi(a),a===Ga||a===-Ga){var b=0>a?-1:1;return b*Ia}return a===a?a:0}function zi(a){var b=yi(a),c=b%1;return b===b?c?b-c:b:0}function Ai(a){return a?Lc(zi(a),0,Ka):0}function Bi(a){if("number"==typeof a)return a;if(ti(a))return Ja;if(hi(a)){var b="function"==typeof a.valueOf?a.valueOf():a;a=hi(b)?b+"":b}if("string"!=typeof a)return 0===a?a:+a;a=a.replace(Jb,"");var c=Ub.test(a);return c||Wb.test(a)?bd(a.slice(2),c?2:8):Tb.test(a)?Ja:+a}function Ci(a){return Oe(a,Si(a))}function Di(a){return a?Lc(zi(a),-Ha,Ha):0===a?a:0}function Ei(a){return null==a?"":pe(a)}function Fi(a,b){var c=ql(a);return null==b?c:Hc(c,b)}function Gi(a,b){return u(a,yf(b,3),cd)}function Hi(a,b){return u(a,yf(b,3),dd)}function Ii(a,b){return null==a?a:tl(a,yf(b,3),Si)}function Ji(a,b){return null==a?a:ul(a,yf(b,3),Si)}function Ki(a,b){return a&&cd(a,yf(b,3))}function Li(a,b){return a&&dd(a,yf(b,3))}function Mi(a){return null==a?[]:fd(a,Ri(a))}function Ni(a){return null==a?[]:fd(a,Si(a))}function Oi(a,b,c){var d=null==a?ca:gd(a,b);return d===ca?c:d}function Pi(a,b){return null!=a&&Ff(a,b,ud)}function Qi(a,b){return null!=a&&Ff(a,b,xd)}function Ri(a){return Xh(a)?zc(a):Od(a)}function Si(a){return Xh(a)?zc(a,!0):Pd(a)}function Ti(a,b){var c={};return b=yf(b,3),cd(a,function(a,d,e){Jc(c,b(a,d,e),a)}),c}function Ui(a,b){var c={};return b=yf(b,3),cd(a,function(a,d,e){Jc(c,d,b(a,d,e))}),c}function Vi(a,b){return Wi(a,Jh(yf(b)))}function Wi(a,b){if(null==a)return{};var c=n(vf(a),function(a){return[a]});return b=yf(b),Zd(a,c,function(a,c){return b(a,c[0])})}function Xi(a,b,c){b=ze(b,a);var d=-1,e=b.length;for(e||(e=1,a=ca);++d<e;){var f=null==a?ca:a[cg(b[d])];f===ca&&(d=e,f=c),a=ei(f)?f.call(a):f}return a}function Yi(a,b,c){return null==a?a:he(a,b,c)}function Zi(a,b,c,d){return d="function"==typeof d?d:ca,null==a?a:he(a,b,c,d)}function $i(a,b,c){var d=tm(a),e=d||vm(a)||Am(a);if(b=yf(b,4),null==c){var f=a&&a.constructor;c=e?d?new f:[]:hi(a)&&ei(f)?ql(Ek(a)):{}}return(e?h:cd)(a,function(a,d,e){return b(c,a,d,e)}),c}function _i(a,b){return null==a?!0:re(a,b)}function aj(a,b,c){return null==a?a:se(a,b,ye(c))}function bj(a,b,c,d){return d="function"==typeof d?d:ca,null==a?a:se(a,b,ye(c),d)}function cj(a){return null==a?[]:I(a,Ri(a))}function dj(a){return null==a?[]:I(a,Si(a))}function ej(a,b,c){return c===ca&&(c=b,b=ca),c!==ca&&(c=Bi(c),c=c===c?c:0),b!==ca&&(b=Bi(b),b=b===b?b:0),Lc(Bi(a),b,c)}function fj(a,b,c){return b=yi(b),c===ca?(c=b,b=0):c=yi(c),a=Bi(a),yd(a,b,c)}function gj(a,b,c){if(c&&"boolean"!=typeof c&&Mf(a,b,c)&&(b=c=ca),c===ca&&("boolean"==typeof b?(c=b,b=ca):"boolean"==typeof a&&(c=a,a=ca)),a===ca&&b===ca?(a=0,b=1):(a=yi(a),b===ca?(b=a,a=0):b=yi(b)),a>b){var d=a;a=b,b=d}if(c||a%1||b%1){var e=$k();return Xk(a+e*(b-a+ad("1e-"+((e+"").length-1))),b)}return be(a,b)}function hj(a){return $m(Ei(a).toLowerCase())}function ij(a){return a=Ei(a),a&&a.replace(Yb,rd).replace(Pc,"")}function jj(a,b,c){a=Ei(a),b=pe(b);var d=a.length;c=c===ca?d:Lc(zi(c),0,d);var e=c;return c-=b.length,c>=0&&a.slice(c,e)==b}function kj(a){return a=Ei(a),a&&zb.test(a)?a.replace(xb,sd):a}function lj(a){return a=Ei(a),a&&Ib.test(a)?a.replace(Hb,"\\$&"):a}function mj(a,b,c){a=Ei(a),b=zi(b);var d=b?Z(a):0;if(!b||d>=b)return a;var e=(b-d)/2;return ef(Qk(e),c)+a+ef(Pk(e),c)}function nj(a,b,c){a=Ei(a),b=zi(b);var d=b?Z(a):0;return b&&b>d?a+ef(b-d,c):a}function oj(a,b,c){a=Ei(a),b=zi(b);var d=b?Z(a):0;return b&&b>d?ef(b-d,c)+a:a}function pj(a,b,c){return c||null==b?b=0:b&&(b=+b),Zk(Ei(a).replace(Kb,""),b||0)}function qj(a,b,c){return b=(c?Mf(a,b,c):b===ca)?1:zi(b),de(Ei(a),b)}function rj(){var a=arguments,b=Ei(a[0]);return a.length<3?b:b.replace(a[1],a[2])}function sj(a,b,c){return c&&"number"!=typeof c&&Mf(a,b,c)&&(b=c=ca),(c=c===ca?Ka:c>>>0)?(a=Ei(a),a&&("string"==typeof b||null!=b&&!ym(b))&&(b=pe(b),!b&&P(a))?Ae($(a),0,c):a.split(b,c)):[]}function tj(a,b,c){return a=Ei(a),c=null==c?0:Lc(zi(c),0,a.length),b=pe(b),a.slice(c,c+b.length)==b}function uj(a,c,d){var e=b.templateSettings;d&&Mf(a,c,d)&&(c=ca),a=Ei(a),c=Fm({},c,e,nf);var f,g,h=Fm({},c.imports,e.imports,nf),i=Ri(h),j=I(h,i),k=0,l=c.interpolate||Zb,m="__p += '",n=lk((c.escape||Zb).source+"|"+l.source+"|"+(l===Cb?Rb:Zb).source+"|"+(c.evaluate||Zb).source+"|$","g"),o="//# sourceURL="+("sourceURL"in c?c.sourceURL:"lodash.templateSources["+ ++Vc+"]")+"\n";a.replace(n,function(b,c,d,e,h,i){return d||(d=e),m+=a.slice(k,i).replace($b,N),c&&(f=!0,m+="' +\n__e("+c+") +\n'"),h&&(g=!0,m+="';\n"+h+";\n__p += '"),d&&(m+="' +\n((__t = ("+d+")) == null ? '' : __t) +\n'"),k=i+b.length,b}),m+="';\n";var p=c.variable;p||(m="with (obj) {\n"+m+"\n}\n"),m=(g?m.replace(tb,""):m).replace(ub,"$1").replace(vb,"$1;"),m="function("+(p||"obj")+") {\n"+(p?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(f?", __e = _.escape":"")+(g?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+m+"return __p\n}";var q=_m(function(){return ik(i,o+"return "+m).apply(ca,j)});if(q.source=m,ci(q))throw q;return q}function vj(a){return Ei(a).toLowerCase()}function wj(a){return Ei(a).toUpperCase()}function xj(a,b,c){if(a=Ei(a),a&&(c||b===ca))return a.replace(Jb,"");if(!a||!(b=pe(b)))return a;var d=$(a),e=$(b),f=K(d,e),g=L(d,e)+1;return Ae(d,f,g).join("")}function yj(a,b,c){if(a=Ei(a),a&&(c||b===ca))return a.replace(Lb,"");if(!a||!(b=pe(b)))return a;var d=$(a),e=L(d,$(b))+1;return Ae(d,0,e).join("")}function zj(a,b,c){if(a=Ei(a),a&&(c||b===ca))return a.replace(Kb,"");if(!a||!(b=pe(b)))return a;var d=$(a),e=K(d,$(b));return Ae(d,e).join("")}function Aj(a,b){var c=za,d=Aa;if(hi(b)){var e="separator"in b?b.separator:e;c="length"in b?zi(b.length):c,d="omission"in b?pe(b.omission):d}a=Ei(a);var f=a.length;if(P(a)){var g=$(a);f=g.length}if(c>=f)return a;var h=c-Z(d);if(1>h)return d;var i=g?Ae(g,0,h).join(""):a.slice(0,h);if(e===ca)return i+d;if(g&&(h+=i.length-h),ym(e)){if(a.slice(h).search(e)){var j,k=i;for(e.global||(e=lk(e.source,Ei(Sb.exec(e))+"g")),e.lastIndex=0;j=e.exec(k);)var l=j.index;i=i.slice(0,l===ca?h:l)}}else if(a.indexOf(pe(e),h)!=h){var m=i.lastIndexOf(e);m>-1&&(i=i.slice(0,m))}return i+d}function Bj(a){return a=Ei(a),a&&yb.test(a)?a.replace(wb,td):a}function Cj(a,b,c){return a=Ei(a),b=c?ca:b,b===ca?Q(a)?ba(a):t(a):a.match(b)||[]}function Dj(a){var b=null==a?0:a.length,c=yf();return a=b?n(a,function(a){if("function"!=typeof a[1])throw new nk(ga);return[c(a[0]),a[1]]}):[],ee(function(c){for(var d=-1;++d<b;){var e=a[d];if(f(e[0],this,c))return f(e[1],this,c)}})}function Ej(a){return Nc(Mc(a,ka))}function Fj(a){return function(){return a}}function Gj(a,b){return null==a||a!==a?b:a}function Hj(a){return a}function Ij(a){return Nd("function"==typeof a?a:Mc(a,ka))}function Jj(a){return Sd(Mc(a,ka))}function Kj(a,b){return Td(a,Mc(b,ka))}function Lj(a,b,c){var d=Ri(b),e=fd(b,d);null!=c||hi(b)&&(e.length||!d.length)||(c=b,b=a,a=this,e=fd(b,Ri(b)));var f=!(hi(c)&&"chain"in c&&!c.chain),g=ei(a);return h(e,function(c){var d=b[c];a[c]=d,g&&(a.prototype[c]=function(){var b=this.__chain__;if(f||b){var c=a(this.__wrapped__),e=c.__actions__=Ne(this.__actions__);return e.push({func:d,args:arguments,thisArg:a}),c.__chain__=b,c}return d.apply(a,o([this.value()],arguments))})}),a}function Mj(){return ed._===this&&(ed._=yk),this}function Nj(){}function Oj(a){return a=zi(a),ee(function(b){return Wd(b,a)})}function Pj(a){return Nf(a)?A(cg(a)):$d(a)}function Qj(a){return function(b){return null==a?ca:gd(a,b)}}function Rj(){return[]}function Sj(){return!1}function Tj(){return{}}function Uj(){return""}function Vj(){return!0}function Wj(a,b){if(a=zi(a),1>a||a>Ha)return[];var c=Ka,d=Xk(a,Ka);b=yf(b),a-=Ka;for(var e=F(d,b);++c<a;)b(c);return e}function Xj(a){return tm(a)?n(a,cg):ti(a)?[a]:Ne(Il(Ei(a)))}function Yj(a){var b=++uk;return Ei(a)+b}function Zj(a){return a&&a.length?Yc(a,Hj,qd):ca}function $j(a,b){return a&&a.length?Yc(a,yf(b,2),qd):ca}function _j(a){return z(a,Hj)}function ak(a,b){return z(a,yf(b,2))}function bk(a){return a&&a.length?Yc(a,Hj,Qd):ca}function ck(a,b){return a&&a.length?Yc(a,yf(b,2),Qd):ca}function dk(a){return a&&a.length?E(a,Hj):0}function ek(a,b){return a&&a.length?E(a,yf(b,2)):0}a=null==a?ed:vd.defaults(ed.Object(),a,vd.pick(ed,Uc));var fk=a.Array,gk=a.Date,hk=a.Error,ik=a.Function,jk=a.Math,kk=a.Object,lk=a.RegExp,mk=a.String,nk=a.TypeError,ok=fk.prototype,pk=ik.prototype,qk=kk.prototype,rk=a["__core-js_shared__"],sk=pk.toString,tk=qk.hasOwnProperty,uk=0,vk=function(){var a=/[^.]+$/.exec(rk&&rk.keys&&rk.keys.IE_PROTO||"");return a?"Symbol(src)_1."+a:""}(),wk=qk.toString,xk=sk.call(kk),yk=ed._,zk=lk("^"+sk.call(tk).replace(Hb,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Ak=hd?a.Buffer:ca,Bk=a.Symbol,Ck=a.Uint8Array,Dk=Ak?Ak.allocUnsafe:ca,Ek=T(kk.getPrototypeOf,kk),Fk=kk.create,Gk=qk.propertyIsEnumerable,Hk=ok.splice,Ik=Bk?Bk.isConcatSpreadable:ca,Jk=Bk?Bk.iterator:ca,Kk=Bk?Bk.toStringTag:ca,Lk=function(){try{var a=Bf(kk,"defineProperty");return a({},"",{}),a}catch(b){}}(),Mk=a.clearTimeout!==ed.clearTimeout&&a.clearTimeout,Nk=gk&&gk.now!==ed.Date.now&&gk.now,Ok=a.setTimeout!==ed.setTimeout&&a.setTimeout,Pk=jk.ceil,Qk=jk.floor,Rk=kk.getOwnPropertySymbols,Sk=Ak?Ak.isBuffer:ca,Tk=a.isFinite,Uk=ok.join,Vk=T(kk.keys,kk),Wk=jk.max,Xk=jk.min,Yk=gk.now,Zk=a.parseInt,$k=jk.random,_k=ok.reverse,al=Bf(a,"DataView"),bl=Bf(a,"Map"),cl=Bf(a,"Promise"),dl=Bf(a,"Set"),el=Bf(a,"WeakMap"),fl=Bf(kk,"create"),gl=el&&new el,hl={},il=dg(al),jl=dg(bl),kl=dg(cl),ll=dg(dl),ml=dg(el),nl=Bk?Bk.prototype:ca,ol=nl?nl.valueOf:ca,pl=nl?nl.toString:ca,ql=function(){function a(){}return function(b){if(!hi(b))return{};if(Fk)return Fk(b);a.prototype=b;var c=new a;return a.prototype=ca,c}}();b.templateSettings={escape:Ab,evaluate:Bb,interpolate:Cb,variable:"",imports:{_:b}},b.prototype=c.prototype,b.prototype.constructor=b,s.prototype=ql(c.prototype),s.prototype.constructor=s,B.prototype=ql(c.prototype),B.prototype.constructor=B,Pb.prototype.clear=_b,Pb.prototype["delete"]=ac,Pb.prototype.get=bc,Pb.prototype.has=cc,Pb.prototype.set=dc,ec.prototype.clear=fc,ec.prototype["delete"]=gc,ec.prototype.get=hc,ec.prototype.has=ic,ec.prototype.set=jc,kc.prototype.clear=lc,kc.prototype["delete"]=mc,kc.prototype.get=nc,kc.prototype.has=oc,kc.prototype.set=pc,qc.prototype.add=qc.prototype.push=rc,qc.prototype.has=sc,tc.prototype.clear=uc,tc.prototype["delete"]=vc,tc.prototype.get=wc,tc.prototype.has=xc,tc.prototype.set=yc;var rl=Te(cd),sl=Te(dd,!0),tl=Ue(),ul=Ue(!0),vl=gl?function(a,b){return gl.set(a,b),a}:Hj,wl=Lk?function(a,b){return Lk(a,"toString",{configurable:!0,enumerable:!1,value:Fj(b),writable:!0})}:Hj,xl=ee,yl=Mk||function(a){return ed.clearTimeout(a)},zl=dl&&1/V(new dl([,-0]))[1]==Ga?function(a){return new dl(a)}:Nj,Al=gl?function(a){return gl.get(a)}:Nj,Bl=Rk?function(a){return null==a?[]:(a=kk(a),k(Rk(a),function(b){return Gk.call(a,b)}))}:Rj,Cl=Rk?function(a){for(var b=[];a;)o(b,Bl(a)),a=Ek(a);return b}:Rj,Dl=jd;(al&&Dl(new al(new ArrayBuffer(1)))!=jb||bl&&Dl(new bl)!=Xa||cl&&Dl(cl.resolve())!=_a||dl&&Dl(new dl)!=cb||el&&Dl(new el)!=gb)&&(Dl=function(a){var b=jd(a),c=b==$a?a.constructor:ca,d=c?dg(c):"";if(d)switch(d){case il:return jb;case jl:return Xa;case kl:return _a;case ll:return cb;case ml:return gb}return b});var El=rk?ei:Sj,Fl=ag(vl),Gl=Ok||function(a,b){return ed.setTimeout(a,b)},Hl=ag(wl),Il=Uf(function(a){var b=[];return Fb.test(a)&&b.push(""),a.replace(Gb,function(a,c,d,e){b.push(d?e.replace(Qb,"$1"):c||a)}),b}),Jl=ee(function(a,b){return Yh(a)?Sc(a,_c(b,1,Yh,!0)):[]}),Kl=ee(function(a,b){var c=yg(b);return Yh(c)&&(c=ca),Yh(a)?Sc(a,_c(b,1,Yh,!0),yf(c,2)):[]}),Ll=ee(function(a,b){var c=yg(b);return Yh(c)&&(c=ca),Yh(a)?Sc(a,_c(b,1,Yh,!0),ca,c):[]}),Ml=ee(function(a){var b=n(a,xe);return b.length&&b[0]===a[0]?zd(b):[]}),Nl=ee(function(a){var b=yg(a),c=n(a,xe);return b===yg(c)?b=ca:c.pop(),c.length&&c[0]===a[0]?zd(c,yf(b,2)):[]}),Ol=ee(function(a){var b=yg(a),c=n(a,xe);return b="function"==typeof b?b:ca,b&&c.pop(),c.length&&c[0]===a[0]?zd(c,ca,b):[]}),Pl=ee(Bg),Ql=tf(function(a,b){var c=null==a?0:a.length,d=Kc(a,b);return ae(a,n(b,function(a){return Lf(a,c)?+a:a}).sort(Je)),d}),Rl=ee(function(a){return qe(_c(a,1,Yh,!0))}),Sl=ee(function(a){var b=yg(a);return Yh(b)&&(b=ca),qe(_c(a,1,Yh,!0),yf(b,2))}),Tl=ee(function(a){var b=yg(a);return b="function"==typeof b?b:ca,qe(_c(a,1,Yh,!0),ca,b)}),Ul=ee(function(a,b){return Yh(a)?Sc(a,b):[]}),Vl=ee(function(a){return ve(k(a,Yh))}),Wl=ee(function(a){var b=yg(a);return Yh(b)&&(b=ca),ve(k(a,Yh),yf(b,2))}),Xl=ee(function(a){var b=yg(a);return b="function"==typeof b?b:ca,ve(k(a,Yh),ca,b)}),Yl=ee(Xg),Zl=ee(function(a){var b=a.length,c=b>1?a[b-1]:ca;return c="function"==typeof c?(a.pop(),c):ca,Yg(a,c)}),$l=tf(function(a){var b=a.length,c=b?a[0]:0,d=this.__wrapped__,e=function(b){return Kc(b,a)};return!(b>1||this.__actions__.length)&&d instanceof B&&Lf(c)?(d=d.slice(c,+c+(b?1:0)),d.__actions__.push({func:bh,args:[e],thisArg:ca}),new s(d,this.__chain__).thru(function(a){return b&&!a.length&&a.push(ca),a})):this.thru(e)}),_l=Re(function(a,b,c){tk.call(a,c)?++a[c]:Jc(a,c,1)}),am=$e(og),bm=$e(pg),cm=Re(function(a,b,c){tk.call(a,c)?a[c].push(b):Jc(a,c,[b])}),dm=ee(function(a,b,c){var d=-1,e="function"==typeof b,g=Xh(a)?fk(a.length):[];return rl(a,function(a){g[++d]=e?f(b,a,c):Bd(a,b,c)}),g}),em=Re(function(a,b,c){Jc(a,c,b)}),fm=Re(function(a,b,c){a[c?0:1].push(b)},function(){return[[],[]]}),gm=ee(function(a,b){if(null==a)return[];var c=b.length;return c>1&&Mf(a,b[0],b[1])?b=[]:c>2&&Mf(b[0],b[1],b[2])&&(b=[b[0]]),Xd(a,_c(b,1),[])}),hm=Nk||function(){return ed.Date.now()},im=ee(function(a,b,c){var d=pa;if(c.length){var e=U(c,xf(im));d|=ua}return mf(a,d,b,c,e)}),jm=ee(function(a,b,c){var d=pa|qa;if(c.length){var e=U(c,xf(jm));d|=ua}return mf(b,d,a,c,e)}),km=ee(function(a,b){return Rc(a,1,b)}),lm=ee(function(a,b,c){return Rc(a,Bi(b)||0,c)});Ih.Cache=kc;var mm=xl(function(a,b){b=1==b.length&&tm(b[0])?n(b[0],H(yf())):n(_c(b,1),H(yf()));var c=b.length;return ee(function(d){for(var e=-1,g=Xk(d.length,c);++e<g;)d[e]=b[e].call(this,d[e]);return f(a,this,d)})}),nm=ee(function(a,b){var c=U(b,xf(nm));return mf(a,ua,ca,b,c)}),om=ee(function(a,b){var c=U(b,xf(om));return mf(a,va,ca,b,c)}),pm=tf(function(a,b){return mf(a,xa,ca,ca,ca,b)}),qm=hf(qd),rm=hf(function(a,b){return a>=b}),sm=Cd(function(){return arguments}())?Cd:function(a){return ii(a)&&tk.call(a,"callee")&&!Gk.call(a,"callee")},tm=fk.isArray,um=kd?H(kd):Dd,vm=Sk||Sj,wm=ld?H(ld):Ed,xm=md?H(md):Hd,ym=nd?H(nd):Kd,zm=od?H(od):Ld,Am=pd?H(pd):Md,Bm=hf(Qd),Cm=hf(function(a,b){return b>=a}),Dm=Se(function(a,b){if(Rf(b)||Xh(b))return void Oe(b,Ri(b),a);for(var c in b)tk.call(b,c)&&Ec(a,c,b[c])}),Em=Se(function(a,b){Oe(b,Si(b),a)}),Fm=Se(function(a,b,c,d){Oe(b,Si(b),a,d)}),Gm=Se(function(a,b,c,d){Oe(b,Ri(b),a,d)}),Hm=tf(Kc),Im=ee(function(a){return a.push(ca,nf),f(Fm,ca,a)}),Jm=ee(function(a){return a.push(ca,of),f(Om,ca,a)}),Km=bf(function(a,b,c){a[b]=c},Fj(Hj)),Lm=bf(function(a,b,c){tk.call(a,b)?a[b].push(c):a[b]=[c]},yf),Mm=ee(Bd),Nm=Se(function(a,b,c){Ud(a,b,c)}),Om=Se(function(a,b,c,d){Ud(a,b,c,d)}),Pm=tf(function(a,b){var c={};if(null==a)return c;var d=!1;b=n(b,function(b){return b=ze(b,a),d||(d=b.length>1),b}),Oe(a,vf(a),c),d&&(c=Mc(c,ka|la|ma,pf));for(var e=b.length;e--;)re(c,b[e]);return c}),Qm=tf(function(a,b){return null==a?{}:Yd(a,b)}),Rm=lf(Ri),Sm=lf(Si),Tm=Xe(function(a,b,c){return b=b.toLowerCase(),a+(c?hj(b):b)}),Um=Xe(function(a,b,c){return a+(c?"-":"")+b.toLowerCase()}),Vm=Xe(function(a,b,c){return a+(c?" ":"")+b.toLowerCase()}),Wm=We("toLowerCase"),Xm=Xe(function(a,b,c){return a+(c?"_":"")+b.toLowerCase()}),Ym=Xe(function(a,b,c){return a+(c?" ":"")+$m(b)}),Zm=Xe(function(a,b,c){return a+(c?" ":"")+b.toUpperCase()}),$m=We("toUpperCase"),_m=ee(function(a,b){try{return f(a,ca,b)}catch(c){return ci(c)?c:new hk(c)}}),an=tf(function(a,b){return h(b,function(b){b=cg(b),Jc(a,b,im(a[b],a))}),a}),bn=_e(),cn=_e(!0),dn=ee(function(a,b){return function(c){return Bd(c,a,b)}}),en=ee(function(a,b){return function(c){return Bd(a,c,b)}}),fn=df(n),gn=df(j),hn=df(r),jn=gf(),kn=gf(!0),ln=cf(function(a,b){return a+b},0),mn=kf("ceil"),nn=cf(function(a,b){return a/b},1),on=kf("floor"),pn=cf(function(a,b){return a*b},1),qn=kf("round"),rn=cf(function(a,b){return a-b},0);return b.after=Bh,b.ary=Ch,b.assign=Dm,b.assignIn=Em,b.assignInWith=Fm,b.assignWith=Gm,b.at=Hm,b.before=Dh,b.bind=im,b.bindAll=an,b.bindKey=jm,b.castArray=Qh,b.chain=_g,b.chunk=gg,b.compact=hg,b.concat=ig,b.cond=Dj,b.conforms=Ej,b.constant=Fj,b.countBy=_l,b.create=Fi,b.curry=Eh,b.curryRight=Fh,b.debounce=Gh,b.defaults=Im,b.defaultsDeep=Jm,b.defer=km,b.delay=lm,b.difference=Jl,b.differenceBy=Kl,b.differenceWith=Ll,b.drop=jg,b.dropRight=kg,b.dropRightWhile=lg,b.dropWhile=mg,b.fill=ng,b.filter=kh,b.flatMap=lh,b.flatMapDeep=mh,b.flatMapDepth=nh,b.flatten=qg,b.flattenDeep=rg,b.flattenDepth=sg,b.flip=Hh,b.flow=bn,b.flowRight=cn,b.fromPairs=tg,b.functions=Mi,b.functionsIn=Ni,b.groupBy=cm,b.initial=wg,b.intersection=Ml,b.intersectionBy=Nl,b.intersectionWith=Ol,b.invert=Km,b.invertBy=Lm,b.invokeMap=dm,b.iteratee=Ij,b.keyBy=em,b.keys=Ri,b.keysIn=Si,b.map=rh,b.mapKeys=Ti,b.mapValues=Ui,b.matches=Jj,b.matchesProperty=Kj,b.memoize=Ih,b.merge=Nm,b.mergeWith=Om,b.method=dn,b.methodOf=en,b.mixin=Lj,b.negate=Jh,b.nthArg=Oj,b.omit=Pm,b.omitBy=Vi,b.once=Kh,b.orderBy=sh,b.over=fn,b.overArgs=mm,b.overEvery=gn,b.overSome=hn,b.partial=nm,b.partialRight=om,b.partition=fm,b.pick=Qm,b.pickBy=Wi,b.property=Pj,b.propertyOf=Qj,b.pull=Pl,b.pullAll=Bg,b.pullAllBy=Cg,b.pullAllWith=Dg,b.pullAt=Ql,b.range=jn,b.rangeRight=kn,b.rearg=pm,b.reject=vh,b.remove=Eg,b.rest=Lh,b.reverse=Fg,b.sampleSize=xh,b.set=Yi,b.setWith=Zi,b.shuffle=yh,b.slice=Gg,b.sortBy=gm,b.sortedUniq=Ng,b.sortedUniqBy=Og,b.split=sj,b.spread=Mh,b.tail=Pg,b.take=Qg,b.takeRight=Rg,b.takeRightWhile=Sg,b.takeWhile=Tg,b.tap=ah,b.throttle=Nh,b.thru=bh,b.toArray=xi,b.toPairs=Rm,b.toPairsIn=Sm,b.toPath=Xj,b.toPlainObject=Ci,b.transform=$i,b.unary=Oh,b.union=Rl,b.unionBy=Sl,b.unionWith=Tl,b.uniq=Ug,b.uniqBy=Vg,b.uniqWith=Wg,b.unset=_i,b.unzip=Xg,b.unzipWith=Yg,b.update=aj,b.updateWith=bj,b.values=cj,b.valuesIn=dj,b.without=Ul,b.words=Cj,b.wrap=Ph,b.xor=Vl,b.xorBy=Wl,b.xorWith=Xl,b.zip=Yl,b.zipObject=Zg,b.zipObjectDeep=$g,b.zipWith=Zl,b.entries=Rm,b.entriesIn=Sm,b.extend=Em,b.extendWith=Fm,Lj(b,b),b.add=ln,b.attempt=_m,b.camelCase=Tm,b.capitalize=hj,b.ceil=mn,b.clamp=ej,b.clone=Rh,b.cloneDeep=Th,b.cloneDeepWith=Uh,b.cloneWith=Sh,b.conformsTo=Vh,b.deburr=ij,b.defaultTo=Gj,b.divide=nn,b.endsWith=jj,b.eq=Wh,b.escape=kj,b.escapeRegExp=lj,b.every=jh,b.find=am,b.findIndex=og,b.findKey=Gi,b.findLast=bm,b.findLastIndex=pg,b.findLastKey=Hi,b.floor=on,b.forEach=oh,b.forEachRight=ph,b.forIn=Ii,b.forInRight=Ji,b.forOwn=Ki,b.forOwnRight=Li,b.get=Oi,b.gt=qm,b.gte=rm,b.has=Pi,b.hasIn=Qi,b.head=ug,b.identity=Hj,b.includes=qh,b.indexOf=vg,b.inRange=fj,b.invoke=Mm,b.isArguments=sm,b.isArray=tm,b.isArrayBuffer=um,b.isArrayLike=Xh,b.isArrayLikeObject=Yh,b.isBoolean=Zh,b.isBuffer=vm,b.isDate=wm,b.isElement=$h,b.isEmpty=_h,b.isEqual=ai,b.isEqualWith=bi,b.isError=ci,b.isFinite=di,b.isFunction=ei,b.isInteger=fi,b.isLength=gi,b.isMap=xm,b.isMatch=ji,b.isMatchWith=ki,b.isNaN=li,b.isNative=mi,b.isNil=oi,b.isNull=ni,b.isNumber=pi,b.isObject=hi,b.isObjectLike=ii,b.isPlainObject=qi,b.isRegExp=ym,b.isSafeInteger=ri,b.isSet=zm,b.isString=si,b.isSymbol=ti,b.isTypedArray=Am,b.isUndefined=ui,b.isWeakMap=vi,b.isWeakSet=wi,b.join=xg,b.kebabCase=Um,b.last=yg,b.lastIndexOf=zg,b.lowerCase=Vm,b.lowerFirst=Wm,b.lt=Bm,b.lte=Cm,b.max=Zj,b.maxBy=$j,b.mean=_j,b.meanBy=ak,b.min=bk,b.minBy=ck,b.stubArray=Rj,b.stubFalse=Sj,b.stubObject=Tj,b.stubString=Uj,b.stubTrue=Vj,b.multiply=pn,b.nth=Ag,b.noConflict=Mj,b.noop=Nj,b.now=hm,b.pad=mj,b.padEnd=nj,b.padStart=oj,b.parseInt=pj,b.random=gj,b.reduce=th,b.reduceRight=uh,b.repeat=qj,b.replace=rj,b.result=Xi,b.round=qn,b.runInContext=wd,b.sample=wh,b.size=zh,b.snakeCase=Xm,b.some=Ah,b.sortedIndex=Hg,b.sortedIndexBy=Ig,b.sortedIndexOf=Jg,b.sortedLastIndex=Kg,b.sortedLastIndexBy=Lg,b.sortedLastIndexOf=Mg,b.startCase=Ym,b.startsWith=tj,b.subtract=rn,b.sum=dk,b.sumBy=ek,b.template=uj,b.times=Wj,b.toFinite=yi,b.toInteger=zi,b.toLength=Ai,b.toLower=vj,b.toNumber=Bi,b.toSafeInteger=Di,b.toString=Ei,b.toUpper=wj,b.trim=xj,b.trimEnd=yj,b.trimStart=zj,b.truncate=Aj,b.unescape=Bj,b.uniqueId=Yj,b.upperCase=Zm,b.upperFirst=$m,b.each=oh,b.eachRight=ph,b.first=ug,Lj(b,function(){var a={};return cd(b,function(c,d){tk.call(b.prototype,d)||(a[d]=c)}),a}(),{chain:!1}),b.VERSION=da,h(["bind","bindKey","curry","curryRight","partial","partialRight"],function(a){b[a].placeholder=b}),h(["drop","take"],function(a,b){B.prototype[a]=function(c){c=c===ca?1:Wk(zi(c),0);var d=this.__filtered__&&!b?new B(this):this.clone();return d.__filtered__?d.__takeCount__=Xk(c,d.__takeCount__):d.__views__.push({size:Xk(c,Ka),type:a+(d.__dir__<0?"Right":"")}),d},B.prototype[a+"Right"]=function(b){return this.reverse()[a](b).reverse()}}),h(["filter","map","takeWhile"],function(a,b){var c=b+1,d=c==Da||c==Fa;B.prototype[a]=function(a){var b=this.clone();return b.__iteratees__.push({iteratee:yf(a,3),type:c}),b.__filtered__=b.__filtered__||d,b}}),h(["head","last"],function(a,b){var c="take"+(b?"Right":"");B.prototype[a]=function(){return this[c](1).value()[0]}}),h(["initial","tail"],function(a,b){var c="drop"+(b?"":"Right");B.prototype[a]=function(){return this.__filtered__?new B(this):this[c](1)}}),B.prototype.compact=function(){return this.filter(Hj)},B.prototype.find=function(a){return this.filter(a).head()},B.prototype.findLast=function(a){return this.reverse().find(a)},B.prototype.invokeMap=ee(function(a,b){return"function"==typeof a?new B(this):this.map(function(c){return Bd(c,a,b)})}),B.prototype.reject=function(a){return this.filter(Jh(yf(a)))},B.prototype.slice=function(a,b){a=zi(a);var c=this;return c.__filtered__&&(a>0||0>b)?new B(c):(0>a?c=c.takeRight(-a):a&&(c=c.drop(a)),b!==ca&&(b=zi(b),c=0>b?c.dropRight(-b):c.take(b-a)),c)},B.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},B.prototype.toArray=function(){return this.take(Ka)},cd(B.prototype,function(a,c){var d=/^(?:filter|find|map|reject)|While$/.test(c),e=/^(?:head|last)$/.test(c),f=b[e?"take"+("last"==c?"Right":""):c],g=e||/^find/.test(c);f&&(b.prototype[c]=function(){var c=this.__wrapped__,h=e?[1]:arguments,i=c instanceof B,j=h[0],k=i||tm(c),l=function(a){var c=f.apply(b,o([a],h));return e&&m?c[0]:c};k&&d&&"function"==typeof j&&1!=j.length&&(i=k=!1);var m=this.__chain__,n=!!this.__actions__.length,p=g&&!m,q=i&&!n;if(!g&&k){c=q?c:new B(this);var r=a.apply(c,h);return r.__actions__.push({func:bh,args:[l],thisArg:ca}),new s(r,m)}return p&&q?a.apply(this,h):(r=this.thru(l),p?e?r.value()[0]:r.value():r)})}),h(["pop","push","shift","sort","splice","unshift"],function(a){var c=ok[a],d=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",e=/^(?:pop|shift)$/.test(a);b.prototype[a]=function(){var a=arguments;if(e&&!this.__chain__){var b=this.value();return c.apply(tm(b)?b:[],a)}return this[d](function(b){return c.apply(tm(b)?b:[],a)})}}),cd(B.prototype,function(a,c){var d=b[c];if(d){var e=d.name+"",f=hl[e]||(hl[e]=[]);f.push({name:c,func:d})}}),hl[af(ca,qa).name]=[{name:"wrapper",func:ca}],B.prototype.clone=X,B.prototype.reverse=_,B.prototype.value=aa,b.prototype.at=$l,b.prototype.chain=ch,b.prototype.commit=dh,b.prototype.next=eh,b.prototype.plant=gh,b.prototype.reverse=hh,b.prototype.toJSON=b.prototype.valueOf=b.prototype.value=ih,b.prototype.first=b.prototype.head,Jk&&(b.prototype[Jk]=fh),b},vd=ud();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(ed._=vd,define(function(){return vd})):gd?((gd.exports=vd)._=vd,fd._=vd):ed._=vd}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],130:[function(a,b,c){function d(a,b){if("function"!=typeof a||null!=b&&"function"!=typeof b)throw new TypeError(f);var c=function(){var d=arguments,e=b?b.apply(this,d):d[0],f=c.cache;if(f.has(e))return f.get(e);var g=a.apply(this,d);return c.cache=f.set(e,g)||f,g};return c.cache=new(d.Cache||e),c}var e=a("./_MapCache"),f="Expected a function";d.Cache=e,b.exports=d},{"./_MapCache":79}],131:[function(a,b,c){function d(a,b,c){return null==a?a:e(a,b,c)}var e=a("./_baseSet");b.exports=d},{"./_baseSet":87}],132:[function(a,b,c){function d(a){return null==a?"":e(a)}var e=a("./_baseToString");b.exports=d},{"./_baseToString":88}],133:[function(a,b,c){(function(c){"use strict";var d=a("is-utf8"),e=b.exports=function(a){return"string"==typeof a?a.replace(/^\ufeff/g,""):c.isBuffer(a)&&d(a)&&239===a[0]&&187===a[1]&&191===a[2]?a.slice(3):a};e.stream=function(){var b=a("first-chunk-stream");return b({minSize:3},function(a,b,c){this.push(e(a)),c()})}}).call(this,{isBuffer:a("../grunt-browserify/node_modules/browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js")})},{"../grunt-browserify/node_modules/browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js":39,"first-chunk-stream":30,"is-utf8":75}],134:[function(a,b,c){b.exports={name:"csvtojson",description:"A tool concentrating on converting csv data to JSON with customised parser supporting",author:"Keyang Xiang <keyang.xiang@gmail.com>",homepage:"https://github.com/Keyang/node-csvtojson",bugs:"https://github.com/Keyang/node-csvtojson/issues",repository:{type:"git",url:"https://github.com/Keyang/node-csvtojson.git"},contributors:[{name:"Daniel Cohen",email:"dcohenb@gmail.com",url:"https://github.com/dcohenb",contributions:1,additions:1,deletions:6,hireable:!0},{name:"Trang",email:"trangtungn@gmail.com",url:"https://github.com/trangtungn",contributions:1,additions:6,deletions:1,hireable:!0},{name:"Matthias Lienau",email:"matthias@mlienau.de",url:"https://github.com/atufkas",contributions:9,additions:74,deletions:45,hireable:null},{name:"Alec Fenichel",email:"alec.fenichel@gmail.com",url:"https://github.com/fenichelar",contributions:1,additions:1,deletions:1,hireable:!0},{name:"Blake Blackshear",email:null,url:"https://github.com/blakeblackshear",contributions:2,additions:8,deletions:8,hireable:null},{name:"Dimitri Kennedy",email:"dimitrikennedy@gmail.com",url:"https://github.com/roodboi",contributions:2,additions:3,deletions:3,hireable:null},{name:null,email:null,url:"https://github.com/markwithers",contributions:1,additions:1,deletions:1,hireable:null},{name:"Robert Porter",email:null,url:"https://github.com/colarob",contributions:1,additions:64,deletions:21,hireable:null},{name:"Jessica Good",email:null,url:"https://github.com/jessicagood",contributions:1,additions:8,deletions:5,hireable:null},{name:null,email:null,url:"https://github.com/jondayft",contributions:1,additions:18,deletions:0,hireable:null},{name:"Dane Petersen",email:null,url:"https://github.com/thegreatsunra",contributions:1,additions:18920,deletions:8429,hireable:null},{name:"Jimi Ford",email:null,url:"https://github.com/JimiHFord",
+contributions:1,additions:5,deletions:5,hireable:null},{name:"Hocine Moukaideche",email:null,url:"https://github.com/Off76",contributions:1,additions:1,deletions:1,hireable:!0},{name:"Keyang Xiang",email:"keyang.xiang@gmail.com",url:"https://github.com/Keyang",contributions:122,additions:46304,deletions:65397,hireable:null},{name:"Ionică Bizău",email:"contact@ionicabizau.net",url:"https://github.com/IonicaBizau",contributions:1,additions:98,deletions:86,hireable:null},{name:"Sean Lang",email:"slang800@gmail.com",url:"https://github.com/slang800",contributions:2,additions:2,deletions:1,hireable:!0},{name:"Tom Dodson",email:"t3.dodson@gmail.com",url:"https://github.com/t3dodson",contributions:25,additions:1485,deletions:1414,hireable:null},{name:"Jeff Johnson",email:null,url:"https://github.com/jeffcjohnson",contributions:1,additions:1,deletions:1,hireable:null},{name:"Amila Welihinda",email:"amilajack@gmail.com",url:"https://github.com/amilajack",contributions:1,additions:2,deletions:1,hireable:!0},{name:"Zsolt R. Molnar",email:null,url:"https://github.com/molnarzs",contributions:1,additions:40,deletions:2,hireable:!0}],version:"1.1.7",keywords:["csv","csv parser","parse csv","csvtojson","json","csv to json","csv convert","tojson","convert csv to json","csv-json"],bin:{csvtojson:"./bin/csvtojson"},license:"MIT",engines:{node:">=0.10"},devDependencies:{grunt:"^0.4.5","grunt-browserify":"^4.0.1","grunt-contrib-jshint":"^0.11.2","grunt-contrib-uglify":"^0.11.0","grunt-contrib-watch":"^0.6.1","grunt-git":"^0.3.5","grunt-madge":"0.0.6","grunt-mocha-test":"^0.12.7","grunt-newer":"^1.1.0",imgur:"^0.1.5","load-grunt-tasks":"^3.4.0",minimist:"^1.2.0",mocha:"^2.4.5",request:"^2.81.0"},dependencies:{lodash:"^4.17.3","strip-bom":"1.0.0"},scripts:{test:"mocha ./test -R spec","test-debug":"mocha debug ./test -R spec","test-all":"mocha  ./test -R spec && CSV_WORKER=3 mocha ./test -R spec "}}},{}]},{},[1]);
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/index.html new file mode 100644 index 0000000..efda2c2 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/dist/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for csv2json/dist + + + + + + + +
+
+

+ All files csv2json/dist +

+
+
+ 0% + Statements + 0/13762 +
+
+ 0% + Branches + 0/11883 +
+
+ 0% + Functions + 0/2950 +
+
+ 0% + Lines + 0/8549 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
csvtojson.js
0%0/87550%0/60570%0/14770%0/8543
csvtojson.min.js
0%0/50070%0/58260%0/14730%0/6
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/index.html new file mode 100644 index 0000000..09c8f5e --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/index.html @@ -0,0 +1,123 @@ + + + + Code coverage report for csv2json + + + + + + + +
+
+

+ All files csv2json +

+
+
+ 0% + Statements + 0/12 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/12 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Gruntfile.js
0%0/8100%0/00%0/10%0/8
browser_index.js
0%0/30%0/2100%0/00%0/3
index.js
0%0/1100%0/0100%0/00%0/1
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/index.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/index.js.html new file mode 100644 index 0000000..adb2418 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/index.js.html @@ -0,0 +1,69 @@ + + + + Code coverage report for csv2json/index.js + + + + + + + +
+
+

+ All files / csv2json index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 
module.exports=require("./build");
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/CSVError.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/CSVError.js.html new file mode 100644 index 0000000..865196c --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/CSVError.js.html @@ -0,0 +1,150 @@ + + + + Code coverage report for csv2json/libs/core/CSVError.js + + + + + + + +
+
+

+ All files / csv2json/libs/core CSVError.js +

+
+
+ 0% + Statements + 0/17 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/5 +
+
+ 0% + Lines + 0/17 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var util = require("util");
+module.exports = CSVError;
+function CSVError(err, index, extra) {
+  Error.call(this, "");
+  this.err = err;
+  this.line = index;
+  this.extra = extra;
+  this.message = "Error: " + err + ". JSON Line number: " + index + (extra ? " near: " + extra : "");
+  this.name = "CSV Error";
+}
+util.inherits(CSVError, Error);
+ 
+CSVError.prototype.toString = function() {
+  return JSON.stringify([this.err, this.line, this.extra]);
+};
+ 
+CSVError.column_mismatched = function(index, extra) {
+  return new CSVError("column_mismatched", index, extra);
+};
+ 
+CSVError.unclosed_quote = function(index, extra) {
+  return new CSVError("unclosed_quote", index, extra);
+};
+ 
+CSVError.fromArray = function(arr) {
+  return new CSVError(arr[0], arr[1], arr[2]);
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/Converter.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/Converter.js.html new file mode 100644 index 0000000..b611579 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/Converter.js.html @@ -0,0 +1,1836 @@ + + + + Code coverage report for csv2json/libs/core/Converter.js + + + + + + + +
+
+

+ All files / csv2json/libs/core Converter.js +

+
+
+ 0% + Statements + 0/375 +
+
+ 0% + Branches + 0/226 +
+
+ 0% + Functions + 0/43 +
+
+ 0% + Lines + 0/374 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var util = require("util");
+var Transform = require("stream").Transform;
+var os = require("os");
+var stripBom = require('strip-bom');
+var eol = os.EOL;
+// var Processor = require("./Processor.js");
+var defParam = require("./defParam");
+var fileline = require("./fileline");
+var fileLineToCSVLine = require("./fileLineToCSVLine");
+var linesToJson = require("./linesToJson");
+var CSVError = require("./CSVError");
+var workerMgr = null;
+var _ = require('lodash');
+var rowSplit = require("./rowSplit");
+function Converter(params, options) {
+  Transform.call(this, options);
+  this._options = options || {};
+  this.param = defParam(params);
+  this.param._options = this._options;
+  // this.resultObject = new Result(this);
+  // this.pipe(this.resultObject); // it is important to have downstream for a transform otherwise it will stuck
+  this.started = false;//indicate if parsing has started.
+  this.recordNum = 0;
+  this.lineNumber = 0; //file line number
+  this._csvLineBuffer = "";
+  this.lastIndex = 0; // index in result json array
+  //this._pipe(this.lineParser).pipe(this.processor);
+  // this.initNoFork();
+  if (this.param.forked) {
+    this.param.forked = false;
+    this.workerNum = 2;
+  }
+  this.flushCb = null;
+  this.processEnd = false;
+  this.sequenceBuffer = [];
+  this._needJson = null;
+  this._needEmitResult = null;
+  this._needEmitFinalResult = null;
+  this._needEmitHeader = null;
+  this._needEmitJson = null;
+  this._needPush = null;
+  this._needEmitCsv = null;
+  this._csvTransf = null;
+  this.finalResult = [];
+  // this.on("data", function() {});
+  this.on("error", emitDone(this));
+  this.on("end", emitDone(this));
+  this.initWorker();
+  process.nextTick(function () {
+    if (this._needEmitFinalResult === null) {
+      this._needEmitFinalResult = this.listeners("end_parsed").length > 0;
+    }
+    if (this._needEmitResult === null) {
+      this._needEmitResult = this.listeners("record_parsed").length > 0;
+    }
+    if (this._needEmitJson === null) {
+      this._needEmitJson = this.listeners("json").length > 0;
+    }
+    if (this._needEmitHeader === null) {
+      this._needEmitHeader = this.listeners("header").length > 0;
+    }
+    if (this._needEmitCsv === null) {
+      this._needEmitCsv = this.listeners("csv").length > 0;
+    }
+    if (this._needJson === null) {
+      this._needJson = this._needEmitJson || this._needEmitFinalResult || this._needEmitResult || this.transform || this._options.objectMode;
+    }
+    if (this._needPush === null) {
+      this._needPush = this.listeners("data").length > 0 || this.listeners("readable").length > 0;
+      // this._needPush=false;
+    }
+    this.param._needParseJson = this._needJson || this._needPush;
+  }.bind(this));
+ 
+  return this;
+}
+ 
+util.inherits(Converter, Transform);
+function emitDone(conv) {
+  return function (err) {
+    if (!conv._hasDone) {
+      conv._hasDone = true;
+      process.nextTick(function () {
+        conv.emit('done', err);
+      });
+    };
+  }
+}
+ 
+ 
+function bufFromString(str) {
+  var length=Buffer.byteLength(str);
+  var buffer = Buffer.allocUnsafe
+    ? Buffer.allocUnsafe(length)
+    : new Buffer(length);
+  buffer.write(str);
+  return buffer;
+}
+ 
+Converter.prototype._transform = function (data, encoding, cb) {
+  data=this.prepareData(data);
+  var idx =data.length-1;
+  var left=null;
+  /**
+   * From Keyang:
+   * The code below is to check if a single utf8 char (which could be multiple bytes) being split.
+   * If the char being split, the buffer from two chunk needs to be concat
+   * check how utf8 being encoded to understand the code below. 
+   * If anyone has any better way to do this, please let me know.
+   */
+  if ((data[idx] & 1<<7) !=0){
+    while ((data[idx] & 3<<6) === 128){
+      idx--;
+    }
+    idx--;
+  }
+  if (idx !=data.length-1){
+    left=data.slice(idx+1);
+    data=data.slice(0,idx+1)
+    var _cb=cb;
+    var self=this;
+    cb=function(){
+      if (self._csvLineBuffer){
+        self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]);
+      }else{
+        self._csvLineBuffer=left;
+      }
+      _cb();
+    }
+  }
+  data = data.toString("utf8");
+  if (this.started === false) {
+    this.started = true;
+    data = stripBom(data);
+    if (this.param.toArrayString) {
+      if (this._needPush) {
+        this.push("[" + eol, "utf8");
+      }
+    }
+  }
+  var self = this;
+  this.preProcessRaw(data, function (d) {
+    if (d && d.length > 0) {
+      self.processData(d, cb);
+    } else {
+      cb();
+    }
+  });
+};
+ 
+Converter.prototype.prepareData = function (data) {
+  if (this._csvLineBuffer && this._csvLineBuffer.length>0){
+    if (typeof this._csvLineBuffer === "string"){
+      this._csvLineBuffer=bufFromString(this._csvLineBuffer);
+    }
+    return Buffer.concat([this._csvLineBuffer,data]);
+  }else{
+    return data;
+  }
+  // return this._csvLineBuffer + data;
+};
+ 
+Converter.prototype.setPartialData = function (d) {
+  this._csvLineBuffer = d;
+};
+ 
+Converter.prototype.processData = function (data, cb) {
+  var params = this.param;
+  if (params.ignoreEmpty && !params._headers) {
+    data = data.trimLeft();
+  }
+  var eol = this.param.eol;
+  var fileLines = fileline(data, this.param);
+  if (this.param.eol !== eol) {
+    this.emit("eol", this.param.eol);
+  }
+  if (fileLines.lines.length > 0) {
+    if (this.preProcessLine && typeof this.preProcessLine === "function") {
+      fileLines.lines = this._preProcessLines(fileLines.lines, this.lastIndex);
+    }
+    if (!params._headers) { //header is not inited. init header
+      this.processHead(fileLines, cb);
+    } else {
+      if (params.workerNum <= 1) {
+        var lines = fileLineToCSVLine(fileLines, params);
+        this.setPartialData(lines.partial);
+        var jsonArr = linesToJson(lines.lines, params, this.recordNum);
+        this.processResult(jsonArr);
+        this.lastIndex += jsonArr.length;
+        this.recordNum += jsonArr.length;
+        cb();
+      } else {
+        this.workerProcess(fileLines, cb);
+      }
+    }
+  } else {
+    this.setPartialData(fileLines.partial);
+    cb();
+  }
+};
+ 
+Converter.prototype._preProcessLines = function (lines, startIdx) {
+  var rtn = [];
+  for (var i = 0, len = lines.length; i < len; i++) {
+    var result = this.preProcessLine(lines[i], startIdx + i + 1);
+    if (typeof result === "string") {
+      rtn.push(result);
+    } else {
+      rtn.push(lines[i]);
+      this.emit("error", new Error("preProcessLine should return a string but got: " + JSON.stringify(result)));
+    }
+  }
+  return rtn;
+};
+ 
+Converter.prototype.initWorker = function () {
+  var workerNum = this.param.workerNum - 1;
+  if (workerNum > 0) {
+    workerMgr = require("./workerMgr");
+    this.workerMgr = workerMgr();
+    this.workerMgr.initWorker(workerNum, this.param);
+  }
+};
+ 
+Converter.prototype.preRawData = function (func) {
+  this.preProcessRaw = func;
+  return this;
+};
+ 
+Converter.prototype.preFileLine = function (func) {
+  this.preProcessLine = func;
+  return this;
+};
+ 
+/**
+ * workerpRocess does not support embeded multiple lines.
+ */
+Converter.prototype.workerProcess = function (fileLine, cb) {
+  var self = this;
+  var line = fileLine;
+  var eol = this.getEol();
+  this.setPartialData(line.partial);
+  this.workerMgr.sendWorker(line.lines.join(eol) + eol, this.lastIndex, cb, function (results, lastIndex) {
+    var buf;
+    var cur = self.sequenceBuffer[0];
+    if (cur.idx === lastIndex) {
+      cur.result = results;
+      var records = [];
+      while (self.sequenceBuffer[0] && self.sequenceBuffer[0].result) {
+        buf = self.sequenceBuffer.shift();
+        records = records.concat(buf.result);
+      }
+      self.processResult(records);
+      self.recordNum += records.length;
+    } else {
+      for (var i = 0, len = self.sequenceBuffer.length; i < len; i++) {
+        buf = self.sequenceBuffer[i];
+        if (buf.idx === lastIndex) {
+          buf.result = results;
+          break;
+        }
+      }
+    }
+  });
+  this.sequenceBuffer.push({
+    idx: this.lastIndex,
+    result: null
+  });
+  this.lastIndex += line.lines.length;
+};
+ 
+Converter.prototype.processHead = function (fileLine, cb) {
+  var params = this.param;
+  if (params._headers) {
+    return cb();
+  }
+  //dirty hack
+  params._needFilterRow = false;
+  // if header is not inited. init header
+  var lines = fileLine.lines;
+  var left = "";
+  var headerRow = [];
+  if (!params.noheader) {
+    while (lines.length) {
+      var line = left + lines.shift();
+      var delimiter = params.delimiter;
+      var row = rowSplit(line, params);
+      if (params.delimiter !== delimiter) {
+        this.emit("delimiter", params.delimiter);
+      }
+      if (row.closed) {
+        headerRow = row.cols;
+        left = "";
+        break;
+      } else {
+        left = line + this.getEol();
+      }
+    }
+  }
+  params._needFilterRow = true;
+  if (!params.noheader && headerRow.length === 0) { //if one chunk of data does not complete header row.
+    this.setPartialData(left);
+    return cb();
+  }
+  if (params.noheader) {
+    if (params.headers) {
+      params._headers = params.headers;
+    } else {
+      params._headers = [];
+    }
+  } else {
+    if (params.headers) {
+      params._headers = params.headers;
+    } else {
+      params._headers = headerRow;
+    }
+  }
+  configIgnoreIncludeColumns(params);
+  params._headers = require("./filterRow")(params._headers, params);
+  if (this._needEmitHeader && this.param._headers) {
+    this.emit("header", this.param._headers);
+  }
+  var delimiter = params.delimiter;
+  var lines = fileLineToCSVLine(fileLine, params);
+  if (params.delimiter !== delimiter) {
+    this.emit("delimiter", params.delimiter);
+  }
+  this.setPartialData(lines.partial);
+  if (this.param.workerNum > 1) {
+    this.workerMgr.setParams(params);
+  }
+  var res = linesToJson(lines.lines, params, 0);
+  // Put the header with the first row
+  // if(res.length > 0) res[0].header = params._headers;
+  this.processResult(res);
+  this.lastIndex += res.length;
+  this.recordNum += res.length;
+ 
+  cb();
+};
+function configIgnoreIncludeColumns(params) {
+  if (params._postIgnoreColumns) {
+    for (var i = 0; i < params.ignoreColumns.length; i++) {
+      var ignoreCol = params.ignoreColumns[i];
+      if (typeof ignoreCol === "string") {
+        var idx = params._headers.indexOf(ignoreCol);
+        if (idx > -1) {
+          params.ignoreColumns[i] = idx;
+        } else {
+          params.ignoreColumns[i] = -1;
+        }
+      }
+    }
+    params.ignoreColumns.sort(function (a, b) { return b - a; });
+  }
+  if (params._postIncludeColumns) {
+    for (var i = 0; i < params.includeColumns.length; i++) {
+      var includeCol = params.includeColumns[i];
+      if (typeof includeCol === "string") {
+        var idx = params._headers.indexOf(includeCol);
+        if (idx > -1) {
+          params.includeColumns[i] = idx;
+        } else {
+          params.includeColumns[i] = -1;
+        }
+      }
+    }
+  }
+  params.ignoreColumns = _.uniq(params.ignoreColumns);
+  params.includeColumns = _.uniq(params.includeColumns);
+}
+ 
+Converter.prototype.processResult = function (result) {
+  for (var i = 0, len = result.length; i < len; i++) {
+    var r = result[i];
+    if (r.err) {
+      this.emit("error", r.err);
+    } else {
+      this.emitResult(r);
+    }
+  }
+};
+ 
+Converter.prototype.emitResult = function (r) {
+  var index = r.index;
+  var header = this.param;
+  var row = r.row;
+  var result = r.json;
+  var resultJson = null;
+  var resultStr = null;
+  if (typeof result === "string") {
+    resultStr = result;
+  } else {
+    resultJson = result;
+  }
+  if (resultJson === null && this._needJson) {
+    resultJson = JSON.parse(resultStr);
+    if (typeof row === "string") {
+      row = JSON.parse(row);
+    }
+  }
+  if (this.transform && typeof this.transform === "function") {
+    this.transform(resultJson, row, index);
+    resultStr = null;
+  }
+  if (this._needEmitJson) {
+    this.emit("json", resultJson, index);
+  }
+  if (this._needEmitCsv) {
+    if (typeof row === "string") {
+      row = JSON.parse(row);
+    }
+    this.emit("csv", row, index);
+  }
+  if (this.param.constructResult && this._needEmitFinalResult) {
+    this.finalResult.push(resultJson);
+  }
+  if (this._needEmitResult) {
+    this.emit("record_parsed", resultJson, row, index);
+  }
+  if (this.param.toArrayString && index > 0 && this._needPush) {
+    this.push("," + eol);
+  }
+  if (this._options && this._options.objectMode) {
+    this.push(resultJson);
+  } else {
+    if (this._needPush) {
+      if (resultStr === null) {
+        resultStr = JSON.stringify(resultJson);
+      }
+      this.push(!this.param.toArrayString ? resultStr + eol : resultStr, "utf8");
+    }
+  }
+};
+ 
+Converter.prototype.preProcessRaw = function (data, cb) {
+  cb(data);
+};
+ 
+// FIXME: lineNumber is not used.
+Converter.prototype.preProcessLine = function (line, lineNumber) {
+  return line;
+};
+ 
+Converter.prototype._flush = function (cb) {
+  var self = this;
+  this.flushCb = function () {
+    self.emit("end_parsed", self.finalResult);
+    if (self.workerMgr) {
+      self.workerMgr.destroyWorker();
+    }
+    cb();
+    if (!self._needPush) {
+      self.emit("end");
+    }
+  };
+  if (this._csvLineBuffer.length > 0) {
+    var eol = this.getEol();
+    if (this._csvLineBuffer[this._csvLineBuffer.length - 1] !== eol) {
+      this._csvLineBuffer += eol;
+    }
+    this.processData(this._csvLineBuffer, function () {
+      this.checkAndFlush();
+    }.bind(this));
+  } else {
+    this.checkAndFlush();
+  }
+  return;
+};
+ 
+Converter.prototype.checkAndFlush = function () {
+  if (this._csvLineBuffer.length !== 0) {
+    this.emit("error", CSVError.unclosed_quote(this.recordNum, this._csvLineBuffer), this._csvLineBuffer);
+  }
+  if (this.param.toArrayString && this._needPush) {
+    this.push(eol + "]", "utf8");
+  }
+  if (this.workerMgr && this.workerMgr.isRunning()) {
+    this.workerMgr.drain = function () {
+      this.flushCb();
+    }.bind(this);
+  } else {
+    this.flushCb();
+  }
+};
+ 
+Converter.prototype.getEol = function (data) {
+  if (!this.param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          this.param.eol = "\r\n";
+        } else {
+          this.param.eol = "\r";
+        }
+        return this.param.eol;
+      } else if (data[i] === "\n") {
+        this.param.eol = "\n";
+        return this.param.eol;
+      }
+    }
+    this.param.eol = eol;
+  }
+ 
+  return this.param.eol || eol;
+};
+ 
+Converter.prototype.fromFile = function (filePath, cb, options) {
+  var fs = require('fs');
+  var rs = null;
+  if (typeof cb ==="object" && typeof options === "undefined"){
+    options=cb;
+    cb=null;
+  }
+  this.wrapCallback(cb, function () {
+    if (rs && rs.destroy) {
+      rs.destroy();
+    }
+  });
+  fs.exists(filePath, function (exist) {
+    if (exist) {
+      rs = fs.createReadStream(filePath,options);
+      rs.pipe(this);
+    } else {
+      this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct."));
+    }
+  }.bind(this));
+  return this;
+};
+ 
+Converter.prototype.fromStream = function (readStream, cb) {
+  if (cb && typeof cb === "function") {
+    this.wrapCallback(cb);
+  }
+  readStream.pipe(this);
+  return this;
+};
+ 
+Converter.prototype.transf = function (func) {
+  this.transform = func;
+  return this;
+};
+ 
+Converter.prototype.fromString = function (csvString, cb) {
+  if (typeof csvString !== "string") {
+    if (cb && typeof cb ==="function"){
+      return cb(new Error("Passed CSV Data is not a string."));
+    }
+  }
+  if (cb && typeof cb === "function") {
+    this.wrapCallback(cb, function () {
+    });
+  }
+  var read=new Readable();
+  var idx=0;
+  read._read=function(size){
+    if (idx>=csvString.length){
+      this.push(null);
+    }else{
+      var str=csvString.substr(idx,size);
+      this.push(str);
+      idx+=size;
+    }
+  }
+  read.pipe(this);
+  return this;
+};
+ 
+Converter.prototype.wrapCallback = function (cb, clean) {
+  if (clean === undefined) {
+    clean = function () { };
+  }
+  if (cb && typeof cb === "function") {
+    this.once("end_parsed", function (res) {
+      if (!this.hasError) {
+        cb(null, res);
+      }
+    }.bind(this));
+  }
+  this.once("error", function (err) {
+    this.hasError = true;
+    if (cb && typeof cb === "function") {
+      cb(err);
+    }
+    clean();
+  }.bind(this));
+};
+ 
+module.exports = Converter;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/csvline.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/csvline.js.html new file mode 100644 index 0000000..99d4701 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/csvline.js.html @@ -0,0 +1,138 @@ + + + + Code coverage report for csv2json/libs/core/csvline.js + + + + + + + +
+
+

+ All files / csv2json/libs/core csvline.js +

+
+
+ 0% + Statements + 0/13 +
+
+ 0% + Branches + 0/6 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var getEol = require("./getEol");
+var rowSplit = require("./rowSplit");
+/**
+ * Convert lines to csv columns
+ * @param  {[type]} lines [file lines]
+ * @param  {[type]} param [Converter param]
+ * @return {[type]}  {lines:[[col1,col2,col3...]],partial:String}
+ */
+module.exports = function (lines, param) {
+  var csvLines = [];
+  var left = "";
+  while (lines.length) {
+    var line = left + lines.shift();
+    var row = rowSplit(line, param);
+    if (row.closed || param.alwaysSplitAtEOL) {
+      csvLines.push(row.cols);
+      left = "";
+    } else {
+      left = line + (getEol(line, param) || "\n"); // if unable to getEol from data, assume "\n"
+    }
+  }
+  return { lines: csvLines, partial: left };
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/dataToCSVLine.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/dataToCSVLine.js.html new file mode 100644 index 0000000..f9af899 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/dataToCSVLine.js.html @@ -0,0 +1,120 @@ + + + + Code coverage report for csv2json/libs/core/dataToCSVLine.js + + + + + + + +
+
+

+ All files / csv2json/libs/core dataToCSVLine.js +

+
+
+ 0% + Statements + 0/7 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var fileline=require("./fileline");
+var csvline=require("./csvline");
+/**
+ * Convert data chunk to csv lines with cols
+ * @param  {[type]} data   [description]
+ * @param  {[type]} params [description]
+ * @return {[type]}    {lines:[[col1,col2,col3]],partial:String}
+ */
+module.exports = function(data, params) {
+  var line = fileline(data, params);
+  var lines = line.lines;
+  var csvLines = csvline(lines, params);
+  return {
+    lines: csvLines.lines,
+    partial: csvLines.partial + line.partial
+  };
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defParam.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defParam.js.html new file mode 100644 index 0000000..3bbcc58 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defParam.js.html @@ -0,0 +1,270 @@ + + + + Code coverage report for csv2json/libs/core/defParam.js + + + + + + + +
+
+

+ All files / csv2json/libs/core defParam.js +

+
+
+ 0% + Statements + 0/23 +
+
+ 0% + Branches + 0/22 +
+
+ 0% + Functions + 0/3 +
+
+ 0% + Lines + 0/22 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var numExp = /^[0-9]+$/;
+module.exports = function (params) {
+  var _param = {
+    constructResult: true, //set to false to not construct result in memory. suitable for big csv data
+    delimiter: ',', // change the delimiter of csv columns. It is able to use an array to specify potencial delimiters. e.g. [",","|",";"]
+    ignoreColumns: [], // columns to ignore upon input.
+    includeColumns: [], // columns to include upon input.
+    quote: '"', //quote for a column containing delimiter.
+    trim: true, //trim column's space charcters
+    checkType: false, //whether check column type
+    toArrayString: false, //stream down stringified json array instead of string of json. (useful if downstream is file writer etc)
+    ignoreEmpty: false, //Ignore empty value while parsing. if a value of the column is empty, it will be skipped parsing.
+    workerNum: getEnv("CSV_WORKER", 1), //number of parallel workers. If multi-core CPU available, increase the number will get better performance for large csv data.
+    fork: false, //use another CPU core to convert the csv stream
+    noheader: false, //indicate if first line of CSV file is header or not.
+    headers: null, //an array of header strings. If noheader is false and headers is array, csv header will be ignored.
+    flatKeys: false, // Don't interpret dots and square brackets in header fields as nested object or array identifiers at all.
+    maxRowLength: 0, //the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0
+    checkColumn: false, //whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false
+    escape: '"', //escape char for quoted column
+    colParser:{}, //flags on columns to alter field processing.
+ 
+    /**below are internal params */
+    _columnConv:[],
+    _headerType: [],
+    _headerTitle: [],
+    _headerFlag: [],
+    _headers: null,
+    _needFilterRow: false
+  };
+  if (!params) {
+    params = {};
+  }
+  for (var key in params) {
+    if (params.hasOwnProperty(key)) {
+      if (Array.isArray(params[key])) {
+        _param[key] = [].concat(params[key]);
+      } else {
+        _param[key] = params[key];
+      }
+    }
+  }
+  if (_param.ignoreColumns.length > 0 && !numExp.test(_param.ignoreColumns.join(""))) {
+    _param._postIgnoreColumns = true;
+  }
+  if (_param.includeColumns.length > 0 && !numExp.test(_param.includeColumns.join(""))) {
+    _param._postIncludeColumns = true;
+  }
+ 
+  if (_param.ignoreColumns.length || _param.includeColumns.length) {
+    _param._needFilterRow = true;
+    if (!_param._postIgnoreColumns){
+      _param.ignoreColumns.sort(function (a, b) { return b-a;});
+    }
+  }
+ 
+ 
+  return _param;
+};
+ 
+function getEnv(key, def) {
+  if (process.env[key]) {
+    return process.env[key];
+  } else {
+    return def;
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/index.html new file mode 100644 index 0000000..c1a1a38 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/index.html @@ -0,0 +1,162 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers + + + + + + + +
+
+

+ All files csv2json/libs/core/defaultParsers +

+
+
+ 0% + Statements + 0/63 +
+
+ 0% + Branches + 0/40 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/63 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/1100%0/0100%0/00%0/1
parser_array.js
0%0/50%0/20%0/10%0/5
parser_flat.js
0%0/4100%0/00%0/10%0/4
parser_json.js
0%0/390%0/340%0/20%0/39
parser_jsonarray.js
0%0/130%0/40%0/10%0/13
parser_omit.js
0%0/1100%0/00%0/10%0/1
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/index.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/index.js.html new file mode 100644 index 0000000..761cb8e --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/index.js.html @@ -0,0 +1,90 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8  +  +  +  +  +  +  + 
module.exports = [
+  require('./parser_array.js'),
+  require('./parser_json.js'),
+  require('./parser_omit.js'),
+  require('./parser_jsonarray.js'),
+  require("./parser_flat.js")
+];
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_array.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_array.js.html new file mode 100644 index 0000000..0f25f5c --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_array.js.html @@ -0,0 +1,105 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_array.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_array.js +

+
+
+ 0% + Statements + 0/5 +
+
+ 0% + Branches + 0/2 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +  +  +  +  +  +  +  +  +  +  + 
module.exports = {
+  "name": "array",
+  "processSafe":true,
+  "regExp": /^\*array\*/,
+  "parserFunc": function parser_array(params) {
+    var fieldName = params.head.replace(this.regExp, '');
+    if (params.resultRow[fieldName] === undefined) {
+      params.resultRow[fieldName] = [];
+    }
+    params.resultRow[fieldName].push(params.item);
+  }
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_flat.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_flat.js.html new file mode 100644 index 0000000..3011352 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_flat.js.html @@ -0,0 +1,99 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_flat.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_flat.js +

+
+
+ 0% + Statements + 0/4 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +  +  +  +  +  +  +  +  + 
module.exports = {
+  "name": "flat",
+  "processSafe": true,
+  "regExp": /^\*flat\*/,
+  "parserFunc": function parser_flat (params) {
+     var key = this.getHeadStr();
+     var val = params.item;
+     params.resultRow[key] = val;
+  }
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_json.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_json.js.html new file mode 100644 index 0000000..972617f --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_json.js.html @@ -0,0 +1,279 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_json.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_json.js +

+
+
+ 0% + Statements + 0/39 +
+
+ 0% + Branches + 0/34 +
+
+ 0% + Functions + 0/2 +
+
+ 0% + Lines + 0/39 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var arrReg = /\[([0-9]*)\]/;
+ 
+ 
+function processHead(pointer, headArr, arrReg, flatKeys) {
+  var headStr, match, index;
+  while (headArr.length > 1) {
+    headStr = headArr.shift();
+    // match = headStr.match(arrReg);
+    match = flatKeys ? false : headStr.match(arrReg);
+    if (match) { //if its array, we need add an empty json object into specified index.
+      if (pointer[headStr.replace(match[0], '')] === undefined) {
+        pointer[headStr.replace(match[0], '')] = [];
+      }
+      index = match[1]; //get index where json object should stay
+      pointer = pointer[headStr.replace(match[0], '')];
+      if (index === '') { //if its dynamic array index, push to the end
+        index = pointer.length;
+      }
+      if (!pointer[index]) { //current index in the array is empty. we need create a new json object.
+        pointer[index] = {};
+      }
+      pointer = pointer[index];
+    } else { //not array, just normal JSON object. we get the reference of it
+      if (pointer[headStr] === undefined) {
+        pointer[headStr] = {};
+      }
+      pointer = pointer[headStr];
+    }
+  }
+  return pointer;
+}
+module.exports = {
+  "name": "json",
+  "processSafe": true,
+  "regExp": /^\*json\*/,
+  "parserFunc": function parser_json(params) {
+    var fieldStr = this.getHeadStr();
+    var headArr = (params.config && params.config.flatKeys) ? [fieldStr] : fieldStr.split('.');
+    var match, index, key;
+    //now the pointer is pointing the position to add a key/value pair.
+    var pointer = processHead(params.resultRow, headArr, arrReg, params.config && params.config.flatKeys);
+    key = headArr.shift();
+    match = (params.config && params.config.flatKeys) ? false : key.match(arrReg);
+    if (match) { // the last element is an array, we need check and treat it as an array.
+      try {
+        key = key.replace(match[0], '');
+        if (!pointer[key] || !(pointer[key] instanceof Array)) {
+          pointer[key] = [];
+        }
+        if (pointer[key]) {
+          index = match[1];
+          if (index === '') {
+            index = pointer[key].length;
+          }
+          pointer[key][index] = params.item;
+        } else {
+          params.resultRow[fieldStr] = params.item;
+        }
+      } catch (e) {
+        params.resultRow[fieldStr] = params.item;
+      }
+    } else {
+      if (typeof pointer === "string"){
+        params.resultRow[fieldStr] = params.item;
+      }else{
+        pointer[key] = params.item;
+      }
+    }
+  }
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_jsonarray.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_jsonarray.js.html new file mode 100644 index 0000000..db31428 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_jsonarray.js.html @@ -0,0 +1,135 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_jsonarray.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_jsonarray.js +

+
+
+ 0% + Statements + 0/13 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/13 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
module.exports = {
+  "name": "jsonarray",
+  "processSafe":true,
+  "regExp": /^\*jsonarray\*/,
+  "parserFunc": function parser_jsonarray (params) {
+    var fieldStr = params.head.replace(this.regExp, "");
+    var headArr = fieldStr.split('.');
+    var pointer = params.resultRow;
+    while (headArr.length > 1) {
+      var headStr = headArr.shift();
+      if (pointer[headStr] === undefined) {
+        pointer[headStr] = {};
+      }
+      pointer = pointer[headStr];
+    }
+    var arrFieldName = headArr.shift();
+    if (pointer[arrFieldName] === undefined) {
+      pointer[arrFieldName] = [];
+    }
+    pointer[arrFieldName].push(params.item);
+  }
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_omit.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_omit.js.html new file mode 100644 index 0000000..af785dd --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/defaultParsers/parser_omit.js.html @@ -0,0 +1,87 @@ + + + + Code coverage report for csv2json/libs/core/defaultParsers/parser_omit.js + + + + + + + +
+
+

+ All files / csv2json/libs/core/defaultParsers parser_omit.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
module.exports = {
+  "name": "omit",
+  "regExp": /^\*omit\*/,
+  "processSafe":true,
+  "parserFunc": function parser_omit() {}
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/fileLineToCSVLine.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/fileLineToCSVLine.js.html new file mode 100644 index 0000000..878ecc0 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/fileLineToCSVLine.js.html @@ -0,0 +1,114 @@ + + + + Code coverage report for csv2json/libs/core/fileLineToCSVLine.js + + + + + + + +
+
+

+ All files / csv2json/libs/core fileLineToCSVLine.js +

+
+
+ 0% + Statements + 0/5 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var csvline=require("./csvline");
+/**
+ * Convert data chunk to csv lines with cols
+ * @param  {[type]} data   [description]
+ * @param  {[type]} params [description]
+ * @return {[type]}    {lines:[[col1,col2,col3]],partial:String}
+ */
+module.exports = function(fileLine, params) {
+  var lines = fileLine.lines;
+  var csvLines = csvline(lines,params);
+  return {
+    lines: csvLines.lines,
+    partial: csvLines.partial + fileLine.partial
+  };
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/fileline.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/fileline.js.html new file mode 100644 index 0000000..82d0a1b --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/fileline.js.html @@ -0,0 +1,108 @@ + + + + Code coverage report for csv2json/libs/core/fileline.js + + + + + + + +
+
+

+ All files / csv2json/libs/core fileline.js +

+
+
+ 0% + Statements + 0/6 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/6 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +  +  +  +  +  +  +  +  + 
var getEol = require("./getEol");
+/**
+ * convert data chunk to file lines array
+ * @param  {string} data  data chunk as utf8 string
+ * @param  {object} param Converter param object
+ * @return {Object}   {lines:[line1,line2...],partial:String}
+ */
+module.exports = function(data, param) {
+  var eol = getEol(data,param);
+  var lines = data.split(eol);
+  var partial = lines.pop();
+  return {lines: lines, partial: partial};
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/filterRow.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/filterRow.js.html new file mode 100644 index 0000000..a3ba920 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/filterRow.js.html @@ -0,0 +1,123 @@ + + + + Code coverage report for csv2json/libs/core/filterRow.js + + + + + + + +
+
+

+ All files / csv2json/libs/core filterRow.js +

+
+
+ 0% + Statements + 0/12 +
+
+ 0% + Branches + 0/12 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/12 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
module.exports=function filterRow(row, param) {
+  if (param.ignoreColumns instanceof Array && param.ignoreColumns.length > 0) {
+    for (var igRow = 0, igColLen = param.ignoreColumns.length; igRow < igColLen; igRow++) {
+      if (param.ignoreColumns[igRow] >= 0) {
+        row.splice(param.ignoreColumns[igRow], 1);
+      }
+    }
+  }
+  if (param.includeColumns instanceof Array && param.includeColumns.length > 0) {
+    var cleanRowArr = [];
+    for (var inRow = 0, inColLen = param.includeColumns.length; inRow < inColLen; inRow++) {
+      if (param.includeColumns[inRow] >= 0) {
+        cleanRowArr.push(row[param.includeColumns[inRow]]);
+      }
+    }
+    row = cleanRowArr;
+  }
+  return row;
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/getDelimiter.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/getDelimiter.js.html new file mode 100644 index 0000000..1afa808 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/getDelimiter.js.html @@ -0,0 +1,135 @@ + + + + Code coverage report for csv2json/libs/core/getDelimiter.js + + + + + + + +
+
+

+ All files / csv2json/libs/core getDelimiter.js +

+
+
+ 0% + Statements + 0/15 +
+
+ 0% + Branches + 0/6 +
+
+ 0% + Functions + 0/2 +
+
+ 0% + Lines + 0/15 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
module.exports = getDelimiter;
+var defaulDelimiters = [",", "|", "\t", ";", ":"];
+function getDelimiter(rowStr,param) {
+  var checker;
+  if (param.delimiter === "auto"){
+    checker = defaulDelimiters;
+  } else if (param.delimiter instanceof Array) {
+    checker = param.delimiter;
+  } else {
+    return param.delimiter;
+  }
+  var count = 0;
+  var rtn = ",";
+  checker.forEach(function(delim) {
+    var delimCount = rowStr.split(delim).length;
+    if (delimCount > count) {
+      rtn = delim;
+      count = delimCount;
+    }
+  });
+  return rtn;
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/getEol.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/getEol.js.html new file mode 100644 index 0000000..7f56219 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/getEol.js.html @@ -0,0 +1,129 @@ + + + + Code coverage report for csv2json/libs/core/getEol.js + + + + + + + +
+
+

+ All files / csv2json/libs/core getEol.js +

+
+
+ 0% + Statements + 0/14 +
+
+ 0% + Branches + 0/12 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/14 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
//return eol from a data chunk.
+var eol = require("os").EOL;
+module.exports = function(data, param) {
+  if (!param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          param.eol = "\r\n";
+        } else if (data[i + 1]) {
+          param.eol = "\r";
+        }
+        return param.eol;
+      } else if (data[i] === "\n") {
+        param.eol = "\n";
+        return param.eol;
+      }
+    }
+  }
+  return param.eol;
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/index.html new file mode 100644 index 0000000..48878fa --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/index.html @@ -0,0 +1,305 @@ + + + + Code coverage report for csv2json/libs/core + + + + + + + +
+
+

+ All files csv2json/libs/core +

+
+
+ 0% + Statements + 0/911 +
+
+ 0% + Branches + 0/503 +
+
+ 0% + Functions + 0/125 +
+
+ 0% + Lines + 0/909 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CSVError.js
0%0/170%0/20%0/50%0/17
Converter.js
0%0/3750%0/2260%0/430%0/374
csvline.js
0%0/130%0/60%0/10%0/13
dataToCSVLine.js
0%0/7100%0/00%0/10%0/7
defParam.js
0%0/230%0/220%0/30%0/22
fileLineToCSVLine.js
0%0/5100%0/00%0/10%0/5
fileline.js
0%0/6100%0/00%0/10%0/6
filterRow.js
0%0/120%0/120%0/10%0/12
getDelimiter.js
0%0/150%0/60%0/20%0/15
getEol.js
0%0/140%0/120%0/10%0/14
index.js
0%0/3100%0/00%0/10%0/3
linesToJson.js
0%0/1210%0/880%0/160%0/121
parser.js
0%0/720%0/490%0/100%0/72
parserMgr.js
0%0/340%0/140%0/100%0/34
rowSplit.js
0%0/700%0/350%0/50%0/70
worker.js
0%0/450%0/130%0/60%0/45
workerMgr.js
0%0/790%0/180%0/180%0/79
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/index.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/index.js.html new file mode 100644 index 0000000..b665600 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/index.js.html @@ -0,0 +1,87 @@ + + + + Code coverage report for csv2json/libs/core/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/core index.js +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
module.exports = constructor;
+module.exports.Converter = require("./Converter.js");
+ 
+function constructor(param,options) {
+  return new module.exports.Converter(param, options);
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/linesToJson.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/linesToJson.js.html new file mode 100644 index 0000000..f880bfe --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/linesToJson.js.html @@ -0,0 +1,774 @@ + + + + Code coverage report for csv2json/libs/core/linesToJson.js + + + + + + + +
+
+

+ All files / csv2json/libs/core linesToJson.js +

+
+
+ 0% + Statements + 0/121 +
+
+ 0% + Branches + 0/88 +
+
+ 0% + Functions + 0/16 +
+
+ 0% + Lines + 0/121 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var parserMgr = require("./parserMgr.js");
+var CSVError = require("./CSVError");
+var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+/**
+ * Convert lines of csv array into json
+ * @param  {[type]} lines  [[col1,col2,col3]]
+ * @param  {[type]} params Converter params with _headers field populated
+ * @param  {[type]} idx start pos of the lines
+ * @return {[type]}   [{err:null,json:obj,index:line,row:[csv row]}]
+ */
+module.exports = function (lines, params, idx) {
+  if (params._needParseJson) {
+    if (!params._headers || !Array.isArray(params._headers)) {
+      params._headers = [];
+    }
+    if (!params.parseRules) {
+      var row = params._headers;
+      params.parseRules = parserMgr.initParsers(row, params);
+    }
+    return processRows(lines, params, idx);
+  } else {
+    return justReturnRows(lines, params, idx);
+  }
+};
+ 
+function justReturnRows(lines, params, idx) {
+  var rtn = [];
+  for (var i = 0, len = lines.length; i < len; i++) {
+    rtn.push({
+      err: null,
+      json: {},
+      index: idx++,
+      row: lines[i]
+    });
+  }
+  return rtn;
+}
+ 
+function processRows(csvRows, params, startIndex) {
+  var res = [];
+  for (var i = 0, len = csvRows.length; i < len; i++) {
+    var r = processRow(csvRows[i], params, startIndex++);
+    if (r) {
+      res.push(r);
+    }
+  }
+  return res;
+}
+ 
+function processRow(row, param, index) {
+  var parseRules = param.parseRules;
+  if (param.checkColumn && row.length !== parseRules.length) {
+    return {
+      err: CSVError.column_mismatched(index)
+    };
+  }
+ 
+  var headRow = param._headers;
+  var resultRow = convertRowToJson(row, headRow, param);
+  if (resultRow) {
+    return {
+      json: resultRow,
+      index: index,
+      row: row
+    };
+  } else {
+    return null;
+  }
+}
+ 
+function convertRowToJson(row, headRow, param) {
+  var hasValue = false;
+  var resultRow = {};
+ 
+  for (var i = 0, len = row.length; i < len; i++) {
+    var convertFunc, head, item;
+    item = row[i];
+ 
+    if (param.ignoreEmpty && item === '') {
+      continue;
+    }
+    hasValue = true;
+ 
+    head = headRow[i];
+    if (!head || head === "") {
+      head = headRow[i] = "field" + (i + 1);
+    }
+    var convFunc = getConvFunc(head, i, param);
+    if (convFunc) {
+      var convRes = convFunc(item, head, resultRow,row,i);
+      if (convRes !== undefined) {
+        setPath(resultRow, head, convRes);
+      }
+    } else {
+      var flag = getFlag(head, i, param);
+      if (flag === 'omit') {
+        continue;
+      }
+      if (param.checkType) {
+        convertFunc = checkType(item, head, i, param);
+        item = convertFunc(item);
+      }
+      var title = getTitle(head, i, param);
+      if (flag === 'flat' || param.flatKeys) {
+        resultRow[title] = item;
+      } else {
+        setPath(resultRow, title, item);
+      }
+    }
+  }
+  if (hasValue) {
+    return resultRow;
+  } else {
+    return false;
+  }
+}
+ 
+var builtInConv={
+  "string":stringType,
+  "number":numberType,
+  "omit":function(){}
+}
+function getConvFunc(head,i,param){
+  if (param._columnConv[i] !== undefined){
+    return param._columnConv[i];
+  }else{
+    var flag=param.colParser[head];
+    if (flag === undefined){
+      return param._columnConv[i]=false;
+    }
+    if (typeof flag ==="string"){
+      flag=flag.trim().toLowerCase();
+      var builtInFunc=builtInConv[flag];
+      if (builtInFunc){
+        return param._columnConv[i]=builtInFunc;
+      }else{
+        return param._columnConv[i]=false;  
+      }
+    }else if (typeof flag ==="function"){
+      return param._columnConv[i]=flag;
+    }else{
+      return param._columnConv[i]=false;
+    }
+  }
+}
+function setPath(json, path, value) {
+  var _set = require('lodash/set');
+  var pathArr = path.split('.');
+  if (pathArr.length === 1) {
+    json[path] = value;
+  } else {
+    _set(json, path, value);
+  }
+}
+ 
+function getFlag(head, i, param) {
+  if (typeof param._headerFlag[i] === "string") {
+    return param._headerFlag[i];
+  } else if (head.indexOf('*omit*') > -1) {
+    return param._headerFlag[i] = 'omit';
+  } else if (head.indexOf('*flat*') > -1) {
+    return param._headerFlag[i] = 'flat';
+  } else {
+    return param._headerFlag[i] = '';
+  }
+}
+ 
+function getTitle(head, i, param) {
+  if (param._headerTitle[i]) {
+    return param._headerTitle[i];
+  }
+ 
+  var flag = getFlag(head, i, param);
+  var str = head.replace('*flat*', '').replace('string#!', '').replace('number#!', '');
+  return param._headerTitle[i] = str;
+}
+ 
+function checkType(item, head, headIdx, param) {
+  if (param._headerType[headIdx]) {
+    return param._headerType[headIdx];
+  } else if (head.indexOf('number#!') > -1) {
+    return param._headerType[headIdx] = numberType;
+  } else if (head.indexOf('string#!') > -1) {
+    return param._headerType[headIdx] = stringType;
+  } else if (param.checkType) {
+    return param._headerType[headIdx] = dynamicType;
+  } else {
+    return param._headerType[headIdx] = stringType;
+  }
+}
+ 
+function numberType(item) {
+  var rtn = parseFloat(item);
+  if (isNaN(rtn)) {
+    return item;
+  }
+  return rtn;
+}
+ 
+function stringType(item) {
+  return item.toString();
+}
+ 
+function dynamicType(item) {
+  var trimed = item.trim();
+  if (trimed === "") {
+    return stringType(item);
+  }
+  if (numReg.test(trimed)) {
+    return numberType(item);
+  } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") {
+    return booleanType(item);
+  } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") {
+    return jsonType(item);
+  } else {
+    return stringType(item);
+  }
+}
+ 
+function booleanType(item) {
+  var trimed = item.trim();
+  if (trimed.length === 5 && trimed.toLowerCase() === "false") {
+    return false;
+  } else {
+    return true;
+  }
+}
+ 
+function jsonType(item) {
+  try {
+    return JSON.parse(item);
+  } catch (e) {
+    return item;
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/parser.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/parser.js.html new file mode 100644 index 0000000..f238827 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/parser.js.html @@ -0,0 +1,417 @@ + + + + Code coverage report for csv2json/libs/core/parser.js + + + + + + + +
+
+

+ All files / csv2json/libs/core parser.js +

+
+
+ 0% + Statements + 0/72 +
+
+ 0% + Branches + 0/49 +
+
+ 0% + Functions + 0/10 +
+
+ 0% + Lines + 0/72 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var explicitTypes = ["number", "string"];
+ 
+function Parser(name, regExp, parser, processSafe) {
+  this.name = typeof name === "undefined" ? "Default" : name;
+  this.regExp = null;
+  this.type = "";
+  this.processSafe = processSafe;
+  if (typeof regExp !== "undefined") {
+    if (typeof regExp === "string") {
+      this.regExp = new RegExp(regExp);
+    } else {
+      this.regExp = regExp;
+    }
+  }
+  if (typeof parser !== "undefined") {
+    this.parse = parser;
+  }
+}
+// var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+Parser.prototype.convertType = function(item) {
+  var type=this.type;
+  if (type === 'number') {
+    var rtn = parseFloat(item);
+    if (isNaN(rtn)) {
+      return 0;
+    } else {
+      return rtn;
+    }
+  } else if (this.param && this.param.checkType && type === '') {
+    var trimed = item.trim();
+    if (trimed === ""){
+      return trimed;
+    }
+    if (!isNaN(trimed)) {
+      return parseFloat(trimed);
+    } else if (trimed.length === 5 && trimed.toLowerCase() === "false") {
+      return false;
+    } else if (trimed.length === 4 && trimed.toLowerCase() === "true") {
+      return true;
+    } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1]==="]") {
+      try {
+        return JSON.parse(trimed);
+      } catch (e) {
+        return item;
+      }
+    } else {
+      return item;
+    }
+  }
+  return item;
+};
+ 
+Parser.prototype.setParam = function(param) {
+  this.param = param;
+};
+ 
+Parser.prototype.test = function(str) {
+  return this.regExp && this.regExp.test(str);
+};
+ 
+Parser.prototype.parse = function(params) {
+  params.resultRow[params.head] = params.item;
+};
+ 
+Parser.prototype.getHeadStr = function() {
+  if (this.headStr) {
+    return this.headStr;
+  } else {
+    var head = this.head;
+    this.headStr = head.replace(this.regExp, '');
+    if (!this.headStr) {
+      this.headStr = "Unknown Header";
+    }
+    return this.getHeadStr();
+  }
+};
+ 
+Parser.prototype.getHead = function() {
+  return this.head;
+};
+ 
+Parser.prototype.initHead = function(columnTitle) {
+  this.head = columnTitle;
+  var wholeHead = columnTitle.replace(this.regExp, '');
+  //init type && headStr
+  var splitArr = wholeHead.split("#!");
+  if (splitArr.length === 1) { //no explicit type
+    this.headStr = splitArr[0];
+  } else {
+    var type = splitArr.shift();
+    if (explicitTypes.indexOf(type.toLowerCase()) > -1) {
+      this.type = type;
+      this.headStr = splitArr.join("#!");
+    } else { //no explicit type
+      this.headStr = wholeHead;
+    }
+  }
+  if (!this.headStr) {
+    this.headStr = wholeHead ? wholeHead : "Unknown Head";
+  }
+};
+ 
+Parser.prototype.clone = function() {
+  var obj = Object.create(this);
+  var newParser = new Parser();
+  for (var key in obj) {
+    newParser[key] = obj[key];
+  }
+  return newParser;
+};
+ 
+Parser.prototype.getName = function() {
+  return this.name;
+};
+ 
+module.exports = Parser;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/parserMgr.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/parserMgr.js.html new file mode 100644 index 0000000..14711c9 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/parserMgr.js.html @@ -0,0 +1,276 @@ + + + + Code coverage report for csv2json/libs/core/parserMgr.js + + + + + + + +
+
+

+ All files / csv2json/libs/core parserMgr.js +

+
+
+ 0% + Statements + 0/34 +
+
+ 0% + Branches + 0/14 +
+
+ 0% + Functions + 0/10 +
+
+ 0% + Lines + 0/34 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
//implementation
+var registeredParsers = [];
+var Parser = require("./parser.js");
+var defaultParser = require("./defaultParsers");
+ 
+function registerParser (parser) {
+  if (parser instanceof Parser && registeredParsers.indexOf(parser) === -1) {
+    registeredParsers.push(parser); // TODO indexOf doesn't work with object references
+  }
+}
+ 
+function getParser(columnTitle, param) {
+  var inst, parser;
+  function getParserByName(parserName) {
+    var parser;
+    registeredParsers.forEach(function(p){
+      if (p.getName() === parserName){
+        parser = p;
+      }
+    });
+    if (parser) {
+      var inst = parser.clone();
+      return inst;
+    }
+    return new Parser(); //TODO remove new
+  }
+  columnTitle = columnTitle ? columnTitle : '';
+  registeredParsers.forEach(function(p) {
+    if (p.test(columnTitle)) {
+      parser=p;
+    }
+  });
+  if (parser) {
+    inst = parser.clone();
+    inst.head = columnTitle;
+  } else {
+    inst = getParserByName("json", columnTitle);
+  }
+  inst.setParam(param);
+  inst.initHead(columnTitle);
+  return inst;
+}
+ 
+function addParser(name, regExp, parseFunc) {
+  var parser = new Parser(name, regExp, parseFunc,false); //TODO remove new
+  registerParser(parser);
+}
+ 
+function addSafeParser(parserPath) {
+  //TODO impl
+}
+ 
+function initParsers(row, param) {
+  var parsers = [];
+  row.forEach(function (columnTitle) {
+    parsers.push(getParser(columnTitle, param));
+  });
+  return parsers;
+}
+ 
+defaultParser.forEach(function (parserCfg){
+  //TODO refactor this
+  addParser(parserCfg.name, parserCfg.regExp, parserCfg.parserFunc, parserCfg.processSafe);
+});
+ 
+//module interfaces
+module.exports.addParser = addParser;
+module.exports.initParsers = initParsers;
+module.exports.getParser = getParser;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/rowSplit.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/rowSplit.js.html new file mode 100644 index 0000000..1ed13a4 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/rowSplit.js.html @@ -0,0 +1,462 @@ + + + + Code coverage report for csv2json/libs/core/rowSplit.js + + + + + + + +
+
+

+ All files / csv2json/libs/core rowSplit.js +

+
+
+ 0% + Statements + 0/70 +
+
+ 0% + Branches + 0/35 +
+
+ 0% + Functions + 0/5 +
+
+ 0% + Lines + 0/70 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var getDelimiter = require("./getDelimiter");
+var filterRow=require("./filterRow");
+/**
+ * Convert a line of string to csv columns according to its delimiter
+ * the param._header may not be ready when this is called.
+ * @param  {[type]} rowStr [description]
+ * @param  {[type]} param  [Converter param]
+ * @return {[type]}        {cols:["a","b","c"],closed:boolean} the closed field indicate if the row is a complete row
+ */
+module.exports = function rowSplit(rowStr, param) {
+  if (rowStr === "") {
+    return { cols: [], closed: true };
+  }
+  var quote = param.quote;
+  var trim = param.trim;
+  var escape = param.escape;
+  if (param.delimiter instanceof Array || param.delimiter.toLowerCase() === "auto") {
+    param.delimiter = getDelimiter(rowStr, param);
+  }
+  var delimiter = param.delimiter;
+  var rowArr = rowStr.split(delimiter);
+  if (quote === "off") {
+    return { cols: rowArr, closed: true };
+  }
+  var row = [];
+  var inquote = false;
+  var quoteBuff = '';
+  for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) {
+    var e = rowArr[i];
+    if (!inquote && trim) {
+      e = e.trim();
+    }
+    var len = e.length;
+    if (!inquote) {
+      if (isQuoteOpen(e, param)) { //quote open
+        e = e.substr(1);
+        if (isQuoteClose(e, param)) { //quote close
+          e = e.substring(0, e.length - 1);
+          e = _escapeQuote(e, quote, escape);
+          row.push(e);
+          continue;
+        } else {
+          inquote = true;
+          quoteBuff += e;
+          continue;
+        }
+      } else {
+        row.push(e);
+        continue;
+      }
+    } else { //previous quote not closed
+      if (isQuoteClose(e, param)) { //close double quote
+        inquote = false;
+        e = e.substr(0, len - 1);
+        quoteBuff += delimiter + e;
+        quoteBuff = _escapeQuote(quoteBuff, quote, escape);
+        if (trim) {
+          quoteBuff = quoteBuff.trimRight();
+        }
+        row.push(quoteBuff);
+        quoteBuff = "";
+      } else {
+        quoteBuff += delimiter + e;
+      }
+    }
+  }
+ 
+  if (!inquote && param._needFilterRow) {
+    row = filterRow(row, param);
+  }
+ 
+  return { cols: row, closed: !inquote };
+  // if (param.workerNum<=1){
+  // }else{
+  //   if (inquote && quoteBuff.length>0){//for multi core, quote will be closed at the end of line
+  //     quoteBuff=_escapeQuote(quoteBuff,quote,escape);;
+  //     if (trim){
+  //       quoteBuff=quoteBuff.trimRight();
+  //     }
+  //     row.push(quoteBuff);
+  //   }
+  //   return {cols:row,closed:true};
+  // }
+ 
+};
+ 
+ 
+ 
+function isQuoteOpen(str, param) {
+  var quote = param.quote;
+  var escape = param.escape;
+  return str[0] === quote && (
+    str[1] !== quote ||
+    str[1] === escape && (str[2] === quote || str.length === 2));
+}
+function isQuoteClose(str, param) {
+  var quote = param.quote;
+  var count = 0;
+  var idx = str.length - 1;
+  var escape = param.escape;
+  while (str[idx] === quote || str[idx] === escape) {
+    idx--;
+    count++;
+  }
+  return count % 2 !== 0;
+}
+ 
+function twoDoubleQuote(str, quote) {
+  var twoQuote = quote + quote;
+  var curIndex = -1;
+  while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
+    str = str.substring(0, curIndex) + str.substring(++curIndex);
+  }
+  return str;
+}
+ 
+var cachedRegExp = {};
+function _escapeQuote(segment, quote, escape) {
+ 
+  var key = "es|" + quote + "|" + escape;
+  if (cachedRegExp[key] === undefined) {
+ 
+    // if (escape === "\\") {
+    //   escape = "\\\\";
+    // }
+    cachedRegExp[key] = new RegExp('\\'+escape + '\\'+quote, 'g');
+  }
+  var regExp = cachedRegExp[key];
+  // console.log(regExp,segment);
+  return segment.replace(regExp, quote);
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/worker.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/worker.js.html new file mode 100644 index 0000000..e6c427c --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/worker.js.html @@ -0,0 +1,321 @@ + + + + Code coverage report for csv2json/libs/core/worker.js + + + + + + + +
+
+

+ All files / csv2json/libs/core worker.js +

+
+
+ 0% + Statements + 0/45 +
+
+ 0% + Branches + 0/13 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/45 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
var param = null;
+var fileLine = require("./fileline");
+var csvline = require("./csvline");
+var linesToJson = require("./linesToJson");
+var CSVError = require('./CSVError');
+var eom = "\x03";
+var eom1 = "\x0e";
+var eom2 = "\x0f";
+/**
+ * message is like :
+ * 0{"a":"b"}
+ * 13345|a,b,c
+ * <cmd><data>
+ * <cmd> is 0-9
+ */
+var buffer="";
+process.stdin.on("data", function(d) {
+  var str = d.toString("utf8");
+  var all = buffer + str;
+  var cmdArr = all.split(eom);
+  while (cmdArr.length > 1) {
+    processMsg(cmdArr.shift());
+  }
+  buffer = cmdArr[0];
+});
+ 
+process.on("message", processMsg);
+function processMsg(msg) {
+  if (msg) {
+    var cmd = msg[0];
+    var data = msg.substr(1);
+    switch (cmd) {
+      case "0":
+        initParams(data);
+        break;
+      case "1":
+        processData(data);
+        break;
+      default:
+        console.error("Unknown command: " + msg);
+    }
+  }
+}
+ 
+function initParams(data) {
+   param = JSON.parse(data);
+}
+ 
+/**
+ * e.g.
+ * 1023|a,b,c,d\ne,f,g,h\n
+ * <start line number>|<raw csv data>
+ */
+function processData(data) {
+  if (!param){
+    console.error("Parameter not initialised when processing data.");
+    process.exit(1);
+  }
+  var sepIdx = data.indexOf("|");
+  var startIdx = parseInt(data.substr(0, sepIdx));
+  var csvData = data.substr(sepIdx + 1);
+  var lines = fileLine(csvData,param); //convert to file lines.
+  // process.send("0"+lines.lines.length+"|"+lines.partial);
+  var csvLines = csvline(lines.lines,param);
+  var res = linesToJson(csvLines.lines,param,startIdx);
+  if (csvLines.partial) {
+    var lastIdx = res.length > 0 ? res[res.length - 1].index + 1 : startIdx;
+    res.push({
+      err:CSVError.unclosed_quote(lastIdx, csvLines.partial)
+    });
+  }
+  // console.error(res)
+  //1<line num>|^<row>|^err|^data|&<line num>|^<row>|^err|^data
+  var str="1";
+  res.forEach(function(item) {
+    var errStr = item.err ? item.err.toString() : "";
+    str += item.index + eom2 + JSON.stringify(item.row) + eom2 + errStr + eom2 + JSON.stringify(item.json) + eom1;
+  });
+  sendData(str);
+}
+ 
+function sendData(str) {
+  process.stdout.write(str + eom);
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/workerMgr.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/workerMgr.js.html new file mode 100644 index 0000000..6c74618 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/core/workerMgr.js.html @@ -0,0 +1,522 @@ + + + + Code coverage report for csv2json/libs/core/workerMgr.js + + + + + + + +
+
+

+ All files / csv2json/libs/core workerMgr.js +

+
+
+ 0% + Statements + 0/79 +
+
+ 0% + Branches + 0/18 +
+
+ 0% + Functions + 0/18 +
+
+ 0% + Lines + 0/79 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
module.exports = workerMgr;
+var eom = "\x03";
+var eom1 = "\x0e";
+var eom2 = "\x0f";
+var CSVError = require('./CSVError');
+function workerMgr() {
+  var spawn = require("child_process").spawn;
+  var exports = {
+    initWorker: initWorker,
+    sendWorker: sendWorker,
+    setParams: setParams,
+    drain: function(){},
+    isRunning: isRunning,
+    destroyWorker: destroyWorker
+  };
+  var workers = [];
+  var running = 0;
+  var waiting = null;
+  function initWorker(num, params) {
+    workers = [];
+    running = 0;
+    waiting = null;
+    for (var i = 0; i < num; i++) {
+      workers.push(new Worker(params));
+    }
+ 
+  }
+  function isRunning() {
+    return running > 0;
+  }
+  function destroyWorker() {
+    workers.forEach(function(w) {
+      w.destroy();
+    });
+  }
+ 
+  function sendWorker(data, startIdx, transformCb, cbResult) {
+    if (workers.length > 0) {
+      var worker = workers.shift();
+      running++;
+      worker.parse(data, startIdx, function(result) {
+        // var arr=JSON.parse(result);
+        // arr.forEach(function(item){
+        //   console.log('idx',item.index)
+        // })
+        workers.push(worker);
+        cbResult(result, startIdx);
+        running--;
+        if (waiting === null && running === 0) {
+          exports.drain();
+        } else if (waiting) {
+          sendWorker.apply(this, waiting);
+          waiting = null;
+        }
+      });
+      process.nextTick(transformCb);
+    } else {
+      waiting = [data, startIdx, transformCb, cbResult];
+    }
+  }
+ 
+  function setParams(params) {
+    workers.forEach(function(w) {
+      w.setParams(params);
+    });
+  }
+  return exports;
+}
+ 
+function Worker(params) {
+  var spawn = require("child_process").spawn;
+  this.cp = spawn(process.execPath, [__dirname + "/worker.js"], {
+    env: {
+      child:true
+    },
+    stdio:['pipe', 'pipe', 2, 'ipc']
+    // stdio:[0,1,2,'ipc']
+  });
+  this.setParams(params);
+  this.cp.on("message", this.onChildMsg.bind(this));
+  this.buffer = "";
+  var self = this;
+  this.cp.stdout.on("data", function(d) {
+    var str = d.toString("utf8");
+    var all = self.buffer + str;
+    var cmdArr = all.split(eom);
+    while (cmdArr.length > 1) {
+      self.onChildMsg(cmdArr.shift());
+    }
+    self.buffer = cmdArr[0];
+  });
+}
+ 
+Worker.prototype.setParams = function(params) {
+  var msg = "0" + JSON.stringify(params);
+  this.sendMsg(msg);
+};
+ 
+/**
+ * msg is like:
+ * <cmd><data>
+ * cmd is from 0-9
+ */
+Worker.prototype.onChildMsg = function(msg) {
+  if (msg) {
+    var cmd = msg[0];
+    var data = msg.substr(1);
+    switch (cmd) {
+      case "0": //total line number of current chunk
+        if (this.cbLine) {
+          var sp = data.split("|");
+          var len = parseInt(sp[0]);
+          var partial = sp[1];
+          this.cbLine(len, partial);
+        }
+        break;
+      case "1": // json array of current chunk
+        if (this.cbResult) {
+          var rows = data.split(eom1);
+          rows.pop();
+          var res = [];
+          rows.forEach(function(row) {
+            var sp = row.split(eom2);
+            res.push({
+              index: sp[0],
+              row: sp[1],
+              err: sp[2] ? CSVError.fromArray(JSON.parse(sp[2])) : null,
+              json: sp[3]
+            });
+          });
+          this.cbResult(res);
+        }
+        break;
+    }
+  }
+};
+ 
+Worker.prototype.parse = function(data, startIdx, cbResult) {
+  this.cbResult = cbResult;
+  var msg = "1" + startIdx + "|" + data;
+  this.sendMsg(msg);
+};
+ 
+Worker.prototype.destroy = function() {
+  this.cp.kill();
+};
+ 
+Worker.prototype.sendMsg = function(msg) {
+  this.cp.stdin.write(msg + eom, "utf8");
+  // this.cp.send(msg)
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/csv2json.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/csv2json.js.html new file mode 100644 index 0000000..5f3f0f8 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/csv2json.js.html @@ -0,0 +1,87 @@ + + + + Code coverage report for csv2json/libs/csv2json.js + + + + + + + +
+
+

+ All files / csv2json/libs csv2json.js +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
//deprecated but leave it for backward compatibility
+module.exports.core=require("./core");
+ 
+//live apis
+module.exports=require("./core");
+module.exports.interfaces = require("./interfaces");
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/index.html new file mode 100644 index 0000000..bf0ac5e --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for csv2json/libs + + + + + + + +
+
+

+ All files csv2json/libs +

+
+
+ 0% + Statements + 0/3 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
csv2json.js
0%0/3100%0/0100%0/00%0/3
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/index.html new file mode 100644 index 0000000..6b46db7 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/index.html @@ -0,0 +1,110 @@ + + + + Code coverage report for csv2json/libs/interfaces/cli + + + + + + + +
+
+

+ All files csv2json/libs/interfaces/cli +

+
+
+ 0% + Statements + 0/24 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/24 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/1100%0/0100%0/00%0/1
main.js
0%0/230%0/40%0/60%0/23
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/index.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/index.js.html new file mode 100644 index 0000000..28122bc --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/index.js.html @@ -0,0 +1,69 @@ + + + + Code coverage report for csv2json/libs/interfaces/cli/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/interfaces/cli index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 
module.exports = require("./main.js");
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/main.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/main.js.html new file mode 100644 index 0000000..109e272 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/cli/main.js.html @@ -0,0 +1,192 @@ + + + + Code coverage report for csv2json/libs/interfaces/cli/main.js + + + + + + + +
+
+

+ All files / csv2json/libs/interfaces/cli main.js +

+
+
+ 0% + Statements + 0/23 +
+
+ 0% + Branches + 0/4 +
+
+ 0% + Functions + 0/6 +
+
+ 0% + Lines + 0/23 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Convert input to process stdout
+ */
+ 
+//implementation
+var Converter = require("../../core/Converter.js");
+function _initConverter(){
+    var csvConverter = new Converter();
+    var started = false;
+    var writeStream = process.stdout;
+    csvConverter.on("record_parsed",function(rowJSON){
+        if (started){
+            writeStream.write(",\n");
+        }
+        writeStream.write(JSON.stringify(rowJSON));  //write parsed JSON object one by one.
+        if (started === false){
+            started = true;
+        }
+    });
+    writeStream.write("[\n"); //write array symbol
+ 
+    csvConverter.on("end_parsed",function(){
+        writeStream.write("\n]"); //end array symbol
+    });
+    csvConverter.on("error",function(err){
+        console.error(err);
+        process.exit(-1);
+    });
+    return csvConverter;
+}
+function convertFile(fileName){
+    var csvConverter=_initConverter();
+    csvConverter.from(fileName);
+}
+ 
+function convertString(csvString){
+    var csvConverter=_initConverter();
+    csvConverter.from(csvString);
+}
+//module interfaces
+module.exports.convertFile = convertFile;
+module.exports.convertString = convertString;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/index.html new file mode 100644 index 0000000..b079af9 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/index.html @@ -0,0 +1,97 @@ + + + + Code coverage report for csv2json/libs/interfaces + + + + + + + +
+
+

+ All files csv2json/libs/interfaces +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js
0%0/1100%0/0100%0/00%0/1
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/index.js.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/index.js.html new file mode 100644 index 0000000..70639f5 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/libs/interfaces/index.js.html @@ -0,0 +1,69 @@ + + + + Code coverage report for csv2json/libs/interfaces/index.js + + + + + + + +
+
+

+ All files / csv2json/libs/interfaces index.js +

+
+
+ 0% + Statements + 0/1 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 0% + Lines + 0/1 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 
module.exports.cli=require("./cli");
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/CSVError.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/CSVError.ts.html new file mode 100644 index 0000000..e81d6d2 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/CSVError.ts.html @@ -0,0 +1,138 @@ + + + + Code coverage report for csv2json/src/CSVError.ts + + + + + + + +
+
+

+ All files / csv2json/src CSVError.ts +

+
+
+ 88.24% + Statements + 15/17 +
+
+ 75% + Branches + 3/4 +
+
+ 66.67% + Functions + 4/6 +
+
+ 87.5% + Lines + 14/16 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +241x +1x +1x +2x +  +1x +4x +  +1x +  +  +  +6x +6x +6x +  +6x +6x +  +1x +  +  +1x + 
var util = require("util");
+export default class CSVError extends Error{
+  static column_mismatched(index:number, extra?:string){
+    return new CSVError("column_mismatched", index, extra);
+  }
+  static unclosed_quote(index:number, extra?:string){
+    return new CSVError("unclosed_quote", index, extra);
+  }
+  static fromArray(arr:any[]){
+    return new CSVError(arr[0],arr[1],arr[2]);
+  }
+  constructor(
+    public err:string,
+    public line:number,
+    public extra?: string
+  ){
+    super("Error: " + err + ". JSON Line number: " + line + (extra ? " near: " + extra : ""));
+    this.name="CSV Parse Error";
+  }
+  toString(){
+    return JSON.stringify([this.err, this.line, this.extra]);  
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Converter.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Converter.ts.html new file mode 100644 index 0000000..4ffaca3 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Converter.ts.html @@ -0,0 +1,636 @@ + + + + Code coverage report for csv2json/src/Converter.ts + + + + + + + +
+
+

+ All files / csv2json/src Converter.ts +

+
+
+ 94% + Statements + 94/100 +
+
+ 84.62% + Branches + 22/26 +
+
+ 96.43% + Functions + 27/28 +
+
+ 93.62% + Lines + 88/94 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +1901x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +1x +  +1x +1x +2x +  +1x +1x +  +1x +  +  +  +17x +  +  +  +  +17x +  +5x +5x +  +  +  +  +  +  +5x +5x +5x +5x +  +  +  +  +5x +  +1x +25x +25x +  +1x +16x +16x +16x +16x +37x +16x +  +21x +21x +21x +  +  +16x +  +49x +49x +49x +  +46x +46x +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +1x +165734x +  +1x +436312x +  +  +  +  +  +217x +73x +73x +73x +73x +73x +  +  +73x +  +73x +  +6x +6x +6x +  +  +  +  +73x +  +124x +124x +  +122x +70x +70x +  +  +  +122x +  +2x +2x +2x +2x +  +  +65x +65x +28x +28x +28x +  +28x +24x +  +  +  +28x +4x +  +24x +  +  +  +  +  +  +  +  +37x +  +  +1x +61x +61x +61x +  +1x +4x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Transform, TransformOptions, Readable } from "stream";
+import { CSVParseParam, mergeParams } from "./Parameters";
+import { ParseRuntime, initParseRuntime } from "./ParseRuntime";
+import P from "bluebird";
+import { Worker } from "./Worker";
+import { stringToLines } from "./fileline";
+import { map } from "lodash/map";
+import { RowSplit, RowSplitResult } from "./rowSplit";
+import getEol from "./getEol";
+import lineToJson, { JSONResult } from "./lineToJson";
+import { Processor, ProcessLineResult } from "./Processor";
+import { ProcessorFork } from "./ProcessFork";
+import { ProcessorLocal } from "./ProcessorLocal";
+import { Result } from "./Result";
+import CSVError from "./CSVError";
+import { bufFromString } from "./util";
+export class Converter extends Transform {
+  preRawData(onRawData: PreRawDataCallback) {
+    this.runtime.preRawDataHook = onRawData;
+  }
+  preFileLine(onFileLine: PreFileLineCallback) {
+    this.runtime.preFileLineHook = onFileLine;
+  }
+  subscribe(
+    onNext?: (data: any, lineNumber: number) => void | PromiseLike<void>,
+    onError?: (err: CSVError) => void,
+    onCompleted?: () => void): Converter {
+    this.parseRuntime.subscribe = {
+      onNext,
+      onError,
+      onCompleted
+    }
+    return this;
+  }
+  fromFile(filePath: string, options?: string | CreateReadStreamOption | undefined): Converter {
+    const fs = require("fs");
+    // var rs = null;
+    // this.wrapCallback(cb, function () {
+    //   if (rs && rs.destroy) {
+    //     rs.destroy();
+    //   }
+    // });
+    fs.exists(filePath, (exist) => {
+      Eif (exist) {
+        const rs = fs.createReadStream(filePath, options);
+        rs.pipe(this);
+      } else {
+        this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct."));
+      }
+    });
+    return this;
+  }
+  fromStream(readStream: Readable): Converter {
+    readStream.pipe(this);
+    return this;
+  }
+  fromString(csvString: string): Converter {
+    const csv = csvString.toString();
+    const read = new Readable();
+    let idx = 0;
+    read._read = function (size) {
+      if (idx >= csvString.length) {
+        this.push(null);
+      } else {
+        const str = csvString.substr(idx, size);
+        this.push(str);
+        idx += size;
+      }
+    }
+    return this.fromStream(read);
+  }
+  then<TResult1 = any[], TResult2 = never>(onfulfilled?: (value: any[]) => TResult1 | PromiseLike<TResult1>, onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>): PromiseLike<TResult1 | TResult2> {
+    return new P((resolve, reject) => {
+      this.parseRuntime.then = {
+        onfulfilled: (value: any[]) => {
+          Eif (onfulfilled) {
+            resolve(onfulfilled(value));
+          } else {
+            resolve(value as any);
+          }
+        },
+        onrejected: (err: Error) => {
+          Eif (onrejected) {
+            resolve(onrejected(err));
+          } else {
+            reject(err);
+          }
+        }
+      }
+    });
+  }
+  public get parseParam(): CSVParseParam {
+    return this.params;
+  }
+  public get parseRuntime(): ParseRuntime {
+    return this.runtime;
+  }
+  private params: CSVParseParam;
+  private runtime: ParseRuntime;
+  private processor: Processor;
+  private result: Result;
+  constructor(param?: Partial<CSVParseParam>, public options: TransformOptions = {}) {
+    super(options);
+    this.params = mergeParams(param);
+    this.runtime = initParseRuntime(this);
+    this.result = new Result(this);
+    Iif (this.params.fork) {
+      this.processor = new ProcessorFork(this);
+    } else {
+      this.processor = new ProcessorLocal(this);
+    }
+    this.once("error", (err: any) => {
+      // console.log("BBB");
+      this.result.processError(err);
+      setTimeout(() => {
+        this.emit("done", err);
+      },0);
+ 
+    });
+ 
+    return this;
+  }
+  _transform(chunk: any, encoding: string, cb: Function) {
+    this.processor.process(chunk)
+      .then((result) => {
+        if (result.length > 0) {
+          this.runtime.started = true;
+          return this.result.processResult(result);
+        }
+      })
+      .then(() => {
+        cb();
+      }, (error) => {
+        this.runtime.hasError = true;
+        this.runtime.error = error;
+        this.emit("error", error);
+        cb();
+      });
+  }
+  _flush(cb: Function) {
+    if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
+      const buf = this.runtime.csvLineBuffer;
+      this.runtime.csvLineBuffer = undefined;
+      this.processor.process(buf, true)
+        .then((result) => {
+          if (result.length > 0) {
+            return this.result.processResult(result);
+          }
+        })
+        .then(() => {
+          if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) {
+            this.emit("error", CSVError.unclosed_quote(this.parsedLineNumber, this.runtime.csvLineBuffer.toString()));
+          } else {
+            this.processEnd(cb);
+          }
+          // cb();
+ 
+        }, (err) => {
+          this.emit("error", err);
+          cb();
+        })
+    } else {
+      this.processEnd(cb);
+    }
+  }
+  private processEnd(cb) {
+    this.result.endProcess();
+    this.emit("done");
+    cb();
+  }
+  get parsedLineNumber(): number {
+    return this.runtime.parsedLineNumber;
+  }
+}
+export interface CreateReadStreamOption {
+  flags?: string;
+  encoding?: string;
+  fd?: number;
+  mode?: number;
+  autoClose?: boolean;
+  start?: number;
+  end?: number;
+  highWaterMark?: number;
+}
+export type CallBack = (err: Error, data: Array<any>) => void;
+ 
+ 
+export type PreFileLineCallback = (line: string, lineNumber: number) => string | PromiseLike<string>;
+export type PreRawDataCallback = (csvString: string) => string | PromiseLike<string>;
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Processor.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Processor.ts.html new file mode 100644 index 0000000..a690d42 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Processor.ts.html @@ -0,0 +1,117 @@ + + + + Code coverage report for csv2json/src/Processor.ts + + + + + + + +
+
+

+ All files / csv2json/src Processor.ts +

+
+
+ 100% + Statements + 6/6 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17  +  +  +  +  +  +1x +  +  +75x +75x +75x +  +  +1x +  + 
import { Converter } from "./Converter";
+import P from "bluebird";
+import { JSONResult } from "./lineToJson";
+import { CSVParseParam } from "./Parameters";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+export abstract class Processor {
+  protected params: CSVParseParam;
+  protected runtime: ParseRuntime;
+  constructor(protected converter: Converter) {
+    this.params = converter.parseParam;
+    this.runtime = converter.parseRuntime;
+  }
+  abstract process(chunk: Buffer,finalChunk?:boolean): P<ProcessLineResult[]>
+}
+export type ProcessLineResult = string | string[] | JSONResult;
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/ProcessorLocal.test.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/ProcessorLocal.test.ts.html new file mode 100644 index 0000000..d34e56b --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/ProcessorLocal.test.ts.html @@ -0,0 +1,153 @@ + + + + Code coverage report for csv2json/src/ProcessorLocal.test.ts + + + + + + + +
+
+

+ All files / csv2json/src ProcessorLocal.test.ts +

+
+
+ 100% + Statements + 23/23 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 3/3 +
+
+ 100% + Lines + 21/21 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +291x +1x +  +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +1x +  +1x +1x +1x +1x +  +1x +  +  +  + 
import {ProcessorLocal} from "./ProcessorLocal";
+import { Converter } from "./Converter";
+import P from "bluebird";
+import {readFileSync} from "fs";
+import path from "path";
+import assert from "assert";
+import { JSONResult } from "./lineToJson";
+const dataDir=path.join(__dirname,"../test/data/");
+describe("ProcessLocal",()=>{
+  it ("should process csv chunks and output json",async function (){
+    const processor=new ProcessorLocal(new Converter());
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    const lines=await processor.process(data);
+    assert(lines.length === 2);
+    const line0=lines[0] as JSONResult;
+    assert.equal(line0.fieldA.title,"Food Factory");
+    assert.equal(line0.fieldA.children.length,2);
+    assert.equal(line0.fieldA.children[1].employee[0].name,"Tim");
+  })
+  it ("should process csv chunks and output csv rows",async function (){
+    const processor=new ProcessorLocal(new Converter({output:"line"}));
+    const data=readFileSync(dataDir+"/complexJSONCSV");
+    const lines=await processor.process(data);
+    
+    assert(lines.length === 2);
+  })
+})
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/ProcessorLocal.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/ProcessorLocal.ts.html new file mode 100644 index 0000000..2a75d8f --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/ProcessorLocal.ts.html @@ -0,0 +1,810 @@ + + + + Code coverage report for csv2json/src/ProcessorLocal.ts + + + + + + + +
+
+

+ All files / csv2json/src ProcessorLocal.ts +

+
+
+ 93.75% + Statements + 135/144 +
+
+ 87.5% + Branches + 77/88 +
+
+ 94.12% + Functions + 16/17 +
+
+ 93.43% + Lines + 128/137 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +2481x +1x +1x +1x +1x +1x +1x +1x +  +  +75x +75x +75x +75x +1x +154x +68x +  +154x +  +75x +75x +1x +67x +67x +  +67x +  +  +280x +  +154x +28x +  +126x +  +  +154x +  +154x +4x +  +150x +  +  +  +154x +154x +  +  +  +  +  +154x +154x +154x +154x +105x +  +154x +2x +2x +  +  +154x +1x +  +154x +154x +126x +  +28x +28x +  +154x +106x +106x +1x +  +105x +  +106x +106x +  +  +68x +  +38x +  +  +  +  +  +  +48x +  +  +  +1x +68x +8x +4x +  +4x +  +  +60x +60x +60x +60x +60x +60x +59x +59x +59x +  +1x +  +  +60x +  +60x +1x +  +59x +2x +  +57x +  +  +67x +4x +  +67x +4x +4x +  +67x +  +1x +4x +4x +4x +4x +22x +5x +1x +  +  +1x +  +  +4x +  +17x +17x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +1x +105x +1x +  +104x +104x +104x +2x +  +102x +  +  +  +  +  +  +  +  +  +1x +290x +290x +138x +  +152x +  +  +  +  +1x +1x +1x +1x +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +1x +1x +  +1x +  +  +  +  +  + 
import { Processor, ProcessLineResult } from "./Processor";
+import P from "bluebird";
+import { prepareData } from "./dataClean";
+import getEol from "./getEol";
+import { stringToLines } from "./fileline";
+import { bufFromString, filterArray } from "./util";
+import { RowSplit } from "./rowSplit";
+import lineToJson from "./lineToJson";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+export class ProcessorLocal extends Processor {
+  private rowSplit: RowSplit = new RowSplit(this.converter);
+  private eolEmitted = false;
+  private _needEmitEol?: boolean = undefined;
+  private get needEmitEol() {
+    if (this._needEmitEol === undefined) {
+      this._needEmitEol = this.converter.listeners("eol").length > 0;
+    }
+    return this._needEmitEol;
+  }
+  private headEmitted = false;
+  private _needEmitHead?: boolean = undefined;
+  private get needEmitHead() {
+    Eif (this._needEmitHead === undefined) {
+      this._needEmitHead = this.converter.listeners("header").length > 0;
+    }
+    return this._needEmitHead;
+ 
+  }
+  process(chunk: Buffer, finalChunk = false): P<ProcessLineResult[]> {
+    let csvString: string;
+    if (finalChunk) {
+      csvString = chunk.toString();
+    } else {
+      csvString = prepareData(chunk, this.converter.parseRuntime);
+ 
+    }
+    return P.resolve()
+      .then(() => {
+        if (this.runtime.preRawDataHook) {
+          return this.runtime.preRawDataHook(csvString);
+        } else {
+          return csvString;
+        }
+      })
+      .then((csv) => {
+        Eif (csv && csv.length > 0) {
+          return this.processCSV(csv, finalChunk);
+        } else {
+          return P.resolve([]);
+        }
+      })
+  }
+  private processCSV(csv: string, finalChunk: boolean): P<ProcessLineResult[]> {
+    const params = this.params;
+    const runtime = this.runtime;
+    if (!runtime.eol) {
+      getEol(csv, runtime);
+    }
+    if (this.needEmitEol && !this.eolEmitted && runtime.eol) {
+      this.converter.emit("eol", runtime.eol);
+      this.eolEmitted = true;
+    }
+    // trim csv file has initial blank lines.
+    if (params.ignoreEmpty && !runtime.started) {
+      csv = csv.trimLeft();
+    }
+    const stringToLineResult = stringToLines(csv, runtime);
+    if (!finalChunk) {
+      this.prependLeftBuf(bufFromString(stringToLineResult.partial));
+    } else {
+      stringToLineResult.lines.push(stringToLineResult.partial);
+      stringToLineResult.partial = "";
+    }
+    if (stringToLineResult.lines.length > 0) {
+      let prom: P<string[]>;
+      if (runtime.preFileLineHook) {
+        prom = this.runPreLineHook(stringToLineResult.lines);
+      } else {
+        prom = P.resolve(stringToLineResult.lines);
+      }
+      return prom.then((lines) => {
+        if (!runtime.started
+          && !this.runtime.headers
+        ) {
+          return this.processDataWithHead(lines);
+        } else {
+          return this.processCSVBody(lines);
+        }
+ 
+      })
+ 
+    } else {
+ 
+      return P.resolve([]);
+    }
+ 
+  }
+  private processDataWithHead(lines: string[]): ProcessLineResult[] {
+    if (this.params.noheader) {
+      if (this.params.headers) {
+        this.runtime.headers = this.params.headers;
+      } else {
+        this.runtime.headers = [];
+      }
+    } else {
+      let left = "";
+      let headerRow: string[] = [];
+      while (lines.length) {
+        const line = left + lines.shift();
+        const row = this.rowSplit.parse(line);
+        if (row.closed) {
+          headerRow = row.cells;
+          left = "";
+          break;
+        } else {
+          left = line + getEol(line, this.runtime);
+        }
+      }
+      this.prependLeftBuf(bufFromString(left));
+ 
+      if (headerRow.length === 0) {
+        return [];
+      }
+      if (this.params.headers) {
+        this.runtime.headers = this.params.headers;
+      } else {
+        this.runtime.headers = headerRow;
+      }
+    }
+    if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) {
+      this.filterHeader();
+    }
+    if (this.needEmitHead && !this.headEmitted) {
+      this.converter.emit("header", this.runtime.headers);
+      this.headEmitted = true;
+    }
+    return this.processCSVBody(lines);
+  }
+  private filterHeader() {
+    this.runtime.selectedColumns = [];
+    Eif (this.runtime.headers) {
+      const headers = this.runtime.headers;
+      for (let i = 0; i < headers.length; i++) {
+        if (this.params.ignoreColumns) {
+          if (this.params.ignoreColumns.test(headers[i])) {
+            Iif (this.params.includeColumns && this.params.includeColumns.test(headers[i])) {
+              this.runtime.selectedColumns.push(i);
+            } else {
+              continue;
+            }
+          } else {
+            this.runtime.selectedColumns.push(i);
+          }
+        } else Eif (this.params.includeColumns) {
+          if (this.params.includeColumns.test(headers[i])) {
+            this.runtime.selectedColumns.push(i);
+          }
+        } else {
+          this.runtime.selectedColumns.push(i);
+        }
+        // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){
+        //   this.runtime.selectedColumns.push(i);
+        // }else{
+        //   if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){
+        //     continue;
+        //   }else{
+        //     if (this.params.ignoreColumns && !this.params.includeColumns){
+        //       this.runtime.selectedColumns.push(i);
+        //     }
+ 
+        //   }
+        // }
+      }
+      this.runtime.headers = filterArray(this.runtime.headers, this.runtime.selectedColumns);
+    }
+ 
+  }
+  private processCSVBody(lines: string[]): ProcessLineResult[] {
+    if (this.params.output === "line") {
+      return lines;
+    } else {
+      const result = this.rowSplit.parseMultiLines(lines);
+      this.prependLeftBuf(bufFromString(result.partial));
+      if (this.params.output === "csv") {
+        return result.rowsCells;
+      } else {
+        return lineToJson(result.rowsCells, this.converter);
+      }
+    }
+ 
+    // var jsonArr = linesToJson(lines.lines, params, this.recordNum);
+    // this.processResult(jsonArr);
+    // this.lastIndex += jsonArr.length;
+    // this.recordNum += jsonArr.length;
+  }
+ 
+  private prependLeftBuf(buf: Buffer) {
+    Eif (buf) {
+      if (this.runtime.csvLineBuffer) {
+        this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]);
+      } else {
+        this.runtime.csvLineBuffer = buf;
+      }
+    }
+ 
+  }
+  private runPreLineHook(lines: string[]): P<string[]> {
+    return new P((resolve,reject)=>{
+      processLineHook(lines,this.runtime,0,(err)=>{
+        Iif (err){
+          reject(err);
+        }else{
+          resolve(lines);
+        }
+      })
+    });
+  }
+}
+ 
+function processLineHook(lines: string[], runtime: ParseRuntime, offset: number,
+  cb: (err?) => void
+) {
+  Iif (lines.length === 0) {
+    cb();
+  } else {
+    Eif (runtime.preFileLineHook) {
+      const line = lines[offset];
+      const res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset);
+      offset++;
+      Iif (res && (res as PromiseLike<string>).then) {
+        (res as PromiseLike<string>).then((value) => {
+          lines[offset - 1] = value;
+          processLineHook(lines, runtime, offset, cb);
+        });
+      } else {
+        lines[offset - 1] = res as string;
+        while (offset < lines.length) {
+          lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset) as string;
+          offset++;
+        }
+        cb();
+      }
+    } else {
+      cb();
+    }
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Result.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Result.ts.html new file mode 100644 index 0000000..cf31273 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Result.ts.html @@ -0,0 +1,516 @@ + + + + Code coverage report for csv2json/src/Result.ts + + + + + + + +
+
+

+ All files / csv2json/src Result.ts +

+
+
+ 87.32% + Statements + 62/71 +
+
+ 79.25% + Branches + 42/53 +
+
+ 86.67% + Functions + 13/15 +
+
+ 86.96% + Lines + 60/69 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150  +  +1x +  +  +1x +1x +94x +  +  +1x +102x +63x +  +102x +  +1x +155x +  +73x +73x +94x +94x +  +94x +94x +31x +  +  +  +  +  +31x +  +  +31x +31x +  +  +  +  +63x +63x +  +  +  +1x +94x +73x +  +94x +  +1x +6x +  +  +6x +2x +  +  +1x +61x +46x +46x +  +  +61x +  +  +  +1x +  +  +  +  +  +  +  +  +  +31x +  +  +31x +23x +23x +23x +23x +  +23x +  +  +  +  +  +23x +1x +  +23x +10592x +10592x +10592x +10592x +1x +  +  +23x +  +  +  +  +  +  +  +  +  +8x +8x +10584x +10584x +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10586x +10584x +  +2x +  + 
import { Converter } from "./Converter";
+import { ProcessLineResult } from "./Processor";
+import P from "bluebird";
+import CSVError from "./CSVError";
+ 
+export class Result {
+  private get needEmitLine(): boolean {
+    return !!this.converter.parseRuntime.subscribe && !!this.converter.parseRuntime.subscribe.onNext || this.needPushDownstream
+  }
+  private _needPushDownstream?: boolean;
+  private get needPushDownstream(): boolean {
+    if (this._needPushDownstream === undefined) {
+      this._needPushDownstream = this.converter.listeners("data").length > 0 || this.converter.listeners("readable").length > 0;
+    }
+    return this._needPushDownstream;
+  }
+  private get needEmitAll(): boolean {
+    return !!this.converter.parseRuntime.then;
+  }
+  private finalResult: any[] = [];
+  constructor(private converter: Converter) { }
+  processResult(resultLines: ProcessLineResult[]): P<any> {
+    const startPos = this.converter.parseRuntime.parsedLineNumber;
+    // let prom: P<any>;
+    return new P((resolve, reject) => {
+      if (this.needEmitLine) {
+        processLineByLine(
+          resultLines,
+          this.converter,
+          0,
+          this.needPushDownstream,
+          (err) => {
+            Iif (err) {
+              reject(err);
+            } else {
+              this.appendFinalResult(resultLines);
+              resolve();
+            }
+          },
+        )
+      } else {
+        this.appendFinalResult(resultLines);
+        resolve();
+      }
+    })
+  }
+  appendFinalResult(lines: any[]) {
+    if (this.needEmitAll) {
+      this.finalResult = this.finalResult.concat(lines);
+    }
+    this.converter.parseRuntime.parsedLineNumber += lines.length;
+  }
+  processError(err: CSVError) {
+    Iif (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onError) {
+      this.converter.parseRuntime.subscribe.onError(err);
+    }
+    if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onrejected) {
+      this.converter.parseRuntime.then.onrejected(err);
+    }
+  }
+  endProcess() {
+    if (this.needEmitAll) {
+      Eif (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onfulfilled) {
+        this.converter.parseRuntime.then.onfulfilled(this.finalResult);
+      }
+    }
+    Iif (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onCompleted) {
+      this.converter.parseRuntime.subscribe.onCompleted();
+    }
+  }
+}
+ 
+function processLineByLine(
+  lines: ProcessLineResult[],
+ 
+  conv: Converter,
+  offset: number,
+  needPushDownstream: boolean,
+  cb: (err?) => void,
+) {
+  Iif (lines.length === 0) {
+    cb();
+  } else {
+    if (conv.parseRuntime.subscribe && conv.parseRuntime.subscribe.onNext) {
+      const hook = conv.parseRuntime.subscribe.onNext;
+      const nextLine = lines[offset];
+      const res = hook(nextLine, conv.parseRuntime.parsedLineNumber + offset);
+      offset++;
+      // if (isAsync === undefined) {
+      Iif (res && res.then) {
+        res.then(function () {
+          processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine);
+        }, cb);
+      } else {
+        // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false);
+        if (needPushDownstream){
+          pushDownstream(conv,nextLine);
+        }
+        while (offset<lines.length){
+          const line=lines[offset];
+          hook(line, conv.parseRuntime.parsedLineNumber + offset);
+          offset++;
+          if (needPushDownstream){
+            pushDownstream(conv,line);
+          }
+        }
+        cb();
+      }
+      // } else if (isAsync === true) {
+      //   (res as PromiseLike<void>).then(function () {
+      //     processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, true);
+      //   }, cb);
+      // } else if (isAsync === false) {
+      //   processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false);
+      // }
+    } else {
+      Eif (needPushDownstream) {
+        while (offset<lines.length) {
+          const line = lines[offset++];
+          pushDownstream(conv, line);
+        }
+        
+      }
+      cb();
+    }
+ 
+  }
+}
+ 
+function processRecursive(
+  lines: ProcessLineResult[],
+  hook: (data: any, lineNumber: number) => void | PromiseLike<void>,
+  conv: Converter,
+  offset: number,
+  needPushDownstream: boolean,
+  cb: (err?) => void,
+  res: ProcessLineResult,
+) {
+  if (needPushDownstream) {
+    pushDownstream(conv, res);
+  }
+  processLineByLine(lines, conv, offset, needPushDownstream, cb);
+}
+function pushDownstream(conv: Converter, res: ProcessLineResult) {
+  if (typeof res === "object" && !conv.options.objectMode) {
+    conv.push(JSON.stringify(res) + "\n", "utf8");
+  } else {
+    conv.push(res);
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Worker.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Worker.ts.html new file mode 100644 index 0000000..ea06d33 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/Worker.ts.html @@ -0,0 +1,87 @@ + + + + Code coverage report for csv2json/src/Worker.ts + + + + + + + +
+
+

+ All files / csv2json/src Worker.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/1 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
import { Converter } from "./Converter";
+ 
+export class Worker {
+  constructor(converter: Converter) {
+ 
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/dataClean.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/dataClean.ts.html new file mode 100644 index 0000000..2f24af7 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/dataClean.ts.html @@ -0,0 +1,255 @@ + + + + Code coverage report for csv2json/src/dataClean.ts + + + + + + + +
+
+

+ All files / csv2json/src dataClean.ts +

+
+
+ 100% + Statements + 7/7 +
+
+ 75% + Branches + 3/4 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 7/7 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +1x +126x +126x +  +126x +  +  +  +  +  +126x +  +  +  +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +126x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+import stripBom from "strip-bom";
+/**
+ * For each data chunk coming to parser:
+ * 1. append the data to the buffer that is left from last chunk
+ * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer.
+ * 3. stripBom 
+ */
+export function prepareData(chunk: Buffer, runtime: ParseRuntime): string {
+  const workChunk = concatLeftChunk(chunk, runtime);
+  runtime.csvLineBuffer = undefined;
+  const cleanCSVString = cleanUtf8Split(workChunk, runtime).toString("utf8");
+  if (runtime.started === false) {
+    return stripBom(cleanCSVString);
+  } else {
+    return cleanCSVString;
+  }
+}I
+/**
+ *  append data to buffer that is left form last chunk
+ */
+function concatLeftChunk(chunk: Buffer, runtime: ParseRuntime): Buffer {
+  if (runtime.csvLineBuffer && runtime.csvLineBuffer.length > 0) {
+    return Buffer.concat([runtime.csvLineBuffer, chunk]);
+  } else {
+    return chunk;
+  }
+}
+/**
+ * check if utf8 chars being split, if does, stripe the bytes and add to left buffer.
+ */
+function cleanUtf8Split(chunk: Buffer, runtime: ParseRuntime): Buffer {
+  let idx = chunk.length - 1;
+  /**
+   * From Keyang:
+   * The code below is to check if a single utf8 char (which could be multiple bytes) being split.
+   * If the char being split, the buffer from two chunk needs to be concat
+   * check how utf8 being encoded to understand the code below. 
+   * If anyone has any better way to do this, please let me know.
+   */
+  if ((chunk[idx] & 1 << 7) != 0) {
+    while ((chunk[idx] & 3 << 6) === 128) {
+      idx--;
+    }
+    idx--;
+  }
+  if (idx != chunk.length - 1) {
+    runtime.csvLineBuffer = chunk.slice(idx + 1);
+    return chunk.slice(0, idx + 1)
+    // var _cb=cb;
+    // var self=this;
+    // cb=function(){
+    //   if (self._csvLineBuffer){
+    //     self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]);
+    //   }else{
+    //     self._csvLineBuffer=left;
+    //   }
+    //   _cb();
+    // }
+  } else {
+    return chunk;
+  }
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/fileline.test.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/fileline.test.ts.html new file mode 100644 index 0000000..9267070 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/fileline.test.ts.html @@ -0,0 +1,111 @@ + + + + Code coverage report for csv2json/src/fileline.test.ts + + + + + + + +
+
+

+ All files / csv2json/src fileline.test.ts +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 4/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15  +  +1x +  +  +1x +1x +1x +  +  +  +  +  +  + 
import {stringToLines} from "./fileline";
+import { mergeParams } from "./Parameters";
+import { Converter } from "./Converter";
+var assert = require("assert");
+describe("fileline function", function() {
+  it ("should convert data to multiple lines ", function() {
+    const conv=new Converter();
+    var data = "abcde\nefef";
+    var result = stringToLines(data, conv.parseRuntime);
+    assert.equal(result.lines.length, 1);
+    assert.equal(result.partial, "efef");
+    assert.equal(result.lines[0], "abcde");
+  });
+});
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/fileline.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/fileline.ts.html new file mode 100644 index 0000000..6ccf935 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/fileline.ts.html @@ -0,0 +1,141 @@ + + + + Code coverage report for csv2json/src/fileline.ts + + + + + + + +
+
+

+ All files / csv2json/src fileline.ts +

+
+
+ 100% + Statements + 2/2 +
+
+ 100% + Branches + 2/2 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 2/2 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+import getEol from "./getEol";
+// const getEol = require("./getEol");
+/**
+ * convert data chunk to file lines array
+ * @param  {string} data  data chunk as utf8 string
+ * @param  {object} param Converter param object
+ * @return {Object}   {lines:[line1,line2...],partial:String}
+ */
+export function stringToLines(data: string, param: ParseRuntime): StringToLinesResult {
+  const eol = getEol(data, param);
+  const lines = data.split(eol);
+  const partial = lines.pop() || "";
+  return { lines: lines, partial: partial };
+};
+ 
+ 
+export interface StringToLinesResult {
+  lines: Fileline[],
+  /**
+   * last line which could be incomplete line.
+   */
+  partial: string
+}
+export type Fileline = string;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/getEol.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/getEol.ts.html new file mode 100644 index 0000000..34d12c3 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/getEol.ts.html @@ -0,0 +1,132 @@ + + + + Code coverage report for csv2json/src/getEol.ts + + + + + + + +
+
+

+ All files / csv2json/src getEol.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 3/3 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { ParseRuntime } from "./ParseRuntime";
+//return first eol found from a data chunk.
+export default function (data: string, param: ParseRuntime): string {
+  if (!param.eol && data) {
+    for (var i = 0, len = data.length; i < len; i++) {
+      if (data[i] === "\r") {
+        if (data[i + 1] === "\n") {
+          param.eol = "\r\n";
+          break;
+        } else if (data[i + 1]) {
+          param.eol = "\r";
+          break;
+        } 
+      } else if (data[i] === "\n") {
+        param.eol = "\n";
+        break;
+      }
+    }
+  }
+  return param.eol || "\n";
+};
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/index.html new file mode 100644 index 0000000..9ec653e --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/index.html @@ -0,0 +1,305 @@ + + + + Code coverage report for csv2json/src + + + + + + + +
+
+

+ All files csv2json/src +

+
+
+ 93.69% + Statements + 594/634 +
+
+ 86.56% + Branches + 277/320 +
+
+ 91% + Functions + 91/100 +
+
+ 93.47% + Lines + 573/613 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
CSVError.ts
88.24%15/1775%3/466.67%4/687.5%14/16
Converter.ts
94%94/10084.62%22/2696.43%27/2893.62%88/94
Processor.ts
100%6/6100%0/0100%2/2100%5/5
ProcessorLocal.test.ts
100%23/23100%0/0100%3/3100%21/21
ProcessorLocal.ts
93.75%135/14487.5%77/8894.12%16/1793.43%128/137
Result.ts
87.32%62/7179.25%42/5386.67%13/1586.96%60/69
Worker.ts
0%0/00%0/00%0/10%0/0
dataClean.ts
100%7/775%3/4100%1/1100%7/7
fileline.test.ts
100%4/4100%0/0100%0/0100%4/4
fileline.ts
100%2/2100%2/2100%0/0100%2/2
getEol.ts
0%0/00%3/30%0/00%0/0
index.ts
100%5/5100%0/0100%1/1100%5/5
lineToJson.ts
91.92%91/9986.75%72/8392.86%13/1491.92%91/99
rowSplit.test.ts
100%31/31100%0/0100%0/0100%31/31
rowSplit.ts
95.08%116/12294.55%52/5591.67%11/1295.04%115/121
test.ts
0%0/00%0/00%0/00%0/0
util.ts
100%3/350%1/2100%0/0100%2/2
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/index.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/index.ts.html new file mode 100644 index 0000000..cded391 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/index.ts.html @@ -0,0 +1,93 @@ + + + + Code coverage report for csv2json/src/index.ts + + + + + + + +
+
+

+ All files / csv2json/src index.ts +

+
+
+ 100% + Statements + 5/5 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 1/1 +
+
+ 100% + Lines + 5/5 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9  +  +1x +1x +15x +  +  +1x +1x
import { TransformOptions } from "stream";
+import { CSVParseParam } from "./Parameters";
+import { Converter } from "./Converter";
+const helper = function (param?: Partial<CSVParseParam>, options?: TransformOptions): Converter {
+  return new Converter(param, options);
+}
+ 
+helper["Converter"] = Converter;
+export =helper;
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/lineToJson.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/lineToJson.ts.html new file mode 100644 index 0000000..97c8753 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/lineToJson.ts.html @@ -0,0 +1,660 @@ + + + + Code coverage report for csv2json/src/lineToJson.ts + + + + + + + +
+
+

+ All files / csv2json/src lineToJson.ts +

+
+
+ 91.92% + Statements + 91/99 +
+
+ 86.75% + Branches + 72/83 +
+
+ 92.86% + Functions + 13/14 +
+
+ 91.92% + Lines + 91/99 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198  +1x +  +1x +  +  +1x +  +1x +102x +102x +32101x +32099x +32090x +  +  +100x +  +  +  +  +  +  +  +32101x +2x +  +  +32099x +32099x +32099x +32090x +  +9x +  +  +  +  +32099x +32099x +  +32099x +65788x +  +65788x +7x +  +65781x +  +65781x +65781x +50x +  +65781x +65781x +6x +6x +6x +  +  +  +  +  +  +65775x +75x +75x +  +65775x +65775x +  +  +  +32099x +32090x +  +9x +  +  +  +1x +  +  +  +  +  +65781x +65243x +  +538x +538x +533x +  +5x +1x +  +5x +4x +4x +4x +4x +  +  +  +1x +1x +  +  +  +  +  +  +65781x +538x +3x +  +535x +103x +1x +  +102x +  +  +432x +  +  +  +65781x +  +  +  +  +64992x +  +  +789x +  +  +  +  +75x +9x +66x +  +66x +  +66x +66x +  +  +  +  +  +  +13x +13x +  +  +13x +  +  +  +60x +  +  +  +75x +75x +13x +  +62x +13x +49x +2x +47x +5x +  +42x +  +  +  +  +2x +2x +  +  +2x +  +  +  +  +5x +5x +  +  +  +  + 
import { Converter } from "./Converter";
+import CSVError from "./CSVError";
+import { CellParser, ColumnParam } from "./Parameters";
+import set from "lodash/set";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+ 
+export default function (csvRows: string[][], conv: Converter): JSONResult[] {
+  const res: JSONResult[] = [];
+  for (let i = 0, len = csvRows.length; i < len; i++) {
+    const r = processRow(csvRows[i], conv, i);
+    if (r) {
+      res.push(r);
+    }
+  }
+  return res;
+};
+export type JSONResult = {
+  [key: string]: any
+}
+ 
+function processRow(row: string[], conv: Converter, index): JSONResult | null {
+ 
+  if (conv.parseParam.checkColumn && conv.parseRuntime.headers && row.length !== conv.parseRuntime.headers.length) {
+    throw (CSVError.column_mismatched(conv.parseRuntime.parsedLineNumber + index))
+  }
+ 
+  const headRow = conv.parseRuntime.headers || [];
+  const resultRow = convertRowToJson(row, headRow, conv);
+  if (resultRow) {
+    return resultRow;
+  } else {
+    return null;
+  }
+}
+ 
+function convertRowToJson(row: string[], headRow: string[], conv: Converter): { [key: string]: any } | null {
+  let hasValue = false;
+  const resultRow = {};
+  
+  for (let i = 0, len = row.length; i < len; i++) {
+    let item = row[i];
+ 
+    if (conv.parseParam.ignoreEmpty && item === '') {
+      continue;
+    }
+    hasValue = true;
+ 
+    let head = headRow[i];
+    if (!head || head === "") {
+      head = headRow[i] = "field" + (i + 1);
+    }
+    const convFunc = getConvFunc(head, i, conv);
+    if (convFunc) {
+      const convRes = convFunc(item, head, resultRow, row, i);
+      Eif (convRes !== undefined) {
+        setPath(resultRow, head, convRes, conv,i);
+      }
+    } else {
+      // var flag = getFlag(head, i, param);
+      // if (flag === 'omit') {
+      //   continue;
+      // }
+      if (conv.parseParam.checkType) {
+        const convertFunc = checkType(item, head, i, conv);
+        item = convertFunc(item);
+      }
+      Eif (item !== undefined) {
+        setPath(resultRow, head, item, conv,i);
+      }
+    }
+  }
+  if (hasValue) {
+    return resultRow;
+  } else {
+    return null;
+  }
+}
+ 
+const builtInConv: { [key: string]: CellParser } = {
+  "string": stringType,
+  "number": numberType,
+  "omit": function () { }
+}
+function getConvFunc(head: string, i: number, conv: Converter): CellParser | null {
+  if (conv.parseRuntime.columnConv[i] !== undefined) {
+    return conv.parseRuntime.columnConv[i];
+  } else {
+    let flag = conv.parseParam.colParser[head];
+    if (flag === undefined) {
+      return conv.parseRuntime.columnConv[i] = null;
+    }
+    if (typeof flag === "object") {
+      flag = (flag as ColumnParam).cellParser || "string";
+    }
+    if (typeof flag === "string") {
+      flag = flag.trim().toLowerCase();
+      const builtInFunc = builtInConv[flag];
+      Eif (builtInFunc) {
+        return conv.parseRuntime.columnConv[i] = builtInFunc;
+      } else {
+        return conv.parseRuntime.columnConv[i] = null;
+      }
+    } else Eif (typeof flag === "function") {
+      return conv.parseRuntime.columnConv[i] = flag;
+    } else {
+      return conv.parseRuntime.columnConv[i] = null;
+    }
+  }
+}
+function setPath(resultJson: any, head: string, value: any, conv: Converter,headIdx:number) {
+  if (!conv.parseRuntime.columnValueSetter[headIdx]) {
+    if (conv.parseParam.flatKeys) {
+      conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+    } else {
+      if (head.indexOf(".") > -1) {
+        if (conv.parseParam.colParser[head] && (conv.parseParam.colParser[head] as ColumnParam).flat) {
+          conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+        } else {
+          conv.parseRuntime.columnValueSetter[headIdx] = jsonSetter;
+        }
+      } else {
+        conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+      }
+    }
+  }
+  conv.parseRuntime.columnValueSetter[headIdx](resultJson, head, value);
+  // flatSetter(resultJson, head, value);
+ 
+}
+function flatSetter(resultJson: any, head: string, value: any) {
+  resultJson[head] = value;
+}
+function jsonSetter(resultJson: any, head: string, value: any) {
+  set(resultJson, head, value);
+}
+ 
+ 
+function checkType(item: string, head: string, headIdx: number, conv: Converter): Function {
+  if (conv.parseRuntime.headerType[headIdx]) {
+    return conv.parseRuntime.headerType[headIdx];
+  } else Iif (head.indexOf('number#!') > -1) {
+    return conv.parseRuntime.headerType[headIdx] = numberType;
+  } else Iif (head.indexOf('string#!') > -1) {
+    return conv.parseRuntime.headerType[headIdx] = stringType;
+  } else Eif (conv.parseParam.checkType) {
+    return conv.parseRuntime.headerType[headIdx] = dynamicType;
+  } else {
+    return conv.parseRuntime.headerType[headIdx] = stringType;
+  }
+}
+ 
+function numberType(item) {
+  var rtn = parseFloat(item);
+  Iif (isNaN(rtn)) {
+    return item;
+  }
+  return rtn;
+}
+ 
+function stringType(item: string): string {
+  return item.toString();
+}
+ 
+function dynamicType(item) {
+  var trimed = item.trim();
+  if (trimed === "") {
+    return stringType(item);
+  }
+  if (numReg.test(trimed)) {
+    return numberType(item);
+  } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") {
+    return booleanType(item);
+  } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") {
+    return jsonType(item);
+  } else {
+    return stringType(item);
+  }
+}
+ 
+function booleanType(item) {
+  var trimed = item.trim();
+  Iif (trimed.length === 5 && trimed.toLowerCase() === "false") {
+    return false;
+  } else {
+    return true;
+  }
+}
+ 
+function jsonType(item) {
+  try {
+    return JSON.parse(item);
+  } catch (e) {
+    return item;
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/rowSplit.test.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/rowSplit.test.ts.html new file mode 100644 index 0000000..119b172 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/rowSplit.test.ts.html @@ -0,0 +1,399 @@ + + + + Code coverage report for csv2json/src/rowSplit.test.ts + + + + + + + +
+
+

+ All files / csv2json/src rowSplit.test.ts +

+
+
+ 100% + Statements + 31/31 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 31/31 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +1111x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +  +1x +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +1x +  +1x +  +  +  +1x +3x +1x +  +1x +  +  +  +1x +1x +  +1x + 
import { RowSplit, MultipleRowResult, RowSplitResult } from "./rowSplit";
+import { Converter } from "./Converter";
+const assert = require("assert");
+ 
+describe("Test delimiters", function () {
+  const getDelimiter = (str, opt: { delimiter: string | string[] }): string => {
+    return RowSplit.prototype["getDelimiter"].call({
+      conv: {
+        parseParam: {
+          delimiter: opt.delimiter
+        }
+      }
+    }, str);
+  }
+ 
+  it("should return the explicitly specified delimiter", function () {
+    var delimiter = ";";
+    var rowStr = "a;b;c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: ";" });
+    assert.equal(returnedDelimiter, delimiter);
+  });
+ 
+  it("should return the autodetected delimiter if 'auto' specified", function () {
+    var rowStr = "a;b;c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
+    assert(returnedDelimiter === ";");
+  });
+ 
+  it("should return the ',' delimiter if delimiter cannot be specified, in case of 'auto'", function () {
+    var rowStr = "abc";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
+    assert(returnedDelimiter === ",");
+  });
+ 
+  it("should accetp an array with potential delimiters", function () {
+    var rowStr = "a$b$c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: [",", ";", "$"] });
+    assert(returnedDelimiter === '$');
+  });
+});
+ 
+describe("ParseMultiLine function", function () {
+  const rowSplit = new RowSplit(new Converter());
+  const func = (lines: string[]): MultipleRowResult => {
+    return rowSplit.parseMultiLines(lines);
+  }
+  it("should convert lines to csv lines", function () {
+    var lines = [
+      "a,b,c,d",
+      "hello,world,csvtojson,abc",
+      "1,2,3,4"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 3);
+    assert.equal(res.partial, "");
+  });
+ 
+  it("should process line breaks", function () {
+    var lines = [
+      "a,b,c",
+      '15",hello,"ab',
+      "cde\"",
+      "\"b\"\"b\",cc,dd"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 3);
+    assert.equal(res.rowsCells[1][0], "15\"");
+    assert.equal(res.rowsCells[1][2], "ab\ncde");
+    assert.equal(res.rowsCells[2][0], "b\"b");
+    assert.equal(res.partial, "");
+  });
+ 
+  it("should return partial if line not closed", function () {
+    var lines = [
+      "a,b,c",
+      '15",hello,"ab',
+      "d,e,f"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 1);
+    assert.equal(res.partial, "15\",hello,\"ab\nd,e,f\n");
+  });
+});
+ 
+describe("RowSplit.parse function", function () {
+  const rowSplit = new RowSplit(new Converter());
+  const func = (str): RowSplitResult => {
+    return rowSplit.parse(str);
+  }
+  it("should split complete csv line", function () {
+    var str = "hello,world,csvtojson,awesome";
+    var res = func(str);
+    assert.equal(res.cells.length, 4);
+    assert.equal(res.closed, true);
+  });
+ 
+  it("should split incomplete csv line", function () {
+    var str = "hello,world,\"csvtojson,awesome";
+    var res = func(str);
+    assert.equal(res.closed, false);
+  });
+ 
+  it("should allow multiple line", function () {
+    var str = "\"he\"llo\",world,\"csvtojson,a\"\nwesome\"";
+    var res = func(str);
+    assert.equal(res.closed, true);
+    assert.equal(res.cells[2], 'csvtojson,a"\nwesome');
+  });
+ 
+});
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/rowSplit.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/rowSplit.ts.html new file mode 100644 index 0000000..61c4372 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/rowSplit.ts.html @@ -0,0 +1,666 @@ + + + + Code coverage report for csv2json/src/rowSplit.ts + + + + + + + +
+
+

+ All files / csv2json/src rowSplit.ts +

+
+
+ 95.08% + Statements + 116/122 +
+
+ 94.55% + Branches + 52/55 +
+
+ 91.67% + Functions + 11/12 +
+
+ 95.04% + Lines + 115/121 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200  +  +  +1x +1x +  +1x +1x +  +  +  +77x +77x +77x +1x +32192x +70x +  +32192x +  +77x +77x +77x +77x +  +1x +32200x +8x +  +32192x +32192x +32192x +32192x +4x +  +  +32192x +2x +2x +  +32192x +32192x +32192x +  +  +32192x +  +  +  +1x +32192x +32192x +32192x +32192x +66757x +66757x +66625x +  +66757x +66757x +66643x +158x +158x +107x +107x +107x +107x +  +51x +51x +51x +  +  +66485x +66473x +  +66485x +66485x +  +  +114x +26x +26x +26x +26x +26x +26x +  +26x +26x +  +88x +  +  +  +  +  +  +  +  +32192x +  +1x +  +8x +6x +2x +1x +  +1x +  +7x +7x +7x +33x +33x +13x +13x +  +  +7x +  +1x +66643x +66643x +66643x +  +  +  +1x +272x +272x +272x +266x +  +272x +272x +272x +191x +191x +  +272x +  +  +1x +  +  +  +  +  +  +  +  +  +1x +133x +133x +25x +  +133x +  +133x +  +1x +107x +107x +107x +32137x +32137x +32137x +32116x +18x +  +32098x +  +  +32116x +  +21x +  +  +107x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CSVParseParam } from "./Parameters";
+import { Converter } from "./Converter";
+import { Fileline } from "./fileline";
+import getEol from "./getEol";
+import { filterArray } from "./util";
+ 
+const defaulDelimiters = [",", "|", "\t", ";", ":"];
+export class RowSplit {
+  private quote: string;
+  private trim: boolean;
+  private escape: string;
+  private cachedRegExp: { [key: string]: RegExp } = {};
+  private delimiterEmitted = false;
+  private _needEmitDelimiter?: boolean = undefined;
+  private get needEmitDelimiter() {
+    if (this._needEmitDelimiter === undefined) {
+      this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0;
+    }
+    return this._needEmitDelimiter;
+  }
+  constructor(private conv: Converter) {
+    this.quote = conv.parseParam.quote;
+    this.trim = conv.parseParam.trim;
+    this.escape = conv.parseParam.escape;
+  }
+  parse(fileline: Fileline): RowSplitResult {
+    if (fileline === "") {
+      return { cells: [], closed: true };
+    }
+    const quote = this.quote;
+    const trim = this.trim;
+    const escape = this.escape;
+    if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") {
+      this.conv.parseRuntime.delimiter = this.getDelimiter(fileline);
+ 
+    }
+    if (this.needEmitDelimiter && !this.delimiterEmitted) {
+      this.conv.emit("delimiter", this.conv.parseRuntime.delimiter);
+      this.delimiterEmitted = true;
+    }
+    const delimiter = this.conv.parseRuntime.delimiter;
+    const rowArr = fileline.split(delimiter);
+    Iif (quote === "off") {
+      return { cells: rowArr, closed: true };
+    } else {
+      return this.toCSVRow(rowArr, trim, quote, delimiter);
+    }
+ 
+  }
+  private toCSVRow(rowArr: string[], trim: boolean, quote: string, delimiter: string): RowSplitResult {
+    const row: string[] = [];
+    let inquote = false;
+    let quoteBuff = '';
+    for (let i = 0, rowLen = rowArr.length; i < rowLen; i++) {
+      let e = rowArr[i];
+      if (!inquote && trim) {
+        e = e.trimLeft();
+      }
+      const len = e.length;
+      if (!inquote) {
+        if (this.isQuoteOpen(e)) { //quote open
+          e = e.substr(1);
+          if (this.isQuoteClose(e)) { //quote close
+            e = e.substring(0, e.lastIndexOf(quote));
+            e = this.escapeQuote(e);
+            row.push(e);
+            continue;
+          } else {
+            inquote = true;
+            quoteBuff += e;
+            continue;
+          }
+        } else {
+          if (trim) {
+            e = e.trimRight();
+          }
+          row.push(e);
+          continue;
+        }
+      } else { //previous quote not closed
+        if (this.isQuoteClose(e)) { //close double quote
+          inquote = false;
+          e = e.substr(0, len - 1);
+          quoteBuff += delimiter + e;
+          quoteBuff = this.escapeQuote(quoteBuff);
+          Eif (trim) {
+            quoteBuff = quoteBuff.trimRight();
+          }
+          row.push(quoteBuff);
+          quoteBuff = "";
+        } else {
+          quoteBuff += delimiter + e;
+        }
+      }
+    }
+ 
+    // if (!inquote && param._needFilterRow) {
+    //   row = filterRow(row, param);
+    // }
+ 
+    return { cells: row, closed: !inquote };
+  }
+  private getDelimiter(fileline: Fileline): string {
+    let checker;
+    if (this.conv.parseParam.delimiter === "auto") {
+      checker = defaulDelimiters;
+    } else if (this.conv.parseParam.delimiter instanceof Array) {
+      checker = this.conv.parseParam.delimiter;
+    } else {
+      return this.conv.parseParam.delimiter;
+    }
+    let count = 0;
+    let rtn = ",";
+    checker.forEach(function (delim) {
+      const delimCount = fileline.split(delim).length;
+      if (delimCount > count) {
+        rtn = delim;
+        count = delimCount;
+      }
+    });
+    return rtn;
+  }
+  private isQuoteOpen(str: string): boolean {
+    const quote = this.quote;
+    const escape = this.escape;
+    return str[0] === quote && (
+      str[1] !== quote ||
+      str[1] === escape && (str[2] === quote || str.length === 2));
+  }
+  private isQuoteClose(str: string): boolean {
+    const quote = this.quote;
+    const escape = this.escape;
+    if (this.conv.parseParam.trim) {
+      str = str.trimRight();
+    }
+    let count = 0;
+    let idx = str.length - 1;
+    while (str[idx] === quote || str[idx] === escape) {
+      idx--;
+      count++;
+    }
+    return count % 2 !== 0;
+  }
+ 
+  private twoDoubleQuote(str: string): string {
+    var twoQuote = this.quote + this.quote;
+    var curIndex = -1;
+    while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
+      str = str.substring(0, curIndex) + str.substring(++curIndex);
+    }
+    return str;
+  }
+ 
+ 
+  private escapeQuote(segment: string): string {
+    const key = "es|" + this.quote + "|" + this.escape;
+    if (this.cachedRegExp[key] === undefined) {
+      this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g');
+    }
+    const regExp = this.cachedRegExp[key];
+    // console.log(regExp,segment);
+    return segment.replace(regExp, this.quote);
+  }
+  parseMultiLines(lines: Fileline[]): MultipleRowResult {
+    const csvLines: string[][] = [];
+    let left = "";
+    while (lines.length) {
+      const line = left + lines.shift();
+      const row = this.parse(line);
+      if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) {
+        if (this.conv.parseRuntime.selectedColumns) {
+          csvLines.push(filterArray(row.cells, this.conv.parseRuntime.selectedColumns));
+        } else {
+          csvLines.push(row.cells);
+        }
+ 
+        left = "";
+      } else {
+        left = line + (getEol(line, this.conv.parseRuntime) || "\n");
+      }
+    }
+    return { rowsCells: csvLines, partial: left };
+  }
+}
+export interface MultipleRowResult {
+  rowsCells: string[][];
+  partial: string;
+}
+export interface RowSplitResult {
+  /**
+   * csv row array. ["a","b","c"]
+   */
+  cells: string[],
+  /**
+   * if the passed fileline is a complete row
+   */
+  closed: boolean
+}
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/test.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/test.ts.html new file mode 100644 index 0000000..091a734 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/test.ts.html @@ -0,0 +1,81 @@ + + + + Code coverage report for csv2json/src/test.ts + + + + + + + +
+
+

+ All files / csv2json/src test.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5  +  +  +  + 
import a from "./index";
+ 
+ 
+// a("sss","CCc");
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/src/util.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/util.ts.html new file mode 100644 index 0000000..2a94dca --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/src/util.ts.html @@ -0,0 +1,120 @@ + + + + Code coverage report for csv2json/src/util.ts + + + + + + + +
+
+

+ All files / csv2json/src util.ts +

+
+
+ 100% + Statements + 3/3 +
+
+ 50% + Branches + 1/2 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 2/2 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18290x +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  + 
export function bufFromString(str: string): Buffer {
+  const length = Buffer.byteLength(str);
+  const buffer = Buffer.allocUnsafe
+    ? Buffer.allocUnsafe(length)
+    : new Buffer(length);
+  buffer.write(str);
+  return buffer;
+}
+ 
+export function filterArray(arr: any[], filter: number[]): any[] {
+  const rtn: any[] = [];
+  for (let i = 0; i < arr.length; i++) {
+    if (filter.indexOf(i) > -1) {
+      rtn.push(arr[i]);
+    }
+  }
+  return rtn;
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/index.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/index.html new file mode 100644 index 0000000..16c8e7f --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/index.html @@ -0,0 +1,136 @@ + + + + Code coverage report for csv2json/testNew + + + + + + + +
+
+

+ All files csv2json/testNew +

+
+
+ 98.58% + Statements + 208/211 +
+
+ 100% + Branches + 1/1 +
+
+ 100% + Functions + 22/22 +
+
+ 98.58% + Lines + 208/211 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
testCSVConverter.ts
98.95%94/95100%1/1100%5/598.95%94/95
testCSVConverter2.ts
98%98/100100%0/0100%15/1598%98/100
testCSVConverter3.ts
100%4/4100%0/0100%0/0100%4/4
testErrorHandle.ts
100%12/12100%0/0100%2/2100%12/12
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter.ts.html new file mode 100644 index 0000000..7b3d7a2 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testCSVConverter.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testCSVConverter.ts +

+
+
+ 98.95% + Statements + 94/95 +
+
+ 100% + Branches + 1/1 +
+
+ 100% + Functions + 5/5 +
+
+ 98.95% + Lines + 94/95 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at LcovReport.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/lcov/index.js:24:24)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter2.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter2.ts.html new file mode 100644 index 0000000..77001fb --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter2.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testCSVConverter2.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testCSVConverter2.ts +

+
+
+ 98% + Statements + 98/100 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 15/15 +
+
+ 98% + Lines + 98/100 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at LcovReport.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/lcov/index.js:24:24)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter3.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter3.ts.html new file mode 100644 index 0000000..b96a735 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testCSVConverter3.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testCSVConverter3.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testCSVConverter3.ts +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 4/4 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at LcovReport.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/lcov/index.js:24:24)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testErrorHandle.ts.html b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testErrorHandle.ts.html new file mode 100644 index 0000000..630ed3d --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/csv2json/testNew/testErrorHandle.ts.html @@ -0,0 +1,102 @@ + + + + Code coverage report for csv2json/testNew/testErrorHandle.ts + + + + + + + +
+
+

+ All files / csv2json/testNew testErrorHandle.ts +

+
+
+ 100% + Statements + 12/12 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 12/12 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +120 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0
Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts')
+Error: Unable to lookup source: /Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts(ENOENT: no such file or directory, open '/Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts')
+    at Context.defaultSourceLookup [as sourceFinder] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:15:15)
+    at Context.getSource (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/context.js:74:17)
+    at Object.annotateSourceCode (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/annotator.js:172:38)
+    at HtmlReport.onDetail (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/html/index.js:237:39)
+    at LcovReport.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-reports/lib/lcov/index.js:24:24)
+    at Visitor.(anonymous function) [as onDetail] (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:34:30)
+    at ReportNode.Node.visit (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:123:17)
+    at /Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:116:23
+    at Array.forEach (native)
+    at visitChildren (/Users/kxiang/work/projects/csv2json/node_modules/nyc/node_modules/istanbul-lib-report/lib/tree.js:115:32)
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/index.html b/node_modules/csvtojson/coverage/lcov-report/index.html new file mode 100644 index 0000000..c4d9b56 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/index.html @@ -0,0 +1,227 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ All files +

+
+
+ 4.86% + Statements + 802/16489 +
+
+ 2.1% + Branches + 278/13264 +
+
+ 3.36% + Functions + 113/3362 +
+
+ 6.95% + Lines + 781/11243 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
csv2json
0%0/120%0/20%0/10%0/12
csv2json/bin
0%0/1480%0/660%0/150%0/148
csv2json/build
0%0/7200%0/4450%0/1370%0/710
csv2json/dist
0%0/137620%0/118830%0/29500%0/8549
csv2json/libs
0%0/3100%0/0100%0/00%0/3
csv2json/libs/core
0%0/9110%0/5030%0/1250%0/909
csv2json/libs/core/defaultParsers
0%0/630%0/400%0/60%0/63
csv2json/libs/interfaces
0%0/1100%0/0100%0/00%0/1
csv2json/libs/interfaces/cli
0%0/240%0/40%0/60%0/24
csv2json/src
93.69%594/63486.56%277/32091%91/10093.47%573/613
csv2json/testNew
98.58%208/211100%1/1100%22/2298.58%208/211
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/lcov-report/prettify.css b/node_modules/csvtojson/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/csvtojson/coverage/lcov-report/prettify.js b/node_modules/csvtojson/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..ef51e03 --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/csvtojson/coverage/lcov-report/sort-arrow-sprite.png b/node_modules/csvtojson/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000..03f704a Binary files /dev/null and b/node_modules/csvtojson/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/node_modules/csvtojson/coverage/lcov-report/sorter.js b/node_modules/csvtojson/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..6c5034e --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov-report/sorter.js @@ -0,0 +1,158 @@ +var addSorting = (function () { + "use strict"; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { return document.querySelector('.coverage-summary'); } + // returns the thead element of the summary table + function getTableHeader() { return getTable().querySelector('thead tr'); } + // returns the tbody element of the summary table + function getTableBody() { return getTable().querySelector('tbody'); } + // returns the th element for nth column + function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/node_modules/csvtojson/coverage/lcov.info b/node_modules/csvtojson/coverage/lcov.info new file mode 100644 index 0000000..8bdaa0e --- /dev/null +++ b/node_modules/csvtojson/coverage/lcov.info @@ -0,0 +1,31888 @@ +TN: +SF:/Users/kxiang/work/projects/csv2json/Gruntfile.js +FN:16,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:22,0 +DA:84,0 +DA:85,0 +DA:86,0 +LF:8 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/browser_index.js +FNF:0 +FNH:0 +DA:1,0 +DA:2,0 +DA:3,0 +LF:3 +LH:0 +BRDA:1,0,0,0 +BRDA:1,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/index.js +FNF:0 +FNH:0 +DA:1,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/bin/benchmark.js +FN:9,testCSVLine +FN:21,(anonymous_1) +FN:25,(anonymous_2) +FN:34,(anonymous_3) +FN:44,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,testCSVLine +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:38,0 +DA:40,0 +DA:44,0 +LF:29 +LH:0 +BRDA:4,0,0,0 +BRDA:4,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/bin/csvtojson.js +FN:1,csvtojson +FN:19,_showHelp +FN:44,parse +FN:61,(anonymous_3) +FN:75,run +FN:86,commandParser +FN:93,parseObject +FN:106,parseBool +FN:116,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,csvtojson +FNDA:0,_showHelp +FNDA:0,parse +FNDA:0,(anonymous_3) +FNDA:0,run +FNDA:0,commandParser +FNDA:0,parseObject +FNDA:0,parseBool +FNDA:0,(anonymous_8) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:41,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:57,0 +DA:58,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:69,0 +DA:71,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:81,0 +DA:82,0 +DA:87,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:98,0 +DA:100,0 +DA:101,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:113,0 +DA:114,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:139,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:149,0 +DA:152,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:158,0 +DA:159,0 +DA:160,0 +LF:96 +LH:0 +BRDA:21,0,0,0 +BRDA:21,0,1,0 +BRDA:27,1,0,0 +BRDA:27,1,1,0 +BRDA:33,2,0,0 +BRDA:33,2,1,0 +BRDA:47,3,0,0 +BRDA:47,3,1,0 +BRDA:50,4,0,0 +BRDA:50,4,1,0 +BRDA:53,5,0,0 +BRDA:53,5,1,0 +BRDA:53,6,0,0 +BRDA:53,6,1,0 +BRDA:57,7,0,0 +BRDA:57,7,1,0 +BRDA:62,8,0,0 +BRDA:62,8,1,0 +BRDA:64,9,0,0 +BRDA:64,9,1,0 +BRDA:76,10,0,0 +BRDA:76,10,1,0 +BRDA:78,11,0,0 +BRDA:78,11,1,0 +BRDA:97,12,0,0 +BRDA:97,12,1,0 +BRDA:108,13,0,0 +BRDA:108,13,1,0 +BRDA:108,14,0,0 +BRDA:108,14,1,0 +BRDA:110,15,0,0 +BRDA:110,15,1,0 +BRDA:110,16,0,0 +BRDA:110,16,1,0 +BRDA:117,17,0,0 +BRDA:117,17,1,0 +BRDA:121,18,0,0 +BRDA:121,18,1,0 +BRDA:126,19,0,0 +BRDA:126,19,1,0 +BRDA:128,20,0,0 +BRDA:128,20,1,0 +BRDA:130,21,0,0 +BRDA:130,21,1,0 +BRDA:132,22,0,0 +BRDA:132,22,1,0 +BRDA:134,23,0,0 +BRDA:134,23,1,0 +BRDA:136,24,0,0 +BRDA:136,24,1,0 +BRDA:144,25,0,0 +BRDA:144,25,1,0 +BRDA:146,26,0,0 +BRDA:146,26,1,0 +BRDA:159,27,0,0 +BRDA:159,27,1,0 +BRF:56 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/bin/genCsv.js +FN:24,genWord +FNF:1 +FNH:0 +FNDA:0,genWord +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:21,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:31,0 +LF:23 +LH:0 +BRDA:9,0,0,0 +BRDA:9,0,1,0 +BRDA:12,1,0,0 +BRDA:12,1,1,0 +BRDA:13,2,0,0 +BRDA:13,2,1,0 +BRDA:14,3,0,0 +BRDA:14,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/CSVError.js +FN:2,(anonymous_0) +FN:4,(anonymous_1) +FN:5,(anonymous_2) +FN:6,(anonymous_3) +FN:8,__ +FN:14,(anonymous_5) +FN:16,CSVError +FN:24,(anonymous_7) +FN:27,(anonymous_8) +FN:30,(anonymous_9) +FN:33,(anonymous_10) +FNF:11 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,__ +FNDA:0,(anonymous_5) +FNDA:0,CSVError +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:36,0 +DA:38,0 +LF:28 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,1,2,0 +BRDA:3,1,3,0 +BRDA:5,2,0,0 +BRDA:5,2,1,0 +BRDA:9,3,0,0 +BRDA:9,3,1,0 +BRDA:17,4,0,0 +BRDA:17,4,1,0 +BRDA:17,5,0,0 +BRDA:17,5,1,0 +BRF:15 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/Converter.js +FN:2,(anonymous_0) +FN:4,(anonymous_1) +FN:5,(anonymous_2) +FN:6,(anonymous_3) +FN:8,__ +FN:12,(anonymous_5) +FN:24,(anonymous_6) +FN:26,Converter +FN:39,(anonymous_8) +FN:42,(anonymous_9) +FN:48,(anonymous_10) +FN:51,(anonymous_11) +FN:54,(anonymous_12) +FN:62,(anonymous_13) +FN:71,(anonymous_14) +FN:82,(anonymous_15) +FN:86,(anonymous_16) +FN:90,(anonymous_17) +FN:102,(anonymous_18) +FN:104,(anonymous_19) +FN:106,(anonymous_20) +FN:114,(anonymous_21) +FN:126,(anonymous_22) +FN:133,(anonymous_23) +FN:139,(anonymous_24) +FN:142,(anonymous_25) +FN:148,(anonymous_26) +FN:150,(anonymous_27) +FN:157,(anonymous_28) +FN:163,(anonymous_29) +FN:168,(anonymous_30) +FN:176,(anonymous_31) +FN:185,(anonymous_32) +FN:191,(anonymous_33) +FNF:34 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,__ +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,Converter +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:0,(anonymous_32) +FNDA:0,(anonymous_33) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:12,0 +DA:13,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:37,0 +DA:39,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:46,0 +DA:48,0 +DA:49,0 +DA:51,0 +DA:52,0 +DA:54,0 +DA:55,0 +DA:60,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:77,0 +DA:80,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:100,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:107,0 +DA:108,0 +DA:111,0 +DA:115,0 +DA:116,0 +DA:119,0 +DA:125,0 +DA:127,0 +DA:132,0 +DA:134,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:149,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:164,0 +DA:165,0 +DA:169,0 +DA:170,0 +DA:173,0 +DA:177,0 +DA:178,0 +DA:182,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:190,0 +DA:192,0 +DA:197,0 +DA:199,0 +LF:112 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,1,2,0 +BRDA:3,1,3,0 +BRDA:5,2,0,0 +BRDA:5,2,1,0 +BRDA:9,3,0,0 +BRDA:9,3,1,0 +BRDA:12,4,0,0 +BRDA:12,4,1,0 +BRDA:12,4,2,0 +BRDA:13,5,0,0 +BRDA:13,5,1,0 +BRDA:13,6,0,0 +BRDA:13,6,1,0 +BRDA:27,7,0,0 +BRDA:27,7,1,0 +BRDA:28,8,0,0 +BRDA:28,8,1,0 +BRDA:33,9,0,0 +BRDA:33,9,1,0 +BRDA:72,10,0,0 +BRDA:72,10,1,0 +BRDA:91,11,0,0 +BRDA:91,11,1,0 +BRDA:107,12,0,0 +BRDA:107,12,1,0 +BRDA:115,13,0,0 +BRDA:115,13,1,0 +BRDA:143,14,0,0 +BRDA:143,14,1,0 +BRDA:159,15,0,0 +BRDA:159,15,1,0 +BRDA:159,16,0,0 +BRDA:159,16,1,0 +BRDA:164,17,0,0 +BRDA:164,17,1,0 +BRDA:169,18,0,0 +BRDA:169,18,1,0 +BRDA:169,19,0,0 +BRDA:169,19,1,0 +BRF:44 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/Parameters.js +FN:3,mergeParams +FNF:1 +FNH:0 +FNDA:0,mergeParams +DA:2,0 +DA:4,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:33,0 +DA:37,0 +DA:39,0 +LF:11 +LH:0 +BRDA:24,0,0,0 +BRDA:24,0,1,0 +BRDA:28,1,0,0 +BRDA:28,1,1,0 +BRDA:29,2,0,0 +BRDA:29,2,1,0 +BRF:6 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/ParseRuntime.js +FN:3,initParseRuntime +FNF:1 +FNH:0 +FNDA:0,initParseRuntime +DA:2,0 +DA:4,0 +DA:5,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:30,0 +DA:32,0 +LF:9 +LH:0 +BRDA:24,0,0,0 +BRDA:24,0,1,0 +BRDA:27,1,0,0 +BRDA:27,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/ProcessFork.js +FN:2,(anonymous_0) +FN:4,(anonymous_1) +FN:5,(anonymous_2) +FN:6,(anonymous_3) +FN:8,__ +FN:14,(anonymous_5) +FN:16,ProcessorFork +FN:19,(anonymous_7) +FNF:8 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,__ +FNDA:0,(anonymous_5) +FNDA:0,ProcessorFork +FNDA:0,(anonymous_7) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:17,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:24,0 +LF:17 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,1,2,0 +BRDA:3,1,3,0 +BRDA:5,2,0,0 +BRDA:5,2,1,0 +BRDA:9,3,0,0 +BRDA:9,3,1,0 +BRDA:17,4,0,0 +BRDA:17,4,1,0 +BRDA:17,4,2,0 +BRF:14 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/Processor.js +FN:3,(anonymous_0) +FN:4,Processor +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,Processor +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:9,0 +DA:11,0 +LF:7 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/ProcessorLocal.js +FN:2,(anonymous_0) +FN:4,(anonymous_1) +FN:5,(anonymous_2) +FN:6,(anonymous_3) +FN:8,__ +FN:12,(anonymous_5) +FN:24,(anonymous_6) +FN:26,ProcessorLocal +FN:36,(anonymous_8) +FN:46,(anonymous_9) +FN:55,(anonymous_10) +FN:66,(anonymous_11) +FN:74,(anonymous_12) +FN:83,(anonymous_13) +FN:114,(anonymous_14) +FN:128,(anonymous_15) +FN:172,(anonymous_16) +FN:213,(anonymous_17) +FN:232,(anonymous_18) +FN:242,(anonymous_19) +FN:244,(anonymous_20) +FN:245,(anonymous_21) +FN:258,processLineHook +FN:268,(anonymous_23) +FNF:24 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,__ +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,ProcessorLocal +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,processLineHook +FNDA:0,(anonymous_23) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:12,0 +DA:13,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:35,0 +DA:37,0 +DA:38,0 +DA:40,0 +DA:45,0 +DA:47,0 +DA:48,0 +DA:50,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:59,0 +DA:60,0 +DA:63,0 +DA:65,0 +DA:67,0 +DA:68,0 +DA:71,0 +DA:75,0 +DA:76,0 +DA:79,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:95,0 +DA:96,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:103,0 +DA:104,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:112,0 +DA:114,0 +DA:115,0 +DA:117,0 +DA:120,0 +DA:125,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:134,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:149,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:156,0 +DA:157,0 +DA:160,0 +DA:163,0 +DA:164,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:170,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:183,0 +DA:187,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:196,0 +DA:210,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:224,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:238,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:250,0 +DA:255,0 +DA:257,0 +DA:259,0 +DA:260,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:269,0 +DA:270,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:279,0 +DA:283,0 +LF:156 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,1,2,0 +BRDA:3,1,3,0 +BRDA:5,2,0,0 +BRDA:5,2,1,0 +BRDA:9,3,0,0 +BRDA:9,3,1,0 +BRDA:12,4,0,0 +BRDA:12,4,1,0 +BRDA:12,4,2,0 +BRDA:13,5,0,0 +BRDA:13,5,1,0 +BRDA:13,6,0,0 +BRDA:13,6,1,0 +BRDA:27,7,0,0 +BRDA:27,7,1,0 +BRDA:27,7,2,0 +BRDA:37,8,0,0 +BRDA:37,8,1,0 +BRDA:47,9,0,0 +BRDA:47,9,1,0 +BRDA:57,10,0,0 +BRDA:57,10,1,0 +BRDA:59,11,0,0 +BRDA:59,11,1,0 +BRDA:67,12,0,0 +BRDA:67,12,1,0 +BRDA:75,13,0,0 +BRDA:75,13,1,0 +BRDA:75,14,0,0 +BRDA:75,14,1,0 +BRDA:87,15,0,0 +BRDA:87,15,1,0 +BRDA:90,16,0,0 +BRDA:90,16,1,0 +BRDA:90,17,0,0 +BRDA:90,17,1,0 +BRDA:90,17,2,0 +BRDA:95,18,0,0 +BRDA:95,18,1,0 +BRDA:95,19,0,0 +BRDA:95,19,1,0 +BRDA:99,20,0,0 +BRDA:99,20,1,0 +BRDA:106,21,0,0 +BRDA:106,21,1,0 +BRDA:108,22,0,0 +BRDA:108,22,1,0 +BRDA:115,23,0,0 +BRDA:115,23,1,0 +BRDA:115,24,0,0 +BRDA:115,24,1,0 +BRDA:129,25,0,0 +BRDA:129,25,1,0 +BRDA:130,26,0,0 +BRDA:130,26,1,0 +BRDA:143,27,0,0 +BRDA:143,27,1,0 +BRDA:153,28,0,0 +BRDA:153,28,1,0 +BRDA:156,29,0,0 +BRDA:156,29,1,0 +BRDA:163,30,0,0 +BRDA:163,30,1,0 +BRDA:163,31,0,0 +BRDA:163,31,1,0 +BRDA:166,32,0,0 +BRDA:166,32,1,0 +BRDA:166,33,0,0 +BRDA:166,33,1,0 +BRDA:174,34,0,0 +BRDA:174,34,1,0 +BRDA:177,35,0,0 +BRDA:177,35,1,0 +BRDA:178,36,0,0 +BRDA:178,36,1,0 +BRDA:179,37,0,0 +BRDA:179,37,1,0 +BRDA:179,38,0,0 +BRDA:179,38,1,0 +BRDA:190,39,0,0 +BRDA:190,39,1,0 +BRDA:191,40,0,0 +BRDA:191,40,1,0 +BRDA:214,41,0,0 +BRDA:214,41,1,0 +BRDA:220,42,0,0 +BRDA:220,42,1,0 +BRDA:233,43,0,0 +BRDA:233,43,1,0 +BRDA:234,44,0,0 +BRDA:234,44,1,0 +BRDA:246,45,0,0 +BRDA:246,45,1,0 +BRDA:259,46,0,0 +BRDA:259,46,1,0 +BRDA:263,47,0,0 +BRDA:263,47,1,0 +BRDA:267,48,0,0 +BRDA:267,48,1,0 +BRDA:267,49,0,0 +BRDA:267,49,1,0 +BRF:106 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/Result.js +FN:2,(anonymous_0) +FN:7,(anonymous_1) +FN:8,Result +FN:13,(anonymous_3) +FN:20,(anonymous_4) +FN:30,(anonymous_5) +FN:36,(anonymous_6) +FN:40,(anonymous_7) +FN:42,(anonymous_8) +FN:58,(anonymous_9) +FN:64,(anonymous_10) +FN:72,(anonymous_11) +FN:85,processLineByLine +FN:97,(anonymous_13) +FN:135,processRecursive +FN:141,pushDownstream +FNF:16 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,Result +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,processLineByLine +FNDA:0,(anonymous_13) +FNDA:0,processRecursive +FNDA:0,pushDownstream +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:14,0 +DA:19,0 +DA:21,0 +DA:22,0 +DA:24,0 +DA:29,0 +DA:31,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:47,0 +DA:48,0 +DA:53,0 +DA:54,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:62,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:68,0 +DA:69,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:78,0 +DA:79,0 +DA:82,0 +DA:84,0 +DA:86,0 +DA:87,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:103,0 +DA:104,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:114,0 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:131,0 +DA:136,0 +DA:137,0 +DA:139,0 +DA:142,0 +DA:143,0 +DA:146,0 +LF:74 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,2,0,0 +BRDA:3,2,1,0 +BRDA:14,3,0,0 +BRDA:14,3,1,0 +BRDA:14,3,2,0 +BRDA:21,4,0,0 +BRDA:21,4,1,0 +BRDA:22,5,0,0 +BRDA:22,5,1,0 +BRDA:41,6,0,0 +BRDA:41,6,1,0 +BRDA:43,7,0,0 +BRDA:43,7,1,0 +BRDA:59,8,0,0 +BRDA:59,8,1,0 +BRDA:65,9,0,0 +BRDA:65,9,1,0 +BRDA:65,10,0,0 +BRDA:65,10,1,0 +BRDA:68,11,0,0 +BRDA:68,11,1,0 +BRDA:68,12,0,0 +BRDA:68,12,1,0 +BRDA:73,13,0,0 +BRDA:73,13,1,0 +BRDA:74,14,0,0 +BRDA:74,14,1,0 +BRDA:74,15,0,0 +BRDA:74,15,1,0 +BRDA:78,16,0,0 +BRDA:78,16,1,0 +BRDA:78,17,0,0 +BRDA:78,17,1,0 +BRDA:86,18,0,0 +BRDA:86,18,1,0 +BRDA:90,19,0,0 +BRDA:90,19,1,0 +BRDA:90,20,0,0 +BRDA:90,20,1,0 +BRDA:96,21,0,0 +BRDA:96,21,1,0 +BRDA:96,22,0,0 +BRDA:96,22,1,0 +BRDA:103,23,0,0 +BRDA:103,23,1,0 +BRDA:110,24,0,0 +BRDA:110,24,1,0 +BRDA:125,25,0,0 +BRDA:125,25,1,0 +BRDA:136,26,0,0 +BRDA:136,26,1,0 +BRDA:142,27,0,0 +BRDA:142,27,1,0 +BRDA:142,28,0,0 +BRDA:142,28,1,0 +BRF:60 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/Worker.js +FN:3,(anonymous_0) +FN:4,Worker +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,Worker +DA:2,0 +DA:3,0 +DA:6,0 +DA:8,0 +LF:4 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/dataClean.js +FN:2,(anonymous_0) +FN:13,prepareData +FN:28,concatLeftChunk +FN:39,cleanUtf8Split +FNF:4 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,prepareData +FNDA:0,concatLeftChunk +FNDA:0,cleanUtf8Split +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:21,0 +DA:24,0 +DA:29,0 +DA:30,0 +DA:33,0 +DA:40,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:69,0 +LF:23 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,2,0,0 +BRDA:3,2,1,0 +BRDA:17,3,0,0 +BRDA:17,3,1,0 +BRDA:29,4,0,0 +BRDA:29,4,1,0 +BRDA:29,5,0,0 +BRDA:29,5,1,0 +BRDA:48,6,0,0 +BRDA:48,6,1,0 +BRDA:54,7,0,0 +BRDA:54,7,1,0 +BRF:17 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/fileline.js +FN:2,(anonymous_0) +FN:14,stringToLines +FNF:2 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,stringToLines +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:20,0 +LF:9 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,2,0,0 +BRDA:3,2,1,0 +BRDA:17,3,0,0 +BRDA:17,3,1,0 +BRF:9 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/getEol.js +FN:4,default_1 +FNF:1 +FNH:0 +FNDA:0,default_1 +DA:2,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:23,0 +DA:25,0 +LF:15 +LH:0 +BRDA:5,0,0,0 +BRDA:5,0,1,0 +BRDA:5,1,0,0 +BRDA:5,1,1,0 +BRDA:7,2,0,0 +BRDA:7,2,1,0 +BRDA:8,3,0,0 +BRDA:8,3,1,0 +BRDA:12,4,0,0 +BRDA:12,4,1,0 +BRDA:17,5,0,0 +BRDA:17,5,1,0 +BRDA:23,6,0,0 +BRDA:23,6,1,0 +BRF:14 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/index.js +FN:3,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:2,0 +DA:3,0 +DA:4,0 +DA:6,0 +DA:7,0 +LF:5 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/lineToJson.js +FN:2,(anonymous_0) +FN:9,default_1 +FN:21,processRow +FN:34,convertRowToJson +FN:78,(anonymous_4) +FN:80,getConvFunc +FN:110,setPath +FN:132,flatSetter +FN:135,jsonSetter +FN:138,checkType +FN:155,numberType +FN:162,stringType +FN:165,dynamicType +FN:183,booleanType +FN:192,jsonType +FNF:15 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,default_1 +FNDA:0,processRow +FNDA:0,convertRowToJson +FNDA:0,(anonymous_4) +FNDA:0,getConvFunc +FNDA:0,setPath +FNDA:0,flatSetter +FNDA:0,jsonSetter +FNDA:0,checkType +FNDA:0,numberType +FNDA:0,stringType +FNDA:0,dynamicType +FNDA:0,booleanType +FNDA:0,jsonType +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:17,0 +DA:19,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:31,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:63,0 +DA:64,0 +DA:68,0 +DA:69,0 +DA:72,0 +DA:75,0 +DA:81,0 +DA:82,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:89,0 +DA:90,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:99,0 +DA:102,0 +DA:103,0 +DA:106,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:121,0 +DA:125,0 +DA:129,0 +DA:133,0 +DA:136,0 +DA:139,0 +DA:140,0 +DA:142,0 +DA:143,0 +DA:145,0 +DA:146,0 +DA:148,0 +DA:149,0 +DA:152,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:160,0 +DA:163,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:170,0 +DA:171,0 +DA:173,0 +DA:174,0 +DA:176,0 +DA:177,0 +DA:180,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:189,0 +DA:193,0 +DA:194,0 +DA:197,0 +LF:102 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,2,0,0 +BRDA:3,2,1,0 +BRDA:13,3,0,0 +BRDA:13,3,1,0 +BRDA:22,4,0,0 +BRDA:22,4,1,0 +BRDA:22,5,0,0 +BRDA:22,5,1,0 +BRDA:22,5,2,0 +BRDA:25,6,0,0 +BRDA:25,6,1,0 +BRDA:27,7,0,0 +BRDA:27,7,1,0 +BRDA:39,8,0,0 +BRDA:39,8,1,0 +BRDA:39,9,0,0 +BRDA:39,9,1,0 +BRDA:44,10,0,0 +BRDA:44,10,1,0 +BRDA:44,11,0,0 +BRDA:44,11,1,0 +BRDA:48,12,0,0 +BRDA:48,12,1,0 +BRDA:50,13,0,0 +BRDA:50,13,1,0 +BRDA:59,14,0,0 +BRDA:59,14,1,0 +BRDA:63,15,0,0 +BRDA:63,15,1,0 +BRDA:68,16,0,0 +BRDA:68,16,1,0 +BRDA:81,17,0,0 +BRDA:81,17,1,0 +BRDA:86,18,0,0 +BRDA:86,18,1,0 +BRDA:89,19,0,0 +BRDA:89,19,1,0 +BRDA:90,20,0,0 +BRDA:90,20,1,0 +BRDA:92,21,0,0 +BRDA:92,21,1,0 +BRDA:95,22,0,0 +BRDA:95,22,1,0 +BRDA:102,23,0,0 +BRDA:102,23,1,0 +BRDA:111,24,0,0 +BRDA:111,24,1,0 +BRDA:112,25,0,0 +BRDA:112,25,1,0 +BRDA:116,26,0,0 +BRDA:116,26,1,0 +BRDA:117,27,0,0 +BRDA:117,27,1,0 +BRDA:117,28,0,0 +BRDA:117,28,1,0 +BRDA:139,29,0,0 +BRDA:139,29,1,0 +BRDA:142,30,0,0 +BRDA:142,30,1,0 +BRDA:145,31,0,0 +BRDA:145,31,1,0 +BRDA:148,32,0,0 +BRDA:148,32,1,0 +BRDA:157,33,0,0 +BRDA:157,33,1,0 +BRDA:167,34,0,0 +BRDA:167,34,1,0 +BRDA:170,35,0,0 +BRDA:170,35,1,0 +BRDA:173,36,0,0 +BRDA:173,36,1,0 +BRDA:173,37,0,0 +BRDA:173,37,1,0 +BRDA:173,37,2,0 +BRDA:173,37,3,0 +BRDA:176,38,0,0 +BRDA:176,38,1,0 +BRDA:176,39,0,0 +BRDA:176,39,1,0 +BRDA:176,39,2,0 +BRDA:176,39,3,0 +BRDA:185,40,0,0 +BRDA:185,40,1,0 +BRDA:185,41,0,0 +BRDA:185,41,1,0 +BRF:90 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/rowSplit.js +FN:2,(anonymous_0) +FN:9,(anonymous_1) +FN:10,RowSplit +FN:20,(anonymous_3) +FN:29,(anonymous_4) +FN:52,(anonymous_5) +FN:107,(anonymous_6) +FN:120,(anonymous_7) +FN:129,(anonymous_8) +FN:135,(anonymous_9) +FN:149,(anonymous_10) +FN:157,(anonymous_11) +FN:166,(anonymous_12) +FNF:13 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,RowSplit +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +DA:2,0 +DA:3,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:21,0 +DA:22,0 +DA:24,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:49,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:78,0 +DA:79,0 +DA:81,0 +DA:82,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:94,0 +DA:95,0 +DA:98,0 +DA:105,0 +DA:107,0 +DA:109,0 +DA:110,0 +DA:112,0 +DA:113,0 +DA:116,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:127,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:147,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:155,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:162,0 +DA:164,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:177,0 +DA:179,0 +DA:182,0 +DA:185,0 +DA:187,0 +DA:189,0 +LF:125 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,0,2,0 +BRDA:3,1,0,0 +BRDA:3,1,1,0 +BRDA:3,2,0,0 +BRDA:3,2,1,0 +BRDA:21,3,0,0 +BRDA:21,3,1,0 +BRDA:30,4,0,0 +BRDA:30,4,1,0 +BRDA:36,5,0,0 +BRDA:36,5,1,0 +BRDA:36,6,0,0 +BRDA:36,6,1,0 +BRDA:39,7,0,0 +BRDA:39,7,1,0 +BRDA:39,8,0,0 +BRDA:39,8,1,0 +BRDA:45,9,0,0 +BRDA:45,9,1,0 +BRDA:58,10,0,0 +BRDA:58,10,1,0 +BRDA:58,11,0,0 +BRDA:58,11,1,0 +BRDA:62,12,0,0 +BRDA:62,12,1,0 +BRDA:63,13,0,0 +BRDA:63,13,1,0 +BRDA:65,14,0,0 +BRDA:65,14,1,0 +BRDA:78,15,0,0 +BRDA:78,15,1,0 +BRDA:86,16,0,0 +BRDA:86,16,1,0 +BRDA:91,17,0,0 +BRDA:91,17,1,0 +BRDA:109,18,0,0 +BRDA:109,18,1,0 +BRDA:112,19,0,0 +BRDA:112,19,1,0 +BRDA:122,20,0,0 +BRDA:122,20,1,0 +BRDA:132,21,0,0 +BRDA:132,21,1,0 +BRDA:132,21,2,0 +BRDA:132,21,3,0 +BRDA:132,21,4,0 +BRDA:138,22,0,0 +BRDA:138,22,1,0 +BRDA:143,23,0,0 +BRDA:143,23,1,0 +BRDA:159,24,0,0 +BRDA:159,24,1,0 +BRDA:172,25,0,0 +BRDA:172,25,1,0 +BRDA:172,26,0,0 +BRDA:172,26,1,0 +BRDA:173,27,0,0 +BRDA:173,27,1,0 +BRDA:182,28,0,0 +BRDA:182,28,1,0 +BRF:62 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/test.js +FNF:0 +FNH:0 +DA:2,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/build/util.js +FN:3,bufFromString +FN:12,filterArray +FNF:2 +FNH:0 +FNDA:0,bufFromString +FNDA:0,filterArray +DA:2,0 +DA:4,0 +DA:5,0 +DA:8,0 +DA:9,0 +DA:11,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:19,0 +DA:21,0 +LF:12 +LH:0 +BRDA:5,0,0,0 +BRDA:5,0,1,0 +BRDA:15,1,0,0 +BRDA:15,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/dist/csvtojson.js +FN:1,e +FN:1,s +FN:1,(anonymous_2) +FN:1,(anonymous_3) +FN:7,(anonymous_4) +FN:9,(anonymous_5) +FN:12,CSVError +FN:22,(anonymous_7) +FN:26,(anonymous_8) +FN:30,(anonymous_9) +FN:34,(anonymous_10) +FN:38,(anonymous_11) +FN:39,(anonymous_12) +FN:54,Converter +FN:87,(anonymous_14) +FN:114,emitDone +FN:115,(anonymous_16) +FN:118,(anonymous_17) +FN:125,bufFromString +FN:128,(anonymous_19) +FN:143,(anonymous_20) +FN:163,(anonymous_21) +FN:172,(anonymous_22) +FN:184,(anonymous_23) +FN:188,(anonymous_24) +FN:219,(anonymous_25) +FN:233,(anonymous_26) +FN:242,(anonymous_27) +FN:247,(anonymous_28) +FN:255,(anonymous_29) +FN:260,(anonymous_30) +FN:289,(anonymous_31) +FN:345,configIgnoreIncludeColumns +FN:358,(anonymous_33) +FN:377,(anonymous_34) +FN:388,(anonymous_35) +FN:439,(anonymous_36) +FN:444,(anonymous_37) +FN:448,(anonymous_38) +FN:450,(anonymous_39) +FN:465,(anonymous_40) +FN:474,(anonymous_41) +FN:482,(anonymous_42) +FN:490,(anonymous_43) +FN:511,(anonymous_44) +FN:518,(anonymous_45) +FN:523,(anonymous_46) +FN:534,(anonymous_47) +FN:542,(anonymous_48) +FN:547,(anonymous_49) +FN:552,(anonymous_50) +FN:555,(anonymous_51) +FN:561,(anonymous_52) +FN:563,(anonymous_53) +FN:566,(anonymous_54) +FN:572,(anonymous_55) +FN:584,(anonymous_56) +FN:593,(anonymous_57) +FN:609,(anonymous_58) +FN:610,(anonymous_59) +FN:612,(anonymous_60) +FN:659,(anonymous_61) +FN:667,getEnv +FN:676,(anonymous_63) +FN:685,(anonymous_64) +FN:690,parser_array +FN:699,(anonymous_66) +FN:704,parser_flat +FN:711,(anonymous_68) +FN:715,processHead +FN:747,parser_json +FN:783,(anonymous_71) +FN:788,parser_jsonarray +FN:807,(anonymous_73) +FN:812,parser_omit +FN:815,(anonymous_75) +FN:823,(anonymous_76) +FN:832,(anonymous_77) +FN:840,(anonymous_78) +FN:847,(anonymous_79) +FN:848,filterRow +FN:867,(anonymous_81) +FN:870,getDelimiter +FN:881,(anonymous_83) +FN:891,(anonymous_84) +FN:894,(anonymous_85) +FN:913,(anonymous_86) +FN:917,constructor +FN:921,(anonymous_88) +FN:932,(anonymous_89) +FN:947,justReturnRows +FN:960,processRows +FN:971,processRow +FN:992,convertRowToJson +FN:1042,(anonymous_94) +FN:1044,getConvFunc +FN:1067,setPath +FN:1077,getFlag +FN:1089,getTitle +FN:1099,checkType +FN:1113,numberType +FN:1121,stringType +FN:1125,dynamicType +FN:1141,booleanType +FN:1150,jsonType +FN:1158,(anonymous_105) +FN:1161,Parser +FN:1178,(anonymous_107) +FN:1211,(anonymous_108) +FN:1215,(anonymous_109) +FN:1219,(anonymous_110) +FN:1223,(anonymous_111) +FN:1236,(anonymous_112) +FN:1240,(anonymous_113) +FN:1261,(anonymous_114) +FN:1270,(anonymous_115) +FN:1276,(anonymous_116) +FN:1282,registerParser +FN:1288,getParser +FN:1290,getParserByName +FN:1292,(anonymous_120) +FN:1304,(anonymous_121) +FN:1320,addParser +FN:1325,addSafeParser +FN:1329,initParsers +FN:1331,(anonymous_125) +FN:1337,(anonymous_126) +FN:1347,(anonymous_127) +FN:1357,rowSplit +FN:1436,isQuoteOpen +FN:1443,isQuoteClose +FN:1455,twoDoubleQuote +FN:1465,_escapeQuote +FN:1478,(anonymous_133) +FN:1479,(anonymous_134) +FN:1486,workerMgr +FN:1492,(anonymous_136) +FN:1499,initWorker +FN:1508,isRunning +FN:1511,destroyWorker +FN:1512,(anonymous_140) +FN:1517,sendWorker +FN:1521,(anonymous_142) +FN:1542,setParams +FN:1543,(anonymous_144) +FN:1550,Worker +FN:1562,(anonymous_146) +FN:1573,(anonymous_147) +FN:1583,(anonymous_148) +FN:1601,(anonymous_149) +FN:1617,(anonymous_150) +FN:1623,(anonymous_151) +FN:1627,(anonymous_152) +FN:1633,(anonymous_153) +FN:1641,(anonymous_154) +FN:1643,(anonymous_155) +FN:1644,(anonymous_156) +FN:1651,_initConverter +FN:1655,(anonymous_158) +FN:1666,(anonymous_159) +FN:1669,(anonymous_160) +FN:1675,convertFile +FN:1680,convertString +FN:1688,(anonymous_163) +FN:1691,(anonymous_164) +FN:1693,(anonymous_165) +FN:1696,startWebServer +FN:1703,(anonymous_167) +FN:1718,(anonymous_168) +FN:1719,(anonymous_169) +FN:1724,ctor +FN:1736,FirstChunk +FN:1748,(anonymous_172) +FN:1778,(anonymous_173) +FN:1791,(anonymous_174) +FN:1808,(anonymous_175) +FN:1815,(anonymous_176) +FN:1817,(anonymous_177) +FN:1819,(anonymous_178) +FN:1820,(anonymous_179) +FN:1873,typedArraySupport +FN:1874,Bar +FN:1877,(anonymous_182) +FN:1888,kMaxLength +FN:1906,Buffer +FN:1932,fromNumber +FN:1942,fromString +FN:1953,fromObject +FN:1976,fromBuffer +FN:1983,fromArray +FN:1993,fromTypedArray +FN:2005,fromArrayBuffer +FN:2017,fromArrayLike +FN:2028,fromJsonObject +FN:2053,allocate +FN:2070,checked +FN:2080,SlowBuffer +FN:2088,isBuffer +FN:2092,compare +FN:2120,isEncoding +FN:2139,concat +FN:2164,byteLength +FN:2201,slowToString +FN:2244,toString +FN:2251,equals +FN:2257,inspect +FN:2267,compare +FN:2273,indexOf +FN:2298,arrayIndexOf +FN:2315,get +FN:2321,set +FN:2326,hexWrite +FN:2353,utf8Write +FN:2357,asciiWrite +FN:2361,binaryWrite +FN:2365,base64Write +FN:2369,ucs2Write +FN:2373,write +FN:2445,toJSON +FN:2452,base64Slice +FN:2460,utf8Slice +FN:2538,decodeCodePointsArray +FN:2556,asciiSlice +FN:2566,binarySlice +FN:2576,hexSlice +FN:2589,utf16leSlice +FN:2598,slice +FN:2638,checkOffset +FN:2643,readUIntLE +FN:2658,readUIntBE +FN:2674,readUInt8 +FN:2679,readUInt16LE +FN:2684,readUInt16BE +FN:2689,readUInt32LE +FN:2698,readUInt32BE +FN:2707,readIntLE +FN:2725,readIntBE +FN:2743,readInt8 +FN:2749,readInt16LE +FN:2755,readInt16BE +FN:2761,readInt32LE +FN:2770,readInt32BE +FN:2779,readFloatLE +FN:2784,readFloatBE +FN:2789,readDoubleLE +FN:2794,readDoubleBE +FN:2799,checkInt +FN:2805,writeUIntLE +FN:2821,writeUIntBE +FN:2837,writeUInt8 +FN:2846,objectWriteUInt16 +FN:2854,writeUInt16LE +FN:2867,writeUInt16BE +FN:2880,objectWriteUInt32 +FN:2887,writeUInt32LE +FN:2902,writeUInt32BE +FN:2917,writeIntLE +FN:2937,writeIntBE +FN:2957,writeInt8 +FN:2967,writeInt16LE +FN:2980,writeInt16BE +FN:2993,writeInt32LE +FN:3008,writeInt32BE +FN:3024,checkIEEE754 +FN:3030,writeFloat +FN:3038,writeFloatLE +FN:3042,writeFloatBE +FN:3046,writeDouble +FN:3054,writeDoubleLE +FN:3058,writeDoubleBE +FN:3063,copy +FN:3108,fill +FN:3142,toArrayBuffer +FN:3166,_augment +FN:3231,base64clean +FN:3243,stringtrim +FN:3248,toHex +FN:3253,utf8ToBytes +FN:3333,asciiToBytes +FN:3342,utf16leToBytes +FN:3358,base64ToBytes +FN:3362,blitBuffer +FN:3371,(anonymous_282) +FN:3374,(anonymous_283) +FN:3389,decode +FN:3407,b64ToByteArray +FN:3430,push +FN:3453,uint8ToBase64 +FN:3459,encode +FN:3463,tripletToBase64 +FN:3497,(anonymous_290) +FN:3498,(anonymous_291) +FN:3531,(anonymous_292) +FN:3583,(anonymous_293) +FN:3586,(anonymous_294) +FN:3590,(anonymous_295) +FN:3612,EventEmitter +FN:3630,(anonymous_297) +FN:3637,(anonymous_298) +FN:3695,(anonymous_299) +FN:3748,(anonymous_300) +FN:3754,g +FN:3770,(anonymous_302) +FN:3815,(anonymous_303) +FN:3855,(anonymous_304) +FN:3866,(anonymous_305) +FN:3877,isFunction +FN:3881,isNumber +FN:3885,isObject +FN:3889,isUndefined +FN:3893,(anonymous_310) +FN:3896,inherits +FN:3909,inherits +FN:3911,(anonymous_313) +FN:3918,(anonymous_314) +FN:3928,(anonymous_315) +FN:3937,(anonymous_316) +FN:3938,(anonymous_317) +FN:3942,(anonymous_318) +FN:3943,(anonymous_319) +FN:3945,(anonymous_320) +FN:3952,(anonymous_321) +FN:3954,(anonymous_322) +FN:3956,(anonymous_323) +FN:3960,(anonymous_324) +FN:3964,(anonymous_325) +FN:3966,(anonymous_326) +FN:3968,(anonymous_327) +FN:3977,(anonymous_328) +FN:3979,(anonymous_329) +FN:3981,(anonymous_330) +FN:3983,(anonymous_331) +FN:3989,(anonymous_332) +FN:3998,cleanUpNextTick +FN:4010,drainQueue +FN:4034,(anonymous_335) +FN:4048,Item +FN:4052,(anonymous_337) +FN:4062,noop +FN:4072,(anonymous_339) +FN:4076,(anonymous_340) +FN:4077,(anonymous_341) +FN:4080,(anonymous_342) +FN:4082,(anonymous_343) +FN:4083,(anonymous_344) +FN:4085,(anonymous_345) +FN:4149,error +FN:4161,map +FN:4180,mapDomain +FN:4209,ucs2decode +FN:4243,ucs2encode +FN:4244,(anonymous_351) +FN:4265,basicToDigit +FN:4289,digitToBasic +FN:4300,adapt +FN:4317,decode +FN:4418,encode +FN:4536,toUnicode +FN:4537,(anonymous_358) +FN:4555,toASCII +FN:4556,(anonymous_360) +FN:4598,(anonymous_361) +FN:4619,(anonymous_362) +FN:4646,hasOwnProperty +FN:4650,(anonymous_364) +FN:4701,(anonymous_365) +FN:4705,(anonymous_366) +FN:4729,(anonymous_367) +FN:4745,(anonymous_368) +FN:4753,(anonymous_369) +FN:4756,(anonymous_370) +FN:4771,(anonymous_371) +FN:4775,map +FN:4784,(anonymous_373) +FN:4792,(anonymous_374) +FN:4798,(anonymous_375) +FN:4801,(anonymous_376) +FN:4810,(anonymous_377) +FN:4843,Duplex +FN:4864,onend +FN:4875,onEndNT +FN:4879,forEach +FN:4885,(anonymous_382) +FN:4903,PassThrough +FN:4910,(anonymous_384) +FN:4914,(anonymous_385) +FN:4915,(anonymous_386) +FN:4939,(anonymous_387) +FN:4948,(anonymous_388) +FN:4971,(anonymous_389) +FN:4980,ReadableState +FN:5048,Readable +FN:5069,(anonymous_392) +FN:5084,(anonymous_393) +FN:5089,(anonymous_394) +FN:5093,readableAddChunk +FN:5147,needMoreData +FN:5155,(anonymous_397) +FN:5165,computeNewHighWaterMark +FN:5181,howMuchToRead +FN:5220,(anonymous_400) +FN:5335,chunkInvalid +FN:5348,onEofChunk +FN:5366,emitReadable +FN:5379,emitReadable_ +FN:5392,maybeReadMore +FN:5399,maybeReadMore_ +FN:5418,(anonymous_407) +FN:5422,(anonymous_408) +FN:5451,onunpipe +FN:5458,onend +FN:5471,cleanup +FN:5496,ondata +FN:5516,onerror +FN:5534,onclose +FN:5539,onfinish +FN:5546,unpipe +FN:5563,pipeOnDrain +FN:5564,(anonymous_418) +FN:5577,(anonymous_419) +FN:5634,(anonymous_420) +FN:5661,nReadingNextTick +FN:5668,(anonymous_422) +FN:5678,resume +FN:5685,resume_ +FN:5698,(anonymous_425) +FN:5708,flow +FN:5721,(anonymous_427) +FN:5726,(anonymous_428) +FN:5737,(anonymous_429) +FN:5759,(anonymous_430) +FN:5759,(anonymous_431) +FN:5767,(anonymous_432) +FN:5773,(anonymous_433) +FN:5790,fromList +FN:5856,endReadable +FN:5870,endReadableNT +FN:5879,forEach +FN:5885,indexOf +FN:5893,(anonymous_439) +FN:5950,TransformState +FN:5951,(anonymous_441) +FN:5961,afterTransform +FN:5987,Transform +FN:6014,(anonymous_444) +FN:6016,(anonymous_445) +FN:6024,(anonymous_446) +FN:6039,(anonymous_447) +FN:6043,(anonymous_448) +FN:6060,(anonymous_449) +FN:6074,done +FN:6092,(anonymous_451) +FN:6129,(anonymous_452) +FN:6141,nop +FN:6143,WriteReq +FN:6151,WritableState +FN:6215,(anonymous_456) +FN:6240,writableStateGetBuffer +FN:6250,(anonymous_458) +FN:6252,(anonymous_459) +FN:6261,Writable +FN:6286,(anonymous_461) +FN:6291,writeAfterEnd +FN:6303,validChunk +FN:6319,(anonymous_464) +FN:6346,(anonymous_465) +FN:6352,(anonymous_466) +FN:6367,setDefaultEncoding +FN:6378,decodeChunk +FN:6390,writeOrBuffer +FN:6419,doWrite +FN:6431,onwriteError +FN:6442,onwriteStateUpdate +FN:6449,onwrite +FN:6477,afterWrite +FN:6488,onwriteDrain +FN:6497,clearBuffer +FN:6515,(anonymous_477) +FN:6549,(anonymous_478) +FN:6555,(anonymous_479) +FN:6582,needFinish +FN:6590,prefinish +FN:6597,finishMaybe +FN:6611,endWritable +FN:6623,(anonymous_484) +FN:6624,(anonymous_485) +FN:6649,isArray +FN:6657,isBoolean +FN:6662,isNull +FN:6667,isNullOrUndefined +FN:6672,isNumber +FN:6677,isString +FN:6682,isSymbol +FN:6687,isUndefined +FN:6692,isRegExp +FN:6697,isObject +FN:6702,isDate +FN:6707,isError +FN:6712,isFunction +FN:6717,isPrimitive +FN:6729,objectToString +FN:6734,(anonymous_501) +FN:6735,(anonymous_502) +FN:6746,nextTick +FN:6752,afterTick +FN:6758,(anonymous_505) +FN:6759,(anonymous_506) +FN:6785,deprecate +FN:6791,deprecated +FN:6816,config +FN:6829,(anonymous_510) +FN:6832,(anonymous_511) +FN:6833,(anonymous_512) +FN:6846,(anonymous_513) +FN:6849,(anonymous_514) +FN:6852,(anonymous_515) +FN:6894,Stream +FN:6898,(anonymous_517) +FN:6901,ondata +FN:6911,ondrain +FN:6927,onend +FN:6935,onclose +FN:6943,onerror +FN:6954,cleanup +FN:6981,(anonymous_524) +FN:6989,(anonymous_525) +FN:7017,get +FN:7023,(anonymous_527) +FN:7056,(anonymous_528) +FN:7057,(anonymous_529) +FN:7071,checkTypeSupport +FN:7093,isFunction +FN:7100,(anonymous_532) +FN:7101,(anonymous_533) +FN:7114,decideMode +FN:7130,(anonymous_535) +FN:7139,(anonymous_536) +FN:7159,(anonymous_537) +FN:7166,(anonymous_538) +FN:7181,(anonymous_539) +FN:7186,(anonymous_540) +FN:7191,(anonymous_541) +FN:7202,(anonymous_542) +FN:7214,(anonymous_543) +FN:7224,(anonymous_544) +FN:7227,(anonymous_545) +FN:7235,(anonymous_546) +FN:7251,(anonymous_547) +FN:7256,(anonymous_548) +FN:7267,(anonymous_549) +FN:7272,(anonymous_550) +FN:7281,(anonymous_551) +FN:7293,statusValid +FN:7301,(anonymous_553) +FN:7313,(anonymous_554) +FN:7323,(anonymous_555) +FN:7330,(anonymous_556) +FN:7341,(anonymous_557) +FN:7351,(anonymous_558) +FN:7352,(anonymous_559) +FN:7353,(anonymous_560) +FN:7354,(anonymous_561) +FN:7382,(anonymous_562) +FN:7383,(anonymous_563) +FN:7397,(anonymous_564) +FN:7408,(anonymous_565) +FN:7410,(anonymous_566) +FN:7429,read +FN:7430,(anonymous_568) +FN:7450,(anonymous_569) +FN:7479,(anonymous_570) +FN:7481,(anonymous_571) +FN:7538,(anonymous_572) +FN:7544,(anonymous_573) +FN:7559,(anonymous_574) +FN:7620,(anonymous_575) +FN:7625,forEach +FN:7644,(anonymous_577) +FN:7648,(anonymous_578) +FN:7655,(anonymous_579) +FN:7664,(anonymous_580) +FN:7674,(anonymous_581) +FN:7689,(anonymous_582) +FN:7707,(anonymous_583) +FN:7719,keys +FN:7761,shimObjectKeys +FN:7763,(anonymous_586) +FN:7769,keys +FN:7785,(anonymous_588) +FN:7790,isArguments +FN:7804,(anonymous_590) +FN:7829,(anonymous_591) +FN:7837,assertEncoding +FN:7851,(anonymous_593) +FN:7894,(anonymous_594) +FN:7966,(anonymous_595) +FN:7998,(anonymous_596) +FN:8013,passThroughWrite +FN:8017,utf16DetectIncompleteChar +FN:8022,base64DetectIncompleteChar +FN:8027,(anonymous_600) +FN:8058,Url +FN:8123,urlParse +FN:8131,(anonymous_603) +FN:8365,urlFormat +FN:8375,(anonymous_605) +FN:8423,(anonymous_606) +FN:8431,urlResolve +FN:8435,(anonymous_608) +FN:8439,urlResolveObject +FN:8444,(anonymous_610) +FN:8452,(anonymous_611) +FN:8469,(anonymous_612) +FN:8494,(anonymous_613) +FN:8708,(anonymous_614) +FN:8721,isString +FN:8725,isObject +FN:8729,isNull +FN:8732,isNullOrUndefined +FN:8736,(anonymous_619) +FN:8737,isBuffer +FN:8743,(anonymous_621) +FN:8744,(anonymous_622) +FN:8767,(anonymous_623) +FN:8779,(anonymous_624) +FN:8809,(anonymous_625) +FN:8812,(anonymous_626) +FN:8822,deprecated +FN:8842,(anonymous_628) +FN:8849,(anonymous_629) +FN:8854,(anonymous_630) +FN:8869,inspect +FN:8927,stylizeWithColor +FN:8939,stylizeNoColor +FN:8944,arrayToHash +FN:8947,(anonymous_635) +FN:8955,formatValue +FN:9057,(anonymous_637) +FN:9068,formatPrimitive +FN:9087,formatError +FN:9092,formatArray +FN:9102,(anonymous_641) +FN:9112,formatProperty +FN:9138,(anonymous_643) +FN:9142,(anonymous_644) +FN:9171,reduceToSingleString +FN:9173,(anonymous_646) +FN:9194,isArray +FN:9199,isBoolean +FN:9204,isNull +FN:9209,isNullOrUndefined +FN:9214,isNumber +FN:9219,isString +FN:9224,isSymbol +FN:9229,isUndefined +FN:9234,isRegExp +FN:9239,isObject +FN:9244,isDate +FN:9249,isError +FN:9255,isFunction +FN:9260,isPrimitive +FN:9272,objectToString +FN:9277,pad +FN:9286,timestamp +FN:9296,(anonymous_664) +FN:9316,(anonymous_665) +FN:9328,hasOwnProperty +FN:9333,(anonymous_667) +FN:9338,extend +FN:9354,(anonymous_669) +FN:9356,(anonymous_670) +FN:9432,(anonymous_671) +FN:9446,Hash +FN:9466,(anonymous_673) +FN:9480,ListCache +FN:9500,(anonymous_675) +FN:9509,(anonymous_676) +FN:9523,MapCache +FN:9543,(anonymous_678) +FN:9551,(anonymous_679) +FN:9561,arrayMap +FN:9574,(anonymous_681) +FN:9594,assignValue +FN:9604,(anonymous_683) +FN:9615,assocIndexOf +FN:9627,(anonymous_685) +FN:9639,baseAssignValue +FN:9654,(anonymous_687) +FN:9673,baseGetTag +FN:9684,(anonymous_689) +FN:9723,baseIsNative +FN:9733,(anonymous_691) +FN:9750,baseSet +FN:9782,(anonymous_693) +FN:9803,baseToString +FN:9821,(anonymous_695) +FN:9835,castPath +FN:9844,(anonymous_697) +FN:9852,(anonymous_698) +FN:9855,(anonymous_699) +FN:9865,(anonymous_700) +FN:9866,(anonymous_701) +FN:9873,(anonymous_702) +FN:9884,getMapData +FN:9893,(anonymous_704) +FN:9905,getNative +FN:9912,(anonymous_706) +FN:9938,getRawTag +FN:9960,(anonymous_708) +FN:9969,getValue +FN:9975,(anonymous_710) +FN:9985,hashClear +FN:9992,(anonymous_712) +FN:10003,hashDelete +FN:10011,(anonymous_714) +FN:10032,hashGet +FN:10043,(anonymous_716) +FN:10061,hashHas +FN:10068,(anonymous_718) +FN:10084,hashSet +FN:10093,(anonymous_720) +FN:10108,isIndex +FN:10117,(anonymous_722) +FN:10133,isKey +FN:10148,(anonymous_724) +FN:10156,isKeyable +FN:10165,(anonymous_726) +FN:10169,(anonymous_727) +FN:10181,isMasked +FN:10187,(anonymous_729) +FN:10195,listCacheClear +FN:10202,(anonymous_731) +FN:10220,listCacheDelete +FN:10239,(anonymous_733) +FN:10251,listCacheGet +FN:10260,(anonymous_735) +FN:10272,listCacheHas +FN:10278,(anonymous_737) +FN:10291,listCacheSet +FN:10306,(anonymous_739) +FN:10318,mapCacheClear +FN:10329,(anonymous_741) +FN:10341,mapCacheDelete +FN:10349,(anonymous_743) +FN:10361,mapCacheGet +FN:10367,(anonymous_745) +FN:10379,mapCacheHas +FN:10385,(anonymous_747) +FN:10398,mapCacheSet +FN:10409,(anonymous_749) +FN:10423,memoizeCapped +FN:10424,(anonymous_751) +FN:10437,(anonymous_752) +FN:10445,(anonymous_753) +FN:10463,objectToString +FN:10469,(anonymous_755) +FN:10480,(anonymous_756) +FN:10497,(anonymous_757) +FN:10502,(anonymous_758) +FN:10510,(anonymous_759) +FN:10523,toKey +FN:10533,(anonymous_761) +FN:10547,toSource +FN:10561,(anonymous_763) +FN:10594,eq +FN:10600,(anonymous_765) +FN:10628,(anonymous_766) +FN:10655,isFunction +FN:10667,(anonymous_768) +FN:10693,isObject +FN:10700,(anonymous_770) +FN:10725,isObjectLike +FN:10731,(anonymous_772) +FN:10755,isSymbol +FN:10762,(anonymous_774) +FN:10763,(anonymous_775) +FN:10772,(anonymous_776) +FN:11201,(anonymous_777) +FN:11225,addMapEntry +FN:11239,addSetEntry +FN:11255,apply +FN:11275,arrayAggregator +FN:11295,arrayEach +FN:11316,arrayEachRight +FN:11337,arrayEvery +FN:11358,arrayFilter +FN:11382,arrayIncludes +FN:11396,arrayIncludesWith +FN:11417,arrayMap +FN:11436,arrayPush +FN:11459,arrayReduce +FN:11484,arrayReduceRight +FN:11505,arraySome +FN:11533,asciiToArray +FN:11544,asciiWords +FN:11559,baseFindKey +FN:11561,(anonymous_796) +FN:11581,baseFindIndex +FN:11602,baseIndexOf +FN:11618,baseIndexOfWith +FN:11637,baseIsNaN +FN:11650,baseMean +FN:11662,baseProperty +FN:11663,(anonymous_803) +FN:11675,basePropertyOf +FN:11676,(anonymous_805) +FN:11694,baseReduce +FN:11695,(anonymous_807) +FN:11713,baseSortBy +FN:11732,baseSum +FN:11755,baseTimes +FN:11774,baseToPairs +FN:11775,(anonymous_812) +FN:11787,baseUnary +FN:11788,(anonymous_814) +FN:11803,baseValues +FN:11804,(anonymous_816) +FN:11817,cacheHas +FN:11830,charsStartIndex +FN:11847,charsEndIndex +FN:11862,countHolders +FN:11900,escapeStringChar +FN:11912,getValue +FN:11923,hasUnicode +FN:11934,hasUnicodeWord +FN:11945,iteratorToArray +FN:11962,mapToArray +FN:11966,(anonymous_827) +FN:11980,overArg +FN:11981,(anonymous_829) +FN:11995,replaceHolders +FN:12018,setToArray +FN:12022,(anonymous_832) +FN:12035,setToPairs +FN:12039,(anonymous_834) +FN:12055,strictIndexOf +FN:12077,strictLastIndexOf +FN:12094,stringSize +FN:12107,stringToArray +FN:12129,unicodeSize +FN:12144,unicodeToArray +FN:12155,unicodeWords +FN:12190,runInContext +FN:12222,(anonymous_843) +FN:12259,(anonymous_844) +FN:12432,lodash +FN:12452,(anonymous_846) +FN:12453,object +FN:12454,(anonymous_848) +FN:12473,baseLodash +FN:12484,LodashWrapper +FN:12569,LazyWrapper +FN:12587,lazyClone +FN:12606,lazyReverse +FN:12626,lazyValue +FN:12688,Hash +FN:12706,hashClear +FN:12721,hashDelete +FN:12736,hashGet +FN:12754,hashHas +FN:12769,hashSet +FN:12792,ListCache +FN:12810,listCacheClear +FN:12824,listCacheDelete +FN:12850,listCacheGet +FN:12866,listCacheHas +FN:12880,listCacheSet +FN:12909,MapCache +FN:12927,mapCacheClear +FN:12945,mapCacheDelete +FN:12960,mapCacheGet +FN:12973,mapCacheHas +FN:12987,mapCacheSet +FN:13013,SetCache +FN:13033,setCacheAdd +FN:13047,setCacheHas +FN:13064,Stack +FN:13076,stackClear +FN:13090,stackDelete +FN:13107,stackGet +FN:13120,stackHas +FN:13134,stackSet +FN:13167,arrayLikeKeys +FN:13201,arraySample +FN:13214,arraySampleSize +FN:13225,arrayShuffle +FN:13238,assignMergeValue +FN:13255,assignValue +FN:13271,assocIndexOf +FN:13292,baseAggregator +FN:13293,(anonymous_890) +FN:13308,baseAssign +FN:13321,baseAssignIn +FN:13334,baseAssignValue +FN:13355,baseAt +FN:13376,baseClamp +FN:13404,baseClone +FN:13459,(anonymous_897) +FN:13477,baseConforms +FN:13479,(anonymous_899) +FN:13492,baseConformsTo +FN:13520,baseDelay +FN:13524,(anonymous_902) +FN:13538,baseDifference +FN:13612,baseEvery +FN:13614,(anonymous_905) +FN:13631,baseExtremum +FN:13660,baseFill +FN:13686,baseFilter +FN:13688,(anonymous_909) +FN:13707,baseFlatten +FN:13763,baseForOwn +FN:13775,baseForOwnRight +FN:13788,baseFunctions +FN:13789,(anonymous_914) +FN:13802,baseGet +FN:13825,baseGetAllKeys +FN:13837,baseGetTag +FN:13855,baseGt +FN:13867,baseHas +FN:13879,baseHasIn +FN:13892,baseInRange +FN:13906,baseIntersection +FN:13970,baseInverter +FN:13971,(anonymous_924) +FN:13987,baseInvoke +FN:14001,baseIsArguments +FN:14012,baseIsArrayBuffer +FN:14023,baseIsDate +FN:14041,baseIsEqual +FN:14065,baseIsEqualDeep +FN:14117,baseIsMap +FN:14131,baseIsMatch +FN:14183,baseIsNative +FN:14198,baseIsRegExp +FN:14209,baseIsSet +FN:14220,baseIsTypedArray +FN:14232,baseIteratee +FN:14256,baseKeys +FN:14276,baseKeysIn +FN:14300,baseLt +FN:14312,baseMap +FN:14316,(anonymous_942) +FN:14329,baseMatches +FN:14334,(anonymous_944) +FN:14347,baseMatchesProperty +FN:14351,(anonymous_946) +FN:14370,baseMerge +FN:14374,(anonymous_948) +FN:14407,baseMergeDeep +FN:14477,baseNth +FN:14495,baseOrderBy +FN:14499,(anonymous_952) +FN:14500,(anonymous_953) +FN:14506,(anonymous_954) +FN:14520,basePick +FN:14521,(anonymous_956) +FN:14535,basePickBy +FN:14558,basePropertyDeep +FN:14559,(anonymous_959) +FN:14575,basePullAll +FN:14611,basePullAt +FN:14638,baseRandom +FN:14653,baseRange +FN:14673,baseRepeat +FN:14701,baseRest +FN:14712,baseSample +FN:14724,baseSampleSize +FN:14739,baseSet +FN:14777,(anonymous_969) +FN:14790,(anonymous_970) +FN:14806,baseShuffle +FN:14819,baseSlice +FN:14849,baseSome +FN:14852,(anonymous_974) +FN:14871,baseSortedIndex +FN:14905,baseSortedIndexBy +FN:14954,baseSortedUniq +FN:14980,baseToNumber +FN:14998,baseToString +FN:15023,baseUniq +FN:15083,baseUnset +FN:15099,baseUpdate +FN:15114,baseWhile +FN:15136,baseWrapperValue +FN:15141,(anonymous_985) +FN:15156,baseXor +FN:15186,baseZipObject +FN:15206,castArrayLikeObject +FN:15217,castFunction +FN:15229,castPath +FN:15256,castSlice +FN:15268,(anonymous_992) +FN:15280,cloneBuffer +FN:15298,cloneArrayBuffer +FN:15312,cloneDataView +FN:15326,cloneMap +FN:15338,cloneRegExp +FN:15353,cloneSet +FN:15365,cloneSymbol +FN:15377,cloneTypedArray +FN:15390,compareAscending +FN:15434,compareMultiple +FN:15472,composeArgs +FN:15507,composeArgsRight +FN:15541,copyArray +FN:15562,copyObject +FN:15596,copySymbols +FN:15608,copySymbolsIn +FN:15620,createAggregator +FN:15621,(anonymous_1010) +FN:15636,createAssigner +FN:15637,(anonymous_1012) +FN:15670,createBaseEach +FN:15671,(anonymous_1014) +FN:15698,createBaseFor +FN:15699,(anonymous_1016) +FN:15725,createBind +FN:15729,wrapper +FN:15743,createCaseFirst +FN:15744,(anonymous_1020) +FN:15770,createCompounder +FN:15771,(anonymous_1022) +FN:15784,createCtor +FN:15785,(anonymous_1024) +FN:15818,createCurry +FN:15821,wrapper +FN:15853,createFind +FN:15854,(anonymous_1028) +FN:15859,(anonymous_1029) +FN:15873,createFlow +FN:15874,(anonymous_1031) +FN:15909,(anonymous_1032) +FN:15946,createHybrid +FN:15954,wrapper +FN:16008,createInverter +FN:16009,(anonymous_1036) +FN:16022,createMathOperation +FN:16023,(anonymous_1038) +FN:16055,createOver +FN:16056,(anonymous_1040) +FN:16058,(anonymous_1041) +FN:16060,(anonymous_1042) +FN:16076,createPadding +FN:16101,createPartial +FN:16105,wrapper +FN:16131,createRange +FN:16132,(anonymous_1047) +FN:16156,createRelationalOperation +FN:16157,(anonymous_1049) +FN:16183,createRecurry +FN:16216,createRound +FN:16218,(anonymous_1052) +FN:16241,(anonymous_1053) +FN:16252,createToPairs +FN:16253,(anonymous_1055) +FN:16290,createWrap +FN:16357,customDefaultsAssignIn +FN:16379,customDefaultsMerge +FN:16398,customOmitClone +FN:16415,equalArrays +FN:16454,(anonymous_1061) +FN:16493,equalByTag +FN:16571,equalObjects +FN:16642,flatRest +FN:16653,getAllKeys +FN:16665,getAllKeysIn +FN:16676,(anonymous_1067) +FN:16687,getFuncName +FN:16709,getHolder +FN:16725,getIteratee +FN:16739,getMapData +FN:16753,getMatchData +FN:16774,getNative +FN:16786,getRawTag +FN:16813,(anonymous_1075) +FN:16818,(anonymous_1076) +FN:16830,(anonymous_1077) +FN:16854,(anonymous_1078) +FN:16882,getView +FN:16907,getWrapDetails +FN:16921,hasPath +FN:16950,initCloneArray +FN:16969,initCloneObject +FN:16988,initCloneByTag +FN:17032,insertWrapDetails +FN:17050,isFlattenable +FN:17063,isIndex +FN:17080,isIterateeCall +FN:17102,isKey +FN:17122,isKeyable +FN:17137,isLaziable +FN:17158,isMasked +FN:17178,isPrototype +FN:17193,isStrictComparable +FN:17206,matchesStrictComparable +FN:17207,(anonymous_1096) +FN:17224,memoizeCapped +FN:17225,(anonymous_1098) +FN:17252,mergeData +FN:17316,nativeKeysIn +FN:17333,objectToString +FN:17346,overRest +FN:17348,(anonymous_1103) +FN:17375,parent +FN:17389,reorder +FN:17425,(anonymous_1106) +FN:17449,setWrapToString +FN:17463,shortOut +FN:17467,(anonymous_1109) +FN:17491,shuffleSelf +FN:17515,(anonymous_1111) +FN:17520,(anonymous_1112) +FN:17533,toKey +FN:17548,toSource +FN:17568,updateWrapDetails +FN:17569,(anonymous_1116) +FN:17585,wrapperClone +FN:17619,chunk +FN:17654,compact +FN:17691,concat +FN:17727,(anonymous_1121) +FN:17759,(anonymous_1122) +FN:17792,(anonymous_1123) +FN:17827,drop +FN:17861,dropRight +FN:17906,dropRightWhile +FN:17947,dropWhile +FN:17982,fill +FN:18029,findIndex +FN:18076,findLastIndex +FN:18105,flatten +FN:18124,flattenDeep +FN:18149,flattenDepth +FN:18173,fromPairs +FN:18203,head +FN:18230,indexOf +FN:18256,initial +FN:18278,(anonymous_1138) +FN:18308,(anonymous_1139) +FN:18343,(anonymous_1140) +FN:18371,join +FN:18389,last +FN:18415,lastIndexOf +FN:18451,nth +FN:18500,pullAll +FN:18529,pullAllBy +FN:18558,pullAllWith +FN:18588,(anonymous_1148) +FN:18592,(anonymous_1149) +FN:18627,remove +FN:18671,reverse +FN:18691,slice +FN:18724,sortedIndex +FN:18753,sortedIndexBy +FN:18773,sortedIndexOf +FN:18802,sortedLastIndex +FN:18831,sortedLastIndexBy +FN:18851,sortedLastIndexOf +FN:18877,sortedUniq +FN:18899,sortedUniqBy +FN:18919,tail +FN:18949,take +FN:18982,takeRight +FN:19027,takeRightWhile +FN:19068,takeWhile +FN:19090,(anonymous_1166) +FN:19117,(anonymous_1167) +FN:19146,(anonymous_1168) +FN:19170,uniq +FN:19197,uniqBy +FN:19221,uniqWith +FN:19245,unzip +FN:19250,(anonymous_1173) +FN:19256,(anonymous_1174) +FN:19282,unzipWith +FN:19290,(anonymous_1176) +FN:19315,(anonymous_1177) +FN:19339,(anonymous_1178) +FN:19366,(anonymous_1179) +FN:19395,(anonymous_1180) +FN:19435,zipObject +FN:19454,zipObjectDeep +FN:19478,(anonymous_1183) +FN:19517,chain +FN:19546,tap +FN:19574,thru +FN:19594,(anonymous_1187) +FN:19598,(anonymous_1188) +FN:19610,(anonymous_1189) +FN:19645,wrapperChain +FN:19675,wrapperCommit +FN:19701,wrapperNext +FN:19729,wrapperToIterator +FN:19757,wrapperPlant +FN:19797,wrapperReverse +FN:19829,wrapperValue +FN:19857,(anonymous_1197) +FN:19906,every +FN:19951,filter +FN:20036,flatMap +FN:20060,flatMapDeep +FN:20085,flatMapDepth +FN:20120,forEach +FN:20145,forEachRight +FN:20173,(anonymous_1205) +FN:20211,includes +FN:20247,(anonymous_1207) +FN:20252,(anonymous_1208) +FN:20286,(anonymous_1209) +FN:20332,map +FN:20366,orderBy +FN:20416,(anonymous_1212) +FN:20418,(anonymous_1213) +FN:20457,reduce +FN:20486,reduceRight +FN:20527,reject +FN:20546,sample +FN:20571,sampleSize +FN:20596,shuffle +FN:20622,size +FN:20672,some +FN:20709,(anonymous_1222) +FN:20740,(anonymous_1223) +FN:20770,after +FN:20775,(anonymous_1225) +FN:20799,ary +FN:20822,before +FN:20828,(anonymous_1228) +FN:20874,(anonymous_1229) +FN:20928,(anonymous_1230) +FN:20978,curry +FN:21023,curryRight +FN:21084,debounce +FN:21107,invokeFunc +FN:21117,leadingEdge +FN:21126,remainingWait +FN:21134,shouldInvoke +FN:21145,timerExpired +FN:21154,trailingEdge +FN:21166,cancel +FN:21174,flush +FN:21178,debounced +FN:21224,(anonymous_1243) +FN:21247,(anonymous_1244) +FN:21269,flip +FN:21317,memoize +FN:21321,(anonymous_1247) +FN:21360,negate +FN:21364,(anonymous_1249) +FN:21394,once +FN:21429,(anonymous_1251) +FN:21435,(anonymous_1252) +FN:21479,(anonymous_1253) +FN:21516,(anonymous_1254) +FN:21543,(anonymous_1255) +FN:21572,rest +FN:21614,spread +FN:21619,(anonymous_1258) +FN:21674,throttle +FN:21707,unary +FN:21733,wrap +FN:21772,castArray +FN:21806,clone +FN:21841,cloneWith +FN:21864,cloneDeep +FN:21896,cloneDeepWith +FN:21925,conformsTo +FN:21961,eq +FN:22013,(anonymous_1269) +FN:22035,(anonymous_1270) +FN:22035,(anonymous_1271) +FN:22109,isArrayLike +FN:22138,isArrayLikeObject +FN:22159,isBoolean +FN:22219,isElement +FN:22256,isEmpty +FN:22308,isEqual +FN:22344,isEqualWith +FN:22368,isError +FN:22403,isFinite +FN:22424,isFunction +FN:22460,isInteger +FN:22490,isLength +FN:22520,isObject +FN:22549,isObjectLike +FN:22600,isMatch +FN:22636,isMatchWith +FN:22669,isNaN +FN:22702,isNative +FN:22726,isNull +FN:22750,isNil +FN:22780,isNumber +FN:22813,isPlainObject +FN:22872,isSafeInteger +FN:22912,isString +FN:22934,isSymbol +FN:22975,isUndefined +FN:22996,isWeakMap +FN:23017,isWeakSet +FN:23069,(anonymous_1300) +FN:23096,toArray +FN:23135,toFinite +FN:23173,toInteger +FN:23207,toLength +FN:23234,toNumber +FN:23279,toPlainObject +FN:23307,toSafeInteger +FN:23334,toString +FN:23372,(anonymous_1309) +FN:23415,(anonymous_1310) +FN:23448,(anonymous_1311) +FN:23480,(anonymous_1312) +FN:23537,create +FN:23563,(anonymous_1314) +FN:23587,(anonymous_1315) +FN:23627,findKey +FN:23666,findLastKey +FN:23698,forIn +FN:23730,forInRight +FN:23764,forOwn +FN:23794,forOwnRight +FN:23821,functions +FN:23848,functionsIn +FN:23877,get +FN:23909,has +FN:23939,hasIn +FN:23961,(anonymous_1327) +FN:23991,(anonymous_1328) +FN:24047,keys +FN:24074,keysIn +FN:24099,mapKeys +FN:24103,(anonymous_1332) +FN:24137,mapValues +FN:24141,(anonymous_1334) +FN:24178,(anonymous_1335) +FN:24213,(anonymous_1336) +FN:24237,(anonymous_1337) +FN:24243,(anonymous_1338) +FN:24279,omitBy +FN:24300,(anonymous_1340) +FN:24322,pickBy +FN:24326,(anonymous_1342) +FN:24330,(anonymous_1343) +FN:24364,result +FN:24414,set +FN:24442,setWith +FN:24529,transform +FN:24546,(anonymous_1348) +FN:24579,unset +FN:24610,update +FN:24638,updateWith +FN:24669,values +FN:24697,valuesIn +FN:24722,clamp +FN:24776,inRange +FN:24819,random +FN:24880,(anonymous_1357) +FN:24900,capitalize +FN:24922,deburr +FN:24950,endsWith +FN:24992,escape +FN:25014,escapeRegExp +FN:25042,(anonymous_1363) +FN:25066,(anonymous_1364) +FN:25112,pad +FN:25151,padEnd +FN:25184,padStart +FN:25218,parseInt +FN:25249,repeat +FN:25277,replace +FN:25305,(anonymous_1371) +FN:25328,split +FN:25370,(anonymous_1373) +FN:25397,startsWith +FN:25511,template +FN:25548,(anonymous_1376) +FN:25605,(anonymous_1377) +FN:25640,toLower +FN:25665,toUpper +FN:25691,trim +FN:25726,trimEnd +FN:25759,trimStart +FN:25810,truncate +FN:25885,unescape +FN:25912,(anonymous_1385) +FN:25954,words +FN:25988,(anonymous_1387) +FN:26022,(anonymous_1388) +FN:26023,(anonymous_1389) +FN:26059,cond +FN:26063,(anonymous_1391) +FN:26070,(anonymous_1392) +FN:26105,conforms +FN:26128,constant +FN:26129,(anonymous_1395) +FN:26154,defaultTo +FN:26221,identity +FN:26267,iteratee +FN:26299,matches +FN:26329,matchesProperty +FN:26357,(anonymous_1401) +FN:26358,(anonymous_1402) +FN:26386,(anonymous_1403) +FN:26387,(anonymous_1404) +FN:26428,mixin +FN:26442,(anonymous_1406) +FN:26446,(anonymous_1407) +FN:26477,noConflict +FN:26496,noop +FN:26520,nthArg +FN:26522,(anonymous_1411) +FN:26621,property +FN:26646,propertyOf +FN:26647,(anonymous_1414) +FN:26751,stubArray +FN:26768,stubFalse +FN:26790,stubObject +FN:26807,stubString +FN:26824,stubTrue +FN:26847,times +FN:26882,toPath +FN:26906,uniqueId +FN:26928,(anonymous_1423) +FN:26970,(anonymous_1424) +FN:27015,max +FN:27044,maxBy +FN:27064,mean +FN:27091,meanBy +FN:27113,min +FN:27142,minBy +FN:27163,(anonymous_1431) +FN:27205,(anonymous_1432) +FN:27223,sum +FN:27252,sumBy +FN:27578,(anonymous_1435) +FN:27580,(anonymous_1436) +FN:27600,(anonymous_1437) +FN:27605,(anonymous_1438) +FN:27606,(anonymous_1439) +FN:27624,(anonymous_1440) +FN:27630,(anonymous_1441) +FN:27634,(anonymous_1442) +FN:27646,(anonymous_1443) +FN:27649,(anonymous_1444) +FN:27655,(anonymous_1445) +FN:27658,(anonymous_1446) +FN:27663,(anonymous_1447) +FN:27667,(anonymous_1448) +FN:27671,(anonymous_1449) +FN:27675,(anonymous_1450) +FN:27679,(anonymous_1451) +FN:27684,(anonymous_1452) +FN:27688,(anonymous_1453) +FN:27707,(anonymous_1454) +FN:27711,(anonymous_1455) +FN:27716,(anonymous_1456) +FN:27725,(anonymous_1457) +FN:27732,(anonymous_1458) +FN:27761,(anonymous_1459) +FN:27766,(anonymous_1460) +FN:27772,(anonymous_1461) +FN:27779,(anonymous_1462) +FN:27832,(anonymous_1463) +FN:27850,(anonymous_1464) +FN:27900,memoize +FN:27904,(anonymous_1466) +FN:27925,(anonymous_1467) +FN:27956,set +FN:27962,(anonymous_1469) +FN:27986,toString +FN:27992,(anonymous_1471) +FN:27993,(anonymous_1472) +FN:27997,(anonymous_1473) +FN:28010,(anonymous_1474) +FN:28013,(anonymous_1475) +FN:28020,(anonymous_1476) +FNF:1477 +FNH:0 +FNDA:0,e +FNDA:0,s +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,CSVError +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,Converter +FNDA:0,(anonymous_14) +FNDA:0,emitDone +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,bufFromString +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:0,configIgnoreIncludeColumns +FNDA:0,(anonymous_33) +FNDA:0,(anonymous_34) +FNDA:0,(anonymous_35) +FNDA:0,(anonymous_36) +FNDA:0,(anonymous_37) +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_39) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_41) +FNDA:0,(anonymous_42) +FNDA:0,(anonymous_43) +FNDA:0,(anonymous_44) +FNDA:0,(anonymous_45) +FNDA:0,(anonymous_46) +FNDA:0,(anonymous_47) +FNDA:0,(anonymous_48) +FNDA:0,(anonymous_49) +FNDA:0,(anonymous_50) +FNDA:0,(anonymous_51) +FNDA:0,(anonymous_52) +FNDA:0,(anonymous_53) +FNDA:0,(anonymous_54) +FNDA:0,(anonymous_55) +FNDA:0,(anonymous_56) +FNDA:0,(anonymous_57) +FNDA:0,(anonymous_58) +FNDA:0,(anonymous_59) +FNDA:0,(anonymous_60) +FNDA:0,(anonymous_61) +FNDA:0,getEnv +FNDA:0,(anonymous_63) +FNDA:0,(anonymous_64) +FNDA:0,parser_array +FNDA:0,(anonymous_66) +FNDA:0,parser_flat +FNDA:0,(anonymous_68) +FNDA:0,processHead +FNDA:0,parser_json +FNDA:0,(anonymous_71) +FNDA:0,parser_jsonarray +FNDA:0,(anonymous_73) +FNDA:0,parser_omit +FNDA:0,(anonymous_75) +FNDA:0,(anonymous_76) +FNDA:0,(anonymous_77) +FNDA:0,(anonymous_78) +FNDA:0,(anonymous_79) +FNDA:0,filterRow +FNDA:0,(anonymous_81) +FNDA:0,getDelimiter +FNDA:0,(anonymous_83) +FNDA:0,(anonymous_84) +FNDA:0,(anonymous_85) +FNDA:0,(anonymous_86) +FNDA:0,constructor +FNDA:0,(anonymous_88) +FNDA:0,(anonymous_89) +FNDA:0,justReturnRows +FNDA:0,processRows +FNDA:0,processRow +FNDA:0,convertRowToJson +FNDA:0,(anonymous_94) +FNDA:0,getConvFunc +FNDA:0,setPath +FNDA:0,getFlag +FNDA:0,getTitle +FNDA:0,checkType +FNDA:0,numberType +FNDA:0,stringType +FNDA:0,dynamicType +FNDA:0,booleanType +FNDA:0,jsonType +FNDA:0,(anonymous_105) +FNDA:0,Parser +FNDA:0,(anonymous_107) +FNDA:0,(anonymous_108) +FNDA:0,(anonymous_109) +FNDA:0,(anonymous_110) +FNDA:0,(anonymous_111) +FNDA:0,(anonymous_112) +FNDA:0,(anonymous_113) +FNDA:0,(anonymous_114) +FNDA:0,(anonymous_115) +FNDA:0,(anonymous_116) +FNDA:0,registerParser +FNDA:0,getParser +FNDA:0,getParserByName +FNDA:0,(anonymous_120) +FNDA:0,(anonymous_121) +FNDA:0,addParser +FNDA:0,addSafeParser +FNDA:0,initParsers +FNDA:0,(anonymous_125) +FNDA:0,(anonymous_126) +FNDA:0,(anonymous_127) +FNDA:0,rowSplit +FNDA:0,isQuoteOpen +FNDA:0,isQuoteClose +FNDA:0,twoDoubleQuote +FNDA:0,_escapeQuote +FNDA:0,(anonymous_133) +FNDA:0,(anonymous_134) +FNDA:0,workerMgr +FNDA:0,(anonymous_136) +FNDA:0,initWorker +FNDA:0,isRunning +FNDA:0,destroyWorker +FNDA:0,(anonymous_140) +FNDA:0,sendWorker +FNDA:0,(anonymous_142) +FNDA:0,setParams +FNDA:0,(anonymous_144) +FNDA:0,Worker +FNDA:0,(anonymous_146) +FNDA:0,(anonymous_147) +FNDA:0,(anonymous_148) +FNDA:0,(anonymous_149) +FNDA:0,(anonymous_150) +FNDA:0,(anonymous_151) +FNDA:0,(anonymous_152) +FNDA:0,(anonymous_153) +FNDA:0,(anonymous_154) +FNDA:0,(anonymous_155) +FNDA:0,(anonymous_156) +FNDA:0,_initConverter +FNDA:0,(anonymous_158) +FNDA:0,(anonymous_159) +FNDA:0,(anonymous_160) +FNDA:0,convertFile +FNDA:0,convertString +FNDA:0,(anonymous_163) +FNDA:0,(anonymous_164) +FNDA:0,(anonymous_165) +FNDA:0,startWebServer +FNDA:0,(anonymous_167) +FNDA:0,(anonymous_168) +FNDA:0,(anonymous_169) +FNDA:0,ctor +FNDA:0,FirstChunk +FNDA:0,(anonymous_172) +FNDA:0,(anonymous_173) +FNDA:0,(anonymous_174) +FNDA:0,(anonymous_175) +FNDA:0,(anonymous_176) +FNDA:0,(anonymous_177) +FNDA:0,(anonymous_178) +FNDA:0,(anonymous_179) +FNDA:0,typedArraySupport +FNDA:0,Bar +FNDA:0,(anonymous_182) +FNDA:0,kMaxLength +FNDA:0,Buffer +FNDA:0,fromNumber +FNDA:0,fromString +FNDA:0,fromObject +FNDA:0,fromBuffer +FNDA:0,fromArray +FNDA:0,fromTypedArray +FNDA:0,fromArrayBuffer +FNDA:0,fromArrayLike +FNDA:0,fromJsonObject +FNDA:0,allocate +FNDA:0,checked +FNDA:0,SlowBuffer +FNDA:0,isBuffer +FNDA:0,compare +FNDA:0,isEncoding +FNDA:0,concat +FNDA:0,byteLength +FNDA:0,slowToString +FNDA:0,toString +FNDA:0,equals +FNDA:0,inspect +FNDA:0,compare +FNDA:0,indexOf +FNDA:0,arrayIndexOf +FNDA:0,get +FNDA:0,set +FNDA:0,hexWrite +FNDA:0,utf8Write +FNDA:0,asciiWrite +FNDA:0,binaryWrite +FNDA:0,base64Write +FNDA:0,ucs2Write +FNDA:0,write +FNDA:0,toJSON +FNDA:0,base64Slice +FNDA:0,utf8Slice +FNDA:0,decodeCodePointsArray +FNDA:0,asciiSlice +FNDA:0,binarySlice +FNDA:0,hexSlice +FNDA:0,utf16leSlice +FNDA:0,slice +FNDA:0,checkOffset +FNDA:0,readUIntLE +FNDA:0,readUIntBE +FNDA:0,readUInt8 +FNDA:0,readUInt16LE +FNDA:0,readUInt16BE +FNDA:0,readUInt32LE +FNDA:0,readUInt32BE +FNDA:0,readIntLE +FNDA:0,readIntBE +FNDA:0,readInt8 +FNDA:0,readInt16LE +FNDA:0,readInt16BE +FNDA:0,readInt32LE +FNDA:0,readInt32BE +FNDA:0,readFloatLE +FNDA:0,readFloatBE +FNDA:0,readDoubleLE +FNDA:0,readDoubleBE +FNDA:0,checkInt +FNDA:0,writeUIntLE +FNDA:0,writeUIntBE +FNDA:0,writeUInt8 +FNDA:0,objectWriteUInt16 +FNDA:0,writeUInt16LE +FNDA:0,writeUInt16BE +FNDA:0,objectWriteUInt32 +FNDA:0,writeUInt32LE +FNDA:0,writeUInt32BE +FNDA:0,writeIntLE +FNDA:0,writeIntBE +FNDA:0,writeInt8 +FNDA:0,writeInt16LE +FNDA:0,writeInt16BE +FNDA:0,writeInt32LE +FNDA:0,writeInt32BE +FNDA:0,checkIEEE754 +FNDA:0,writeFloat +FNDA:0,writeFloatLE +FNDA:0,writeFloatBE +FNDA:0,writeDouble +FNDA:0,writeDoubleLE +FNDA:0,writeDoubleBE +FNDA:0,copy +FNDA:0,fill +FNDA:0,toArrayBuffer +FNDA:0,_augment +FNDA:0,base64clean +FNDA:0,stringtrim +FNDA:0,toHex +FNDA:0,utf8ToBytes +FNDA:0,asciiToBytes +FNDA:0,utf16leToBytes +FNDA:0,base64ToBytes +FNDA:0,blitBuffer +FNDA:0,(anonymous_282) +FNDA:0,(anonymous_283) +FNDA:0,decode +FNDA:0,b64ToByteArray +FNDA:0,push +FNDA:0,uint8ToBase64 +FNDA:0,encode +FNDA:0,tripletToBase64 +FNDA:0,(anonymous_290) +FNDA:0,(anonymous_291) +FNDA:0,(anonymous_292) +FNDA:0,(anonymous_293) +FNDA:0,(anonymous_294) +FNDA:0,(anonymous_295) +FNDA:0,EventEmitter +FNDA:0,(anonymous_297) +FNDA:0,(anonymous_298) +FNDA:0,(anonymous_299) +FNDA:0,(anonymous_300) +FNDA:0,g +FNDA:0,(anonymous_302) +FNDA:0,(anonymous_303) +FNDA:0,(anonymous_304) +FNDA:0,(anonymous_305) +FNDA:0,isFunction +FNDA:0,isNumber +FNDA:0,isObject +FNDA:0,isUndefined +FNDA:0,(anonymous_310) +FNDA:0,inherits +FNDA:0,inherits +FNDA:0,(anonymous_313) +FNDA:0,(anonymous_314) +FNDA:0,(anonymous_315) +FNDA:0,(anonymous_316) +FNDA:0,(anonymous_317) +FNDA:0,(anonymous_318) +FNDA:0,(anonymous_319) +FNDA:0,(anonymous_320) +FNDA:0,(anonymous_321) +FNDA:0,(anonymous_322) +FNDA:0,(anonymous_323) +FNDA:0,(anonymous_324) +FNDA:0,(anonymous_325) +FNDA:0,(anonymous_326) +FNDA:0,(anonymous_327) +FNDA:0,(anonymous_328) +FNDA:0,(anonymous_329) +FNDA:0,(anonymous_330) +FNDA:0,(anonymous_331) +FNDA:0,(anonymous_332) +FNDA:0,cleanUpNextTick +FNDA:0,drainQueue +FNDA:0,(anonymous_335) +FNDA:0,Item +FNDA:0,(anonymous_337) +FNDA:0,noop +FNDA:0,(anonymous_339) +FNDA:0,(anonymous_340) +FNDA:0,(anonymous_341) +FNDA:0,(anonymous_342) +FNDA:0,(anonymous_343) +FNDA:0,(anonymous_344) +FNDA:0,(anonymous_345) +FNDA:0,error +FNDA:0,map +FNDA:0,mapDomain +FNDA:0,ucs2decode +FNDA:0,ucs2encode +FNDA:0,(anonymous_351) +FNDA:0,basicToDigit +FNDA:0,digitToBasic +FNDA:0,adapt +FNDA:0,decode +FNDA:0,encode +FNDA:0,toUnicode +FNDA:0,(anonymous_358) +FNDA:0,toASCII +FNDA:0,(anonymous_360) +FNDA:0,(anonymous_361) +FNDA:0,(anonymous_362) +FNDA:0,hasOwnProperty +FNDA:0,(anonymous_364) +FNDA:0,(anonymous_365) +FNDA:0,(anonymous_366) +FNDA:0,(anonymous_367) +FNDA:0,(anonymous_368) +FNDA:0,(anonymous_369) +FNDA:0,(anonymous_370) +FNDA:0,(anonymous_371) +FNDA:0,map +FNDA:0,(anonymous_373) +FNDA:0,(anonymous_374) +FNDA:0,(anonymous_375) +FNDA:0,(anonymous_376) +FNDA:0,(anonymous_377) +FNDA:0,Duplex +FNDA:0,onend +FNDA:0,onEndNT +FNDA:0,forEach +FNDA:0,(anonymous_382) +FNDA:0,PassThrough +FNDA:0,(anonymous_384) +FNDA:0,(anonymous_385) +FNDA:0,(anonymous_386) +FNDA:0,(anonymous_387) +FNDA:0,(anonymous_388) +FNDA:0,(anonymous_389) +FNDA:0,ReadableState +FNDA:0,Readable +FNDA:0,(anonymous_392) +FNDA:0,(anonymous_393) +FNDA:0,(anonymous_394) +FNDA:0,readableAddChunk +FNDA:0,needMoreData +FNDA:0,(anonymous_397) +FNDA:0,computeNewHighWaterMark +FNDA:0,howMuchToRead +FNDA:0,(anonymous_400) +FNDA:0,chunkInvalid +FNDA:0,onEofChunk +FNDA:0,emitReadable +FNDA:0,emitReadable_ +FNDA:0,maybeReadMore +FNDA:0,maybeReadMore_ +FNDA:0,(anonymous_407) +FNDA:0,(anonymous_408) +FNDA:0,onunpipe +FNDA:0,onend +FNDA:0,cleanup +FNDA:0,ondata +FNDA:0,onerror +FNDA:0,onclose +FNDA:0,onfinish +FNDA:0,unpipe +FNDA:0,pipeOnDrain +FNDA:0,(anonymous_418) +FNDA:0,(anonymous_419) +FNDA:0,(anonymous_420) +FNDA:0,nReadingNextTick +FNDA:0,(anonymous_422) +FNDA:0,resume +FNDA:0,resume_ +FNDA:0,(anonymous_425) +FNDA:0,flow +FNDA:0,(anonymous_427) +FNDA:0,(anonymous_428) +FNDA:0,(anonymous_429) +FNDA:0,(anonymous_430) +FNDA:0,(anonymous_431) +FNDA:0,(anonymous_432) +FNDA:0,(anonymous_433) +FNDA:0,fromList +FNDA:0,endReadable +FNDA:0,endReadableNT +FNDA:0,forEach +FNDA:0,indexOf +FNDA:0,(anonymous_439) +FNDA:0,TransformState +FNDA:0,(anonymous_441) +FNDA:0,afterTransform +FNDA:0,Transform +FNDA:0,(anonymous_444) +FNDA:0,(anonymous_445) +FNDA:0,(anonymous_446) +FNDA:0,(anonymous_447) +FNDA:0,(anonymous_448) +FNDA:0,(anonymous_449) +FNDA:0,done +FNDA:0,(anonymous_451) +FNDA:0,(anonymous_452) +FNDA:0,nop +FNDA:0,WriteReq +FNDA:0,WritableState +FNDA:0,(anonymous_456) +FNDA:0,writableStateGetBuffer +FNDA:0,(anonymous_458) +FNDA:0,(anonymous_459) +FNDA:0,Writable +FNDA:0,(anonymous_461) +FNDA:0,writeAfterEnd +FNDA:0,validChunk +FNDA:0,(anonymous_464) +FNDA:0,(anonymous_465) +FNDA:0,(anonymous_466) +FNDA:0,setDefaultEncoding +FNDA:0,decodeChunk +FNDA:0,writeOrBuffer +FNDA:0,doWrite +FNDA:0,onwriteError +FNDA:0,onwriteStateUpdate +FNDA:0,onwrite +FNDA:0,afterWrite +FNDA:0,onwriteDrain +FNDA:0,clearBuffer +FNDA:0,(anonymous_477) +FNDA:0,(anonymous_478) +FNDA:0,(anonymous_479) +FNDA:0,needFinish +FNDA:0,prefinish +FNDA:0,finishMaybe +FNDA:0,endWritable +FNDA:0,(anonymous_484) +FNDA:0,(anonymous_485) +FNDA:0,isArray +FNDA:0,isBoolean +FNDA:0,isNull +FNDA:0,isNullOrUndefined +FNDA:0,isNumber +FNDA:0,isString +FNDA:0,isSymbol +FNDA:0,isUndefined +FNDA:0,isRegExp +FNDA:0,isObject +FNDA:0,isDate +FNDA:0,isError +FNDA:0,isFunction +FNDA:0,isPrimitive +FNDA:0,objectToString +FNDA:0,(anonymous_501) +FNDA:0,(anonymous_502) +FNDA:0,nextTick +FNDA:0,afterTick +FNDA:0,(anonymous_505) +FNDA:0,(anonymous_506) +FNDA:0,deprecate +FNDA:0,deprecated +FNDA:0,config +FNDA:0,(anonymous_510) +FNDA:0,(anonymous_511) +FNDA:0,(anonymous_512) +FNDA:0,(anonymous_513) +FNDA:0,(anonymous_514) +FNDA:0,(anonymous_515) +FNDA:0,Stream +FNDA:0,(anonymous_517) +FNDA:0,ondata +FNDA:0,ondrain +FNDA:0,onend +FNDA:0,onclose +FNDA:0,onerror +FNDA:0,cleanup +FNDA:0,(anonymous_524) +FNDA:0,(anonymous_525) +FNDA:0,get +FNDA:0,(anonymous_527) +FNDA:0,(anonymous_528) +FNDA:0,(anonymous_529) +FNDA:0,checkTypeSupport +FNDA:0,isFunction +FNDA:0,(anonymous_532) +FNDA:0,(anonymous_533) +FNDA:0,decideMode +FNDA:0,(anonymous_535) +FNDA:0,(anonymous_536) +FNDA:0,(anonymous_537) +FNDA:0,(anonymous_538) +FNDA:0,(anonymous_539) +FNDA:0,(anonymous_540) +FNDA:0,(anonymous_541) +FNDA:0,(anonymous_542) +FNDA:0,(anonymous_543) +FNDA:0,(anonymous_544) +FNDA:0,(anonymous_545) +FNDA:0,(anonymous_546) +FNDA:0,(anonymous_547) +FNDA:0,(anonymous_548) +FNDA:0,(anonymous_549) +FNDA:0,(anonymous_550) +FNDA:0,(anonymous_551) +FNDA:0,statusValid +FNDA:0,(anonymous_553) +FNDA:0,(anonymous_554) +FNDA:0,(anonymous_555) +FNDA:0,(anonymous_556) +FNDA:0,(anonymous_557) +FNDA:0,(anonymous_558) +FNDA:0,(anonymous_559) +FNDA:0,(anonymous_560) +FNDA:0,(anonymous_561) +FNDA:0,(anonymous_562) +FNDA:0,(anonymous_563) +FNDA:0,(anonymous_564) +FNDA:0,(anonymous_565) +FNDA:0,(anonymous_566) +FNDA:0,read +FNDA:0,(anonymous_568) +FNDA:0,(anonymous_569) +FNDA:0,(anonymous_570) +FNDA:0,(anonymous_571) +FNDA:0,(anonymous_572) +FNDA:0,(anonymous_573) +FNDA:0,(anonymous_574) +FNDA:0,(anonymous_575) +FNDA:0,forEach +FNDA:0,(anonymous_577) +FNDA:0,(anonymous_578) +FNDA:0,(anonymous_579) +FNDA:0,(anonymous_580) +FNDA:0,(anonymous_581) +FNDA:0,(anonymous_582) +FNDA:0,(anonymous_583) +FNDA:0,keys +FNDA:0,shimObjectKeys +FNDA:0,(anonymous_586) +FNDA:0,keys +FNDA:0,(anonymous_588) +FNDA:0,isArguments +FNDA:0,(anonymous_590) +FNDA:0,(anonymous_591) +FNDA:0,assertEncoding +FNDA:0,(anonymous_593) +FNDA:0,(anonymous_594) +FNDA:0,(anonymous_595) +FNDA:0,(anonymous_596) +FNDA:0,passThroughWrite +FNDA:0,utf16DetectIncompleteChar +FNDA:0,base64DetectIncompleteChar +FNDA:0,(anonymous_600) +FNDA:0,Url +FNDA:0,urlParse +FNDA:0,(anonymous_603) +FNDA:0,urlFormat +FNDA:0,(anonymous_605) +FNDA:0,(anonymous_606) +FNDA:0,urlResolve +FNDA:0,(anonymous_608) +FNDA:0,urlResolveObject +FNDA:0,(anonymous_610) +FNDA:0,(anonymous_611) +FNDA:0,(anonymous_612) +FNDA:0,(anonymous_613) +FNDA:0,(anonymous_614) +FNDA:0,isString +FNDA:0,isObject +FNDA:0,isNull +FNDA:0,isNullOrUndefined +FNDA:0,(anonymous_619) +FNDA:0,isBuffer +FNDA:0,(anonymous_621) +FNDA:0,(anonymous_622) +FNDA:0,(anonymous_623) +FNDA:0,(anonymous_624) +FNDA:0,(anonymous_625) +FNDA:0,(anonymous_626) +FNDA:0,deprecated +FNDA:0,(anonymous_628) +FNDA:0,(anonymous_629) +FNDA:0,(anonymous_630) +FNDA:0,inspect +FNDA:0,stylizeWithColor +FNDA:0,stylizeNoColor +FNDA:0,arrayToHash +FNDA:0,(anonymous_635) +FNDA:0,formatValue +FNDA:0,(anonymous_637) +FNDA:0,formatPrimitive +FNDA:0,formatError +FNDA:0,formatArray +FNDA:0,(anonymous_641) +FNDA:0,formatProperty +FNDA:0,(anonymous_643) +FNDA:0,(anonymous_644) +FNDA:0,reduceToSingleString +FNDA:0,(anonymous_646) +FNDA:0,isArray +FNDA:0,isBoolean +FNDA:0,isNull +FNDA:0,isNullOrUndefined +FNDA:0,isNumber +FNDA:0,isString +FNDA:0,isSymbol +FNDA:0,isUndefined +FNDA:0,isRegExp +FNDA:0,isObject +FNDA:0,isDate +FNDA:0,isError +FNDA:0,isFunction +FNDA:0,isPrimitive +FNDA:0,objectToString +FNDA:0,pad +FNDA:0,timestamp +FNDA:0,(anonymous_664) +FNDA:0,(anonymous_665) +FNDA:0,hasOwnProperty +FNDA:0,(anonymous_667) +FNDA:0,extend +FNDA:0,(anonymous_669) +FNDA:0,(anonymous_670) +FNDA:0,(anonymous_671) +FNDA:0,Hash +FNDA:0,(anonymous_673) +FNDA:0,ListCache +FNDA:0,(anonymous_675) +FNDA:0,(anonymous_676) +FNDA:0,MapCache +FNDA:0,(anonymous_678) +FNDA:0,(anonymous_679) +FNDA:0,arrayMap +FNDA:0,(anonymous_681) +FNDA:0,assignValue +FNDA:0,(anonymous_683) +FNDA:0,assocIndexOf +FNDA:0,(anonymous_685) +FNDA:0,baseAssignValue +FNDA:0,(anonymous_687) +FNDA:0,baseGetTag +FNDA:0,(anonymous_689) +FNDA:0,baseIsNative +FNDA:0,(anonymous_691) +FNDA:0,baseSet +FNDA:0,(anonymous_693) +FNDA:0,baseToString +FNDA:0,(anonymous_695) +FNDA:0,castPath +FNDA:0,(anonymous_697) +FNDA:0,(anonymous_698) +FNDA:0,(anonymous_699) +FNDA:0,(anonymous_700) +FNDA:0,(anonymous_701) +FNDA:0,(anonymous_702) +FNDA:0,getMapData +FNDA:0,(anonymous_704) +FNDA:0,getNative +FNDA:0,(anonymous_706) +FNDA:0,getRawTag +FNDA:0,(anonymous_708) +FNDA:0,getValue +FNDA:0,(anonymous_710) +FNDA:0,hashClear +FNDA:0,(anonymous_712) +FNDA:0,hashDelete +FNDA:0,(anonymous_714) +FNDA:0,hashGet +FNDA:0,(anonymous_716) +FNDA:0,hashHas +FNDA:0,(anonymous_718) +FNDA:0,hashSet +FNDA:0,(anonymous_720) +FNDA:0,isIndex +FNDA:0,(anonymous_722) +FNDA:0,isKey +FNDA:0,(anonymous_724) +FNDA:0,isKeyable +FNDA:0,(anonymous_726) +FNDA:0,(anonymous_727) +FNDA:0,isMasked +FNDA:0,(anonymous_729) +FNDA:0,listCacheClear +FNDA:0,(anonymous_731) +FNDA:0,listCacheDelete +FNDA:0,(anonymous_733) +FNDA:0,listCacheGet +FNDA:0,(anonymous_735) +FNDA:0,listCacheHas +FNDA:0,(anonymous_737) +FNDA:0,listCacheSet +FNDA:0,(anonymous_739) +FNDA:0,mapCacheClear +FNDA:0,(anonymous_741) +FNDA:0,mapCacheDelete +FNDA:0,(anonymous_743) +FNDA:0,mapCacheGet +FNDA:0,(anonymous_745) +FNDA:0,mapCacheHas +FNDA:0,(anonymous_747) +FNDA:0,mapCacheSet +FNDA:0,(anonymous_749) +FNDA:0,memoizeCapped +FNDA:0,(anonymous_751) +FNDA:0,(anonymous_752) +FNDA:0,(anonymous_753) +FNDA:0,objectToString +FNDA:0,(anonymous_755) +FNDA:0,(anonymous_756) +FNDA:0,(anonymous_757) +FNDA:0,(anonymous_758) +FNDA:0,(anonymous_759) +FNDA:0,toKey +FNDA:0,(anonymous_761) +FNDA:0,toSource +FNDA:0,(anonymous_763) +FNDA:0,eq +FNDA:0,(anonymous_765) +FNDA:0,(anonymous_766) +FNDA:0,isFunction +FNDA:0,(anonymous_768) +FNDA:0,isObject +FNDA:0,(anonymous_770) +FNDA:0,isObjectLike +FNDA:0,(anonymous_772) +FNDA:0,isSymbol +FNDA:0,(anonymous_774) +FNDA:0,(anonymous_775) +FNDA:0,(anonymous_776) +FNDA:0,(anonymous_777) +FNDA:0,addMapEntry +FNDA:0,addSetEntry +FNDA:0,apply +FNDA:0,arrayAggregator +FNDA:0,arrayEach +FNDA:0,arrayEachRight +FNDA:0,arrayEvery +FNDA:0,arrayFilter +FNDA:0,arrayIncludes +FNDA:0,arrayIncludesWith +FNDA:0,arrayMap +FNDA:0,arrayPush +FNDA:0,arrayReduce +FNDA:0,arrayReduceRight +FNDA:0,arraySome +FNDA:0,asciiToArray +FNDA:0,asciiWords +FNDA:0,baseFindKey +FNDA:0,(anonymous_796) +FNDA:0,baseFindIndex +FNDA:0,baseIndexOf +FNDA:0,baseIndexOfWith +FNDA:0,baseIsNaN +FNDA:0,baseMean +FNDA:0,baseProperty +FNDA:0,(anonymous_803) +FNDA:0,basePropertyOf +FNDA:0,(anonymous_805) +FNDA:0,baseReduce +FNDA:0,(anonymous_807) +FNDA:0,baseSortBy +FNDA:0,baseSum +FNDA:0,baseTimes +FNDA:0,baseToPairs +FNDA:0,(anonymous_812) +FNDA:0,baseUnary +FNDA:0,(anonymous_814) +FNDA:0,baseValues +FNDA:0,(anonymous_816) +FNDA:0,cacheHas +FNDA:0,charsStartIndex +FNDA:0,charsEndIndex +FNDA:0,countHolders +FNDA:0,escapeStringChar +FNDA:0,getValue +FNDA:0,hasUnicode +FNDA:0,hasUnicodeWord +FNDA:0,iteratorToArray +FNDA:0,mapToArray +FNDA:0,(anonymous_827) +FNDA:0,overArg +FNDA:0,(anonymous_829) +FNDA:0,replaceHolders +FNDA:0,setToArray +FNDA:0,(anonymous_832) +FNDA:0,setToPairs +FNDA:0,(anonymous_834) +FNDA:0,strictIndexOf +FNDA:0,strictLastIndexOf +FNDA:0,stringSize +FNDA:0,stringToArray +FNDA:0,unicodeSize +FNDA:0,unicodeToArray +FNDA:0,unicodeWords +FNDA:0,runInContext +FNDA:0,(anonymous_843) +FNDA:0,(anonymous_844) +FNDA:0,lodash +FNDA:0,(anonymous_846) +FNDA:0,object +FNDA:0,(anonymous_848) +FNDA:0,baseLodash +FNDA:0,LodashWrapper +FNDA:0,LazyWrapper +FNDA:0,lazyClone +FNDA:0,lazyReverse +FNDA:0,lazyValue +FNDA:0,Hash +FNDA:0,hashClear +FNDA:0,hashDelete +FNDA:0,hashGet +FNDA:0,hashHas +FNDA:0,hashSet +FNDA:0,ListCache +FNDA:0,listCacheClear +FNDA:0,listCacheDelete +FNDA:0,listCacheGet +FNDA:0,listCacheHas +FNDA:0,listCacheSet +FNDA:0,MapCache +FNDA:0,mapCacheClear +FNDA:0,mapCacheDelete +FNDA:0,mapCacheGet +FNDA:0,mapCacheHas +FNDA:0,mapCacheSet +FNDA:0,SetCache +FNDA:0,setCacheAdd +FNDA:0,setCacheHas +FNDA:0,Stack +FNDA:0,stackClear +FNDA:0,stackDelete +FNDA:0,stackGet +FNDA:0,stackHas +FNDA:0,stackSet +FNDA:0,arrayLikeKeys +FNDA:0,arraySample +FNDA:0,arraySampleSize +FNDA:0,arrayShuffle +FNDA:0,assignMergeValue +FNDA:0,assignValue +FNDA:0,assocIndexOf +FNDA:0,baseAggregator +FNDA:0,(anonymous_890) +FNDA:0,baseAssign +FNDA:0,baseAssignIn +FNDA:0,baseAssignValue +FNDA:0,baseAt +FNDA:0,baseClamp +FNDA:0,baseClone +FNDA:0,(anonymous_897) +FNDA:0,baseConforms +FNDA:0,(anonymous_899) +FNDA:0,baseConformsTo +FNDA:0,baseDelay +FNDA:0,(anonymous_902) +FNDA:0,baseDifference +FNDA:0,baseEvery +FNDA:0,(anonymous_905) +FNDA:0,baseExtremum +FNDA:0,baseFill +FNDA:0,baseFilter +FNDA:0,(anonymous_909) +FNDA:0,baseFlatten +FNDA:0,baseForOwn +FNDA:0,baseForOwnRight +FNDA:0,baseFunctions +FNDA:0,(anonymous_914) +FNDA:0,baseGet +FNDA:0,baseGetAllKeys +FNDA:0,baseGetTag +FNDA:0,baseGt +FNDA:0,baseHas +FNDA:0,baseHasIn +FNDA:0,baseInRange +FNDA:0,baseIntersection +FNDA:0,baseInverter +FNDA:0,(anonymous_924) +FNDA:0,baseInvoke +FNDA:0,baseIsArguments +FNDA:0,baseIsArrayBuffer +FNDA:0,baseIsDate +FNDA:0,baseIsEqual +FNDA:0,baseIsEqualDeep +FNDA:0,baseIsMap +FNDA:0,baseIsMatch +FNDA:0,baseIsNative +FNDA:0,baseIsRegExp +FNDA:0,baseIsSet +FNDA:0,baseIsTypedArray +FNDA:0,baseIteratee +FNDA:0,baseKeys +FNDA:0,baseKeysIn +FNDA:0,baseLt +FNDA:0,baseMap +FNDA:0,(anonymous_942) +FNDA:0,baseMatches +FNDA:0,(anonymous_944) +FNDA:0,baseMatchesProperty +FNDA:0,(anonymous_946) +FNDA:0,baseMerge +FNDA:0,(anonymous_948) +FNDA:0,baseMergeDeep +FNDA:0,baseNth +FNDA:0,baseOrderBy +FNDA:0,(anonymous_952) +FNDA:0,(anonymous_953) +FNDA:0,(anonymous_954) +FNDA:0,basePick +FNDA:0,(anonymous_956) +FNDA:0,basePickBy +FNDA:0,basePropertyDeep +FNDA:0,(anonymous_959) +FNDA:0,basePullAll +FNDA:0,basePullAt +FNDA:0,baseRandom +FNDA:0,baseRange +FNDA:0,baseRepeat +FNDA:0,baseRest +FNDA:0,baseSample +FNDA:0,baseSampleSize +FNDA:0,baseSet +FNDA:0,(anonymous_969) +FNDA:0,(anonymous_970) +FNDA:0,baseShuffle +FNDA:0,baseSlice +FNDA:0,baseSome +FNDA:0,(anonymous_974) +FNDA:0,baseSortedIndex +FNDA:0,baseSortedIndexBy +FNDA:0,baseSortedUniq +FNDA:0,baseToNumber +FNDA:0,baseToString +FNDA:0,baseUniq +FNDA:0,baseUnset +FNDA:0,baseUpdate +FNDA:0,baseWhile +FNDA:0,baseWrapperValue +FNDA:0,(anonymous_985) +FNDA:0,baseXor +FNDA:0,baseZipObject +FNDA:0,castArrayLikeObject +FNDA:0,castFunction +FNDA:0,castPath +FNDA:0,castSlice +FNDA:0,(anonymous_992) +FNDA:0,cloneBuffer +FNDA:0,cloneArrayBuffer +FNDA:0,cloneDataView +FNDA:0,cloneMap +FNDA:0,cloneRegExp +FNDA:0,cloneSet +FNDA:0,cloneSymbol +FNDA:0,cloneTypedArray +FNDA:0,compareAscending +FNDA:0,compareMultiple +FNDA:0,composeArgs +FNDA:0,composeArgsRight +FNDA:0,copyArray +FNDA:0,copyObject +FNDA:0,copySymbols +FNDA:0,copySymbolsIn +FNDA:0,createAggregator +FNDA:0,(anonymous_1010) +FNDA:0,createAssigner +FNDA:0,(anonymous_1012) +FNDA:0,createBaseEach +FNDA:0,(anonymous_1014) +FNDA:0,createBaseFor +FNDA:0,(anonymous_1016) +FNDA:0,createBind +FNDA:0,wrapper +FNDA:0,createCaseFirst +FNDA:0,(anonymous_1020) +FNDA:0,createCompounder +FNDA:0,(anonymous_1022) +FNDA:0,createCtor +FNDA:0,(anonymous_1024) +FNDA:0,createCurry +FNDA:0,wrapper +FNDA:0,createFind +FNDA:0,(anonymous_1028) +FNDA:0,(anonymous_1029) +FNDA:0,createFlow +FNDA:0,(anonymous_1031) +FNDA:0,(anonymous_1032) +FNDA:0,createHybrid +FNDA:0,wrapper +FNDA:0,createInverter +FNDA:0,(anonymous_1036) +FNDA:0,createMathOperation +FNDA:0,(anonymous_1038) +FNDA:0,createOver +FNDA:0,(anonymous_1040) +FNDA:0,(anonymous_1041) +FNDA:0,(anonymous_1042) +FNDA:0,createPadding +FNDA:0,createPartial +FNDA:0,wrapper +FNDA:0,createRange +FNDA:0,(anonymous_1047) +FNDA:0,createRelationalOperation +FNDA:0,(anonymous_1049) +FNDA:0,createRecurry +FNDA:0,createRound +FNDA:0,(anonymous_1052) +FNDA:0,(anonymous_1053) +FNDA:0,createToPairs +FNDA:0,(anonymous_1055) +FNDA:0,createWrap +FNDA:0,customDefaultsAssignIn +FNDA:0,customDefaultsMerge +FNDA:0,customOmitClone +FNDA:0,equalArrays +FNDA:0,(anonymous_1061) +FNDA:0,equalByTag +FNDA:0,equalObjects +FNDA:0,flatRest +FNDA:0,getAllKeys +FNDA:0,getAllKeysIn +FNDA:0,(anonymous_1067) +FNDA:0,getFuncName +FNDA:0,getHolder +FNDA:0,getIteratee +FNDA:0,getMapData +FNDA:0,getMatchData +FNDA:0,getNative +FNDA:0,getRawTag +FNDA:0,(anonymous_1075) +FNDA:0,(anonymous_1076) +FNDA:0,(anonymous_1077) +FNDA:0,(anonymous_1078) +FNDA:0,getView +FNDA:0,getWrapDetails +FNDA:0,hasPath +FNDA:0,initCloneArray +FNDA:0,initCloneObject +FNDA:0,initCloneByTag +FNDA:0,insertWrapDetails +FNDA:0,isFlattenable +FNDA:0,isIndex +FNDA:0,isIterateeCall +FNDA:0,isKey +FNDA:0,isKeyable +FNDA:0,isLaziable +FNDA:0,isMasked +FNDA:0,isPrototype +FNDA:0,isStrictComparable +FNDA:0,matchesStrictComparable +FNDA:0,(anonymous_1096) +FNDA:0,memoizeCapped +FNDA:0,(anonymous_1098) +FNDA:0,mergeData +FNDA:0,nativeKeysIn +FNDA:0,objectToString +FNDA:0,overRest +FNDA:0,(anonymous_1103) +FNDA:0,parent +FNDA:0,reorder +FNDA:0,(anonymous_1106) +FNDA:0,setWrapToString +FNDA:0,shortOut +FNDA:0,(anonymous_1109) +FNDA:0,shuffleSelf +FNDA:0,(anonymous_1111) +FNDA:0,(anonymous_1112) +FNDA:0,toKey +FNDA:0,toSource +FNDA:0,updateWrapDetails +FNDA:0,(anonymous_1116) +FNDA:0,wrapperClone +FNDA:0,chunk +FNDA:0,compact +FNDA:0,concat +FNDA:0,(anonymous_1121) +FNDA:0,(anonymous_1122) +FNDA:0,(anonymous_1123) +FNDA:0,drop +FNDA:0,dropRight +FNDA:0,dropRightWhile +FNDA:0,dropWhile +FNDA:0,fill +FNDA:0,findIndex +FNDA:0,findLastIndex +FNDA:0,flatten +FNDA:0,flattenDeep +FNDA:0,flattenDepth +FNDA:0,fromPairs +FNDA:0,head +FNDA:0,indexOf +FNDA:0,initial +FNDA:0,(anonymous_1138) +FNDA:0,(anonymous_1139) +FNDA:0,(anonymous_1140) +FNDA:0,join +FNDA:0,last +FNDA:0,lastIndexOf +FNDA:0,nth +FNDA:0,pullAll +FNDA:0,pullAllBy +FNDA:0,pullAllWith +FNDA:0,(anonymous_1148) +FNDA:0,(anonymous_1149) +FNDA:0,remove +FNDA:0,reverse +FNDA:0,slice +FNDA:0,sortedIndex +FNDA:0,sortedIndexBy +FNDA:0,sortedIndexOf +FNDA:0,sortedLastIndex +FNDA:0,sortedLastIndexBy +FNDA:0,sortedLastIndexOf +FNDA:0,sortedUniq +FNDA:0,sortedUniqBy +FNDA:0,tail +FNDA:0,take +FNDA:0,takeRight +FNDA:0,takeRightWhile +FNDA:0,takeWhile +FNDA:0,(anonymous_1166) +FNDA:0,(anonymous_1167) +FNDA:0,(anonymous_1168) +FNDA:0,uniq +FNDA:0,uniqBy +FNDA:0,uniqWith +FNDA:0,unzip +FNDA:0,(anonymous_1173) +FNDA:0,(anonymous_1174) +FNDA:0,unzipWith +FNDA:0,(anonymous_1176) +FNDA:0,(anonymous_1177) +FNDA:0,(anonymous_1178) +FNDA:0,(anonymous_1179) +FNDA:0,(anonymous_1180) +FNDA:0,zipObject +FNDA:0,zipObjectDeep +FNDA:0,(anonymous_1183) +FNDA:0,chain +FNDA:0,tap +FNDA:0,thru +FNDA:0,(anonymous_1187) +FNDA:0,(anonymous_1188) +FNDA:0,(anonymous_1189) +FNDA:0,wrapperChain +FNDA:0,wrapperCommit +FNDA:0,wrapperNext +FNDA:0,wrapperToIterator +FNDA:0,wrapperPlant +FNDA:0,wrapperReverse +FNDA:0,wrapperValue +FNDA:0,(anonymous_1197) +FNDA:0,every +FNDA:0,filter +FNDA:0,flatMap +FNDA:0,flatMapDeep +FNDA:0,flatMapDepth +FNDA:0,forEach +FNDA:0,forEachRight +FNDA:0,(anonymous_1205) +FNDA:0,includes +FNDA:0,(anonymous_1207) +FNDA:0,(anonymous_1208) +FNDA:0,(anonymous_1209) +FNDA:0,map +FNDA:0,orderBy +FNDA:0,(anonymous_1212) +FNDA:0,(anonymous_1213) +FNDA:0,reduce +FNDA:0,reduceRight +FNDA:0,reject +FNDA:0,sample +FNDA:0,sampleSize +FNDA:0,shuffle +FNDA:0,size +FNDA:0,some +FNDA:0,(anonymous_1222) +FNDA:0,(anonymous_1223) +FNDA:0,after +FNDA:0,(anonymous_1225) +FNDA:0,ary +FNDA:0,before +FNDA:0,(anonymous_1228) +FNDA:0,(anonymous_1229) +FNDA:0,(anonymous_1230) +FNDA:0,curry +FNDA:0,curryRight +FNDA:0,debounce +FNDA:0,invokeFunc +FNDA:0,leadingEdge +FNDA:0,remainingWait +FNDA:0,shouldInvoke +FNDA:0,timerExpired +FNDA:0,trailingEdge +FNDA:0,cancel +FNDA:0,flush +FNDA:0,debounced +FNDA:0,(anonymous_1243) +FNDA:0,(anonymous_1244) +FNDA:0,flip +FNDA:0,memoize +FNDA:0,(anonymous_1247) +FNDA:0,negate +FNDA:0,(anonymous_1249) +FNDA:0,once +FNDA:0,(anonymous_1251) +FNDA:0,(anonymous_1252) +FNDA:0,(anonymous_1253) +FNDA:0,(anonymous_1254) +FNDA:0,(anonymous_1255) +FNDA:0,rest +FNDA:0,spread +FNDA:0,(anonymous_1258) +FNDA:0,throttle +FNDA:0,unary +FNDA:0,wrap +FNDA:0,castArray +FNDA:0,clone +FNDA:0,cloneWith +FNDA:0,cloneDeep +FNDA:0,cloneDeepWith +FNDA:0,conformsTo +FNDA:0,eq +FNDA:0,(anonymous_1269) +FNDA:0,(anonymous_1270) +FNDA:0,(anonymous_1271) +FNDA:0,isArrayLike +FNDA:0,isArrayLikeObject +FNDA:0,isBoolean +FNDA:0,isElement +FNDA:0,isEmpty +FNDA:0,isEqual +FNDA:0,isEqualWith +FNDA:0,isError +FNDA:0,isFinite +FNDA:0,isFunction +FNDA:0,isInteger +FNDA:0,isLength +FNDA:0,isObject +FNDA:0,isObjectLike +FNDA:0,isMatch +FNDA:0,isMatchWith +FNDA:0,isNaN +FNDA:0,isNative +FNDA:0,isNull +FNDA:0,isNil +FNDA:0,isNumber +FNDA:0,isPlainObject +FNDA:0,isSafeInteger +FNDA:0,isString +FNDA:0,isSymbol +FNDA:0,isUndefined +FNDA:0,isWeakMap +FNDA:0,isWeakSet +FNDA:0,(anonymous_1300) +FNDA:0,toArray +FNDA:0,toFinite +FNDA:0,toInteger +FNDA:0,toLength +FNDA:0,toNumber +FNDA:0,toPlainObject +FNDA:0,toSafeInteger +FNDA:0,toString +FNDA:0,(anonymous_1309) +FNDA:0,(anonymous_1310) +FNDA:0,(anonymous_1311) +FNDA:0,(anonymous_1312) +FNDA:0,create +FNDA:0,(anonymous_1314) +FNDA:0,(anonymous_1315) +FNDA:0,findKey +FNDA:0,findLastKey +FNDA:0,forIn +FNDA:0,forInRight +FNDA:0,forOwn +FNDA:0,forOwnRight +FNDA:0,functions +FNDA:0,functionsIn +FNDA:0,get +FNDA:0,has +FNDA:0,hasIn +FNDA:0,(anonymous_1327) +FNDA:0,(anonymous_1328) +FNDA:0,keys +FNDA:0,keysIn +FNDA:0,mapKeys +FNDA:0,(anonymous_1332) +FNDA:0,mapValues +FNDA:0,(anonymous_1334) +FNDA:0,(anonymous_1335) +FNDA:0,(anonymous_1336) +FNDA:0,(anonymous_1337) +FNDA:0,(anonymous_1338) +FNDA:0,omitBy +FNDA:0,(anonymous_1340) +FNDA:0,pickBy +FNDA:0,(anonymous_1342) +FNDA:0,(anonymous_1343) +FNDA:0,result +FNDA:0,set +FNDA:0,setWith +FNDA:0,transform +FNDA:0,(anonymous_1348) +FNDA:0,unset +FNDA:0,update +FNDA:0,updateWith +FNDA:0,values +FNDA:0,valuesIn +FNDA:0,clamp +FNDA:0,inRange +FNDA:0,random +FNDA:0,(anonymous_1357) +FNDA:0,capitalize +FNDA:0,deburr +FNDA:0,endsWith +FNDA:0,escape +FNDA:0,escapeRegExp +FNDA:0,(anonymous_1363) +FNDA:0,(anonymous_1364) +FNDA:0,pad +FNDA:0,padEnd +FNDA:0,padStart +FNDA:0,parseInt +FNDA:0,repeat +FNDA:0,replace +FNDA:0,(anonymous_1371) +FNDA:0,split +FNDA:0,(anonymous_1373) +FNDA:0,startsWith +FNDA:0,template +FNDA:0,(anonymous_1376) +FNDA:0,(anonymous_1377) +FNDA:0,toLower +FNDA:0,toUpper +FNDA:0,trim +FNDA:0,trimEnd +FNDA:0,trimStart +FNDA:0,truncate +FNDA:0,unescape +FNDA:0,(anonymous_1385) +FNDA:0,words +FNDA:0,(anonymous_1387) +FNDA:0,(anonymous_1388) +FNDA:0,(anonymous_1389) +FNDA:0,cond +FNDA:0,(anonymous_1391) +FNDA:0,(anonymous_1392) +FNDA:0,conforms +FNDA:0,constant +FNDA:0,(anonymous_1395) +FNDA:0,defaultTo +FNDA:0,identity +FNDA:0,iteratee +FNDA:0,matches +FNDA:0,matchesProperty +FNDA:0,(anonymous_1401) +FNDA:0,(anonymous_1402) +FNDA:0,(anonymous_1403) +FNDA:0,(anonymous_1404) +FNDA:0,mixin +FNDA:0,(anonymous_1406) +FNDA:0,(anonymous_1407) +FNDA:0,noConflict +FNDA:0,noop +FNDA:0,nthArg +FNDA:0,(anonymous_1411) +FNDA:0,property +FNDA:0,propertyOf +FNDA:0,(anonymous_1414) +FNDA:0,stubArray +FNDA:0,stubFalse +FNDA:0,stubObject +FNDA:0,stubString +FNDA:0,stubTrue +FNDA:0,times +FNDA:0,toPath +FNDA:0,uniqueId +FNDA:0,(anonymous_1423) +FNDA:0,(anonymous_1424) +FNDA:0,max +FNDA:0,maxBy +FNDA:0,mean +FNDA:0,meanBy +FNDA:0,min +FNDA:0,minBy +FNDA:0,(anonymous_1431) +FNDA:0,(anonymous_1432) +FNDA:0,sum +FNDA:0,sumBy +FNDA:0,(anonymous_1435) +FNDA:0,(anonymous_1436) +FNDA:0,(anonymous_1437) +FNDA:0,(anonymous_1438) +FNDA:0,(anonymous_1439) +FNDA:0,(anonymous_1440) +FNDA:0,(anonymous_1441) +FNDA:0,(anonymous_1442) +FNDA:0,(anonymous_1443) +FNDA:0,(anonymous_1444) +FNDA:0,(anonymous_1445) +FNDA:0,(anonymous_1446) +FNDA:0,(anonymous_1447) +FNDA:0,(anonymous_1448) +FNDA:0,(anonymous_1449) +FNDA:0,(anonymous_1450) +FNDA:0,(anonymous_1451) +FNDA:0,(anonymous_1452) +FNDA:0,(anonymous_1453) +FNDA:0,(anonymous_1454) +FNDA:0,(anonymous_1455) +FNDA:0,(anonymous_1456) +FNDA:0,(anonymous_1457) +FNDA:0,(anonymous_1458) +FNDA:0,(anonymous_1459) +FNDA:0,(anonymous_1460) +FNDA:0,(anonymous_1461) +FNDA:0,(anonymous_1462) +FNDA:0,(anonymous_1463) +FNDA:0,(anonymous_1464) +FNDA:0,memoize +FNDA:0,(anonymous_1466) +FNDA:0,(anonymous_1467) +FNDA:0,set +FNDA:0,(anonymous_1469) +FNDA:0,toString +FNDA:0,(anonymous_1471) +FNDA:0,(anonymous_1472) +FNDA:0,(anonymous_1473) +FNDA:0,(anonymous_1474) +FNDA:0,(anonymous_1475) +FNDA:0,(anonymous_1476) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:8,0 +DA:10,0 +DA:11,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:26,0 +DA:27,0 +DA:30,0 +DA:31,0 +DA:34,0 +DA:35,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:91,0 +DA:92,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:98,0 +DA:100,0 +DA:101,0 +DA:103,0 +DA:104,0 +DA:107,0 +DA:110,0 +DA:113,0 +DA:115,0 +DA:116,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:124,0 +DA:126,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:136,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:147,0 +DA:149,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:167,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:177,0 +DA:179,0 +DA:184,0 +DA:185,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:198,0 +DA:199,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:210,0 +DA:214,0 +DA:215,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:226,0 +DA:227,0 +DA:230,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:262,0 +DA:263,0 +DA:264,0 +DA:265,0 +DA:266,0 +DA:267,0 +DA:268,0 +DA:270,0 +DA:271,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:277,0 +DA:282,0 +DA:286,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:292,0 +DA:295,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:309,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:316,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:322,0 +DA:325,0 +DA:326,0 +DA:328,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:343,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:354,0 +DA:358,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:368,0 +DA:373,0 +DA:374,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:383,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:397,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:405,0 +DA:406,0 +DA:407,0 +DA:409,0 +DA:410,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:416,0 +DA:418,0 +DA:419,0 +DA:421,0 +DA:422,0 +DA:424,0 +DA:425,0 +DA:427,0 +DA:428,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:434,0 +DA:439,0 +DA:440,0 +DA:444,0 +DA:445,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:452,0 +DA:453,0 +DA:455,0 +DA:456,0 +DA:457,0 +DA:460,0 +DA:461,0 +DA:462,0 +DA:463,0 +DA:465,0 +DA:466,0 +DA:469,0 +DA:471,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:478,0 +DA:479,0 +DA:481,0 +DA:482,0 +DA:483,0 +DA:486,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:493,0 +DA:494,0 +DA:495,0 +DA:497,0 +DA:499,0 +DA:500,0 +DA:501,0 +DA:502,0 +DA:505,0 +DA:508,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:514,0 +DA:515,0 +DA:516,0 +DA:518,0 +DA:519,0 +DA:520,0 +DA:523,0 +DA:524,0 +DA:525,0 +DA:526,0 +DA:528,0 +DA:531,0 +DA:534,0 +DA:535,0 +DA:536,0 +DA:538,0 +DA:539,0 +DA:542,0 +DA:543,0 +DA:544,0 +DA:547,0 +DA:548,0 +DA:549,0 +DA:551,0 +DA:552,0 +DA:555,0 +DA:556,0 +DA:558,0 +DA:561,0 +DA:562,0 +DA:563,0 +DA:565,0 +DA:566,0 +DA:567,0 +DA:568,0 +DA:572,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:577,0 +DA:581,0 +DA:585,0 +DA:586,0 +DA:593,0 +DA:594,0 +DA:595,0 +DA:596,0 +DA:597,0 +DA:598,0 +DA:599,0 +DA:600,0 +DA:601,0 +DA:603,0 +DA:606,0 +DA:610,0 +DA:611,0 +DA:612,0 +DA:613,0 +DA:641,0 +DA:642,0 +DA:644,0 +DA:645,0 +DA:646,0 +DA:649,0 +DA:650,0 +DA:652,0 +DA:653,0 +DA:656,0 +DA:657,0 +DA:658,0 +DA:659,0 +DA:664,0 +DA:668,0 +DA:669,0 +DA:671,0 +DA:677,0 +DA:686,0 +DA:691,0 +DA:692,0 +DA:693,0 +DA:695,0 +DA:700,0 +DA:705,0 +DA:706,0 +DA:707,0 +DA:712,0 +DA:717,0 +DA:718,0 +DA:720,0 +DA:721,0 +DA:722,0 +DA:723,0 +DA:725,0 +DA:726,0 +DA:727,0 +DA:728,0 +DA:730,0 +DA:731,0 +DA:733,0 +DA:735,0 +DA:736,0 +DA:738,0 +DA:741,0 +DA:743,0 +DA:748,0 +DA:749,0 +DA:752,0 +DA:753,0 +DA:754,0 +DA:755,0 +DA:756,0 +DA:757,0 +DA:758,0 +DA:759,0 +DA:761,0 +DA:762,0 +DA:763,0 +DA:764,0 +DA:766,0 +DA:768,0 +DA:771,0 +DA:774,0 +DA:775,0 +DA:777,0 +DA:784,0 +DA:789,0 +DA:790,0 +DA:791,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:795,0 +DA:797,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:803,0 +DA:808,0 +DA:816,0 +DA:823,0 +DA:824,0 +DA:825,0 +DA:826,0 +DA:833,0 +DA:840,0 +DA:841,0 +DA:842,0 +DA:843,0 +DA:844,0 +DA:848,0 +DA:849,0 +DA:850,0 +DA:851,0 +DA:852,0 +DA:856,0 +DA:857,0 +DA:858,0 +DA:859,0 +DA:860,0 +DA:863,0 +DA:865,0 +DA:868,0 +DA:869,0 +DA:872,0 +DA:873,0 +DA:874,0 +DA:875,0 +DA:877,0 +DA:879,0 +DA:880,0 +DA:881,0 +DA:882,0 +DA:883,0 +DA:884,0 +DA:885,0 +DA:888,0 +DA:893,0 +DA:894,0 +DA:895,0 +DA:896,0 +DA:897,0 +DA:898,0 +DA:899,0 +DA:900,0 +DA:901,0 +DA:903,0 +DA:904,0 +DA:905,0 +DA:906,0 +DA:910,0 +DA:914,0 +DA:915,0 +DA:918,0 +DA:922,0 +DA:923,0 +DA:924,0 +DA:932,0 +DA:933,0 +DA:934,0 +DA:935,0 +DA:937,0 +DA:938,0 +DA:939,0 +DA:941,0 +DA:943,0 +DA:948,0 +DA:949,0 +DA:950,0 +DA:957,0 +DA:961,0 +DA:962,0 +DA:963,0 +DA:964,0 +DA:965,0 +DA:968,0 +DA:972,0 +DA:973,0 +DA:974,0 +DA:979,0 +DA:980,0 +DA:981,0 +DA:982,0 +DA:988,0 +DA:993,0 +DA:994,0 +DA:996,0 +DA:998,0 +DA:1000,0 +DA:1001,0 +DA:1003,0 +DA:1005,0 +DA:1006,0 +DA:1007,0 +DA:1009,0 +DA:1010,0 +DA:1011,0 +DA:1012,0 +DA:1013,0 +DA:1016,0 +DA:1017,0 +DA:1018,0 +DA:1020,0 +DA:1021,0 +DA:1022,0 +DA:1024,0 +DA:1025,0 +DA:1026,0 +DA:1028,0 +DA:1032,0 +DA:1033,0 +DA:1035,0 +DA:1039,0 +DA:1045,0 +DA:1046,0 +DA:1048,0 +DA:1049,0 +DA:1050,0 +DA:1052,0 +DA:1053,0 +DA:1054,0 +DA:1055,0 +DA:1056,0 +DA:1058,0 +DA:1060,0 +DA:1061,0 +DA:1063,0 +DA:1068,0 +DA:1069,0 +DA:1070,0 +DA:1071,0 +DA:1073,0 +DA:1078,0 +DA:1079,0 +DA:1080,0 +DA:1081,0 +DA:1082,0 +DA:1083,0 +DA:1085,0 +DA:1090,0 +DA:1091,0 +DA:1094,0 +DA:1095,0 +DA:1096,0 +DA:1100,0 +DA:1101,0 +DA:1102,0 +DA:1103,0 +DA:1104,0 +DA:1105,0 +DA:1106,0 +DA:1107,0 +DA:1109,0 +DA:1114,0 +DA:1115,0 +DA:1116,0 +DA:1118,0 +DA:1122,0 +DA:1126,0 +DA:1127,0 +DA:1128,0 +DA:1130,0 +DA:1131,0 +DA:1132,0 +DA:1133,0 +DA:1134,0 +DA:1135,0 +DA:1137,0 +DA:1142,0 +DA:1143,0 +DA:1144,0 +DA:1146,0 +DA:1151,0 +DA:1152,0 +DA:1154,0 +DA:1159,0 +DA:1162,0 +DA:1163,0 +DA:1164,0 +DA:1165,0 +DA:1166,0 +DA:1167,0 +DA:1168,0 +DA:1170,0 +DA:1173,0 +DA:1174,0 +DA:1178,0 +DA:1179,0 +DA:1180,0 +DA:1181,0 +DA:1182,0 +DA:1183,0 +DA:1185,0 +DA:1187,0 +DA:1188,0 +DA:1189,0 +DA:1190,0 +DA:1192,0 +DA:1193,0 +DA:1194,0 +DA:1195,0 +DA:1196,0 +DA:1197,0 +DA:1198,0 +DA:1199,0 +DA:1200,0 +DA:1202,0 +DA:1205,0 +DA:1208,0 +DA:1211,0 +DA:1212,0 +DA:1215,0 +DA:1216,0 +DA:1219,0 +DA:1220,0 +DA:1223,0 +DA:1224,0 +DA:1225,0 +DA:1227,0 +DA:1228,0 +DA:1229,0 +DA:1230,0 +DA:1232,0 +DA:1236,0 +DA:1237,0 +DA:1240,0 +DA:1241,0 +DA:1242,0 +DA:1244,0 +DA:1245,0 +DA:1246,0 +DA:1248,0 +DA:1249,0 +DA:1250,0 +DA:1251,0 +DA:1253,0 +DA:1256,0 +DA:1257,0 +DA:1261,0 +DA:1262,0 +DA:1263,0 +DA:1264,0 +DA:1265,0 +DA:1267,0 +DA:1270,0 +DA:1271,0 +DA:1274,0 +DA:1278,0 +DA:1279,0 +DA:1280,0 +DA:1283,0 +DA:1284,0 +DA:1292,0 +DA:1293,0 +DA:1294,0 +DA:1297,0 +DA:1298,0 +DA:1299,0 +DA:1301,0 +DA:1303,0 +DA:1304,0 +DA:1305,0 +DA:1306,0 +DA:1309,0 +DA:1310,0 +DA:1311,0 +DA:1313,0 +DA:1315,0 +DA:1316,0 +DA:1317,0 +DA:1321,0 +DA:1322,0 +DA:1330,0 +DA:1331,0 +DA:1332,0 +DA:1334,0 +DA:1337,0 +DA:1339,0 +DA:1343,0 +DA:1344,0 +DA:1345,0 +DA:1348,0 +DA:1349,0 +DA:1357,0 +DA:1358,0 +DA:1359,0 +DA:1361,0 +DA:1362,0 +DA:1363,0 +DA:1364,0 +DA:1365,0 +DA:1367,0 +DA:1368,0 +DA:1369,0 +DA:1370,0 +DA:1372,0 +DA:1373,0 +DA:1374,0 +DA:1375,0 +DA:1376,0 +DA:1377,0 +DA:1378,0 +DA:1380,0 +DA:1381,0 +DA:1382,0 +DA:1383,0 +DA:1384,0 +DA:1385,0 +DA:1386,0 +DA:1387,0 +DA:1388,0 +DA:1390,0 +DA:1391,0 +DA:1392,0 +DA:1395,0 +DA:1396,0 +DA:1399,0 +DA:1400,0 +DA:1401,0 +DA:1402,0 +DA:1403,0 +DA:1404,0 +DA:1405,0 +DA:1407,0 +DA:1408,0 +DA:1410,0 +DA:1415,0 +DA:1416,0 +DA:1419,0 +DA:1437,0 +DA:1438,0 +DA:1439,0 +DA:1444,0 +DA:1445,0 +DA:1446,0 +DA:1447,0 +DA:1448,0 +DA:1449,0 +DA:1450,0 +DA:1452,0 +DA:1456,0 +DA:1457,0 +DA:1458,0 +DA:1459,0 +DA:1461,0 +DA:1464,0 +DA:1467,0 +DA:1468,0 +DA:1469,0 +DA:1470,0 +DA:1472,0 +DA:1474,0 +DA:1475,0 +DA:1479,0 +DA:1480,0 +DA:1481,0 +DA:1482,0 +DA:1483,0 +DA:1484,0 +DA:1485,0 +DA:1488,0 +DA:1496,0 +DA:1497,0 +DA:1498,0 +DA:1500,0 +DA:1501,0 +DA:1502,0 +DA:1503,0 +DA:1504,0 +DA:1509,0 +DA:1512,0 +DA:1513,0 +DA:1518,0 +DA:1519,0 +DA:1520,0 +DA:1521,0 +DA:1526,0 +DA:1527,0 +DA:1528,0 +DA:1529,0 +DA:1530,0 +DA:1531,0 +DA:1532,0 +DA:1533,0 +DA:1536,0 +DA:1538,0 +DA:1543,0 +DA:1544,0 +DA:1547,0 +DA:1551,0 +DA:1558,0 +DA:1559,0 +DA:1560,0 +DA:1561,0 +DA:1562,0 +DA:1563,0 +DA:1564,0 +DA:1565,0 +DA:1566,0 +DA:1567,0 +DA:1569,0 +DA:1573,0 +DA:1574,0 +DA:1575,0 +DA:1583,0 +DA:1584,0 +DA:1585,0 +DA:1586,0 +DA:1587,0 +DA:1589,0 +DA:1590,0 +DA:1591,0 +DA:1592,0 +DA:1593,0 +DA:1595,0 +DA:1597,0 +DA:1598,0 +DA:1599,0 +DA:1600,0 +DA:1601,0 +DA:1602,0 +DA:1603,0 +DA:1610,0 +DA:1612,0 +DA:1617,0 +DA:1618,0 +DA:1619,0 +DA:1620,0 +DA:1623,0 +DA:1624,0 +DA:1627,0 +DA:1628,0 +DA:1635,0 +DA:1638,0 +DA:1639,0 +DA:1642,0 +DA:1644,0 +DA:1650,0 +DA:1652,0 +DA:1653,0 +DA:1654,0 +DA:1655,0 +DA:1656,0 +DA:1657,0 +DA:1659,0 +DA:1660,0 +DA:1661,0 +DA:1664,0 +DA:1666,0 +DA:1667,0 +DA:1669,0 +DA:1670,0 +DA:1671,0 +DA:1673,0 +DA:1676,0 +DA:1677,0 +DA:1681,0 +DA:1682,0 +DA:1685,0 +DA:1686,0 +DA:1689,0 +DA:1690,0 +DA:1692,0 +DA:1694,0 +DA:1695,0 +DA:1697,0 +DA:1698,0 +DA:1702,0 +DA:1703,0 +DA:1704,0 +DA:1705,0 +DA:1707,0 +DA:1711,0 +DA:1712,0 +DA:1713,0 +DA:1714,0 +DA:1716,0 +DA:1719,0 +DA:1721,0 +DA:1722,0 +DA:1725,0 +DA:1727,0 +DA:1728,0 +DA:1729,0 +DA:1732,0 +DA:1733,0 +DA:1737,0 +DA:1738,0 +DA:1741,0 +DA:1743,0 +DA:1744,0 +DA:1745,0 +DA:1748,0 +DA:1749,0 +DA:1751,0 +DA:1752,0 +DA:1754,0 +DA:1755,0 +DA:1756,0 +DA:1757,0 +DA:1760,0 +DA:1761,0 +DA:1762,0 +DA:1765,0 +DA:1766,0 +DA:1767,0 +DA:1768,0 +DA:1771,0 +DA:1772,0 +DA:1773,0 +DA:1774,0 +DA:1777,0 +DA:1778,0 +DA:1779,0 +DA:1780,0 +DA:1782,0 +DA:1783,0 +DA:1784,0 +DA:1787,0 +DA:1788,0 +DA:1791,0 +DA:1792,0 +DA:1793,0 +DA:1794,0 +DA:1797,0 +DA:1798,0 +DA:1799,0 +DA:1801,0 +DA:1805,0 +DA:1808,0 +DA:1809,0 +DA:1812,0 +DA:1818,0 +DA:1820,0 +DA:1831,0 +DA:1832,0 +DA:1833,0 +DA:1835,0 +DA:1836,0 +DA:1837,0 +DA:1838,0 +DA:1840,0 +DA:1869,0 +DA:1875,0 +DA:1876,0 +DA:1877,0 +DA:1878,0 +DA:1879,0 +DA:1884,0 +DA:1889,0 +DA:1907,0 +DA:1909,0 +DA:1910,0 +DA:1913,0 +DA:1914,0 +DA:1915,0 +DA:1919,0 +DA:1920,0 +DA:1924,0 +DA:1925,0 +DA:1929,0 +DA:1933,0 +DA:1934,0 +DA:1935,0 +DA:1936,0 +DA:1939,0 +DA:1943,0 +DA:1946,0 +DA:1947,0 +DA:1949,0 +DA:1950,0 +DA:1954,0 +DA:1956,0 +DA:1958,0 +DA:1959,0 +DA:1962,0 +DA:1963,0 +DA:1964,0 +DA:1966,0 +DA:1967,0 +DA:1971,0 +DA:1973,0 +DA:1977,0 +DA:1978,0 +DA:1979,0 +DA:1980,0 +DA:1984,0 +DA:1985,0 +DA:1986,0 +DA:1987,0 +DA:1989,0 +DA:1994,0 +DA:1995,0 +DA:1999,0 +DA:2000,0 +DA:2002,0 +DA:2006,0 +DA:2008,0 +DA:2009,0 +DA:2012,0 +DA:2014,0 +DA:2018,0 +DA:2019,0 +DA:2020,0 +DA:2021,0 +DA:2023,0 +DA:2030,0 +DA:2032,0 +DA:2033,0 +DA:2034,0 +DA:2036,0 +DA:2038,0 +DA:2039,0 +DA:2041,0 +DA:2044,0 +DA:2045,0 +DA:2046,0 +DA:2049,0 +DA:2050,0 +DA:2054,0 +DA:2056,0 +DA:2057,0 +DA:2060,0 +DA:2061,0 +DA:2064,0 +DA:2065,0 +DA:2067,0 +DA:2073,0 +DA:2074,0 +DA:2077,0 +DA:2081,0 +DA:2083,0 +DA:2084,0 +DA:2085,0 +DA:2088,0 +DA:2089,0 +DA:2092,0 +DA:2093,0 +DA:2094,0 +DA:2097,0 +DA:2099,0 +DA:2100,0 +DA:2102,0 +DA:2103,0 +DA:2104,0 +DA:2105,0 +DA:2107,0 +DA:2110,0 +DA:2111,0 +DA:2112,0 +DA:2115,0 +DA:2116,0 +DA:2117,0 +DA:2120,0 +DA:2121,0 +DA:2133,0 +DA:2135,0 +DA:2139,0 +DA:2140,0 +DA:2142,0 +DA:2143,0 +DA:2147,0 +DA:2148,0 +DA:2149,0 +DA:2150,0 +DA:2154,0 +DA:2155,0 +DA:2156,0 +DA:2157,0 +DA:2158,0 +DA:2159,0 +DA:2161,0 +DA:2165,0 +DA:2167,0 +DA:2168,0 +DA:2171,0 +DA:2172,0 +DA:2173,0 +DA:2179,0 +DA:2182,0 +DA:2187,0 +DA:2189,0 +DA:2191,0 +DA:2193,0 +DA:2194,0 +DA:2195,0 +DA:2199,0 +DA:2202,0 +DA:2204,0 +DA:2205,0 +DA:2207,0 +DA:2208,0 +DA:2209,0 +DA:2210,0 +DA:2212,0 +DA:2213,0 +DA:2215,0 +DA:2219,0 +DA:2222,0 +DA:2225,0 +DA:2228,0 +DA:2234,0 +DA:2237,0 +DA:2238,0 +DA:2239,0 +DA:2244,0 +DA:2245,0 +DA:2246,0 +DA:2247,0 +DA:2248,0 +DA:2251,0 +DA:2252,0 +DA:2253,0 +DA:2254,0 +DA:2257,0 +DA:2258,0 +DA:2259,0 +DA:2260,0 +DA:2261,0 +DA:2262,0 +DA:2264,0 +DA:2267,0 +DA:2268,0 +DA:2269,0 +DA:2270,0 +DA:2273,0 +DA:2274,0 +DA:2275,0 +DA:2276,0 +DA:2278,0 +DA:2279,0 +DA:2282,0 +DA:2284,0 +DA:2285,0 +DA:2286,0 +DA:2288,0 +DA:2289,0 +DA:2291,0 +DA:2292,0 +DA:2293,0 +DA:2295,0 +DA:2299,0 +DA:2300,0 +DA:2301,0 +DA:2302,0 +DA:2303,0 +DA:2305,0 +DA:2308,0 +DA:2311,0 +DA:2315,0 +DA:2316,0 +DA:2317,0 +DA:2321,0 +DA:2322,0 +DA:2323,0 +DA:2327,0 +DA:2328,0 +DA:2329,0 +DA:2330,0 +DA:2332,0 +DA:2333,0 +DA:2334,0 +DA:2339,0 +DA:2340,0 +DA:2342,0 +DA:2343,0 +DA:2345,0 +DA:2346,0 +DA:2347,0 +DA:2348,0 +DA:2350,0 +DA:2354,0 +DA:2358,0 +DA:2362,0 +DA:2366,0 +DA:2370,0 +DA:2373,0 +DA:2375,0 +DA:2376,0 +DA:2377,0 +DA:2378,0 +DA:2380,0 +DA:2381,0 +DA:2382,0 +DA:2383,0 +DA:2385,0 +DA:2386,0 +DA:2387,0 +DA:2388,0 +DA:2389,0 +DA:2391,0 +DA:2392,0 +DA:2396,0 +DA:2397,0 +DA:2398,0 +DA:2399,0 +DA:2402,0 +DA:2403,0 +DA:2405,0 +DA:2406,0 +DA:2409,0 +DA:2411,0 +DA:2412,0 +DA:2413,0 +DA:2415,0 +DA:2419,0 +DA:2422,0 +DA:2425,0 +DA:2429,0 +DA:2435,0 +DA:2438,0 +DA:2439,0 +DA:2440,0 +DA:2445,0 +DA:2446,0 +DA:2453,0 +DA:2454,0 +DA:2456,0 +DA:2461,0 +DA:2462,0 +DA:2464,0 +DA:2465,0 +DA:2466,0 +DA:2467,0 +DA:2468,0 +DA:2473,0 +DA:2476,0 +DA:2478,0 +DA:2479,0 +DA:2481,0 +DA:2483,0 +DA:2484,0 +DA:2485,0 +DA:2486,0 +DA:2487,0 +DA:2490,0 +DA:2492,0 +DA:2493,0 +DA:2494,0 +DA:2495,0 +DA:2496,0 +DA:2497,0 +DA:2500,0 +DA:2502,0 +DA:2503,0 +DA:2504,0 +DA:2505,0 +DA:2506,0 +DA:2507,0 +DA:2508,0 +DA:2514,0 +DA:2517,0 +DA:2518,0 +DA:2519,0 +DA:2521,0 +DA:2522,0 +DA:2523,0 +DA:2526,0 +DA:2527,0 +DA:2530,0 +DA:2536,0 +DA:2539,0 +DA:2540,0 +DA:2541,0 +DA:2545,0 +DA:2546,0 +DA:2547,0 +DA:2548,0 +DA:2553,0 +DA:2557,0 +DA:2558,0 +DA:2560,0 +DA:2561,0 +DA:2563,0 +DA:2567,0 +DA:2568,0 +DA:2570,0 +DA:2571,0 +DA:2573,0 +DA:2577,0 +DA:2579,0 +DA:2580,0 +DA:2582,0 +DA:2583,0 +DA:2584,0 +DA:2586,0 +DA:2590,0 +DA:2591,0 +DA:2592,0 +DA:2593,0 +DA:2595,0 +DA:2598,0 +DA:2599,0 +DA:2600,0 +DA:2601,0 +DA:2603,0 +DA:2604,0 +DA:2605,0 +DA:2606,0 +DA:2607,0 +DA:2610,0 +DA:2611,0 +DA:2612,0 +DA:2613,0 +DA:2614,0 +DA:2617,0 +DA:2620,0 +DA:2621,0 +DA:2623,0 +DA:2624,0 +DA:2625,0 +DA:2626,0 +DA:2630,0 +DA:2632,0 +DA:2639,0 +DA:2640,0 +DA:2643,0 +DA:2644,0 +DA:2645,0 +DA:2646,0 +DA:2648,0 +DA:2649,0 +DA:2650,0 +DA:2651,0 +DA:2652,0 +DA:2655,0 +DA:2658,0 +DA:2659,0 +DA:2660,0 +DA:2661,0 +DA:2662,0 +DA:2665,0 +DA:2666,0 +DA:2667,0 +DA:2668,0 +DA:2671,0 +DA:2674,0 +DA:2675,0 +DA:2676,0 +DA:2679,0 +DA:2680,0 +DA:2681,0 +DA:2684,0 +DA:2685,0 +DA:2686,0 +DA:2689,0 +DA:2690,0 +DA:2692,0 +DA:2698,0 +DA:2699,0 +DA:2701,0 +DA:2707,0 +DA:2708,0 +DA:2709,0 +DA:2710,0 +DA:2712,0 +DA:2713,0 +DA:2714,0 +DA:2715,0 +DA:2716,0 +DA:2718,0 +DA:2720,0 +DA:2722,0 +DA:2725,0 +DA:2726,0 +DA:2727,0 +DA:2728,0 +DA:2730,0 +DA:2731,0 +DA:2732,0 +DA:2733,0 +DA:2734,0 +DA:2736,0 +DA:2738,0 +DA:2740,0 +DA:2743,0 +DA:2744,0 +DA:2745,0 +DA:2746,0 +DA:2749,0 +DA:2750,0 +DA:2751,0 +DA:2752,0 +DA:2755,0 +DA:2756,0 +DA:2757,0 +DA:2758,0 +DA:2761,0 +DA:2762,0 +DA:2764,0 +DA:2770,0 +DA:2771,0 +DA:2773,0 +DA:2779,0 +DA:2780,0 +DA:2781,0 +DA:2784,0 +DA:2785,0 +DA:2786,0 +DA:2789,0 +DA:2790,0 +DA:2791,0 +DA:2794,0 +DA:2795,0 +DA:2796,0 +DA:2800,0 +DA:2801,0 +DA:2802,0 +DA:2805,0 +DA:2806,0 +DA:2807,0 +DA:2808,0 +DA:2809,0 +DA:2811,0 +DA:2812,0 +DA:2813,0 +DA:2814,0 +DA:2815,0 +DA:2818,0 +DA:2821,0 +DA:2822,0 +DA:2823,0 +DA:2824,0 +DA:2825,0 +DA:2827,0 +DA:2828,0 +DA:2829,0 +DA:2830,0 +DA:2831,0 +DA:2834,0 +DA:2837,0 +DA:2838,0 +DA:2839,0 +DA:2840,0 +DA:2841,0 +DA:2842,0 +DA:2843,0 +DA:2847,0 +DA:2848,0 +DA:2849,0 +DA:2854,0 +DA:2855,0 +DA:2856,0 +DA:2857,0 +DA:2858,0 +DA:2859,0 +DA:2860,0 +DA:2862,0 +DA:2864,0 +DA:2867,0 +DA:2868,0 +DA:2869,0 +DA:2870,0 +DA:2871,0 +DA:2872,0 +DA:2873,0 +DA:2875,0 +DA:2877,0 +DA:2881,0 +DA:2882,0 +DA:2883,0 +DA:2887,0 +DA:2888,0 +DA:2889,0 +DA:2890,0 +DA:2891,0 +DA:2892,0 +DA:2893,0 +DA:2894,0 +DA:2895,0 +DA:2897,0 +DA:2899,0 +DA:2902,0 +DA:2903,0 +DA:2904,0 +DA:2905,0 +DA:2906,0 +DA:2907,0 +DA:2908,0 +DA:2909,0 +DA:2910,0 +DA:2912,0 +DA:2914,0 +DA:2917,0 +DA:2918,0 +DA:2919,0 +DA:2920,0 +DA:2921,0 +DA:2923,0 +DA:2926,0 +DA:2927,0 +DA:2928,0 +DA:2929,0 +DA:2930,0 +DA:2931,0 +DA:2934,0 +DA:2937,0 +DA:2938,0 +DA:2939,0 +DA:2940,0 +DA:2941,0 +DA:2943,0 +DA:2946,0 +DA:2947,0 +DA:2948,0 +DA:2949,0 +DA:2950,0 +DA:2951,0 +DA:2954,0 +DA:2957,0 +DA:2958,0 +DA:2959,0 +DA:2960,0 +DA:2961,0 +DA:2962,0 +DA:2963,0 +DA:2964,0 +DA:2967,0 +DA:2968,0 +DA:2969,0 +DA:2970,0 +DA:2971,0 +DA:2972,0 +DA:2973,0 +DA:2975,0 +DA:2977,0 +DA:2980,0 +DA:2981,0 +DA:2982,0 +DA:2983,0 +DA:2984,0 +DA:2985,0 +DA:2986,0 +DA:2988,0 +DA:2990,0 +DA:2993,0 +DA:2994,0 +DA:2995,0 +DA:2996,0 +DA:2997,0 +DA:2998,0 +DA:2999,0 +DA:3000,0 +DA:3001,0 +DA:3003,0 +DA:3005,0 +DA:3008,0 +DA:3009,0 +DA:3010,0 +DA:3011,0 +DA:3012,0 +DA:3013,0 +DA:3014,0 +DA:3015,0 +DA:3016,0 +DA:3017,0 +DA:3019,0 +DA:3021,0 +DA:3025,0 +DA:3026,0 +DA:3027,0 +DA:3031,0 +DA:3032,0 +DA:3034,0 +DA:3035,0 +DA:3038,0 +DA:3039,0 +DA:3042,0 +DA:3043,0 +DA:3047,0 +DA:3048,0 +DA:3050,0 +DA:3051,0 +DA:3054,0 +DA:3055,0 +DA:3058,0 +DA:3059,0 +DA:3063,0 +DA:3064,0 +DA:3065,0 +DA:3066,0 +DA:3067,0 +DA:3068,0 +DA:3071,0 +DA:3072,0 +DA:3075,0 +DA:3076,0 +DA:3078,0 +DA:3079,0 +DA:3082,0 +DA:3083,0 +DA:3084,0 +DA:3087,0 +DA:3090,0 +DA:3092,0 +DA:3093,0 +DA:3095,0 +DA:3097,0 +DA:3098,0 +DA:3101,0 +DA:3104,0 +DA:3108,0 +DA:3109,0 +DA:3110,0 +DA:3111,0 +DA:3113,0 +DA:3116,0 +DA:3117,0 +DA:3119,0 +DA:3120,0 +DA:3123,0 +DA:3124,0 +DA:3125,0 +DA:3128,0 +DA:3129,0 +DA:3130,0 +DA:3131,0 +DA:3135,0 +DA:3142,0 +DA:3143,0 +DA:3144,0 +DA:3145,0 +DA:3147,0 +DA:3148,0 +DA:3149,0 +DA:3151,0 +DA:3154,0 +DA:3161,0 +DA:3166,0 +DA:3167,0 +DA:3168,0 +DA:3171,0 +DA:3174,0 +DA:3175,0 +DA:3177,0 +DA:3178,0 +DA:3179,0 +DA:3180,0 +DA:3181,0 +DA:3182,0 +DA:3183,0 +DA:3184,0 +DA:3185,0 +DA:3186,0 +DA:3187,0 +DA:3188,0 +DA:3189,0 +DA:3190,0 +DA:3191,0 +DA:3192,0 +DA:3193,0 +DA:3194,0 +DA:3195,0 +DA:3196,0 +DA:3197,0 +DA:3198,0 +DA:3199,0 +DA:3200,0 +DA:3201,0 +DA:3202,0 +DA:3203,0 +DA:3204,0 +DA:3205,0 +DA:3206,0 +DA:3207,0 +DA:3208,0 +DA:3209,0 +DA:3210,0 +DA:3211,0 +DA:3212,0 +DA:3213,0 +DA:3214,0 +DA:3215,0 +DA:3216,0 +DA:3217,0 +DA:3218,0 +DA:3219,0 +DA:3220,0 +DA:3221,0 +DA:3222,0 +DA:3223,0 +DA:3224,0 +DA:3226,0 +DA:3229,0 +DA:3233,0 +DA:3235,0 +DA:3237,0 +DA:3238,0 +DA:3240,0 +DA:3244,0 +DA:3245,0 +DA:3249,0 +DA:3250,0 +DA:3254,0 +DA:3256,0 +DA:3257,0 +DA:3258,0 +DA:3260,0 +DA:3261,0 +DA:3264,0 +DA:3266,0 +DA:3268,0 +DA:3270,0 +DA:3271,0 +DA:3272,0 +DA:3274,0 +DA:3275,0 +DA:3279,0 +DA:3281,0 +DA:3285,0 +DA:3286,0 +DA:3287,0 +DA:3288,0 +DA:3292,0 +DA:3293,0 +DA:3295,0 +DA:3298,0 +DA:3301,0 +DA:3302,0 +DA:3303,0 +DA:3304,0 +DA:3305,0 +DA:3306,0 +DA:3310,0 +DA:3311,0 +DA:3312,0 +DA:3317,0 +DA:3318,0 +DA:3319,0 +DA:3326,0 +DA:3330,0 +DA:3334,0 +DA:3335,0 +DA:3337,0 +DA:3339,0 +DA:3344,0 +DA:3345,0 +DA:3346,0 +DA:3348,0 +DA:3349,0 +DA:3350,0 +DA:3351,0 +DA:3352,0 +DA:3355,0 +DA:3359,0 +DA:3363,0 +DA:3364,0 +DA:3365,0 +DA:3367,0 +DA:3372,0 +DA:3374,0 +DA:3377,0 +DA:3381,0 +DA:3382,0 +DA:3383,0 +DA:3384,0 +DA:3385,0 +DA:3386,0 +DA:3387,0 +DA:3390,0 +DA:3391,0 +DA:3393,0 +DA:3394,0 +DA:3396,0 +DA:3397,0 +DA:3398,0 +DA:3399,0 +DA:3400,0 +DA:3401,0 +DA:3402,0 +DA:3403,0 +DA:3404,0 +DA:3410,0 +DA:3411,0 +DA:3419,0 +DA:3420,0 +DA:3423,0 +DA:3426,0 +DA:3428,0 +DA:3431,0 +DA:3434,0 +DA:3435,0 +DA:3436,0 +DA:3437,0 +DA:3438,0 +DA:3441,0 +DA:3442,0 +DA:3443,0 +DA:3444,0 +DA:3445,0 +DA:3446,0 +DA:3447,0 +DA:3450,0 +DA:3455,0 +DA:3456,0 +DA:3460,0 +DA:3464,0 +DA:3468,0 +DA:3469,0 +DA:3470,0 +DA:3474,0 +DA:3476,0 +DA:3477,0 +DA:3478,0 +DA:3479,0 +DA:3480,0 +DA:3482,0 +DA:3483,0 +DA:3484,0 +DA:3485,0 +DA:3486,0 +DA:3487,0 +DA:3490,0 +DA:3493,0 +DA:3494,0 +DA:3498,0 +DA:3500,0 +DA:3501,0 +DA:3502,0 +DA:3503,0 +DA:3504,0 +DA:3505,0 +DA:3506,0 +DA:3508,0 +DA:3510,0 +DA:3511,0 +DA:3512,0 +DA:3513,0 +DA:3515,0 +DA:3516,0 +DA:3517,0 +DA:3518,0 +DA:3520,0 +DA:3521,0 +DA:3522,0 +DA:3523,0 +DA:3525,0 +DA:3526,0 +DA:3528,0 +DA:3531,0 +DA:3533,0 +DA:3534,0 +DA:3535,0 +DA:3536,0 +DA:3537,0 +DA:3538,0 +DA:3539,0 +DA:3541,0 +DA:3543,0 +DA:3544,0 +DA:3545,0 +DA:3547,0 +DA:3548,0 +DA:3549,0 +DA:3550,0 +DA:3552,0 +DA:3553,0 +DA:3555,0 +DA:3557,0 +DA:3558,0 +DA:3559,0 +DA:3562,0 +DA:3563,0 +DA:3564,0 +DA:3565,0 +DA:3566,0 +DA:3567,0 +DA:3569,0 +DA:3570,0 +DA:3574,0 +DA:3576,0 +DA:3577,0 +DA:3578,0 +DA:3580,0 +DA:3584,0 +DA:3586,0 +DA:3587,0 +DA:3613,0 +DA:3614,0 +DA:3616,0 +DA:3619,0 +DA:3621,0 +DA:3622,0 +DA:3626,0 +DA:3630,0 +DA:3631,0 +DA:3632,0 +DA:3633,0 +DA:3634,0 +DA:3637,0 +DA:3640,0 +DA:3641,0 +DA:3644,0 +DA:3645,0 +DA:3647,0 +DA:3648,0 +DA:3649,0 +DA:3651,0 +DA:3655,0 +DA:3657,0 +DA:3658,0 +DA:3660,0 +DA:3661,0 +DA:3664,0 +DA:3665,0 +DA:3667,0 +DA:3668,0 +DA:3670,0 +DA:3671,0 +DA:3674,0 +DA:3675,0 +DA:3676,0 +DA:3677,0 +DA:3678,0 +DA:3680,0 +DA:3681,0 +DA:3682,0 +DA:3683,0 +DA:3684,0 +DA:3686,0 +DA:3687,0 +DA:3688,0 +DA:3689,0 +DA:3692,0 +DA:3695,0 +DA:3698,0 +DA:3699,0 +DA:3701,0 +DA:3702,0 +DA:3706,0 +DA:3707,0 +DA:3711,0 +DA:3713,0 +DA:3714,0 +DA:3716,0 +DA:3719,0 +DA:3722,0 +DA:3724,0 +DA:3725,0 +DA:3727,0 +DA:3730,0 +DA:3731,0 +DA:3732,0 +DA:3736,0 +DA:3738,0 +DA:3743,0 +DA:3746,0 +DA:3748,0 +DA:3749,0 +DA:3750,0 +DA:3752,0 +DA:3755,0 +DA:3757,0 +DA:3758,0 +DA:3759,0 +DA:3763,0 +DA:3764,0 +DA:3766,0 +DA:3770,0 +DA:3773,0 +DA:3774,0 +DA:3776,0 +DA:3777,0 +DA:3779,0 +DA:3780,0 +DA:3781,0 +DA:3783,0 +DA:3785,0 +DA:3786,0 +DA:3787,0 +DA:3789,0 +DA:3790,0 +DA:3791,0 +DA:3793,0 +DA:3794,0 +DA:3798,0 +DA:3799,0 +DA:3801,0 +DA:3802,0 +DA:3803,0 +DA:3805,0 +DA:3808,0 +DA:3809,0 +DA:3812,0 +DA:3815,0 +DA:3818,0 +DA:3819,0 +DA:3822,0 +DA:3823,0 +DA:3824,0 +DA:3825,0 +DA:3826,0 +DA:3827,0 +DA:3831,0 +DA:3832,0 +DA:3833,0 +DA:3834,0 +DA:3836,0 +DA:3837,0 +DA:3838,0 +DA:3841,0 +DA:3843,0 +DA:3844,0 +DA:3847,0 +DA:3848,0 +DA:3850,0 +DA:3852,0 +DA:3855,0 +DA:3857,0 +DA:3858,0 +DA:3859,0 +DA:3860,0 +DA:3862,0 +DA:3863,0 +DA:3866,0 +DA:3868,0 +DA:3869,0 +DA:3870,0 +DA:3871,0 +DA:3873,0 +DA:3874,0 +DA:3878,0 +DA:3882,0 +DA:3886,0 +DA:3890,0 +DA:3894,0 +DA:3896,0 +DA:3897,0 +DA:3898,0 +DA:3909,0 +DA:3910,0 +DA:3911,0 +DA:3912,0 +DA:3913,0 +DA:3914,0 +DA:3928,0 +DA:3929,0 +DA:3938,0 +DA:3939,0 +DA:3943,0 +DA:3945,0 +DA:3946,0 +DA:3947,0 +DA:3949,0 +DA:3952,0 +DA:3954,0 +DA:3956,0 +DA:3957,0 +DA:3960,0 +DA:3961,0 +DA:3964,0 +DA:3966,0 +DA:3968,0 +DA:3969,0 +DA:3970,0 +DA:3972,0 +DA:3975,0 +DA:3977,0 +DA:3979,0 +DA:3981,0 +DA:3983,0 +DA:3984,0 +DA:3987,0 +DA:3992,0 +DA:3993,0 +DA:3994,0 +DA:3996,0 +DA:3999,0 +DA:4000,0 +DA:4001,0 +DA:4003,0 +DA:4005,0 +DA:4006,0 +DA:4011,0 +DA:4012,0 +DA:4014,0 +DA:4015,0 +DA:4017,0 +DA:4018,0 +DA:4019,0 +DA:4020,0 +DA:4021,0 +DA:4022,0 +DA:4023,0 +DA:4026,0 +DA:4027,0 +DA:4029,0 +DA:4030,0 +DA:4031,0 +DA:4034,0 +DA:4035,0 +DA:4036,0 +DA:4037,0 +DA:4038,0 +DA:4041,0 +DA:4042,0 +DA:4043,0 +DA:4049,0 +DA:4050,0 +DA:4052,0 +DA:4053,0 +DA:4055,0 +DA:4056,0 +DA:4057,0 +DA:4058,0 +DA:4059,0 +DA:4060,0 +DA:4064,0 +DA:4065,0 +DA:4066,0 +DA:4067,0 +DA:4068,0 +DA:4069,0 +DA:4070,0 +DA:4072,0 +DA:4073,0 +DA:4076,0 +DA:4077,0 +DA:4078,0 +DA:4080,0 +DA:4083,0 +DA:4085,0 +DA:4088,0 +DA:4090,0 +DA:4092,0 +DA:4093,0 +DA:4098,0 +DA:4109,0 +DA:4112,0 +DA:4113,0 +DA:4114,0 +DA:4115,0 +DA:4116,0 +DA:4117,0 +DA:4118,0 +DA:4119,0 +DA:4122,0 +DA:4123,0 +DA:4124,0 +DA:4127,0 +DA:4134,0 +DA:4135,0 +DA:4136,0 +DA:4150,0 +DA:4162,0 +DA:4163,0 +DA:4164,0 +DA:4165,0 +DA:4167,0 +DA:4181,0 +DA:4182,0 +DA:4183,0 +DA:4186,0 +DA:4187,0 +DA:4190,0 +DA:4191,0 +DA:4192,0 +DA:4193,0 +DA:4210,0 +DA:4211,0 +DA:4212,0 +DA:4215,0 +DA:4216,0 +DA:4217,0 +DA:4219,0 +DA:4220,0 +DA:4221,0 +DA:4225,0 +DA:4226,0 +DA:4229,0 +DA:4232,0 +DA:4244,0 +DA:4245,0 +DA:4246,0 +DA:4247,0 +DA:4248,0 +DA:4249,0 +DA:4251,0 +DA:4252,0 +DA:4266,0 +DA:4267,0 +DA:4269,0 +DA:4270,0 +DA:4272,0 +DA:4273,0 +DA:4275,0 +DA:4292,0 +DA:4301,0 +DA:4302,0 +DA:4303,0 +DA:4304,0 +DA:4305,0 +DA:4307,0 +DA:4319,0 +DA:4320,0 +DA:4322,0 +DA:4323,0 +DA:4324,0 +DA:4340,0 +DA:4341,0 +DA:4342,0 +DA:4345,0 +DA:4347,0 +DA:4348,0 +DA:4350,0 +DA:4356,0 +DA:4363,0 +DA:4365,0 +DA:4366,0 +DA:4369,0 +DA:4371,0 +DA:4372,0 +DA:4375,0 +DA:4376,0 +DA:4378,0 +DA:4379,0 +DA:4382,0 +DA:4383,0 +DA:4384,0 +DA:4387,0 +DA:4391,0 +DA:4392,0 +DA:4396,0 +DA:4397,0 +DA:4400,0 +DA:4401,0 +DA:4404,0 +DA:4408,0 +DA:4430,0 +DA:4439,0 +DA:4442,0 +DA:4445,0 +DA:4446,0 +DA:4447,0 +DA:4450,0 +DA:4451,0 +DA:4452,0 +DA:4453,0 +DA:4457,0 +DA:4463,0 +DA:4464,0 +DA:4468,0 +DA:4472,0 +DA:4473,0 +DA:4474,0 +DA:4475,0 +DA:4481,0 +DA:4482,0 +DA:4483,0 +DA:4486,0 +DA:4487,0 +DA:4489,0 +DA:4490,0 +DA:4492,0 +DA:4493,0 +DA:4496,0 +DA:4498,0 +DA:4499,0 +DA:4500,0 +DA:4501,0 +DA:4503,0 +DA:4504,0 +DA:4505,0 +DA:4508,0 +DA:4511,0 +DA:4512,0 +DA:4513,0 +DA:4514,0 +DA:4518,0 +DA:4519,0 +DA:4522,0 +DA:4537,0 +DA:4538,0 +DA:4556,0 +DA:4557,0 +DA:4566,0 +DA:4593,0 +DA:4598,0 +DA:4599,0 +DA:4601,0 +DA:4602,0 +DA:4604,0 +DA:4607,0 +DA:4608,0 +DA:4613,0 +DA:4647,0 +DA:4650,0 +DA:4651,0 +DA:4652,0 +DA:4653,0 +DA:4655,0 +DA:4656,0 +DA:4659,0 +DA:4660,0 +DA:4662,0 +DA:4663,0 +DA:4664,0 +DA:4667,0 +DA:4669,0 +DA:4670,0 +DA:4673,0 +DA:4674,0 +DA:4675,0 +DA:4678,0 +DA:4679,0 +DA:4680,0 +DA:4682,0 +DA:4683,0 +DA:4686,0 +DA:4687,0 +DA:4689,0 +DA:4690,0 +DA:4691,0 +DA:4692,0 +DA:4694,0 +DA:4698,0 +DA:4701,0 +DA:4702,0 +DA:4729,0 +DA:4730,0 +DA:4732,0 +DA:4735,0 +DA:4738,0 +DA:4741,0 +DA:4745,0 +DA:4746,0 +DA:4747,0 +DA:4748,0 +DA:4749,0 +DA:4752,0 +DA:4753,0 +DA:4754,0 +DA:4755,0 +DA:4756,0 +DA:4757,0 +DA:4760,0 +DA:4766,0 +DA:4767,0 +DA:4771,0 +DA:4772,0 +DA:4776,0 +DA:4777,0 +DA:4778,0 +DA:4779,0 +DA:4781,0 +DA:4784,0 +DA:4785,0 +DA:4786,0 +DA:4787,0 +DA:4789,0 +DA:4795,0 +DA:4796,0 +DA:4799,0 +DA:4810,0 +DA:4811,0 +DA:4812,0 +DA:4813,0 +DA:4818,0 +DA:4821,0 +DA:4827,0 +DA:4828,0 +DA:4831,0 +DA:4832,0 +DA:4834,0 +DA:4836,0 +DA:4837,0 +DA:4838,0 +DA:4839,0 +DA:4840,0 +DA:4844,0 +DA:4845,0 +DA:4847,0 +DA:4848,0 +DA:4850,0 +DA:4851,0 +DA:4853,0 +DA:4854,0 +DA:4856,0 +DA:4857,0 +DA:4858,0 +DA:4860,0 +DA:4867,0 +DA:4868,0 +DA:4872,0 +DA:4876,0 +DA:4880,0 +DA:4881,0 +DA:4892,0 +DA:4894,0 +DA:4897,0 +DA:4898,0 +DA:4901,0 +DA:4904,0 +DA:4905,0 +DA:4907,0 +DA:4910,0 +DA:4911,0 +DA:4915,0 +DA:4918,0 +DA:4921,0 +DA:4926,0 +DA:4931,0 +DA:4934,0 +DA:4936,0 +DA:4939,0 +DA:4940,0 +DA:4948,0 +DA:4949,0 +DA:4951,0 +DA:4952,0 +DA:4956,0 +DA:4959,0 +DA:4960,0 +DA:4966,0 +DA:4968,0 +DA:4969,0 +DA:4971,0 +DA:4977,0 +DA:4981,0 +DA:4983,0 +DA:4987,0 +DA:4989,0 +DA:4990,0 +DA:4994,0 +DA:4995,0 +DA:4996,0 +DA:4999,0 +DA:5001,0 +DA:5002,0 +DA:5003,0 +DA:5004,0 +DA:5005,0 +DA:5006,0 +DA:5007,0 +DA:5008,0 +DA:5014,0 +DA:5018,0 +DA:5019,0 +DA:5020,0 +DA:5025,0 +DA:5029,0 +DA:5032,0 +DA:5035,0 +DA:5037,0 +DA:5038,0 +DA:5039,0 +DA:5040,0 +DA:5041,0 +DA:5042,0 +DA:5043,0 +DA:5049,0 +DA:5051,0 +DA:5052,0 +DA:5054,0 +DA:5057,0 +DA:5059,0 +DA:5060,0 +DA:5062,0 +DA:5069,0 +DA:5070,0 +DA:5072,0 +DA:5073,0 +DA:5074,0 +DA:5075,0 +DA:5076,0 +DA:5080,0 +DA:5084,0 +DA:5085,0 +DA:5086,0 +DA:5089,0 +DA:5090,0 +DA:5094,0 +DA:5095,0 +DA:5096,0 +DA:5097,0 +DA:5098,0 +DA:5099,0 +DA:5100,0 +DA:5101,0 +DA:5102,0 +DA:5103,0 +DA:5104,0 +DA:5105,0 +DA:5106,0 +DA:5108,0 +DA:5109,0 +DA:5111,0 +DA:5112,0 +DA:5115,0 +DA:5116,0 +DA:5117,0 +DA:5120,0 +DA:5121,0 +DA:5122,0 +DA:5124,0 +DA:5126,0 +DA:5127,0 +DA:5130,0 +DA:5132,0 +DA:5133,0 +DA:5136,0 +DA:5148,0 +DA:5155,0 +DA:5156,0 +DA:5157,0 +DA:5158,0 +DA:5159,0 +DA:5160,0 +DA:5164,0 +DA:5166,0 +DA:5167,0 +DA:5170,0 +DA:5171,0 +DA:5172,0 +DA:5173,0 +DA:5174,0 +DA:5175,0 +DA:5176,0 +DA:5178,0 +DA:5182,0 +DA:5183,0 +DA:5185,0 +DA:5186,0 +DA:5188,0 +DA:5190,0 +DA:5191,0 +DA:5193,0 +DA:5196,0 +DA:5197,0 +DA:5203,0 +DA:5204,0 +DA:5207,0 +DA:5208,0 +DA:5209,0 +DA:5210,0 +DA:5212,0 +DA:5216,0 +DA:5220,0 +DA:5221,0 +DA:5222,0 +DA:5223,0 +DA:5225,0 +DA:5226,0 +DA:5231,0 +DA:5234,0 +DA:5235,0 +DA:5236,0 +DA:5238,0 +DA:5239,0 +DA:5242,0 +DA:5245,0 +DA:5246,0 +DA:5247,0 +DA:5248,0 +DA:5274,0 +DA:5275,0 +DA:5278,0 +DA:5279,0 +DA:5280,0 +DA:5285,0 +DA:5286,0 +DA:5287,0 +DA:5290,0 +DA:5291,0 +DA:5292,0 +DA:5293,0 +DA:5295,0 +DA:5296,0 +DA:5298,0 +DA:5299,0 +DA:5304,0 +DA:5305,0 +DA:5308,0 +DA:5309,0 +DA:5311,0 +DA:5313,0 +DA:5314,0 +DA:5315,0 +DA:5318,0 +DA:5322,0 +DA:5323,0 +DA:5326,0 +DA:5327,0 +DA:5329,0 +DA:5330,0 +DA:5332,0 +DA:5336,0 +DA:5337,0 +DA:5342,0 +DA:5344,0 +DA:5349,0 +DA:5350,0 +DA:5351,0 +DA:5352,0 +DA:5353,0 +DA:5354,0 +DA:5357,0 +DA:5360,0 +DA:5367,0 +DA:5368,0 +DA:5369,0 +DA:5370,0 +DA:5371,0 +DA:5372,0 +DA:5373,0 +DA:5375,0 +DA:5380,0 +DA:5381,0 +DA:5382,0 +DA:5393,0 +DA:5394,0 +DA:5395,0 +DA:5400,0 +DA:5401,0 +DA:5403,0 +DA:5404,0 +DA:5405,0 +DA:5407,0 +DA:5409,0 +DA:5411,0 +DA:5418,0 +DA:5419,0 +DA:5422,0 +DA:5423,0 +DA:5424,0 +DA:5426,0 +DA:5428,0 +DA:5429,0 +DA:5431,0 +DA:5432,0 +DA:5434,0 +DA:5435,0 +DA:5437,0 +DA:5438,0 +DA:5440,0 +DA:5444,0 +DA:5445,0 +DA:5446,0 +DA:5448,0 +DA:5450,0 +DA:5452,0 +DA:5453,0 +DA:5454,0 +DA:5459,0 +DA:5460,0 +DA:5467,0 +DA:5468,0 +DA:5470,0 +DA:5472,0 +DA:5474,0 +DA:5475,0 +DA:5476,0 +DA:5477,0 +DA:5478,0 +DA:5479,0 +DA:5480,0 +DA:5481,0 +DA:5483,0 +DA:5490,0 +DA:5492,0 +DA:5495,0 +DA:5497,0 +DA:5498,0 +DA:5499,0 +DA:5503,0 +DA:5507,0 +DA:5508,0 +DA:5510,0 +DA:5517,0 +DA:5518,0 +DA:5519,0 +DA:5520,0 +DA:5521,0 +DA:5525,0 +DA:5526,0 +DA:5527,0 +DA:5528,0 +DA:5530,0 +DA:5535,0 +DA:5536,0 +DA:5538,0 +DA:5540,0 +DA:5541,0 +DA:5542,0 +DA:5544,0 +DA:5547,0 +DA:5548,0 +DA:5552,0 +DA:5555,0 +DA:5556,0 +DA:5557,0 +DA:5560,0 +DA:5564,0 +DA:5565,0 +DA:5566,0 +DA:5567,0 +DA:5568,0 +DA:5569,0 +DA:5570,0 +DA:5571,0 +DA:5577,0 +DA:5578,0 +DA:5581,0 +DA:5582,0 +DA:5585,0 +DA:5587,0 +DA:5588,0 +DA:5590,0 +DA:5591,0 +DA:5594,0 +DA:5595,0 +DA:5596,0 +DA:5597,0 +DA:5598,0 +DA:5599,0 +DA:5604,0 +DA:5606,0 +DA:5607,0 +DA:5608,0 +DA:5609,0 +DA:5610,0 +DA:5612,0 +DA:5613,0 +DA:5614,0 +DA:5618,0 +DA:5619,0 +DA:5620,0 +DA:5622,0 +DA:5623,0 +DA:5624,0 +DA:5625,0 +DA:5627,0 +DA:5629,0 +DA:5634,0 +DA:5635,0 +DA:5639,0 +DA:5640,0 +DA:5643,0 +DA:5644,0 +DA:5645,0 +DA:5646,0 +DA:5647,0 +DA:5648,0 +DA:5649,0 +DA:5650,0 +DA:5651,0 +DA:5652,0 +DA:5657,0 +DA:5659,0 +DA:5662,0 +DA:5663,0 +DA:5668,0 +DA:5669,0 +DA:5670,0 +DA:5671,0 +DA:5672,0 +DA:5673,0 +DA:5675,0 +DA:5679,0 +DA:5680,0 +DA:5681,0 +DA:5686,0 +DA:5687,0 +DA:5688,0 +DA:5691,0 +DA:5692,0 +DA:5693,0 +DA:5694,0 +DA:5695,0 +DA:5698,0 +DA:5699,0 +DA:5700,0 +DA:5701,0 +DA:5702,0 +DA:5703,0 +DA:5705,0 +DA:5709,0 +DA:5710,0 +DA:5711,0 +DA:5712,0 +DA:5713,0 +DA:5721,0 +DA:5722,0 +DA:5723,0 +DA:5725,0 +DA:5726,0 +DA:5727,0 +DA:5728,0 +DA:5729,0 +DA:5730,0 +DA:5731,0 +DA:5734,0 +DA:5737,0 +DA:5738,0 +DA:5739,0 +DA:5740,0 +DA:5743,0 +DA:5744,0 +DA:5745,0 +DA:5746,0 +DA:5748,0 +DA:5749,0 +DA:5750,0 +DA:5751,0 +DA:5757,0 +DA:5758,0 +DA:5759,0 +DA:5760,0 +DA:5766,0 +DA:5767,0 +DA:5768,0 +DA:5773,0 +DA:5774,0 +DA:5775,0 +DA:5776,0 +DA:5777,0 +DA:5781,0 +DA:5786,0 +DA:5791,0 +DA:5792,0 +DA:5793,0 +DA:5794,0 +DA:5798,0 +DA:5799,0 +DA:5801,0 +DA:5802,0 +DA:5803,0 +DA:5804,0 +DA:5805,0 +DA:5807,0 +DA:5808,0 +DA:5809,0 +DA:5810,0 +DA:5812,0 +DA:5813,0 +DA:5816,0 +DA:5819,0 +DA:5820,0 +DA:5821,0 +DA:5822,0 +DA:5824,0 +DA:5828,0 +DA:5829,0 +DA:5831,0 +DA:5833,0 +DA:5834,0 +DA:5835,0 +DA:5836,0 +DA:5838,0 +DA:5839,0 +DA:5841,0 +DA:5843,0 +DA:5844,0 +DA:5846,0 +DA:5848,0 +DA:5853,0 +DA:5857,0 +DA:5861,0 +DA:5862,0 +DA:5864,0 +DA:5865,0 +DA:5866,0 +DA:5872,0 +DA:5873,0 +DA:5874,0 +DA:5875,0 +DA:5880,0 +DA:5881,0 +DA:5886,0 +DA:5887,0 +DA:5889,0 +DA:5938,0 +DA:5940,0 +DA:5943,0 +DA:5944,0 +DA:5947,0 +DA:5951,0 +DA:5952,0 +DA:5955,0 +DA:5956,0 +DA:5957,0 +DA:5958,0 +DA:5962,0 +DA:5963,0 +DA:5965,0 +DA:5967,0 +DA:5968,0 +DA:5970,0 +DA:5971,0 +DA:5973,0 +DA:5974,0 +DA:5976,0 +DA:5977,0 +DA:5979,0 +DA:5980,0 +DA:5981,0 +DA:5982,0 +DA:5988,0 +DA:5989,0 +DA:5991,0 +DA:5993,0 +DA:5996,0 +DA:5999,0 +DA:6004,0 +DA:6006,0 +DA:6007,0 +DA:6008,0 +DA:6010,0 +DA:6011,0 +DA:6014,0 +DA:6015,0 +DA:6016,0 +DA:6017,0 +DA:6020,0 +DA:6024,0 +DA:6025,0 +DA:6026,0 +DA:6039,0 +DA:6040,0 +DA:6043,0 +DA:6044,0 +DA:6045,0 +DA:6046,0 +DA:6047,0 +DA:6048,0 +DA:6049,0 +DA:6050,0 +DA:6053,0 +DA:6060,0 +DA:6061,0 +DA:6063,0 +DA:6064,0 +DA:6065,0 +DA:6069,0 +DA:6075,0 +DA:6076,0 +DA:6080,0 +DA:6081,0 +DA:6083,0 +DA:6084,0 +DA:6086,0 +DA:6087,0 +DA:6089,0 +DA:6099,0 +DA:6102,0 +DA:6107,0 +DA:6110,0 +DA:6114,0 +DA:6115,0 +DA:6120,0 +DA:6129,0 +DA:6130,0 +DA:6132,0 +DA:6133,0 +DA:6137,0 +DA:6139,0 +DA:6144,0 +DA:6145,0 +DA:6146,0 +DA:6147,0 +DA:6152,0 +DA:6154,0 +DA:6158,0 +DA:6160,0 +DA:6161,0 +DA:6166,0 +DA:6167,0 +DA:6168,0 +DA:6171,0 +DA:6173,0 +DA:6175,0 +DA:6177,0 +DA:6179,0 +DA:6184,0 +DA:6185,0 +DA:6190,0 +DA:6195,0 +DA:6198,0 +DA:6201,0 +DA:6207,0 +DA:6212,0 +DA:6215,0 +DA:6216,0 +DA:6220,0 +DA:6223,0 +DA:6225,0 +DA:6226,0 +DA:6230,0 +DA:6234,0 +DA:6237,0 +DA:6240,0 +DA:6241,0 +DA:6242,0 +DA:6243,0 +DA:6244,0 +DA:6245,0 +DA:6247,0 +DA:6250,0 +DA:6251,0 +DA:6253,0 +DA:6262,0 +DA:6266,0 +DA:6267,0 +DA:6269,0 +DA:6272,0 +DA:6274,0 +DA:6275,0 +DA:6276,0 +DA:6278,0 +DA:6279,0 +DA:6282,0 +DA:6286,0 +DA:6287,0 +DA:6292,0 +DA:6294,0 +DA:6295,0 +DA:6304,0 +DA:6306,0 +DA:6311,0 +DA:6312,0 +DA:6313,0 +DA:6314,0 +DA:6316,0 +DA:6319,0 +DA:6320,0 +DA:6321,0 +DA:6323,0 +DA:6324,0 +DA:6325,0 +DA:6328,0 +DA:6329,0 +DA:6330,0 +DA:6331,0 +DA:6333,0 +DA:6334,0 +DA:6336,0 +DA:6337,0 +DA:6338,0 +DA:6339,0 +DA:6340,0 +DA:6343,0 +DA:6346,0 +DA:6347,0 +DA:6349,0 +DA:6352,0 +DA:6353,0 +DA:6355,0 +DA:6356,0 +DA:6358,0 +DA:6363,0 +DA:6367,0 +DA:6369,0 +DA:6370,0 +DA:6371,0 +DA:6374,0 +DA:6375,0 +DA:6379,0 +DA:6382,0 +DA:6384,0 +DA:6391,0 +DA:6393,0 +DA:6394,0 +DA:6395,0 +DA:6397,0 +DA:6399,0 +DA:6401,0 +DA:6402,0 +DA:6404,0 +DA:6405,0 +DA:6406,0 +DA:6407,0 +DA:6408,0 +DA:6410,0 +DA:6413,0 +DA:6416,0 +DA:6420,0 +DA:6421,0 +DA:6422,0 +DA:6423,0 +DA:6424,0 +DA:6425,0 +DA:6427,0 +DA:6428,0 +DA:6432,0 +DA:6433,0 +DA:6434,0 +DA:6436,0 +DA:6438,0 +DA:6439,0 +DA:6443,0 +DA:6444,0 +DA:6445,0 +DA:6446,0 +DA:6450,0 +DA:6451,0 +DA:6452,0 +DA:6454,0 +DA:6456,0 +DA:6457,0 +DA:6460,0 +DA:6462,0 +DA:6466,0 +DA:6469,0 +DA:6470,0 +DA:6472,0 +DA:6478,0 +DA:6479,0 +DA:6480,0 +DA:6481,0 +DA:6482,0 +DA:6489,0 +DA:6490,0 +DA:6491,0 +DA:6498,0 +DA:6499,0 +DA:6501,0 +DA:6503,0 +DA:6504,0 +DA:6505,0 +DA:6506,0 +DA:6507,0 +DA:6508,0 +DA:6513,0 +DA:6514,0 +DA:6515,0 +DA:6516,0 +DA:6517,0 +DA:6518,0 +DA:6525,0 +DA:6526,0 +DA:6527,0 +DA:6528,0 +DA:6529,0 +DA:6531,0 +DA:6532,0 +DA:6537,0 +DA:6538,0 +DA:6542,0 +DA:6543,0 +DA:6545,0 +DA:6546,0 +DA:6549,0 +DA:6550,0 +DA:6553,0 +DA:6555,0 +DA:6556,0 +DA:6558,0 +DA:6559,0 +DA:6560,0 +DA:6561,0 +DA:6562,0 +DA:6563,0 +DA:6564,0 +DA:6567,0 +DA:6568,0 +DA:6571,0 +DA:6572,0 +DA:6573,0 +DA:6577,0 +DA:6578,0 +DA:6583,0 +DA:6591,0 +DA:6592,0 +DA:6593,0 +DA:6598,0 +DA:6599,0 +DA:6600,0 +DA:6601,0 +DA:6602,0 +DA:6603,0 +DA:6605,0 +DA:6608,0 +DA:6612,0 +DA:6613,0 +DA:6614,0 +DA:6615,0 +DA:6616,0 +DA:6618,0 +DA:6620,0 +DA:6624,0 +DA:6650,0 +DA:6651,0 +DA:6653,0 +DA:6655,0 +DA:6658,0 +DA:6660,0 +DA:6663,0 +DA:6665,0 +DA:6668,0 +DA:6670,0 +DA:6673,0 +DA:6675,0 +DA:6678,0 +DA:6680,0 +DA:6683,0 +DA:6685,0 +DA:6688,0 +DA:6690,0 +DA:6693,0 +DA:6695,0 +DA:6698,0 +DA:6700,0 +DA:6703,0 +DA:6705,0 +DA:6708,0 +DA:6710,0 +DA:6713,0 +DA:6715,0 +DA:6718,0 +DA:6725,0 +DA:6727,0 +DA:6730,0 +DA:6735,0 +DA:6738,0 +DA:6741,0 +DA:6743,0 +DA:6747,0 +DA:6748,0 +DA:6749,0 +DA:6750,0 +DA:6752,0 +DA:6753,0 +DA:6759,0 +DA:6765,0 +DA:6786,0 +DA:6787,0 +DA:6790,0 +DA:6792,0 +DA:6793,0 +DA:6794,0 +DA:6795,0 +DA:6796,0 +DA:6798,0 +DA:6800,0 +DA:6802,0 +DA:6805,0 +DA:6818,0 +DA:6819,0 +DA:6821,0 +DA:6823,0 +DA:6824,0 +DA:6825,0 +DA:6830,0 +DA:6833,0 +DA:6834,0 +DA:6835,0 +DA:6838,0 +DA:6839,0 +DA:6840,0 +DA:6841,0 +DA:6842,0 +DA:6843,0 +DA:6844,0 +DA:6847,0 +DA:6850,0 +DA:6874,0 +DA:6876,0 +DA:6877,0 +DA:6879,0 +DA:6880,0 +DA:6881,0 +DA:6882,0 +DA:6883,0 +DA:6884,0 +DA:6887,0 +DA:6895,0 +DA:6898,0 +DA:6899,0 +DA:6902,0 +DA:6903,0 +DA:6904,0 +DA:6909,0 +DA:6912,0 +DA:6913,0 +DA:6917,0 +DA:6921,0 +DA:6922,0 +DA:6923,0 +DA:6926,0 +DA:6928,0 +DA:6929,0 +DA:6931,0 +DA:6936,0 +DA:6937,0 +DA:6939,0 +DA:6944,0 +DA:6945,0 +DA:6946,0 +DA:6950,0 +DA:6951,0 +DA:6955,0 +DA:6956,0 +DA:6958,0 +DA:6959,0 +DA:6961,0 +DA:6962,0 +DA:6964,0 +DA:6965,0 +DA:6967,0 +DA:6970,0 +DA:6971,0 +DA:6973,0 +DA:6975,0 +DA:6978,0 +DA:6982,0 +DA:6983,0 +DA:6984,0 +DA:6985,0 +DA:6987,0 +DA:6989,0 +DA:6990,0 +DA:6991,0 +DA:6993,0 +DA:6995,0 +DA:6996,0 +DA:6997,0 +DA:6998,0 +DA:7001,0 +DA:7002,0 +DA:7005,0 +DA:7006,0 +DA:7007,0 +DA:7011,0 +DA:7012,0 +DA:7013,0 +DA:7014,0 +DA:7017,0 +DA:7018,0 +DA:7019,0 +DA:7020,0 +DA:7023,0 +DA:7024,0 +DA:7026,0 +DA:7028,0 +DA:7057,0 +DA:7058,0 +DA:7060,0 +DA:7061,0 +DA:7062,0 +DA:7063,0 +DA:7066,0 +DA:7069,0 +DA:7072,0 +DA:7073,0 +DA:7074,0 +DA:7076,0 +DA:7081,0 +DA:7082,0 +DA:7084,0 +DA:7087,0 +DA:7088,0 +DA:7090,0 +DA:7091,0 +DA:7094,0 +DA:7097,0 +DA:7101,0 +DA:7103,0 +DA:7104,0 +DA:7105,0 +DA:7106,0 +DA:7107,0 +DA:7108,0 +DA:7109,0 +DA:7111,0 +DA:7112,0 +DA:7115,0 +DA:7116,0 +DA:7117,0 +DA:7118,0 +DA:7119,0 +DA:7120,0 +DA:7121,0 +DA:7122,0 +DA:7123,0 +DA:7124,0 +DA:7126,0 +DA:7130,0 +DA:7131,0 +DA:7132,0 +DA:7134,0 +DA:7135,0 +DA:7136,0 +DA:7137,0 +DA:7138,0 +DA:7139,0 +DA:7140,0 +DA:7144,0 +DA:7147,0 +DA:7148,0 +DA:7150,0 +DA:7151,0 +DA:7153,0 +DA:7155,0 +DA:7157,0 +DA:7159,0 +DA:7160,0 +DA:7164,0 +DA:7166,0 +DA:7167,0 +DA:7168,0 +DA:7172,0 +DA:7173,0 +DA:7175,0 +DA:7181,0 +DA:7182,0 +DA:7183,0 +DA:7186,0 +DA:7187,0 +DA:7188,0 +DA:7191,0 +DA:7192,0 +DA:7194,0 +DA:7195,0 +DA:7196,0 +DA:7198,0 +DA:7200,0 +DA:7201,0 +DA:7202,0 +DA:7203,0 +DA:7209,0 +DA:7213,0 +DA:7214,0 +DA:7215,0 +DA:7218,0 +DA:7225,0 +DA:7226,0 +DA:7228,0 +DA:7231,0 +DA:7232,0 +DA:7233,0 +DA:7235,0 +DA:7236,0 +DA:7238,0 +DA:7242,0 +DA:7243,0 +DA:7245,0 +DA:7246,0 +DA:7248,0 +DA:7249,0 +DA:7251,0 +DA:7252,0 +DA:7255,0 +DA:7256,0 +DA:7257,0 +DA:7260,0 +DA:7261,0 +DA:7266,0 +DA:7267,0 +DA:7268,0 +DA:7272,0 +DA:7273,0 +DA:7274,0 +DA:7275,0 +DA:7278,0 +DA:7279,0 +DA:7281,0 +DA:7282,0 +DA:7284,0 +DA:7294,0 +DA:7295,0 +DA:7297,0 +DA:7301,0 +DA:7302,0 +DA:7304,0 +DA:7305,0 +DA:7307,0 +DA:7308,0 +DA:7310,0 +DA:7313,0 +DA:7314,0 +DA:7316,0 +DA:7317,0 +DA:7319,0 +DA:7320,0 +DA:7323,0 +DA:7324,0 +DA:7326,0 +DA:7327,0 +DA:7330,0 +DA:7331,0 +DA:7332,0 +DA:7333,0 +DA:7334,0 +DA:7335,0 +DA:7336,0 +DA:7341,0 +DA:7342,0 +DA:7343,0 +DA:7344,0 +DA:7345,0 +DA:7348,0 +DA:7351,0 +DA:7352,0 +DA:7353,0 +DA:7354,0 +DA:7357,0 +DA:7383,0 +DA:7384,0 +DA:7385,0 +DA:7386,0 +DA:7387,0 +DA:7389,0 +DA:7397,0 +DA:7398,0 +DA:7399,0 +DA:7401,0 +DA:7402,0 +DA:7403,0 +DA:7404,0 +DA:7405,0 +DA:7408,0 +DA:7410,0 +DA:7411,0 +DA:7415,0 +DA:7416,0 +DA:7418,0 +DA:7419,0 +DA:7422,0 +DA:7423,0 +DA:7424,0 +DA:7428,0 +DA:7430,0 +DA:7431,0 +DA:7432,0 +DA:7433,0 +DA:7434,0 +DA:7435,0 +DA:7437,0 +DA:7438,0 +DA:7441,0 +DA:7444,0 +DA:7445,0 +DA:7447,0 +DA:7448,0 +DA:7449,0 +DA:7450,0 +DA:7451,0 +DA:7452,0 +DA:7453,0 +DA:7454,0 +DA:7455,0 +DA:7457,0 +DA:7458,0 +DA:7462,0 +DA:7463,0 +DA:7464,0 +DA:7465,0 +DA:7466,0 +DA:7467,0 +DA:7468,0 +DA:7471,0 +DA:7472,0 +DA:7477,0 +DA:7479,0 +DA:7481,0 +DA:7482,0 +DA:7484,0 +DA:7486,0 +DA:7487,0 +DA:7489,0 +DA:7490,0 +DA:7491,0 +DA:7493,0 +DA:7495,0 +DA:7496,0 +DA:7497,0 +DA:7501,0 +DA:7502,0 +DA:7504,0 +DA:7505,0 +DA:7507,0 +DA:7508,0 +DA:7509,0 +DA:7510,0 +DA:7511,0 +DA:7512,0 +DA:7514,0 +DA:7516,0 +DA:7518,0 +DA:7520,0 +DA:7522,0 +DA:7523,0 +DA:7524,0 +DA:7525,0 +DA:7526,0 +DA:7528,0 +DA:7529,0 +DA:7530,0 +DA:7531,0 +DA:7532,0 +DA:7534,0 +DA:7535,0 +DA:7536,0 +DA:7537,0 +DA:7538,0 +DA:7539,0 +DA:7540,0 +DA:7541,0 +DA:7544,0 +DA:7545,0 +DA:7548,0 +DA:7549,0 +DA:7553,0 +DA:7554,0 +DA:7560,0 +DA:7622,0 +DA:7623,0 +DA:7625,0 +DA:7626,0 +DA:7627,0 +DA:7629,0 +DA:7630,0 +DA:7631,0 +DA:7632,0 +DA:7635,0 +DA:7636,0 +DA:7637,0 +DA:7646,0 +DA:7648,0 +DA:7649,0 +DA:7650,0 +DA:7651,0 +DA:7653,0 +DA:7659,0 +DA:7660,0 +DA:7661,0 +DA:7662,0 +DA:7663,0 +DA:7664,0 +DA:7665,0 +DA:7674,0 +DA:7675,0 +DA:7676,0 +DA:7678,0 +DA:7689,0 +DA:7691,0 +DA:7692,0 +DA:7693,0 +DA:7694,0 +DA:7695,0 +DA:7696,0 +DA:7698,0 +DA:7702,0 +DA:7705,0 +DA:7707,0 +DA:7709,0 +DA:7710,0 +DA:7712,0 +DA:7713,0 +DA:7715,0 +DA:7719,0 +DA:7720,0 +DA:7721,0 +DA:7722,0 +DA:7723,0 +DA:7724,0 +DA:7726,0 +DA:7727,0 +DA:7730,0 +DA:7731,0 +DA:7732,0 +DA:7733,0 +DA:7737,0 +DA:7738,0 +DA:7739,0 +DA:7742,0 +DA:7743,0 +DA:7744,0 +DA:7749,0 +DA:7750,0 +DA:7752,0 +DA:7753,0 +DA:7754,0 +DA:7758,0 +DA:7761,0 +DA:7762,0 +DA:7763,0 +DA:7765,0 +DA:7767,0 +DA:7768,0 +DA:7769,0 +DA:7770,0 +DA:7771,0 +DA:7773,0 +DA:7778,0 +DA:7780,0 +DA:7783,0 +DA:7788,0 +DA:7790,0 +DA:7791,0 +DA:7792,0 +DA:7793,0 +DA:7794,0 +DA:7801,0 +DA:7826,0 +DA:7828,0 +DA:7830,0 +DA:7831,0 +DA:7832,0 +DA:7838,0 +DA:7839,0 +DA:7851,0 +DA:7852,0 +DA:7853,0 +DA:7854,0 +DA:7857,0 +DA:7858,0 +DA:7862,0 +DA:7863,0 +DA:7864,0 +DA:7867,0 +DA:7868,0 +DA:7869,0 +DA:7871,0 +DA:7872,0 +DA:7877,0 +DA:7879,0 +DA:7881,0 +DA:7894,0 +DA:7895,0 +DA:7897,0 +DA:7899,0 +DA:7904,0 +DA:7905,0 +DA:7907,0 +DA:7909,0 +DA:7913,0 +DA:7916,0 +DA:7919,0 +DA:7920,0 +DA:7921,0 +DA:7922,0 +DA:7923,0 +DA:7925,0 +DA:7928,0 +DA:7929,0 +DA:7931,0 +DA:7935,0 +DA:7937,0 +DA:7938,0 +DA:7940,0 +DA:7941,0 +DA:7944,0 +DA:7946,0 +DA:7947,0 +DA:7949,0 +DA:7950,0 +DA:7951,0 +DA:7952,0 +DA:7953,0 +DA:7954,0 +DA:7955,0 +DA:7959,0 +DA:7966,0 +DA:7968,0 +DA:7972,0 +DA:7973,0 +DA:7978,0 +DA:7979,0 +DA:7980,0 +DA:7984,0 +DA:7985,0 +DA:7986,0 +DA:7990,0 +DA:7991,0 +DA:7992,0 +DA:7995,0 +DA:7998,0 +DA:7999,0 +DA:8000,0 +DA:8001,0 +DA:8003,0 +DA:8004,0 +DA:8005,0 +DA:8006,0 +DA:8007,0 +DA:8010,0 +DA:8014,0 +DA:8018,0 +DA:8019,0 +DA:8023,0 +DA:8024,0 +DA:8049,0 +DA:8051,0 +DA:8052,0 +DA:8053,0 +DA:8054,0 +DA:8056,0 +DA:8059,0 +DA:8060,0 +DA:8061,0 +DA:8062,0 +DA:8063,0 +DA:8064,0 +DA:8065,0 +DA:8066,0 +DA:8067,0 +DA:8068,0 +DA:8069,0 +DA:8070,0 +DA:8077,0 +DA:8078,0 +DA:8082,0 +DA:8085,0 +DA:8088,0 +DA:8093,0 +DA:8094,0 +DA:8095,0 +DA:8096,0 +DA:8097,0 +DA:8099,0 +DA:8104,0 +DA:8109,0 +DA:8121,0 +DA:8124,0 +DA:8126,0 +DA:8127,0 +DA:8128,0 +DA:8131,0 +DA:8132,0 +DA:8133,0 +DA:8136,0 +DA:8140,0 +DA:8142,0 +DA:8143,0 +DA:8144,0 +DA:8145,0 +DA:8146,0 +DA:8147,0 +DA:8154,0 +DA:8155,0 +DA:8156,0 +DA:8157,0 +DA:8158,0 +DA:8162,0 +DA:8181,0 +DA:8182,0 +DA:8183,0 +DA:8184,0 +DA:8185,0 +DA:8191,0 +DA:8193,0 +DA:8197,0 +DA:8202,0 +DA:8203,0 +DA:8204,0 +DA:8205,0 +DA:8209,0 +DA:8210,0 +DA:8211,0 +DA:8212,0 +DA:8213,0 +DA:8216,0 +DA:8217,0 +DA:8219,0 +DA:8220,0 +DA:8223,0 +DA:8227,0 +DA:8231,0 +DA:8235,0 +DA:8236,0 +DA:8237,0 +DA:8238,0 +DA:8239,0 +DA:8240,0 +DA:8241,0 +DA:8242,0 +DA:8243,0 +DA:8247,0 +DA:8249,0 +DA:8253,0 +DA:8254,0 +DA:8255,0 +DA:8256,0 +DA:8257,0 +DA:8258,0 +DA:8259,0 +DA:8261,0 +DA:8262,0 +DA:8264,0 +DA:8265,0 +DA:8271,0 +DA:8272,0 +DA:8275,0 +DA:8278,0 +DA:8283,0 +DA:8284,0 +DA:8285,0 +DA:8286,0 +DA:8287,0 +DA:8290,0 +DA:8293,0 +DA:8294,0 +DA:8295,0 +DA:8296,0 +DA:8300,0 +DA:8301,0 +DA:8302,0 +DA:8303,0 +DA:8310,0 +DA:8315,0 +DA:8316,0 +DA:8317,0 +DA:8318,0 +DA:8319,0 +DA:8321,0 +DA:8327,0 +DA:8328,0 +DA:8330,0 +DA:8331,0 +DA:8333,0 +DA:8334,0 +DA:8335,0 +DA:8336,0 +DA:8337,0 +DA:8338,0 +DA:8340,0 +DA:8341,0 +DA:8343,0 +DA:8344,0 +DA:8346,0 +DA:8347,0 +DA:8349,0 +DA:8353,0 +DA:8354,0 +DA:8355,0 +DA:8356,0 +DA:8360,0 +DA:8361,0 +DA:8370,0 +DA:8371,0 +DA:8372,0 +DA:8375,0 +DA:8376,0 +DA:8377,0 +DA:8378,0 +DA:8379,0 +DA:8380,0 +DA:8383,0 +DA:8384,0 +DA:8385,0 +DA:8386,0 +DA:8387,0 +DA:8389,0 +DA:8390,0 +DA:8391,0 +DA:8392,0 +DA:8395,0 +DA:8396,0 +DA:8400,0 +DA:8403,0 +DA:8406,0 +DA:8408,0 +DA:8412,0 +DA:8414,0 +DA:8415,0 +DA:8416,0 +DA:8417,0 +DA:8420,0 +DA:8421,0 +DA:8423,0 +DA:8424,0 +DA:8426,0 +DA:8428,0 +DA:8432,0 +DA:8435,0 +DA:8436,0 +DA:8440,0 +DA:8441,0 +DA:8444,0 +DA:8445,0 +DA:8446,0 +DA:8447,0 +DA:8448,0 +DA:8451,0 +DA:8452,0 +DA:8453,0 +DA:8458,0 +DA:8461,0 +DA:8462,0 +DA:8463,0 +DA:8467,0 +DA:8469,0 +DA:8470,0 +DA:8471,0 +DA:8475,0 +DA:8477,0 +DA:8480,0 +DA:8481,0 +DA:8484,0 +DA:8493,0 +DA:8494,0 +DA:8495,0 +DA:8497,0 +DA:8498,0 +DA:8501,0 +DA:8502,0 +DA:8503,0 +DA:8504,0 +DA:8505,0 +DA:8506,0 +DA:8507,0 +DA:8508,0 +DA:8509,0 +DA:8511,0 +DA:8513,0 +DA:8514,0 +DA:8515,0 +DA:8516,0 +DA:8517,0 +DA:8518,0 +DA:8520,0 +DA:8521,0 +DA:8522,0 +DA:8523,0 +DA:8525,0 +DA:8526,0 +DA:8527,0 +DA:8530,0 +DA:8532,0 +DA:8535,0 +DA:8537,0 +DA:8538,0 +DA:8539,0 +DA:8540,0 +DA:8547,0 +DA:8548,0 +DA:8549,0 +DA:8550,0 +DA:8551,0 +DA:8552,0 +DA:8554,0 +DA:8555,0 +DA:8556,0 +DA:8557,0 +DA:8558,0 +DA:8559,0 +DA:8560,0 +DA:8562,0 +DA:8564,0 +DA:8567,0 +DA:8569,0 +DA:8571,0 +DA:8573,0 +DA:8574,0 +DA:8575,0 +DA:8577,0 +DA:8580,0 +DA:8581,0 +DA:8582,0 +DA:8583,0 +DA:8584,0 +DA:8585,0 +DA:8589,0 +DA:8590,0 +DA:8594,0 +DA:8596,0 +DA:8597,0 +DA:8598,0 +DA:8601,0 +DA:8602,0 +DA:8604,0 +DA:8605,0 +DA:8608,0 +DA:8609,0 +DA:8612,0 +DA:8615,0 +DA:8617,0 +DA:8618,0 +DA:8620,0 +DA:8622,0 +DA:8623,0 +DA:8629,0 +DA:8631,0 +DA:8636,0 +DA:8637,0 +DA:8638,0 +DA:8639,0 +DA:8640,0 +DA:8641,0 +DA:8642,0 +DA:8643,0 +DA:8644,0 +DA:8645,0 +DA:8646,0 +DA:8651,0 +DA:8652,0 +DA:8653,0 +DA:8657,0 +DA:8659,0 +DA:8662,0 +DA:8663,0 +DA:8666,0 +DA:8670,0 +DA:8671,0 +DA:8676,0 +DA:8678,0 +DA:8679,0 +DA:8680,0 +DA:8684,0 +DA:8686,0 +DA:8687,0 +DA:8690,0 +DA:8691,0 +DA:8692,0 +DA:8694,0 +DA:8698,0 +DA:8699,0 +DA:8702,0 +DA:8703,0 +DA:8704,0 +DA:8705,0 +DA:8708,0 +DA:8709,0 +DA:8710,0 +DA:8711,0 +DA:8712,0 +DA:8713,0 +DA:8714,0 +DA:8716,0 +DA:8718,0 +DA:8722,0 +DA:8726,0 +DA:8730,0 +DA:8733,0 +DA:8737,0 +DA:8738,0 +DA:8744,0 +DA:8766,0 +DA:8767,0 +DA:8768,0 +DA:8769,0 +DA:8770,0 +DA:8771,0 +DA:8773,0 +DA:8776,0 +DA:8777,0 +DA:8778,0 +DA:8779,0 +DA:8780,0 +DA:8781,0 +DA:8782,0 +DA:8783,0 +DA:8784,0 +DA:8786,0 +DA:8787,0 +DA:8789,0 +DA:8792,0 +DA:8795,0 +DA:8796,0 +DA:8797,0 +DA:8799,0 +DA:8802,0 +DA:8809,0 +DA:8811,0 +DA:8812,0 +DA:8813,0 +DA:8817,0 +DA:8818,0 +DA:8821,0 +DA:8823,0 +DA:8824,0 +DA:8825,0 +DA:8826,0 +DA:8827,0 +DA:8829,0 +DA:8831,0 +DA:8833,0 +DA:8836,0 +DA:8840,0 +DA:8842,0 +DA:8843,0 +DA:8844,0 +DA:8845,0 +DA:8846,0 +DA:8847,0 +DA:8848,0 +DA:8849,0 +DA:8850,0 +DA:8851,0 +DA:8854,0 +DA:8857,0 +DA:8871,0 +DA:8876,0 +DA:8877,0 +DA:8878,0 +DA:8880,0 +DA:8881,0 +DA:8883,0 +DA:8886,0 +DA:8887,0 +DA:8888,0 +DA:8889,0 +DA:8890,0 +DA:8891,0 +DA:8893,0 +DA:8897,0 +DA:8914,0 +DA:8928,0 +DA:8930,0 +DA:8931,0 +DA:8934,0 +DA:8940,0 +DA:8945,0 +DA:8947,0 +DA:8948,0 +DA:8951,0 +DA:8958,0 +DA:8965,0 +DA:8966,0 +DA:8967,0 +DA:8969,0 +DA:8973,0 +DA:8974,0 +DA:8975,0 +DA:8979,0 +DA:8980,0 +DA:8982,0 +DA:8983,0 +DA:8988,0 +DA:8990,0 +DA:8994,0 +DA:8995,0 +DA:8996,0 +DA:8997,0 +DA:8999,0 +DA:9000,0 +DA:9002,0 +DA:9003,0 +DA:9005,0 +DA:9006,0 +DA:9010,0 +DA:9013,0 +DA:9014,0 +DA:9015,0 +DA:9019,0 +DA:9020,0 +DA:9021,0 +DA:9025,0 +DA:9026,0 +DA:9030,0 +DA:9031,0 +DA:9035,0 +DA:9036,0 +DA:9039,0 +DA:9040,0 +DA:9043,0 +DA:9044,0 +DA:9045,0 +DA:9047,0 +DA:9051,0 +DA:9054,0 +DA:9055,0 +DA:9057,0 +DA:9058,0 +DA:9062,0 +DA:9064,0 +DA:9069,0 +DA:9070,0 +DA:9071,0 +DA:9072,0 +DA:9075,0 +DA:9077,0 +DA:9078,0 +DA:9079,0 +DA:9080,0 +DA:9082,0 +DA:9083,0 +DA:9088,0 +DA:9093,0 +DA:9094,0 +DA:9095,0 +DA:9096,0 +DA:9099,0 +DA:9102,0 +DA:9103,0 +DA:9104,0 +DA:9108,0 +DA:9114,0 +DA:9115,0 +DA:9116,0 +DA:9117,0 +DA:9119,0 +DA:9122,0 +DA:9123,0 +DA:9126,0 +DA:9127,0 +DA:9129,0 +DA:9130,0 +DA:9131,0 +DA:9132,0 +DA:9134,0 +DA:9136,0 +DA:9137,0 +DA:9138,0 +DA:9139,0 +DA:9142,0 +DA:9143,0 +DA:9148,0 +DA:9151,0 +DA:9152,0 +DA:9153,0 +DA:9155,0 +DA:9156,0 +DA:9157,0 +DA:9158,0 +DA:9160,0 +DA:9163,0 +DA:9167,0 +DA:9172,0 +DA:9173,0 +DA:9174,0 +DA:9175,0 +DA:9176,0 +DA:9179,0 +DA:9180,0 +DA:9188,0 +DA:9195,0 +DA:9197,0 +DA:9200,0 +DA:9202,0 +DA:9205,0 +DA:9207,0 +DA:9210,0 +DA:9212,0 +DA:9215,0 +DA:9217,0 +DA:9220,0 +DA:9222,0 +DA:9225,0 +DA:9227,0 +DA:9230,0 +DA:9232,0 +DA:9235,0 +DA:9237,0 +DA:9240,0 +DA:9242,0 +DA:9245,0 +DA:9247,0 +DA:9250,0 +DA:9253,0 +DA:9256,0 +DA:9258,0 +DA:9261,0 +DA:9268,0 +DA:9270,0 +DA:9273,0 +DA:9278,0 +DA:9282,0 +DA:9287,0 +DA:9288,0 +DA:9291,0 +DA:9296,0 +DA:9297,0 +DA:9314,0 +DA:9316,0 +DA:9318,0 +DA:9320,0 +DA:9321,0 +DA:9322,0 +DA:9323,0 +DA:9325,0 +DA:9329,0 +DA:9334,0 +DA:9336,0 +DA:9339,0 +DA:9341,0 +DA:9342,0 +DA:9344,0 +DA:9345,0 +DA:9346,0 +DA:9351,0 +DA:9356,0 +DA:9358,0 +DA:9359,0 +DA:9361,0 +DA:9368,0 +DA:9369,0 +DA:9372,0 +DA:9377,0 +DA:9378,0 +DA:9381,0 +DA:9399,0 +DA:9400,0 +DA:9403,0 +DA:9422,0 +DA:9423,0 +DA:9426,0 +DA:9429,0 +DA:9433,0 +DA:9434,0 +DA:9435,0 +DA:9436,0 +DA:9437,0 +DA:9447,0 +DA:9448,0 +DA:9450,0 +DA:9451,0 +DA:9452,0 +DA:9453,0 +DA:9458,0 +DA:9459,0 +DA:9460,0 +DA:9461,0 +DA:9462,0 +DA:9464,0 +DA:9467,0 +DA:9468,0 +DA:9469,0 +DA:9470,0 +DA:9471,0 +DA:9481,0 +DA:9482,0 +DA:9484,0 +DA:9485,0 +DA:9486,0 +DA:9487,0 +DA:9492,0 +DA:9493,0 +DA:9494,0 +DA:9495,0 +DA:9496,0 +DA:9498,0 +DA:9501,0 +DA:9502,0 +DA:9505,0 +DA:9507,0 +DA:9510,0 +DA:9511,0 +DA:9512,0 +DA:9513,0 +DA:9514,0 +DA:9524,0 +DA:9525,0 +DA:9527,0 +DA:9528,0 +DA:9529,0 +DA:9530,0 +DA:9535,0 +DA:9536,0 +DA:9537,0 +DA:9538,0 +DA:9539,0 +DA:9541,0 +DA:9544,0 +DA:9547,0 +DA:9549,0 +DA:9562,0 +DA:9563,0 +DA:9564,0 +DA:9566,0 +DA:9567,0 +DA:9569,0 +DA:9572,0 +DA:9575,0 +DA:9576,0 +DA:9579,0 +DA:9582,0 +DA:9595,0 +DA:9596,0 +DA:9598,0 +DA:9602,0 +DA:9605,0 +DA:9616,0 +DA:9617,0 +DA:9618,0 +DA:9619,0 +DA:9622,0 +DA:9625,0 +DA:9628,0 +DA:9640,0 +DA:9641,0 +DA:9648,0 +DA:9652,0 +DA:9655,0 +DA:9656,0 +DA:9657,0 +DA:9660,0 +DA:9661,0 +DA:9664,0 +DA:9674,0 +DA:9675,0 +DA:9677,0 +DA:9682,0 +DA:9685,0 +DA:9686,0 +DA:9687,0 +DA:9688,0 +DA:9694,0 +DA:9697,0 +DA:9700,0 +DA:9701,0 +DA:9704,0 +DA:9707,0 +DA:9710,0 +DA:9724,0 +DA:9725,0 +DA:9727,0 +DA:9728,0 +DA:9731,0 +DA:9734,0 +DA:9735,0 +DA:9736,0 +DA:9737,0 +DA:9738,0 +DA:9751,0 +DA:9752,0 +DA:9754,0 +DA:9756,0 +DA:9757,0 +DA:9758,0 +DA:9759,0 +DA:9761,0 +DA:9762,0 +DA:9763,0 +DA:9765,0 +DA:9766,0 +DA:9767,0 +DA:9768,0 +DA:9769,0 +DA:9774,0 +DA:9775,0 +DA:9777,0 +DA:9780,0 +DA:9783,0 +DA:9784,0 +DA:9785,0 +DA:9786,0 +DA:9789,0 +DA:9792,0 +DA:9793,0 +DA:9805,0 +DA:9806,0 +DA:9808,0 +DA:9810,0 +DA:9812,0 +DA:9813,0 +DA:9815,0 +DA:9816,0 +DA:9819,0 +DA:9822,0 +DA:9823,0 +DA:9824,0 +DA:9825,0 +DA:9836,0 +DA:9837,0 +DA:9839,0 +DA:9842,0 +DA:9845,0 +DA:9848,0 +DA:9850,0 +DA:9853,0 +DA:9855,0 +DA:9856,0 +DA:9857,0 +DA:9858,0 +DA:9859,0 +DA:9863,0 +DA:9866,0 +DA:9868,0 +DA:9870,0 +DA:9874,0 +DA:9885,0 +DA:9886,0 +DA:9891,0 +DA:9894,0 +DA:9895,0 +DA:9906,0 +DA:9907,0 +DA:9910,0 +DA:9913,0 +DA:9916,0 +DA:9919,0 +DA:9926,0 +DA:9929,0 +DA:9939,0 +DA:9940,0 +DA:9942,0 +DA:9943,0 +DA:9944,0 +DA:9947,0 +DA:9948,0 +DA:9949,0 +DA:9950,0 +DA:9952,0 +DA:9955,0 +DA:9958,0 +DA:9970,0 +DA:9973,0 +DA:9976,0 +DA:9986,0 +DA:9987,0 +DA:9990,0 +DA:10004,0 +DA:10005,0 +DA:10006,0 +DA:10009,0 +DA:10012,0 +DA:10015,0 +DA:10018,0 +DA:10021,0 +DA:10033,0 +DA:10034,0 +DA:10035,0 +DA:10036,0 +DA:10038,0 +DA:10041,0 +DA:10044,0 +DA:10047,0 +DA:10050,0 +DA:10062,0 +DA:10063,0 +DA:10066,0 +DA:10069,0 +DA:10072,0 +DA:10085,0 +DA:10086,0 +DA:10087,0 +DA:10088,0 +DA:10091,0 +DA:10095,0 +DA:10098,0 +DA:10109,0 +DA:10110,0 +DA:10115,0 +DA:10118,0 +DA:10119,0 +DA:10122,0 +DA:10123,0 +DA:10134,0 +DA:10135,0 +DA:10137,0 +DA:10138,0 +DA:10140,0 +DA:10142,0 +DA:10146,0 +DA:10157,0 +DA:10158,0 +DA:10163,0 +DA:10166,0 +DA:10169,0 +DA:10170,0 +DA:10171,0 +DA:10182,0 +DA:10185,0 +DA:10196,0 +DA:10197,0 +DA:10200,0 +DA:10203,0 +DA:10206,0 +DA:10209,0 +DA:10221,0 +DA:10222,0 +DA:10224,0 +DA:10225,0 +DA:10227,0 +DA:10228,0 +DA:10229,0 +DA:10231,0 +DA:10233,0 +DA:10234,0 +DA:10237,0 +DA:10240,0 +DA:10252,0 +DA:10253,0 +DA:10255,0 +DA:10258,0 +DA:10261,0 +DA:10273,0 +DA:10276,0 +DA:10279,0 +DA:10292,0 +DA:10293,0 +DA:10295,0 +DA:10296,0 +DA:10297,0 +DA:10299,0 +DA:10301,0 +DA:10304,0 +DA:10307,0 +DA:10308,0 +DA:10309,0 +DA:10319,0 +DA:10320,0 +DA:10327,0 +DA:10330,0 +DA:10342,0 +DA:10343,0 +DA:10344,0 +DA:10347,0 +DA:10350,0 +DA:10362,0 +DA:10365,0 +DA:10368,0 +DA:10380,0 +DA:10383,0 +DA:10386,0 +DA:10399,0 +DA:10400,0 +DA:10402,0 +DA:10403,0 +DA:10404,0 +DA:10407,0 +DA:10410,0 +DA:10413,0 +DA:10424,0 +DA:10425,0 +DA:10426,0 +DA:10428,0 +DA:10431,0 +DA:10432,0 +DA:10435,0 +DA:10438,0 +DA:10441,0 +DA:10443,0 +DA:10447,0 +DA:10454,0 +DA:10464,0 +DA:10467,0 +DA:10470,0 +DA:10473,0 +DA:10476,0 +DA:10478,0 +DA:10481,0 +DA:10484,0 +DA:10485,0 +DA:10488,0 +DA:10497,0 +DA:10498,0 +DA:10499,0 +DA:10500,0 +DA:10502,0 +DA:10503,0 +DA:10505,0 +DA:10508,0 +DA:10511,0 +DA:10514,0 +DA:10524,0 +DA:10525,0 +DA:10527,0 +DA:10528,0 +DA:10531,0 +DA:10535,0 +DA:10538,0 +DA:10548,0 +DA:10549,0 +DA:10550,0 +DA:10552,0 +DA:10553,0 +DA:10556,0 +DA:10559,0 +DA:10595,0 +DA:10598,0 +DA:10624,0 +DA:10626,0 +DA:10629,0 +DA:10630,0 +DA:10633,0 +DA:10634,0 +DA:10635,0 +DA:10636,0 +DA:10656,0 +DA:10657,0 +DA:10661,0 +DA:10662,0 +DA:10665,0 +DA:10694,0 +DA:10695,0 +DA:10698,0 +DA:10726,0 +DA:10729,0 +DA:10732,0 +DA:10733,0 +DA:10736,0 +DA:10756,0 +DA:10760,0 +DA:10763,0 +DA:10772,0 +DA:10778,0 +DA:10781,0 +DA:10784,0 +DA:10785,0 +DA:10788,0 +DA:10791,0 +DA:10794,0 +DA:10797,0 +DA:10798,0 +DA:10799,0 +DA:10802,0 +DA:10803,0 +DA:10806,0 +DA:10807,0 +DA:10808,0 +DA:10809,0 +DA:10810,0 +DA:10811,0 +DA:10812,0 +DA:10813,0 +DA:10814,0 +DA:10815,0 +DA:10818,0 +DA:10819,0 +DA:10822,0 +DA:10823,0 +DA:10826,0 +DA:10827,0 +DA:10828,0 +DA:10831,0 +DA:10832,0 +DA:10833,0 +DA:10834,0 +DA:10837,0 +DA:10838,0 +DA:10839,0 +DA:10842,0 +DA:10855,0 +DA:10856,0 +DA:10857,0 +DA:10858,0 +DA:10859,0 +DA:10860,0 +DA:10861,0 +DA:10862,0 +DA:10863,0 +DA:10864,0 +DA:10865,0 +DA:10866,0 +DA:10867,0 +DA:10868,0 +DA:10869,0 +DA:10870,0 +DA:10871,0 +DA:10872,0 +DA:10873,0 +DA:10874,0 +DA:10875,0 +DA:10876,0 +DA:10878,0 +DA:10879,0 +DA:10880,0 +DA:10881,0 +DA:10882,0 +DA:10883,0 +DA:10884,0 +DA:10885,0 +DA:10886,0 +DA:10887,0 +DA:10888,0 +DA:10891,0 +DA:10892,0 +DA:10893,0 +DA:10896,0 +DA:10897,0 +DA:10898,0 +DA:10899,0 +DA:10902,0 +DA:10903,0 +DA:10904,0 +DA:10907,0 +DA:10908,0 +DA:10909,0 +DA:10910,0 +DA:10916,0 +DA:10917,0 +DA:10920,0 +DA:10921,0 +DA:10922,0 +DA:10925,0 +DA:10926,0 +DA:10927,0 +DA:10930,0 +DA:10933,0 +DA:10939,0 +DA:10942,0 +DA:10945,0 +DA:10948,0 +DA:10951,0 +DA:10954,0 +DA:10957,0 +DA:10960,0 +DA:10963,0 +DA:10966,0 +DA:10969,0 +DA:10970,0 +DA:10971,0 +DA:10972,0 +DA:10973,0 +DA:10974,0 +DA:10975,0 +DA:10976,0 +DA:10977,0 +DA:10978,0 +DA:10979,0 +DA:10980,0 +DA:10981,0 +DA:10982,0 +DA:10985,0 +DA:10986,0 +DA:10987,0 +DA:10988,0 +DA:10989,0 +DA:10990,0 +DA:10991,0 +DA:10992,0 +DA:10993,0 +DA:10994,0 +DA:10995,0 +DA:10996,0 +DA:10997,0 +DA:10998,0 +DA:10999,0 +DA:11002,0 +DA:11003,0 +DA:11004,0 +DA:11005,0 +DA:11006,0 +DA:11007,0 +DA:11008,0 +DA:11009,0 +DA:11010,0 +DA:11011,0 +DA:11012,0 +DA:11013,0 +DA:11016,0 +DA:11022,0 +DA:11025,0 +DA:11028,0 +DA:11040,0 +DA:11043,0 +DA:11046,0 +DA:11055,0 +DA:11058,0 +DA:11059,0 +DA:11064,0 +DA:11074,0 +DA:11075,0 +DA:11086,0 +DA:11090,0 +DA:11148,0 +DA:11157,0 +DA:11166,0 +DA:11176,0 +DA:11177,0 +DA:11180,0 +DA:11183,0 +DA:11186,0 +DA:11189,0 +DA:11192,0 +DA:11195,0 +DA:11198,0 +DA:11201,0 +DA:11202,0 +DA:11203,0 +DA:11208,0 +DA:11209,0 +DA:11210,0 +DA:11211,0 +DA:11212,0 +DA:11213,0 +DA:11227,0 +DA:11228,0 +DA:11241,0 +DA:11242,0 +DA:11256,0 +DA:11257,0 +DA:11258,0 +DA:11259,0 +DA:11260,0 +DA:11262,0 +DA:11276,0 +DA:11277,0 +DA:11279,0 +DA:11280,0 +DA:11281,0 +DA:11283,0 +DA:11296,0 +DA:11297,0 +DA:11299,0 +DA:11300,0 +DA:11301,0 +DA:11304,0 +DA:11317,0 +DA:11319,0 +DA:11320,0 +DA:11321,0 +DA:11324,0 +DA:11338,0 +DA:11339,0 +DA:11341,0 +DA:11342,0 +DA:11343,0 +DA:11346,0 +DA:11359,0 +DA:11360,0 +DA:11361,0 +DA:11362,0 +DA:11364,0 +DA:11365,0 +DA:11366,0 +DA:11367,0 +DA:11370,0 +DA:11383,0 +DA:11384,0 +DA:11397,0 +DA:11398,0 +DA:11400,0 +DA:11401,0 +DA:11402,0 +DA:11405,0 +DA:11418,0 +DA:11419,0 +DA:11420,0 +DA:11422,0 +DA:11423,0 +DA:11425,0 +DA:11437,0 +DA:11438,0 +DA:11439,0 +DA:11441,0 +DA:11442,0 +DA:11444,0 +DA:11460,0 +DA:11461,0 +DA:11463,0 +DA:11464,0 +DA:11466,0 +DA:11467,0 +DA:11469,0 +DA:11485,0 +DA:11486,0 +DA:11487,0 +DA:11489,0 +DA:11490,0 +DA:11492,0 +DA:11506,0 +DA:11507,0 +DA:11509,0 +DA:11510,0 +DA:11511,0 +DA:11514,0 +DA:11524,0 +DA:11534,0 +DA:11545,0 +DA:11561,0 +DA:11562,0 +DA:11563,0 +DA:11564,0 +DA:11567,0 +DA:11582,0 +DA:11583,0 +DA:11585,0 +DA:11586,0 +DA:11587,0 +DA:11590,0 +DA:11603,0 +DA:11619,0 +DA:11620,0 +DA:11622,0 +DA:11623,0 +DA:11624,0 +DA:11627,0 +DA:11638,0 +DA:11651,0 +DA:11652,0 +DA:11663,0 +DA:11664,0 +DA:11676,0 +DA:11677,0 +DA:11695,0 +DA:11696,0 +DA:11700,0 +DA:11714,0 +DA:11716,0 +DA:11717,0 +DA:11718,0 +DA:11720,0 +DA:11734,0 +DA:11735,0 +DA:11737,0 +DA:11738,0 +DA:11739,0 +DA:11740,0 +DA:11743,0 +DA:11756,0 +DA:11757,0 +DA:11759,0 +DA:11760,0 +DA:11762,0 +DA:11775,0 +DA:11776,0 +DA:11788,0 +DA:11789,0 +DA:11804,0 +DA:11805,0 +DA:11818,0 +DA:11831,0 +DA:11832,0 +DA:11834,0 +DA:11835,0 +DA:11848,0 +DA:11850,0 +DA:11851,0 +DA:11863,0 +DA:11864,0 +DA:11866,0 +DA:11867,0 +DA:11868,0 +DA:11871,0 +DA:11882,0 +DA:11891,0 +DA:11901,0 +DA:11913,0 +DA:11924,0 +DA:11935,0 +DA:11947,0 +DA:11949,0 +DA:11950,0 +DA:11952,0 +DA:11963,0 +DA:11964,0 +DA:11966,0 +DA:11967,0 +DA:11969,0 +DA:11981,0 +DA:11982,0 +DA:11996,0 +DA:11997,0 +DA:11998,0 +DA:11999,0 +DA:12001,0 +DA:12002,0 +DA:12003,0 +DA:12004,0 +DA:12005,0 +DA:12008,0 +DA:12019,0 +DA:12020,0 +DA:12022,0 +DA:12023,0 +DA:12025,0 +DA:12036,0 +DA:12037,0 +DA:12039,0 +DA:12040,0 +DA:12042,0 +DA:12056,0 +DA:12057,0 +DA:12059,0 +DA:12060,0 +DA:12061,0 +DA:12064,0 +DA:12078,0 +DA:12079,0 +DA:12080,0 +DA:12081,0 +DA:12084,0 +DA:12095,0 +DA:12108,0 +DA:12120,0 +DA:12130,0 +DA:12131,0 +DA:12132,0 +DA:12134,0 +DA:12145,0 +DA:12156,0 +DA:12190,0 +DA:12191,0 +DA:12194,0 +DA:12195,0 +DA:12196,0 +DA:12197,0 +DA:12198,0 +DA:12199,0 +DA:12200,0 +DA:12201,0 +DA:12202,0 +DA:12205,0 +DA:12206,0 +DA:12207,0 +DA:12210,0 +DA:12213,0 +DA:12216,0 +DA:12219,0 +DA:12222,0 +DA:12223,0 +DA:12224,0 +DA:12232,0 +DA:12235,0 +DA:12238,0 +DA:12241,0 +DA:12247,0 +DA:12248,0 +DA:12249,0 +DA:12250,0 +DA:12251,0 +DA:12252,0 +DA:12253,0 +DA:12254,0 +DA:12255,0 +DA:12256,0 +DA:12257,0 +DA:12259,0 +DA:12260,0 +DA:12261,0 +DA:12262,0 +DA:12263,0 +DA:12268,0 +DA:12269,0 +DA:12270,0 +DA:12273,0 +DA:12274,0 +DA:12275,0 +DA:12276,0 +DA:12277,0 +DA:12278,0 +DA:12279,0 +DA:12280,0 +DA:12281,0 +DA:12282,0 +DA:12283,0 +DA:12284,0 +DA:12285,0 +DA:12288,0 +DA:12289,0 +DA:12290,0 +DA:12291,0 +DA:12292,0 +DA:12293,0 +DA:12296,0 +DA:12299,0 +DA:12302,0 +DA:12303,0 +DA:12304,0 +DA:12305,0 +DA:12306,0 +DA:12309,0 +DA:12310,0 +DA:12311,0 +DA:12433,0 +DA:12434,0 +DA:12435,0 +DA:12437,0 +DA:12438,0 +DA:12441,0 +DA:12452,0 +DA:12454,0 +DA:12455,0 +DA:12456,0 +DA:12458,0 +DA:12459,0 +DA:12461,0 +DA:12462,0 +DA:12463,0 +DA:12464,0 +DA:12485,0 +DA:12486,0 +DA:12487,0 +DA:12488,0 +DA:12489,0 +DA:12501,0 +DA:12554,0 +DA:12555,0 +DA:12557,0 +DA:12558,0 +DA:12570,0 +DA:12571,0 +DA:12572,0 +DA:12573,0 +DA:12574,0 +DA:12575,0 +DA:12576,0 +DA:12588,0 +DA:12589,0 +DA:12590,0 +DA:12591,0 +DA:12592,0 +DA:12593,0 +DA:12594,0 +DA:12595,0 +DA:12607,0 +DA:12608,0 +DA:12609,0 +DA:12610,0 +DA:12612,0 +DA:12613,0 +DA:12615,0 +DA:12627,0 +DA:12628,0 +DA:12629,0 +DA:12630,0 +DA:12631,0 +DA:12632,0 +DA:12633,0 +DA:12634,0 +DA:12635,0 +DA:12636,0 +DA:12637,0 +DA:12638,0 +DA:12639,0 +DA:12640,0 +DA:12642,0 +DA:12643,0 +DA:12645,0 +DA:12647,0 +DA:12648,0 +DA:12649,0 +DA:12651,0 +DA:12652,0 +DA:12654,0 +DA:12655,0 +DA:12656,0 +DA:12657,0 +DA:12658,0 +DA:12660,0 +DA:12661,0 +DA:12662,0 +DA:12663,0 +DA:12664,0 +DA:12666,0 +DA:12670,0 +DA:12672,0 +DA:12676,0 +DA:12677,0 +DA:12689,0 +DA:12690,0 +DA:12692,0 +DA:12693,0 +DA:12694,0 +DA:12695,0 +DA:12707,0 +DA:12708,0 +DA:12722,0 +DA:12723,0 +DA:12724,0 +DA:12737,0 +DA:12738,0 +DA:12739,0 +DA:12740,0 +DA:12742,0 +DA:12755,0 +DA:12756,0 +DA:12770,0 +DA:12771,0 +DA:12772,0 +DA:12773,0 +DA:12777,0 +DA:12778,0 +DA:12779,0 +DA:12780,0 +DA:12781,0 +DA:12793,0 +DA:12794,0 +DA:12796,0 +DA:12797,0 +DA:12798,0 +DA:12799,0 +DA:12811,0 +DA:12812,0 +DA:12825,0 +DA:12826,0 +DA:12828,0 +DA:12829,0 +DA:12831,0 +DA:12832,0 +DA:12833,0 +DA:12835,0 +DA:12837,0 +DA:12838,0 +DA:12851,0 +DA:12852,0 +DA:12854,0 +DA:12867,0 +DA:12881,0 +DA:12882,0 +DA:12884,0 +DA:12885,0 +DA:12886,0 +DA:12888,0 +DA:12890,0 +DA:12894,0 +DA:12895,0 +DA:12896,0 +DA:12897,0 +DA:12898,0 +DA:12910,0 +DA:12911,0 +DA:12913,0 +DA:12914,0 +DA:12915,0 +DA:12916,0 +DA:12928,0 +DA:12929,0 +DA:12946,0 +DA:12947,0 +DA:12948,0 +DA:12961,0 +DA:12974,0 +DA:12988,0 +DA:12989,0 +DA:12991,0 +DA:12992,0 +DA:12993,0 +DA:12997,0 +DA:12998,0 +DA:12999,0 +DA:13000,0 +DA:13001,0 +DA:13014,0 +DA:13015,0 +DA:13017,0 +DA:13018,0 +DA:13019,0 +DA:13034,0 +DA:13035,0 +DA:13048,0 +DA:13052,0 +DA:13053,0 +DA:13065,0 +DA:13066,0 +DA:13077,0 +DA:13078,0 +DA:13091,0 +DA:13092,0 +DA:13094,0 +DA:13095,0 +DA:13108,0 +DA:13121,0 +DA:13135,0 +DA:13136,0 +DA:13137,0 +DA:13138,0 +DA:13139,0 +DA:13140,0 +DA:13141,0 +DA:13143,0 +DA:13145,0 +DA:13146,0 +DA:13147,0 +DA:13151,0 +DA:13152,0 +DA:13153,0 +DA:13154,0 +DA:13155,0 +DA:13168,0 +DA:13169,0 +DA:13170,0 +DA:13171,0 +DA:13172,0 +DA:13173,0 +DA:13174,0 +DA:13176,0 +DA:13177,0 +DA:13188,0 +DA:13191,0 +DA:13202,0 +DA:13203,0 +DA:13215,0 +DA:13226,0 +DA:13239,0 +DA:13241,0 +DA:13256,0 +DA:13257,0 +DA:13259,0 +DA:13272,0 +DA:13273,0 +DA:13274,0 +DA:13275,0 +DA:13278,0 +DA:13293,0 +DA:13294,0 +DA:13296,0 +DA:13309,0 +DA:13322,0 +DA:13335,0 +DA:13336,0 +DA:13343,0 +DA:13356,0 +DA:13357,0 +DA:13358,0 +DA:13359,0 +DA:13361,0 +DA:13362,0 +DA:13364,0 +DA:13377,0 +DA:13378,0 +DA:13379,0 +DA:13381,0 +DA:13382,0 +DA:13385,0 +DA:13406,0 +DA:13407,0 +DA:13408,0 +DA:13410,0 +DA:13411,0 +DA:13413,0 +DA:13414,0 +DA:13416,0 +DA:13417,0 +DA:13419,0 +DA:13420,0 +DA:13421,0 +DA:13422,0 +DA:13423,0 +DA:13426,0 +DA:13427,0 +DA:13429,0 +DA:13430,0 +DA:13432,0 +DA:13433,0 +DA:13434,0 +DA:13435,0 +DA:13440,0 +DA:13441,0 +DA:13443,0 +DA:13447,0 +DA:13448,0 +DA:13449,0 +DA:13450,0 +DA:13452,0 +DA:13454,0 +DA:13458,0 +DA:13459,0 +DA:13460,0 +DA:13461,0 +DA:13462,0 +DA:13465,0 +DA:13467,0 +DA:13478,0 +DA:13479,0 +DA:13480,0 +DA:13493,0 +DA:13494,0 +DA:13495,0 +DA:13497,0 +DA:13498,0 +DA:13499,0 +DA:13500,0 +DA:13501,0 +DA:13503,0 +DA:13504,0 +DA:13507,0 +DA:13521,0 +DA:13522,0 +DA:13524,0 +DA:13539,0 +DA:13540,0 +DA:13541,0 +DA:13542,0 +DA:13543,0 +DA:13544,0 +DA:13546,0 +DA:13547,0 +DA:13549,0 +DA:13550,0 +DA:13552,0 +DA:13553,0 +DA:13554,0 +DA:13556,0 +DA:13557,0 +DA:13558,0 +DA:13559,0 +DA:13561,0 +DA:13562,0 +DA:13563,0 +DA:13564,0 +DA:13566,0 +DA:13567,0 +DA:13568,0 +DA:13569,0 +DA:13570,0 +DA:13571,0 +DA:13574,0 +DA:13576,0 +DA:13577,0 +DA:13580,0 +DA:13591,0 +DA:13601,0 +DA:13613,0 +DA:13614,0 +DA:13615,0 +DA:13616,0 +DA:13618,0 +DA:13632,0 +DA:13633,0 +DA:13635,0 +DA:13636,0 +DA:13637,0 +DA:13639,0 +DA:13643,0 +DA:13644,0 +DA:13647,0 +DA:13661,0 +DA:13663,0 +DA:13664,0 +DA:13665,0 +DA:13667,0 +DA:13668,0 +DA:13669,0 +DA:13671,0 +DA:13672,0 +DA:13673,0 +DA:13675,0 +DA:13687,0 +DA:13688,0 +DA:13689,0 +DA:13690,0 +DA:13693,0 +DA:13708,0 +DA:13709,0 +DA:13711,0 +DA:13712,0 +DA:13714,0 +DA:13715,0 +DA:13716,0 +DA:13717,0 +DA:13719,0 +DA:13721,0 +DA:13723,0 +DA:13724,0 +DA:13727,0 +DA:13741,0 +DA:13753,0 +DA:13764,0 +DA:13776,0 +DA:13789,0 +DA:13790,0 +DA:13803,0 +DA:13805,0 +DA:13806,0 +DA:13808,0 +DA:13809,0 +DA:13811,0 +DA:13826,0 +DA:13827,0 +DA:13838,0 +DA:13839,0 +DA:13841,0 +DA:13856,0 +DA:13868,0 +DA:13880,0 +DA:13893,0 +DA:13907,0 +DA:13908,0 +DA:13909,0 +DA:13910,0 +DA:13911,0 +DA:13912,0 +DA:13913,0 +DA:13915,0 +DA:13916,0 +DA:13917,0 +DA:13918,0 +DA:13920,0 +DA:13921,0 +DA:13925,0 +DA:13927,0 +DA:13928,0 +DA:13930,0 +DA:13931,0 +DA:13932,0 +DA:13933,0 +DA:13935,0 +DA:13936,0 +DA:13940,0 +DA:13941,0 +DA:13942,0 +DA:13943,0 +DA:13947,0 +DA:13950,0 +DA:13951,0 +DA:13953,0 +DA:13956,0 +DA:13971,0 +DA:13972,0 +DA:13974,0 +DA:13988,0 +DA:13989,0 +DA:13990,0 +DA:13991,0 +DA:14002,0 +DA:14013,0 +DA:14024,0 +DA:14042,0 +DA:14043,0 +DA:14045,0 +DA:14046,0 +DA:14048,0 +DA:14066,0 +DA:14067,0 +DA:14068,0 +DA:14069,0 +DA:14071,0 +DA:14072,0 +DA:14074,0 +DA:14075,0 +DA:14076,0 +DA:14078,0 +DA:14079,0 +DA:14080,0 +DA:14082,0 +DA:14083,0 +DA:14085,0 +DA:14086,0 +DA:14087,0 +DA:14091,0 +DA:14092,0 +DA:14093,0 +DA:14095,0 +DA:14096,0 +DA:14097,0 +DA:14099,0 +DA:14100,0 +DA:14103,0 +DA:14104,0 +DA:14106,0 +DA:14107,0 +DA:14118,0 +DA:14132,0 +DA:14133,0 +DA:14134,0 +DA:14136,0 +DA:14137,0 +DA:14139,0 +DA:14140,0 +DA:14141,0 +DA:14142,0 +DA:14146,0 +DA:14149,0 +DA:14150,0 +DA:14151,0 +DA:14152,0 +DA:14153,0 +DA:14155,0 +DA:14156,0 +DA:14157,0 +DA:14160,0 +DA:14161,0 +DA:14162,0 +DA:14164,0 +DA:14168,0 +DA:14172,0 +DA:14184,0 +DA:14185,0 +DA:14187,0 +DA:14188,0 +DA:14199,0 +DA:14210,0 +DA:14221,0 +DA:14235,0 +DA:14236,0 +DA:14238,0 +DA:14239,0 +DA:14241,0 +DA:14242,0 +DA:14246,0 +DA:14257,0 +DA:14258,0 +DA:14260,0 +DA:14261,0 +DA:14262,0 +DA:14263,0 +DA:14266,0 +DA:14277,0 +DA:14278,0 +DA:14280,0 +DA:14281,0 +DA:14283,0 +DA:14284,0 +DA:14285,0 +DA:14288,0 +DA:14301,0 +DA:14313,0 +DA:14314,0 +DA:14316,0 +DA:14317,0 +DA:14319,0 +DA:14330,0 +DA:14331,0 +DA:14332,0 +DA:14334,0 +DA:14335,0 +DA:14348,0 +DA:14349,0 +DA:14351,0 +DA:14352,0 +DA:14353,0 +DA:14371,0 +DA:14372,0 +DA:14374,0 +DA:14375,0 +DA:14376,0 +DA:14377,0 +DA:14380,0 +DA:14384,0 +DA:14385,0 +DA:14387,0 +DA:14408,0 +DA:14409,0 +DA:14410,0 +DA:14412,0 +DA:14413,0 +DA:14414,0 +DA:14416,0 +DA:14420,0 +DA:14422,0 +DA:14423,0 +DA:14424,0 +DA:14425,0 +DA:14427,0 +DA:14428,0 +DA:14429,0 +DA:14430,0 +DA:14432,0 +DA:14433,0 +DA:14435,0 +DA:14436,0 +DA:14437,0 +DA:14439,0 +DA:14440,0 +DA:14441,0 +DA:14444,0 +DA:14447,0 +DA:14448,0 +DA:14449,0 +DA:14450,0 +DA:14452,0 +DA:14453,0 +DA:14457,0 +DA:14460,0 +DA:14462,0 +DA:14463,0 +DA:14464,0 +DA:14466,0 +DA:14478,0 +DA:14479,0 +DA:14480,0 +DA:14482,0 +DA:14483,0 +DA:14496,0 +DA:14497,0 +DA:14499,0 +DA:14500,0 +DA:14501,0 +DA:14503,0 +DA:14506,0 +DA:14507,0 +DA:14521,0 +DA:14522,0 +DA:14536,0 +DA:14537,0 +DA:14538,0 +DA:14540,0 +DA:14541,0 +DA:14542,0 +DA:14544,0 +DA:14545,0 +DA:14548,0 +DA:14559,0 +DA:14560,0 +DA:14576,0 +DA:14577,0 +DA:14578,0 +DA:14579,0 +DA:14581,0 +DA:14582,0 +DA:14584,0 +DA:14585,0 +DA:14587,0 +DA:14588,0 +DA:14589,0 +DA:14590,0 +DA:14592,0 +DA:14593,0 +DA:14594,0 +DA:14596,0 +DA:14599,0 +DA:14612,0 +DA:14613,0 +DA:14615,0 +DA:14616,0 +DA:14617,0 +DA:14618,0 +DA:14619,0 +DA:14620,0 +DA:14622,0 +DA:14626,0 +DA:14639,0 +DA:14654,0 +DA:14655,0 +DA:14656,0 +DA:14658,0 +DA:14659,0 +DA:14660,0 +DA:14662,0 +DA:14674,0 +DA:14675,0 +DA:14676,0 +DA:14680,0 +DA:14681,0 +DA:14682,0 +DA:14684,0 +DA:14685,0 +DA:14686,0 +DA:14690,0 +DA:14702,0 +DA:14713,0 +DA:14725,0 +DA:14726,0 +DA:14740,0 +DA:14741,0 +DA:14743,0 +DA:14745,0 +DA:14746,0 +DA:14747,0 +DA:14748,0 +DA:14750,0 +DA:14751,0 +DA:14752,0 +DA:14754,0 +DA:14755,0 +DA:14756,0 +DA:14757,0 +DA:14758,0 +DA:14763,0 +DA:14764,0 +DA:14766,0 +DA:14777,0 +DA:14778,0 +DA:14779,0 +DA:14790,0 +DA:14791,0 +DA:14807,0 +DA:14820,0 +DA:14821,0 +DA:14823,0 +DA:14824,0 +DA:14826,0 +DA:14827,0 +DA:14828,0 +DA:14830,0 +DA:14831,0 +DA:14833,0 +DA:14834,0 +DA:14835,0 +DA:14837,0 +DA:14852,0 +DA:14853,0 +DA:14854,0 +DA:14856,0 +DA:14872,0 +DA:14873,0 +DA:14875,0 +DA:14876,0 +DA:14877,0 +DA:14878,0 +DA:14880,0 +DA:14882,0 +DA:14884,0 +DA:14887,0 +DA:14889,0 +DA:14906,0 +DA:14908,0 +DA:14909,0 +DA:14910,0 +DA:14911,0 +DA:14912,0 +DA:14913,0 +DA:14915,0 +DA:14916,0 +DA:14917,0 +DA:14918,0 +DA:14919,0 +DA:14920,0 +DA:14921,0 +DA:14923,0 +DA:14924,0 +DA:14925,0 +DA:14926,0 +DA:14927,0 +DA:14928,0 +DA:14929,0 +DA:14930,0 +DA:14931,0 +DA:14932,0 +DA:14934,0 +DA:14936,0 +DA:14937,0 +DA:14939,0 +DA:14942,0 +DA:14955,0 +DA:14956,0 +DA:14957,0 +DA:14958,0 +DA:14960,0 +DA:14961,0 +DA:14962,0 +DA:14964,0 +DA:14965,0 +DA:14966,0 +DA:14969,0 +DA:14981,0 +DA:14982,0 +DA:14984,0 +DA:14985,0 +DA:14987,0 +DA:15000,0 +DA:15001,0 +DA:15003,0 +DA:15005,0 +DA:15007,0 +DA:15008,0 +DA:15010,0 +DA:15011,0 +DA:15024,0 +DA:15025,0 +DA:15026,0 +DA:15027,0 +DA:15028,0 +DA:15029,0 +DA:15031,0 +DA:15032,0 +DA:15033,0 +DA:15035,0 +DA:15036,0 +DA:15037,0 +DA:15038,0 +DA:15040,0 +DA:15041,0 +DA:15042,0 +DA:15045,0 +DA:15047,0 +DA:15048,0 +DA:15049,0 +DA:15050,0 +DA:15052,0 +DA:15053,0 +DA:15054,0 +DA:15055,0 +DA:15056,0 +DA:15057,0 +DA:15060,0 +DA:15061,0 +DA:15063,0 +DA:15065,0 +DA:15066,0 +DA:15067,0 +DA:15069,0 +DA:15072,0 +DA:15084,0 +DA:15085,0 +DA:15086,0 +DA:15100,0 +DA:15115,0 +DA:15116,0 +DA:15118,0 +DA:15121,0 +DA:15137,0 +DA:15138,0 +DA:15139,0 +DA:15141,0 +DA:15142,0 +DA:15157,0 +DA:15158,0 +DA:15159,0 +DA:15161,0 +DA:15162,0 +DA:15164,0 +DA:15165,0 +DA:15166,0 +DA:15168,0 +DA:15169,0 +DA:15170,0 +DA:15174,0 +DA:15187,0 +DA:15188,0 +DA:15189,0 +DA:15190,0 +DA:15192,0 +DA:15193,0 +DA:15194,0 +DA:15196,0 +DA:15207,0 +DA:15218,0 +DA:15230,0 +DA:15231,0 +DA:15233,0 +DA:15245,0 +DA:15257,0 +DA:15258,0 +DA:15259,0 +DA:15268,0 +DA:15269,0 +DA:15281,0 +DA:15282,0 +DA:15284,0 +DA:15285,0 +DA:15287,0 +DA:15288,0 +DA:15299,0 +DA:15300,0 +DA:15301,0 +DA:15313,0 +DA:15314,0 +DA:15327,0 +DA:15328,0 +DA:15339,0 +DA:15340,0 +DA:15341,0 +DA:15354,0 +DA:15355,0 +DA:15366,0 +DA:15378,0 +DA:15379,0 +DA:15391,0 +DA:15392,0 +DA:15393,0 +DA:15394,0 +DA:15395,0 +DA:15397,0 +DA:15398,0 +DA:15399,0 +DA:15400,0 +DA:15402,0 +DA:15407,0 +DA:15409,0 +DA:15414,0 +DA:15417,0 +DA:15435,0 +DA:15436,0 +DA:15437,0 +DA:15438,0 +DA:15439,0 +DA:15441,0 +DA:15442,0 +DA:15443,0 +DA:15444,0 +DA:15445,0 +DA:15447,0 +DA:15448,0 +DA:15458,0 +DA:15473,0 +DA:15474,0 +DA:15475,0 +DA:15476,0 +DA:15477,0 +DA:15478,0 +DA:15479,0 +DA:15480,0 +DA:15482,0 +DA:15483,0 +DA:15485,0 +DA:15486,0 +DA:15487,0 +DA:15490,0 +DA:15491,0 +DA:15493,0 +DA:15508,0 +DA:15509,0 +DA:15510,0 +DA:15511,0 +DA:15512,0 +DA:15513,0 +DA:15514,0 +DA:15515,0 +DA:15516,0 +DA:15518,0 +DA:15519,0 +DA:15521,0 +DA:15522,0 +DA:15523,0 +DA:15525,0 +DA:15526,0 +DA:15527,0 +DA:15530,0 +DA:15542,0 +DA:15543,0 +DA:15545,0 +DA:15546,0 +DA:15547,0 +DA:15549,0 +DA:15563,0 +DA:15564,0 +DA:15566,0 +DA:15567,0 +DA:15569,0 +DA:15570,0 +DA:15572,0 +DA:15576,0 +DA:15577,0 +DA:15579,0 +DA:15580,0 +DA:15582,0 +DA:15585,0 +DA:15597,0 +DA:15609,0 +DA:15621,0 +DA:15622,0 +DA:15623,0 +DA:15625,0 +DA:15637,0 +DA:15638,0 +DA:15639,0 +DA:15640,0 +DA:15641,0 +DA:15643,0 +DA:15647,0 +DA:15648,0 +DA:15649,0 +DA:15651,0 +DA:15652,0 +DA:15653,0 +DA:15654,0 +DA:15655,0 +DA:15658,0 +DA:15671,0 +DA:15672,0 +DA:15673,0 +DA:15675,0 +DA:15676,0 +DA:15678,0 +DA:15679,0 +DA:15680,0 +DA:15682,0 +DA:15683,0 +DA:15684,0 +DA:15687,0 +DA:15699,0 +DA:15700,0 +DA:15701,0 +DA:15702,0 +DA:15703,0 +DA:15705,0 +DA:15706,0 +DA:15707,0 +DA:15708,0 +DA:15711,0 +DA:15726,0 +DA:15727,0 +DA:15730,0 +DA:15731,0 +DA:15733,0 +DA:15744,0 +DA:15745,0 +DA:15747,0 +DA:15751,0 +DA:15755,0 +DA:15759,0 +DA:15771,0 +DA:15772,0 +DA:15785,0 +DA:15789,0 +DA:15790,0 +DA:15791,0 +DA:15792,0 +DA:15793,0 +DA:15794,0 +DA:15795,0 +DA:15796,0 +DA:15797,0 +DA:15798,0 +DA:15800,0 +DA:15801,0 +DA:15805,0 +DA:15819,0 +DA:15822,0 +DA:15823,0 +DA:15824,0 +DA:15825,0 +DA:15827,0 +DA:15828,0 +DA:15830,0 +DA:15834,0 +DA:15835,0 +DA:15836,0 +DA:15840,0 +DA:15841,0 +DA:15843,0 +DA:15854,0 +DA:15855,0 +DA:15856,0 +DA:15857,0 +DA:15858,0 +DA:15859,0 +DA:15861,0 +DA:15862,0 +DA:15874,0 +DA:15875,0 +DA:15876,0 +DA:15877,0 +DA:15879,0 +DA:15880,0 +DA:15882,0 +DA:15883,0 +DA:15884,0 +DA:15885,0 +DA:15887,0 +DA:15888,0 +DA:15891,0 +DA:15892,0 +DA:15893,0 +DA:15895,0 +DA:15896,0 +DA:15898,0 +DA:15902,0 +DA:15904,0 +DA:15909,0 +DA:15910,0 +DA:15911,0 +DA:15913,0 +DA:15914,0 +DA:15916,0 +DA:15917,0 +DA:15919,0 +DA:15920,0 +DA:15922,0 +DA:15947,0 +DA:15948,0 +DA:15949,0 +DA:15950,0 +DA:15951,0 +DA:15952,0 +DA:15955,0 +DA:15956,0 +DA:15957,0 +DA:15959,0 +DA:15960,0 +DA:15962,0 +DA:15963,0 +DA:15964,0 +DA:15966,0 +DA:15967,0 +DA:15969,0 +DA:15970,0 +DA:15972,0 +DA:15973,0 +DA:15974,0 +DA:15975,0 +DA:15980,0 +DA:15981,0 +DA:15983,0 +DA:15984,0 +DA:15985,0 +DA:15986,0 +DA:15987,0 +DA:15989,0 +DA:15990,0 +DA:15992,0 +DA:15993,0 +DA:15995,0 +DA:15997,0 +DA:16009,0 +DA:16010,0 +DA:16023,0 +DA:16025,0 +DA:16026,0 +DA:16028,0 +DA:16029,0 +DA:16031,0 +DA:16032,0 +DA:16033,0 +DA:16035,0 +DA:16036,0 +DA:16037,0 +DA:16039,0 +DA:16040,0 +DA:16042,0 +DA:16044,0 +DA:16056,0 +DA:16057,0 +DA:16058,0 +DA:16059,0 +DA:16060,0 +DA:16061,0 +DA:16077,0 +DA:16079,0 +DA:16080,0 +DA:16081,0 +DA:16083,0 +DA:16084,0 +DA:16102,0 +DA:16103,0 +DA:16106,0 +DA:16107,0 +DA:16108,0 +DA:16109,0 +DA:16110,0 +DA:16111,0 +DA:16113,0 +DA:16114,0 +DA:16116,0 +DA:16117,0 +DA:16119,0 +DA:16121,0 +DA:16132,0 +DA:16133,0 +DA:16134,0 +DA:16137,0 +DA:16138,0 +DA:16139,0 +DA:16140,0 +DA:16142,0 +DA:16144,0 +DA:16145,0 +DA:16157,0 +DA:16158,0 +DA:16159,0 +DA:16160,0 +DA:16162,0 +DA:16184,0 +DA:16185,0 +DA:16186,0 +DA:16187,0 +DA:16188,0 +DA:16190,0 +DA:16191,0 +DA:16193,0 +DA:16194,0 +DA:16196,0 +DA:16201,0 +DA:16202,0 +DA:16203,0 +DA:16205,0 +DA:16206,0 +DA:16217,0 +DA:16218,0 +DA:16219,0 +DA:16220,0 +DA:16221,0 +DA:16224,0 +DA:16225,0 +DA:16227,0 +DA:16228,0 +DA:16230,0 +DA:16241,0 +DA:16242,0 +DA:16253,0 +DA:16254,0 +DA:16255,0 +DA:16256,0 +DA:16258,0 +DA:16259,0 +DA:16261,0 +DA:16291,0 +DA:16292,0 +DA:16293,0 +DA:16295,0 +DA:16296,0 +DA:16297,0 +DA:16298,0 +DA:16300,0 +DA:16301,0 +DA:16302,0 +DA:16304,0 +DA:16305,0 +DA:16306,0 +DA:16308,0 +DA:16310,0 +DA:16312,0 +DA:16317,0 +DA:16318,0 +DA:16320,0 +DA:16321,0 +DA:16322,0 +DA:16323,0 +DA:16324,0 +DA:16325,0 +DA:16329,0 +DA:16330,0 +DA:16332,0 +DA:16333,0 +DA:16334,0 +DA:16335,0 +DA:16336,0 +DA:16337,0 +DA:16339,0 +DA:16341,0 +DA:16342,0 +DA:16358,0 +DA:16360,0 +DA:16362,0 +DA:16380,0 +DA:16382,0 +DA:16383,0 +DA:16384,0 +DA:16386,0 +DA:16399,0 +DA:16416,0 +DA:16417,0 +DA:16418,0 +DA:16420,0 +DA:16421,0 +DA:16424,0 +DA:16425,0 +DA:16426,0 +DA:16428,0 +DA:16429,0 +DA:16430,0 +DA:16432,0 +DA:16433,0 +DA:16436,0 +DA:16437,0 +DA:16438,0 +DA:16440,0 +DA:16441,0 +DA:16445,0 +DA:16446,0 +DA:16447,0 +DA:16449,0 +DA:16450,0 +DA:16453,0 +DA:16454,0 +DA:16455,0 +DA:16457,0 +DA:16460,0 +DA:16461,0 +DA:16463,0 +DA:16467,0 +DA:16468,0 +DA:16471,0 +DA:16472,0 +DA:16473,0 +DA:16494,0 +DA:16496,0 +DA:16498,0 +DA:16500,0 +DA:16501,0 +DA:16504,0 +DA:16506,0 +DA:16508,0 +DA:16515,0 +DA:16518,0 +DA:16525,0 +DA:16528,0 +DA:16531,0 +DA:16532,0 +DA:16534,0 +DA:16535,0 +DA:16538,0 +DA:16539,0 +DA:16540,0 +DA:16542,0 +DA:16545,0 +DA:16546,0 +DA:16547,0 +DA:16548,0 +DA:16551,0 +DA:16552,0 +DA:16555,0 +DA:16572,0 +DA:16573,0 +DA:16574,0 +DA:16575,0 +DA:16576,0 +DA:16578,0 +DA:16579,0 +DA:16581,0 +DA:16582,0 +DA:16583,0 +DA:16584,0 +DA:16585,0 +DA:16589,0 +DA:16590,0 +DA:16591,0 +DA:16593,0 +DA:16594,0 +DA:16595,0 +DA:16597,0 +DA:16598,0 +DA:16599,0 +DA:16600,0 +DA:16601,0 +DA:16603,0 +DA:16604,0 +DA:16609,0 +DA:16613,0 +DA:16614,0 +DA:16616,0 +DA:16618,0 +DA:16619,0 +DA:16620,0 +DA:16623,0 +DA:16627,0 +DA:16630,0 +DA:16631,0 +DA:16632,0 +DA:16643,0 +DA:16654,0 +DA:16666,0 +DA:16676,0 +DA:16677,0 +DA:16688,0 +DA:16689,0 +DA:16690,0 +DA:16692,0 +DA:16693,0 +DA:16694,0 +DA:16695,0 +DA:16696,0 +DA:16699,0 +DA:16710,0 +DA:16711,0 +DA:16726,0 +DA:16727,0 +DA:16728,0 +DA:16740,0 +DA:16741,0 +DA:16754,0 +DA:16755,0 +DA:16757,0 +DA:16758,0 +DA:16759,0 +DA:16761,0 +DA:16763,0 +DA:16775,0 +DA:16776,0 +DA:16787,0 +DA:16788,0 +DA:16790,0 +DA:16791,0 +DA:16792,0 +DA:16795,0 +DA:16796,0 +DA:16797,0 +DA:16798,0 +DA:16800,0 +DA:16803,0 +DA:16813,0 +DA:16814,0 +DA:16815,0 +DA:16817,0 +DA:16818,0 +DA:16819,0 +DA:16830,0 +DA:16831,0 +DA:16832,0 +DA:16833,0 +DA:16834,0 +DA:16836,0 +DA:16846,0 +DA:16849,0 +DA:16854,0 +DA:16855,0 +DA:16856,0 +DA:16857,0 +DA:16859,0 +DA:16860,0 +DA:16861,0 +DA:16862,0 +DA:16863,0 +DA:16864,0 +DA:16865,0 +DA:16868,0 +DA:16883,0 +DA:16884,0 +DA:16886,0 +DA:16887,0 +DA:16888,0 +DA:16890,0 +DA:16891,0 +DA:16892,0 +DA:16893,0 +DA:16894,0 +DA:16897,0 +DA:16908,0 +DA:16909,0 +DA:16922,0 +DA:16924,0 +DA:16925,0 +DA:16926,0 +DA:16928,0 +DA:16929,0 +DA:16930,0 +DA:16931,0 +DA:16933,0 +DA:16935,0 +DA:16936,0 +DA:16938,0 +DA:16939,0 +DA:16951,0 +DA:16952,0 +DA:16955,0 +DA:16956,0 +DA:16957,0 +DA:16959,0 +DA:16970,0 +DA:16989,0 +DA:16990,0 +DA:16992,0 +DA:16996,0 +DA:16999,0 +DA:17004,0 +DA:17007,0 +DA:17011,0 +DA:17014,0 +DA:17017,0 +DA:17020,0 +DA:17033,0 +DA:17034,0 +DA:17035,0 +DA:17037,0 +DA:17038,0 +DA:17039,0 +DA:17040,0 +DA:17051,0 +DA:17064,0 +DA:17065,0 +DA:17081,0 +DA:17082,0 +DA:17084,0 +DA:17085,0 +DA:17089,0 +DA:17091,0 +DA:17103,0 +DA:17104,0 +DA:17106,0 +DA:17107,0 +DA:17109,0 +DA:17111,0 +DA:17123,0 +DA:17124,0 +DA:17138,0 +DA:17139,0 +DA:17141,0 +DA:17142,0 +DA:17144,0 +DA:17145,0 +DA:17147,0 +DA:17148,0 +DA:17159,0 +DA:17169,0 +DA:17179,0 +DA:17180,0 +DA:17182,0 +DA:17194,0 +DA:17207,0 +DA:17208,0 +DA:17209,0 +DA:17211,0 +DA:17225,0 +DA:17226,0 +DA:17227,0 +DA:17229,0 +DA:17232,0 +DA:17233,0 +DA:17253,0 +DA:17254,0 +DA:17255,0 +DA:17256,0 +DA:17259,0 +DA:17264,0 +DA:17265,0 +DA:17268,0 +DA:17269,0 +DA:17271,0 +DA:17274,0 +DA:17275,0 +DA:17276,0 +DA:17277,0 +DA:17278,0 +DA:17281,0 +DA:17282,0 +DA:17283,0 +DA:17284,0 +DA:17285,0 +DA:17288,0 +DA:17289,0 +DA:17290,0 +DA:17293,0 +DA:17294,0 +DA:17297,0 +DA:17298,0 +DA:17301,0 +DA:17302,0 +DA:17304,0 +DA:17317,0 +DA:17318,0 +DA:17319,0 +DA:17320,0 +DA:17323,0 +DA:17334,0 +DA:17347,0 +DA:17348,0 +DA:17349,0 +DA:17350,0 +DA:17351,0 +DA:17352,0 +DA:17354,0 +DA:17355,0 +DA:17357,0 +DA:17358,0 +DA:17359,0 +DA:17360,0 +DA:17362,0 +DA:17363,0 +DA:17376,0 +DA:17390,0 +DA:17391,0 +DA:17392,0 +DA:17394,0 +DA:17395,0 +DA:17396,0 +DA:17398,0 +DA:17415,0 +DA:17425,0 +DA:17426,0 +DA:17437,0 +DA:17450,0 +DA:17451,0 +DA:17464,0 +DA:17465,0 +DA:17467,0 +DA:17468,0 +DA:17469,0 +DA:17471,0 +DA:17472,0 +DA:17473,0 +DA:17474,0 +DA:17477,0 +DA:17479,0 +DA:17492,0 +DA:17493,0 +DA:17494,0 +DA:17496,0 +DA:17497,0 +DA:17498,0 +DA:17499,0 +DA:17501,0 +DA:17502,0 +DA:17504,0 +DA:17505,0 +DA:17515,0 +DA:17516,0 +DA:17517,0 +DA:17518,0 +DA:17520,0 +DA:17521,0 +DA:17523,0 +DA:17534,0 +DA:17535,0 +DA:17537,0 +DA:17538,0 +DA:17549,0 +DA:17550,0 +DA:17551,0 +DA:17553,0 +DA:17554,0 +DA:17557,0 +DA:17569,0 +DA:17570,0 +DA:17571,0 +DA:17572,0 +DA:17575,0 +DA:17586,0 +DA:17587,0 +DA:17589,0 +DA:17590,0 +DA:17591,0 +DA:17592,0 +DA:17593,0 +DA:17620,0 +DA:17621,0 +DA:17623,0 +DA:17625,0 +DA:17626,0 +DA:17627,0 +DA:17629,0 +DA:17630,0 +DA:17631,0 +DA:17633,0 +DA:17634,0 +DA:17636,0 +DA:17655,0 +DA:17656,0 +DA:17657,0 +DA:17658,0 +DA:17660,0 +DA:17661,0 +DA:17662,0 +DA:17663,0 +DA:17666,0 +DA:17692,0 +DA:17693,0 +DA:17694,0 +DA:17696,0 +DA:17697,0 +DA:17698,0 +DA:17700,0 +DA:17701,0 +DA:17703,0 +DA:17727,0 +DA:17728,0 +DA:17759,0 +DA:17760,0 +DA:17761,0 +DA:17762,0 +DA:17764,0 +DA:17792,0 +DA:17793,0 +DA:17794,0 +DA:17795,0 +DA:17797,0 +DA:17828,0 +DA:17829,0 +DA:17830,0 +DA:17832,0 +DA:17833,0 +DA:17862,0 +DA:17863,0 +DA:17864,0 +DA:17866,0 +DA:17867,0 +DA:17868,0 +DA:17907,0 +DA:17948,0 +DA:17983,0 +DA:17984,0 +DA:17985,0 +DA:17987,0 +DA:17988,0 +DA:17989,0 +DA:17991,0 +DA:18030,0 +DA:18031,0 +DA:18032,0 +DA:18034,0 +DA:18035,0 +DA:18036,0 +DA:18038,0 +DA:18077,0 +DA:18078,0 +DA:18079,0 +DA:18081,0 +DA:18082,0 +DA:18083,0 +DA:18084,0 +DA:18088,0 +DA:18106,0 +DA:18107,0 +DA:18125,0 +DA:18126,0 +DA:18150,0 +DA:18151,0 +DA:18152,0 +DA:18154,0 +DA:18155,0 +DA:18174,0 +DA:18175,0 +DA:18176,0 +DA:18178,0 +DA:18179,0 +DA:18180,0 +DA:18182,0 +DA:18204,0 +DA:18231,0 +DA:18232,0 +DA:18233,0 +DA:18235,0 +DA:18236,0 +DA:18237,0 +DA:18239,0 +DA:18257,0 +DA:18258,0 +DA:18278,0 +DA:18279,0 +DA:18280,0 +DA:18308,0 +DA:18309,0 +DA:18310,0 +DA:18312,0 +DA:18313,0 +DA:18315,0 +DA:18317,0 +DA:18343,0 +DA:18344,0 +DA:18345,0 +DA:18347,0 +DA:18348,0 +DA:18349,0 +DA:18351,0 +DA:18372,0 +DA:18390,0 +DA:18391,0 +DA:18416,0 +DA:18417,0 +DA:18418,0 +DA:18420,0 +DA:18421,0 +DA:18422,0 +DA:18423,0 +DA:18425,0 +DA:18452,0 +DA:18478,0 +DA:18501,0 +DA:18530,0 +DA:18559,0 +DA:18588,0 +DA:18589,0 +DA:18590,0 +DA:18592,0 +DA:18593,0 +DA:18596,0 +DA:18628,0 +DA:18629,0 +DA:18630,0 +DA:18632,0 +DA:18633,0 +DA:18634,0 +DA:18636,0 +DA:18637,0 +DA:18638,0 +DA:18639,0 +DA:18640,0 +DA:18641,0 +DA:18644,0 +DA:18645,0 +DA:18672,0 +DA:18692,0 +DA:18693,0 +DA:18694,0 +DA:18696,0 +DA:18697,0 +DA:18698,0 +DA:18701,0 +DA:18702,0 +DA:18704,0 +DA:18725,0 +DA:18754,0 +DA:18774,0 +DA:18775,0 +DA:18776,0 +DA:18777,0 +DA:18778,0 +DA:18781,0 +DA:18803,0 +DA:18832,0 +DA:18852,0 +DA:18853,0 +DA:18854,0 +DA:18855,0 +DA:18856,0 +DA:18859,0 +DA:18878,0 +DA:18900,0 +DA:18920,0 +DA:18921,0 +DA:18950,0 +DA:18951,0 +DA:18953,0 +DA:18954,0 +DA:18983,0 +DA:18984,0 +DA:18985,0 +DA:18987,0 +DA:18988,0 +DA:18989,0 +DA:19028,0 +DA:19069,0 +DA:19090,0 +DA:19091,0 +DA:19117,0 +DA:19118,0 +DA:19119,0 +DA:19120,0 +DA:19122,0 +DA:19146,0 +DA:19147,0 +DA:19148,0 +DA:19149,0 +DA:19171,0 +DA:19198,0 +DA:19222,0 +DA:19223,0 +DA:19246,0 +DA:19247,0 +DA:19249,0 +DA:19250,0 +DA:19251,0 +DA:19252,0 +DA:19253,0 +DA:19256,0 +DA:19257,0 +DA:19283,0 +DA:19284,0 +DA:19286,0 +DA:19287,0 +DA:19288,0 +DA:19290,0 +DA:19291,0 +DA:19315,0 +DA:19316,0 +DA:19339,0 +DA:19340,0 +DA:19366,0 +DA:19367,0 +DA:19368,0 +DA:19369,0 +DA:19371,0 +DA:19395,0 +DA:19396,0 +DA:19397,0 +DA:19398,0 +DA:19417,0 +DA:19436,0 +DA:19455,0 +DA:19478,0 +DA:19479,0 +DA:19480,0 +DA:19482,0 +DA:19483,0 +DA:19518,0 +DA:19519,0 +DA:19520,0 +DA:19547,0 +DA:19548,0 +DA:19575,0 +DA:19594,0 +DA:19595,0 +DA:19596,0 +DA:19597,0 +DA:19598,0 +DA:19600,0 +DA:19602,0 +DA:19604,0 +DA:19605,0 +DA:19610,0 +DA:19611,0 +DA:19612,0 +DA:19614,0 +DA:19646,0 +DA:19676,0 +DA:19702,0 +DA:19703,0 +DA:19705,0 +DA:19706,0 +DA:19708,0 +DA:19730,0 +DA:19759,0 +DA:19761,0 +DA:19762,0 +DA:19763,0 +DA:19764,0 +DA:19765,0 +DA:19766,0 +DA:19768,0 +DA:19770,0 +DA:19771,0 +DA:19773,0 +DA:19774,0 +DA:19798,0 +DA:19799,0 +DA:19800,0 +DA:19801,0 +DA:19802,0 +DA:19804,0 +DA:19805,0 +DA:19810,0 +DA:19812,0 +DA:19830,0 +DA:19857,0 +DA:19858,0 +DA:19859,0 +DA:19861,0 +DA:19907,0 +DA:19908,0 +DA:19909,0 +DA:19911,0 +DA:19952,0 +DA:19953,0 +DA:19992,0 +DA:20013,0 +DA:20037,0 +DA:20061,0 +DA:20086,0 +DA:20087,0 +DA:20121,0 +DA:20122,0 +DA:20146,0 +DA:20147,0 +DA:20173,0 +DA:20174,0 +DA:20175,0 +DA:20177,0 +DA:20212,0 +DA:20213,0 +DA:20215,0 +DA:20216,0 +DA:20217,0 +DA:20219,0 +DA:20247,0 +DA:20248,0 +DA:20249,0 +DA:20250,0 +DA:20252,0 +DA:20253,0 +DA:20255,0 +DA:20286,0 +DA:20287,0 +DA:20333,0 +DA:20334,0 +DA:20367,0 +DA:20368,0 +DA:20370,0 +DA:20371,0 +DA:20373,0 +DA:20374,0 +DA:20375,0 +DA:20377,0 +DA:20416,0 +DA:20417,0 +DA:20418,0 +DA:20458,0 +DA:20459,0 +DA:20461,0 +DA:20487,0 +DA:20488,0 +DA:20490,0 +DA:20528,0 +DA:20529,0 +DA:20547,0 +DA:20548,0 +DA:20572,0 +DA:20573,0 +DA:20575,0 +DA:20577,0 +DA:20578,0 +DA:20597,0 +DA:20598,0 +DA:20623,0 +DA:20624,0 +DA:20626,0 +DA:20627,0 +DA:20629,0 +DA:20630,0 +DA:20631,0 +DA:20633,0 +DA:20673,0 +DA:20674,0 +DA:20675,0 +DA:20677,0 +DA:20709,0 +DA:20710,0 +DA:20711,0 +DA:20713,0 +DA:20714,0 +DA:20715,0 +DA:20716,0 +DA:20717,0 +DA:20719,0 +DA:20740,0 +DA:20741,0 +DA:20771,0 +DA:20772,0 +DA:20774,0 +DA:20775,0 +DA:20776,0 +DA:20777,0 +DA:20800,0 +DA:20801,0 +DA:20802,0 +DA:20824,0 +DA:20825,0 +DA:20827,0 +DA:20828,0 +DA:20829,0 +DA:20830,0 +DA:20832,0 +DA:20833,0 +DA:20835,0 +DA:20874,0 +DA:20875,0 +DA:20876,0 +DA:20877,0 +DA:20878,0 +DA:20880,0 +DA:20928,0 +DA:20929,0 +DA:20930,0 +DA:20931,0 +DA:20932,0 +DA:20934,0 +DA:20979,0 +DA:20980,0 +DA:20981,0 +DA:20982,0 +DA:21024,0 +DA:21025,0 +DA:21026,0 +DA:21027,0 +DA:21091,0 +DA:21092,0 +DA:21093,0 +DA:21094,0 +DA:21096,0 +DA:21097,0 +DA:21099,0 +DA:21100,0 +DA:21101,0 +DA:21102,0 +DA:21103,0 +DA:21104,0 +DA:21108,0 +DA:21109,0 +DA:21111,0 +DA:21112,0 +DA:21113,0 +DA:21114,0 +DA:21119,0 +DA:21121,0 +DA:21123,0 +DA:21127,0 +DA:21128,0 +DA:21129,0 +DA:21131,0 +DA:21135,0 +DA:21136,0 +DA:21141,0 +DA:21146,0 +DA:21147,0 +DA:21148,0 +DA:21151,0 +DA:21155,0 +DA:21159,0 +DA:21160,0 +DA:21162,0 +DA:21163,0 +DA:21167,0 +DA:21168,0 +DA:21170,0 +DA:21171,0 +DA:21175,0 +DA:21179,0 +DA:21180,0 +DA:21182,0 +DA:21183,0 +DA:21184,0 +DA:21186,0 +DA:21187,0 +DA:21188,0 +DA:21190,0 +DA:21192,0 +DA:21193,0 +DA:21196,0 +DA:21197,0 +DA:21199,0 +DA:21201,0 +DA:21202,0 +DA:21203,0 +DA:21224,0 +DA:21225,0 +DA:21247,0 +DA:21248,0 +DA:21270,0 +DA:21318,0 +DA:21319,0 +DA:21321,0 +DA:21322,0 +DA:21323,0 +DA:21324,0 +DA:21326,0 +DA:21327,0 +DA:21329,0 +DA:21330,0 +DA:21331,0 +DA:21333,0 +DA:21334,0 +DA:21338,0 +DA:21361,0 +DA:21362,0 +DA:21364,0 +DA:21365,0 +DA:21366,0 +DA:21367,0 +DA:21368,0 +DA:21369,0 +DA:21370,0 +DA:21372,0 +DA:21395,0 +DA:21429,0 +DA:21430,0 +DA:21434,0 +DA:21435,0 +DA:21436,0 +DA:21437,0 +DA:21439,0 +DA:21440,0 +DA:21442,0 +DA:21479,0 +DA:21480,0 +DA:21481,0 +DA:21516,0 +DA:21517,0 +DA:21518,0 +DA:21543,0 +DA:21544,0 +DA:21573,0 +DA:21574,0 +DA:21576,0 +DA:21577,0 +DA:21615,0 +DA:21616,0 +DA:21618,0 +DA:21619,0 +DA:21620,0 +DA:21621,0 +DA:21623,0 +DA:21624,0 +DA:21626,0 +DA:21675,0 +DA:21676,0 +DA:21678,0 +DA:21679,0 +DA:21681,0 +DA:21682,0 +DA:21683,0 +DA:21685,0 +DA:21708,0 +DA:21734,0 +DA:21773,0 +DA:21774,0 +DA:21776,0 +DA:21777,0 +DA:21807,0 +DA:21842,0 +DA:21843,0 +DA:21865,0 +DA:21897,0 +DA:21898,0 +DA:21926,0 +DA:21962,0 +DA:21988,0 +DA:22013,0 +DA:22014,0 +DA:22035,0 +DA:22036,0 +DA:22063,0 +DA:22082,0 +DA:22110,0 +DA:22139,0 +DA:22160,0 +DA:22181,0 +DA:22200,0 +DA:22220,0 +DA:22257,0 +DA:22258,0 +DA:22260,0 +DA:22263,0 +DA:22265,0 +DA:22266,0 +DA:22267,0 +DA:22269,0 +DA:22270,0 +DA:22272,0 +DA:22273,0 +DA:22274,0 +DA:22277,0 +DA:22309,0 +DA:22345,0 +DA:22346,0 +DA:22347,0 +DA:22369,0 +DA:22370,0 +DA:22372,0 +DA:22373,0 +DA:22404,0 +DA:22425,0 +DA:22426,0 +DA:22430,0 +DA:22431,0 +DA:22461,0 +DA:22491,0 +DA:22521,0 +DA:22522,0 +DA:22550,0 +DA:22570,0 +DA:22601,0 +DA:22637,0 +DA:22638,0 +DA:22673,0 +DA:22703,0 +DA:22704,0 +DA:22706,0 +DA:22727,0 +DA:22751,0 +DA:22781,0 +DA:22814,0 +DA:22815,0 +DA:22817,0 +DA:22818,0 +DA:22819,0 +DA:22821,0 +DA:22822,0 +DA:22843,0 +DA:22873,0 +DA:22893,0 +DA:22913,0 +DA:22935,0 +DA:22956,0 +DA:22976,0 +DA:22997,0 +DA:23018,0 +DA:23044,0 +DA:23069,0 +DA:23070,0 +DA:23097,0 +DA:23098,0 +DA:23100,0 +DA:23101,0 +DA:23103,0 +DA:23104,0 +DA:23106,0 +DA:23107,0 +DA:23109,0 +DA:23136,0 +DA:23137,0 +DA:23139,0 +DA:23140,0 +DA:23141,0 +DA:23142,0 +DA:23144,0 +DA:23174,0 +DA:23175,0 +DA:23177,0 +DA:23208,0 +DA:23235,0 +DA:23236,0 +DA:23238,0 +DA:23239,0 +DA:23241,0 +DA:23242,0 +DA:23243,0 +DA:23245,0 +DA:23246,0 +DA:23248,0 +DA:23249,0 +DA:23250,0 +DA:23280,0 +DA:23308,0 +DA:23335,0 +DA:23372,0 +DA:23373,0 +DA:23374,0 +DA:23375,0 +DA:23377,0 +DA:23378,0 +DA:23379,0 +DA:23415,0 +DA:23416,0 +DA:23448,0 +DA:23449,0 +DA:23480,0 +DA:23481,0 +DA:23501,0 +DA:23538,0 +DA:23539,0 +DA:23563,0 +DA:23564,0 +DA:23565,0 +DA:23587,0 +DA:23588,0 +DA:23589,0 +DA:23628,0 +DA:23667,0 +DA:23699,0 +DA:23731,0 +DA:23765,0 +DA:23795,0 +DA:23822,0 +DA:23849,0 +DA:23878,0 +DA:23879,0 +DA:23910,0 +DA:23940,0 +DA:23961,0 +DA:23962,0 +DA:23991,0 +DA:23992,0 +DA:23993,0 +DA:23995,0 +DA:24017,0 +DA:24048,0 +DA:24075,0 +DA:24100,0 +DA:24101,0 +DA:24103,0 +DA:24104,0 +DA:24106,0 +DA:24138,0 +DA:24139,0 +DA:24141,0 +DA:24142,0 +DA:24144,0 +DA:24178,0 +DA:24179,0 +DA:24213,0 +DA:24214,0 +DA:24237,0 +DA:24238,0 +DA:24239,0 +DA:24240,0 +DA:24242,0 +DA:24243,0 +DA:24244,0 +DA:24245,0 +DA:24246,0 +DA:24248,0 +DA:24249,0 +DA:24250,0 +DA:24252,0 +DA:24253,0 +DA:24254,0 +DA:24256,0 +DA:24280,0 +DA:24300,0 +DA:24301,0 +DA:24323,0 +DA:24324,0 +DA:24326,0 +DA:24327,0 +DA:24329,0 +DA:24330,0 +DA:24331,0 +DA:24365,0 +DA:24367,0 +DA:24368,0 +DA:24371,0 +DA:24372,0 +DA:24373,0 +DA:24375,0 +DA:24376,0 +DA:24377,0 +DA:24378,0 +DA:24379,0 +DA:24381,0 +DA:24383,0 +DA:24415,0 +DA:24443,0 +DA:24444,0 +DA:24471,0 +DA:24497,0 +DA:24530,0 +DA:24531,0 +DA:24533,0 +DA:24534,0 +DA:24535,0 +DA:24536,0 +DA:24537,0 +DA:24539,0 +DA:24540,0 +DA:24543,0 +DA:24546,0 +DA:24547,0 +DA:24549,0 +DA:24580,0 +DA:24611,0 +DA:24639,0 +DA:24640,0 +DA:24670,0 +DA:24698,0 +DA:24723,0 +DA:24724,0 +DA:24725,0 +DA:24727,0 +DA:24728,0 +DA:24729,0 +DA:24731,0 +DA:24732,0 +DA:24733,0 +DA:24735,0 +DA:24777,0 +DA:24778,0 +DA:24779,0 +DA:24780,0 +DA:24782,0 +DA:24784,0 +DA:24785,0 +DA:24820,0 +DA:24821,0 +DA:24823,0 +DA:24824,0 +DA:24825,0 +DA:24826,0 +DA:24828,0 +DA:24829,0 +DA:24830,0 +DA:24833,0 +DA:24834,0 +DA:24835,0 +DA:24838,0 +DA:24839,0 +DA:24840,0 +DA:24841,0 +DA:24843,0 +DA:24846,0 +DA:24847,0 +DA:24848,0 +DA:24849,0 +DA:24851,0 +DA:24852,0 +DA:24853,0 +DA:24855,0 +DA:24880,0 +DA:24881,0 +DA:24882,0 +DA:24901,0 +DA:24923,0 +DA:24924,0 +DA:24951,0 +DA:24952,0 +DA:24954,0 +DA:24955,0 +DA:24959,0 +DA:24960,0 +DA:24961,0 +DA:24993,0 +DA:24994,0 +DA:25015,0 +DA:25016,0 +DA:25042,0 +DA:25043,0 +DA:25066,0 +DA:25067,0 +DA:25087,0 +DA:25113,0 +DA:25114,0 +DA:25116,0 +DA:25117,0 +DA:25118,0 +DA:25120,0 +DA:25121,0 +DA:25152,0 +DA:25153,0 +DA:25155,0 +DA:25156,0 +DA:25185,0 +DA:25186,0 +DA:25188,0 +DA:25189,0 +DA:25219,0 +DA:25220,0 +DA:25221,0 +DA:25222,0 +DA:25224,0 +DA:25250,0 +DA:25251,0 +DA:25253,0 +DA:25255,0 +DA:25278,0 +DA:25279,0 +DA:25281,0 +DA:25305,0 +DA:25306,0 +DA:25329,0 +DA:25330,0 +DA:25332,0 +DA:25333,0 +DA:25334,0 +DA:25336,0 +DA:25337,0 +DA:25341,0 +DA:25342,0 +DA:25343,0 +DA:25346,0 +DA:25370,0 +DA:25371,0 +DA:25398,0 +DA:25399,0 +DA:25403,0 +DA:25404,0 +DA:25515,0 +DA:25517,0 +DA:25518,0 +DA:25520,0 +DA:25521,0 +DA:25523,0 +DA:25524,0 +DA:25525,0 +DA:25529,0 +DA:25530,0 +DA:25531,0 +DA:25534,0 +DA:25542,0 +DA:25548,0 +DA:25549,0 +DA:25552,0 +DA:25555,0 +DA:25556,0 +DA:25557,0 +DA:25559,0 +DA:25560,0 +DA:25561,0 +DA:25563,0 +DA:25564,0 +DA:25566,0 +DA:25570,0 +DA:25573,0 +DA:25577,0 +DA:25578,0 +DA:25579,0 +DA:25582,0 +DA:25587,0 +DA:25605,0 +DA:25606,0 +DA:25612,0 +DA:25613,0 +DA:25614,0 +DA:25616,0 +DA:25641,0 +DA:25666,0 +DA:25692,0 +DA:25693,0 +DA:25694,0 +DA:25696,0 +DA:25697,0 +DA:25699,0 +DA:25700,0 +DA:25701,0 +DA:25702,0 +DA:25704,0 +DA:25727,0 +DA:25728,0 +DA:25729,0 +DA:25731,0 +DA:25732,0 +DA:25734,0 +DA:25735,0 +DA:25737,0 +DA:25760,0 +DA:25761,0 +DA:25762,0 +DA:25764,0 +DA:25765,0 +DA:25767,0 +DA:25768,0 +DA:25770,0 +DA:25811,0 +DA:25812,0 +DA:25814,0 +DA:25815,0 +DA:25816,0 +DA:25817,0 +DA:25819,0 +DA:25821,0 +DA:25822,0 +DA:25823,0 +DA:25824,0 +DA:25826,0 +DA:25827,0 +DA:25829,0 +DA:25830,0 +DA:25831,0 +DA:25833,0 +DA:25837,0 +DA:25838,0 +DA:25840,0 +DA:25841,0 +DA:25843,0 +DA:25844,0 +DA:25846,0 +DA:25848,0 +DA:25849,0 +DA:25851,0 +DA:25852,0 +DA:25853,0 +DA:25855,0 +DA:25857,0 +DA:25858,0 +DA:25859,0 +DA:25860,0 +DA:25863,0 +DA:25886,0 +DA:25887,0 +DA:25912,0 +DA:25913,0 +DA:25933,0 +DA:25955,0 +DA:25956,0 +DA:25958,0 +DA:25959,0 +DA:25961,0 +DA:25988,0 +DA:25989,0 +DA:25990,0 +DA:25992,0 +DA:26022,0 +DA:26023,0 +DA:26024,0 +DA:26025,0 +DA:26027,0 +DA:26060,0 +DA:26061,0 +DA:26063,0 +DA:26064,0 +DA:26065,0 +DA:26067,0 +DA:26070,0 +DA:26071,0 +DA:26072,0 +DA:26073,0 +DA:26074,0 +DA:26075,0 +DA:26106,0 +DA:26129,0 +DA:26130,0 +DA:26155,0 +DA:26180,0 +DA:26203,0 +DA:26222,0 +DA:26268,0 +DA:26300,0 +DA:26330,0 +DA:26357,0 +DA:26358,0 +DA:26359,0 +DA:26386,0 +DA:26387,0 +DA:26388,0 +DA:26429,0 +DA:26430,0 +DA:26432,0 +DA:26434,0 +DA:26435,0 +DA:26436,0 +DA:26437,0 +DA:26439,0 +DA:26440,0 +DA:26442,0 +DA:26443,0 +DA:26444,0 +DA:26445,0 +DA:26446,0 +DA:26447,0 +DA:26448,0 +DA:26449,0 +DA:26450,0 +DA:26452,0 +DA:26453,0 +DA:26454,0 +DA:26456,0 +DA:26461,0 +DA:26478,0 +DA:26479,0 +DA:26481,0 +DA:26521,0 +DA:26522,0 +DA:26523,0 +DA:26545,0 +DA:26571,0 +DA:26597,0 +DA:26622,0 +DA:26647,0 +DA:26648,0 +DA:26693,0 +DA:26731,0 +DA:26752,0 +DA:26769,0 +DA:26791,0 +DA:26808,0 +DA:26825,0 +DA:26848,0 +DA:26849,0 +DA:26850,0 +DA:26852,0 +DA:26853,0 +DA:26855,0 +DA:26856,0 +DA:26858,0 +DA:26859,0 +DA:26860,0 +DA:26862,0 +DA:26883,0 +DA:26884,0 +DA:26886,0 +DA:26907,0 +DA:26908,0 +DA:26928,0 +DA:26929,0 +DA:26953,0 +DA:26970,0 +DA:26971,0 +DA:26995,0 +DA:27016,0 +DA:27045,0 +DA:27065,0 +DA:27092,0 +DA:27114,0 +DA:27143,0 +DA:27163,0 +DA:27164,0 +DA:27188,0 +DA:27205,0 +DA:27206,0 +DA:27224,0 +DA:27253,0 +DA:27261,0 +DA:27262,0 +DA:27263,0 +DA:27264,0 +DA:27265,0 +DA:27266,0 +DA:27267,0 +DA:27268,0 +DA:27269,0 +DA:27270,0 +DA:27271,0 +DA:27272,0 +DA:27273,0 +DA:27274,0 +DA:27275,0 +DA:27276,0 +DA:27277,0 +DA:27278,0 +DA:27279,0 +DA:27280,0 +DA:27281,0 +DA:27282,0 +DA:27283,0 +DA:27284,0 +DA:27285,0 +DA:27286,0 +DA:27287,0 +DA:27288,0 +DA:27289,0 +DA:27290,0 +DA:27291,0 +DA:27292,0 +DA:27293,0 +DA:27294,0 +DA:27295,0 +DA:27296,0 +DA:27297,0 +DA:27298,0 +DA:27299,0 +DA:27300,0 +DA:27301,0 +DA:27302,0 +DA:27303,0 +DA:27304,0 +DA:27305,0 +DA:27306,0 +DA:27307,0 +DA:27308,0 +DA:27309,0 +DA:27310,0 +DA:27311,0 +DA:27312,0 +DA:27313,0 +DA:27314,0 +DA:27315,0 +DA:27316,0 +DA:27317,0 +DA:27318,0 +DA:27319,0 +DA:27320,0 +DA:27321,0 +DA:27322,0 +DA:27323,0 +DA:27324,0 +DA:27325,0 +DA:27326,0 +DA:27327,0 +DA:27328,0 +DA:27329,0 +DA:27330,0 +DA:27331,0 +DA:27332,0 +DA:27333,0 +DA:27334,0 +DA:27335,0 +DA:27336,0 +DA:27337,0 +DA:27338,0 +DA:27339,0 +DA:27340,0 +DA:27341,0 +DA:27342,0 +DA:27343,0 +DA:27344,0 +DA:27345,0 +DA:27346,0 +DA:27347,0 +DA:27348,0 +DA:27349,0 +DA:27350,0 +DA:27351,0 +DA:27352,0 +DA:27353,0 +DA:27354,0 +DA:27355,0 +DA:27356,0 +DA:27357,0 +DA:27358,0 +DA:27359,0 +DA:27360,0 +DA:27361,0 +DA:27362,0 +DA:27363,0 +DA:27364,0 +DA:27365,0 +DA:27366,0 +DA:27367,0 +DA:27368,0 +DA:27369,0 +DA:27370,0 +DA:27371,0 +DA:27372,0 +DA:27373,0 +DA:27374,0 +DA:27375,0 +DA:27376,0 +DA:27377,0 +DA:27378,0 +DA:27379,0 +DA:27380,0 +DA:27381,0 +DA:27382,0 +DA:27383,0 +DA:27384,0 +DA:27385,0 +DA:27386,0 +DA:27387,0 +DA:27388,0 +DA:27389,0 +DA:27390,0 +DA:27391,0 +DA:27392,0 +DA:27393,0 +DA:27394,0 +DA:27395,0 +DA:27396,0 +DA:27397,0 +DA:27398,0 +DA:27399,0 +DA:27400,0 +DA:27401,0 +DA:27402,0 +DA:27403,0 +DA:27404,0 +DA:27405,0 +DA:27406,0 +DA:27407,0 +DA:27408,0 +DA:27409,0 +DA:27412,0 +DA:27413,0 +DA:27414,0 +DA:27415,0 +DA:27418,0 +DA:27423,0 +DA:27424,0 +DA:27425,0 +DA:27426,0 +DA:27427,0 +DA:27428,0 +DA:27429,0 +DA:27430,0 +DA:27431,0 +DA:27432,0 +DA:27433,0 +DA:27434,0 +DA:27435,0 +DA:27436,0 +DA:27437,0 +DA:27438,0 +DA:27439,0 +DA:27440,0 +DA:27441,0 +DA:27442,0 +DA:27443,0 +DA:27444,0 +DA:27445,0 +DA:27446,0 +DA:27447,0 +DA:27448,0 +DA:27449,0 +DA:27450,0 +DA:27451,0 +DA:27452,0 +DA:27453,0 +DA:27454,0 +DA:27455,0 +DA:27456,0 +DA:27457,0 +DA:27458,0 +DA:27459,0 +DA:27460,0 +DA:27461,0 +DA:27462,0 +DA:27463,0 +DA:27464,0 +DA:27465,0 +DA:27466,0 +DA:27467,0 +DA:27468,0 +DA:27469,0 +DA:27470,0 +DA:27471,0 +DA:27472,0 +DA:27473,0 +DA:27474,0 +DA:27475,0 +DA:27476,0 +DA:27477,0 +DA:27478,0 +DA:27479,0 +DA:27480,0 +DA:27481,0 +DA:27482,0 +DA:27483,0 +DA:27484,0 +DA:27485,0 +DA:27486,0 +DA:27487,0 +DA:27488,0 +DA:27489,0 +DA:27490,0 +DA:27491,0 +DA:27492,0 +DA:27493,0 +DA:27494,0 +DA:27495,0 +DA:27496,0 +DA:27497,0 +DA:27498,0 +DA:27499,0 +DA:27500,0 +DA:27501,0 +DA:27502,0 +DA:27503,0 +DA:27504,0 +DA:27505,0 +DA:27506,0 +DA:27507,0 +DA:27508,0 +DA:27509,0 +DA:27510,0 +DA:27511,0 +DA:27512,0 +DA:27513,0 +DA:27514,0 +DA:27515,0 +DA:27516,0 +DA:27517,0 +DA:27518,0 +DA:27519,0 +DA:27520,0 +DA:27521,0 +DA:27522,0 +DA:27523,0 +DA:27524,0 +DA:27525,0 +DA:27526,0 +DA:27527,0 +DA:27528,0 +DA:27529,0 +DA:27530,0 +DA:27531,0 +DA:27532,0 +DA:27533,0 +DA:27534,0 +DA:27535,0 +DA:27536,0 +DA:27537,0 +DA:27538,0 +DA:27539,0 +DA:27540,0 +DA:27541,0 +DA:27542,0 +DA:27543,0 +DA:27544,0 +DA:27545,0 +DA:27546,0 +DA:27547,0 +DA:27548,0 +DA:27549,0 +DA:27550,0 +DA:27551,0 +DA:27552,0 +DA:27553,0 +DA:27554,0 +DA:27555,0 +DA:27556,0 +DA:27557,0 +DA:27558,0 +DA:27559,0 +DA:27560,0 +DA:27561,0 +DA:27562,0 +DA:27563,0 +DA:27564,0 +DA:27565,0 +DA:27566,0 +DA:27567,0 +DA:27568,0 +DA:27569,0 +DA:27570,0 +DA:27571,0 +DA:27574,0 +DA:27575,0 +DA:27576,0 +DA:27578,0 +DA:27579,0 +DA:27580,0 +DA:27581,0 +DA:27582,0 +DA:27585,0 +DA:27597,0 +DA:27600,0 +DA:27601,0 +DA:27605,0 +DA:27606,0 +DA:27607,0 +DA:27609,0 +DA:27613,0 +DA:27614,0 +DA:27616,0 +DA:27621,0 +DA:27624,0 +DA:27625,0 +DA:27630,0 +DA:27631,0 +DA:27632,0 +DA:27634,0 +DA:27635,0 +DA:27636,0 +DA:27640,0 +DA:27641,0 +DA:27646,0 +DA:27647,0 +DA:27649,0 +DA:27650,0 +DA:27655,0 +DA:27656,0 +DA:27658,0 +DA:27659,0 +DA:27663,0 +DA:27664,0 +DA:27667,0 +DA:27668,0 +DA:27671,0 +DA:27672,0 +DA:27675,0 +DA:27676,0 +DA:27677,0 +DA:27679,0 +DA:27680,0 +DA:27684,0 +DA:27685,0 +DA:27688,0 +DA:27689,0 +DA:27691,0 +DA:27692,0 +DA:27693,0 +DA:27695,0 +DA:27696,0 +DA:27697,0 +DA:27698,0 +DA:27700,0 +DA:27701,0 +DA:27702,0 +DA:27704,0 +DA:27707,0 +DA:27708,0 +DA:27711,0 +DA:27712,0 +DA:27716,0 +DA:27717,0 +DA:27718,0 +DA:27719,0 +DA:27720,0 +DA:27722,0 +DA:27723,0 +DA:27725,0 +DA:27726,0 +DA:27727,0 +DA:27728,0 +DA:27729,0 +DA:27730,0 +DA:27732,0 +DA:27733,0 +DA:27734,0 +DA:27737,0 +DA:27739,0 +DA:27741,0 +DA:27742,0 +DA:27743,0 +DA:27744,0 +DA:27746,0 +DA:27747,0 +DA:27748,0 +DA:27749,0 +DA:27750,0 +DA:27752,0 +DA:27753,0 +DA:27755,0 +DA:27756,0 +DA:27761,0 +DA:27762,0 +DA:27763,0 +DA:27764,0 +DA:27766,0 +DA:27767,0 +DA:27768,0 +DA:27769,0 +DA:27770,0 +DA:27772,0 +DA:27773,0 +DA:27779,0 +DA:27780,0 +DA:27781,0 +DA:27782,0 +DA:27783,0 +DA:27785,0 +DA:27789,0 +DA:27795,0 +DA:27796,0 +DA:27797,0 +DA:27800,0 +DA:27801,0 +DA:27802,0 +DA:27803,0 +DA:27804,0 +DA:27805,0 +DA:27806,0 +DA:27809,0 +DA:27811,0 +DA:27812,0 +DA:27814,0 +DA:27820,0 +DA:27823,0 +DA:27828,0 +DA:27832,0 +DA:27833,0 +DA:27837,0 +DA:27839,0 +DA:27841,0 +DA:27845,0 +DA:27851,0 +DA:27854,0 +DA:27901,0 +DA:27902,0 +DA:27904,0 +DA:27905,0 +DA:27906,0 +DA:27907,0 +DA:27909,0 +DA:27910,0 +DA:27912,0 +DA:27913,0 +DA:27914,0 +DA:27916,0 +DA:27917,0 +DA:27921,0 +DA:27923,0 +DA:27926,0 +DA:27957,0 +DA:27960,0 +DA:27963,0 +DA:27987,0 +DA:27990,0 +DA:27993,0 +DA:27995,0 +DA:27997,0 +DA:27998,0 +DA:27999,0 +DA:28002,0 +DA:28004,0 +DA:28007,0 +DA:28010,0 +DA:28011,0 +DA:28013,0 +DA:28014,0 +DA:28015,0 +DA:28021,0 +LF:8543 +LH:0 +BRDA:1,0,0,0 +BRDA:1,0,1,0 +BRDA:1,1,0,0 +BRDA:1,1,1,0 +BRDA:1,2,0,0 +BRDA:1,2,1,0 +BRDA:1,3,0,0 +BRDA:1,3,1,0 +BRDA:1,4,0,0 +BRDA:1,4,1,0 +BRDA:1,5,0,0 +BRDA:1,5,1,0 +BRDA:1,6,0,0 +BRDA:1,6,1,0 +BRDA:1,7,0,0 +BRDA:1,7,1,0 +BRDA:2,8,0,0 +BRDA:2,8,1,0 +BRDA:17,9,0,0 +BRDA:17,9,1,0 +BRDA:56,10,0,0 +BRDA:56,10,1,0 +BRDA:68,11,0,0 +BRDA:68,11,1,0 +BRDA:88,12,0,0 +BRDA:88,12,1,0 +BRDA:91,13,0,0 +BRDA:91,13,1,0 +BRDA:94,14,0,0 +BRDA:94,14,1,0 +BRDA:97,15,0,0 +BRDA:97,15,1,0 +BRDA:100,16,0,0 +BRDA:100,16,1,0 +BRDA:101,17,0,0 +BRDA:101,17,1,0 +BRDA:101,17,2,0 +BRDA:101,17,3,0 +BRDA:101,17,4,0 +BRDA:103,18,0,0 +BRDA:103,18,1,0 +BRDA:104,19,0,0 +BRDA:104,19,1,0 +BRDA:107,20,0,0 +BRDA:107,20,1,0 +BRDA:116,21,0,0 +BRDA:116,21,1,0 +BRDA:126,22,0,0 +BRDA:126,22,1,0 +BRDA:132,23,0,0 +BRDA:132,23,1,0 +BRDA:138,24,0,0 +BRDA:138,24,1,0 +BRDA:144,25,0,0 +BRDA:144,25,1,0 +BRDA:153,26,0,0 +BRDA:153,26,1,0 +BRDA:156,27,0,0 +BRDA:156,27,1,0 +BRDA:157,28,0,0 +BRDA:157,28,1,0 +BRDA:164,29,0,0 +BRDA:164,29,1,0 +BRDA:164,30,0,0 +BRDA:164,30,1,0 +BRDA:173,31,0,0 +BRDA:173,31,1,0 +BRDA:173,32,0,0 +BRDA:173,32,1,0 +BRDA:174,33,0,0 +BRDA:174,33,1,0 +BRDA:190,34,0,0 +BRDA:190,34,1,0 +BRDA:190,35,0,0 +BRDA:190,35,1,0 +BRDA:194,36,0,0 +BRDA:194,36,1,0 +BRDA:195,37,0,0 +BRDA:195,37,1,0 +BRDA:195,38,0,0 +BRDA:195,38,1,0 +BRDA:198,39,0,0 +BRDA:198,39,1,0 +BRDA:201,40,0,0 +BRDA:201,40,1,0 +BRDA:223,41,0,0 +BRDA:223,41,1,0 +BRDA:235,42,0,0 +BRDA:235,42,1,0 +BRDA:263,43,0,0 +BRDA:263,43,1,0 +BRDA:266,44,0,0 +BRDA:266,44,1,0 +BRDA:275,45,0,0 +BRDA:275,45,1,0 +BRDA:291,46,0,0 +BRDA:291,46,1,0 +BRDA:300,47,0,0 +BRDA:300,47,1,0 +BRDA:304,48,0,0 +BRDA:304,48,1,0 +BRDA:314,49,0,0 +BRDA:314,49,1,0 +BRDA:314,50,0,0 +BRDA:314,50,1,0 +BRDA:318,51,0,0 +BRDA:318,51,1,0 +BRDA:319,52,0,0 +BRDA:319,52,1,0 +BRDA:325,53,0,0 +BRDA:325,53,1,0 +BRDA:335,54,0,0 +BRDA:335,54,1,0 +BRDA:346,55,0,0 +BRDA:346,55,1,0 +BRDA:349,56,0,0 +BRDA:349,56,1,0 +BRDA:351,57,0,0 +BRDA:351,57,1,0 +BRDA:360,58,0,0 +BRDA:360,58,1,0 +BRDA:363,59,0,0 +BRDA:363,59,1,0 +BRDA:365,60,0,0 +BRDA:365,60,1,0 +BRDA:380,61,0,0 +BRDA:380,61,1,0 +BRDA:394,62,0,0 +BRDA:394,62,1,0 +BRDA:399,63,0,0 +BRDA:399,63,1,0 +BRDA:399,64,0,0 +BRDA:399,64,1,0 +BRDA:401,65,0,0 +BRDA:401,65,1,0 +BRDA:405,66,0,0 +BRDA:405,66,1,0 +BRDA:405,67,0,0 +BRDA:405,67,1,0 +BRDA:409,68,0,0 +BRDA:409,68,1,0 +BRDA:412,69,0,0 +BRDA:412,69,1,0 +BRDA:413,70,0,0 +BRDA:413,70,1,0 +BRDA:418,71,0,0 +BRDA:418,71,1,0 +BRDA:418,72,0,0 +BRDA:418,72,1,0 +BRDA:421,73,0,0 +BRDA:421,73,1,0 +BRDA:424,74,0,0 +BRDA:424,74,1,0 +BRDA:424,75,0,0 +BRDA:424,75,1,0 +BRDA:424,75,2,0 +BRDA:427,76,0,0 +BRDA:427,76,1,0 +BRDA:427,77,0,0 +BRDA:427,77,1,0 +BRDA:430,78,0,0 +BRDA:430,78,1,0 +BRDA:431,79,0,0 +BRDA:431,79,1,0 +BRDA:434,80,0,0 +BRDA:434,80,1,0 +BRDA:452,81,0,0 +BRDA:452,81,1,0 +BRDA:456,82,0,0 +BRDA:456,82,1,0 +BRDA:460,83,0,0 +BRDA:460,83,1,0 +BRDA:462,84,0,0 +BRDA:462,84,1,0 +BRDA:475,85,0,0 +BRDA:475,85,1,0 +BRDA:478,86,0,0 +BRDA:478,86,1,0 +BRDA:478,87,0,0 +BRDA:478,87,1,0 +BRDA:481,88,0,0 +BRDA:481,88,1,0 +BRDA:481,89,0,0 +BRDA:481,89,1,0 +BRDA:491,90,0,0 +BRDA:491,90,1,0 +BRDA:491,91,0,0 +BRDA:491,91,1,0 +BRDA:493,92,0,0 +BRDA:493,92,1,0 +BRDA:494,93,0,0 +BRDA:494,93,1,0 +BRDA:500,94,0,0 +BRDA:500,94,1,0 +BRDA:508,95,0,0 +BRDA:508,95,1,0 +BRDA:514,96,0,0 +BRDA:514,96,1,0 +BRDA:514,97,0,0 +BRDA:514,97,1,0 +BRDA:519,98,0,0 +BRDA:519,98,1,0 +BRDA:519,99,0,0 +BRDA:519,99,1,0 +BRDA:524,100,0,0 +BRDA:524,100,1,0 +BRDA:535,101,0,0 +BRDA:535,101,1,0 +BRDA:535,102,0,0 +BRDA:535,102,1,0 +BRDA:548,103,0,0 +BRDA:548,103,1,0 +BRDA:551,104,0,0 +BRDA:551,104,1,0 +BRDA:551,105,0,0 +BRDA:551,105,1,0 +BRDA:562,106,0,0 +BRDA:562,106,1,0 +BRDA:565,107,0,0 +BRDA:565,107,1,0 +BRDA:565,108,0,0 +BRDA:565,108,1,0 +BRDA:567,109,0,0 +BRDA:567,109,1,0 +BRDA:574,110,0,0 +BRDA:574,110,1,0 +BRDA:574,111,0,0 +BRDA:574,111,1,0 +BRDA:599,112,0,0 +BRDA:599,112,1,0 +BRDA:603,113,0,0 +BRDA:603,113,1,0 +BRDA:641,114,0,0 +BRDA:641,114,1,0 +BRDA:645,115,0,0 +BRDA:645,115,1,0 +BRDA:649,116,0,0 +BRDA:649,116,1,0 +BRDA:649,117,0,0 +BRDA:649,117,1,0 +BRDA:652,118,0,0 +BRDA:652,118,1,0 +BRDA:652,119,0,0 +BRDA:652,119,1,0 +BRDA:656,120,0,0 +BRDA:656,120,1,0 +BRDA:656,121,0,0 +BRDA:656,121,1,0 +BRDA:658,122,0,0 +BRDA:658,122,1,0 +BRDA:668,123,0,0 +BRDA:668,123,1,0 +BRDA:692,124,0,0 +BRDA:692,124,1,0 +BRDA:720,125,0,0 +BRDA:720,125,1,0 +BRDA:721,126,0,0 +BRDA:721,126,1,0 +BRDA:722,127,0,0 +BRDA:722,127,1,0 +BRDA:727,128,0,0 +BRDA:727,128,1,0 +BRDA:730,129,0,0 +BRDA:730,129,1,0 +BRDA:735,130,0,0 +BRDA:735,130,1,0 +BRDA:749,131,0,0 +BRDA:749,131,1,0 +BRDA:749,132,0,0 +BRDA:749,132,1,0 +BRDA:752,133,0,0 +BRDA:752,133,1,0 +BRDA:754,134,0,0 +BRDA:754,134,1,0 +BRDA:754,135,0,0 +BRDA:754,135,1,0 +BRDA:755,136,0,0 +BRDA:755,136,1,0 +BRDA:758,137,0,0 +BRDA:758,137,1,0 +BRDA:758,138,0,0 +BRDA:758,138,1,0 +BRDA:761,139,0,0 +BRDA:761,139,1,0 +BRDA:763,140,0,0 +BRDA:763,140,1,0 +BRDA:774,141,0,0 +BRDA:774,141,1,0 +BRDA:794,142,0,0 +BRDA:794,142,1,0 +BRDA:800,143,0,0 +BRDA:800,143,1,0 +BRDA:849,144,0,0 +BRDA:849,144,1,0 +BRDA:849,145,0,0 +BRDA:849,145,1,0 +BRDA:851,146,0,0 +BRDA:851,146,1,0 +BRDA:856,147,0,0 +BRDA:856,147,1,0 +BRDA:856,148,0,0 +BRDA:856,148,1,0 +BRDA:859,149,0,0 +BRDA:859,149,1,0 +BRDA:872,150,0,0 +BRDA:872,150,1,0 +BRDA:874,151,0,0 +BRDA:874,151,1,0 +BRDA:883,152,0,0 +BRDA:883,152,1,0 +BRDA:895,153,0,0 +BRDA:895,153,1,0 +BRDA:895,154,0,0 +BRDA:895,154,1,0 +BRDA:897,155,0,0 +BRDA:897,155,1,0 +BRDA:898,156,0,0 +BRDA:898,156,1,0 +BRDA:900,157,0,0 +BRDA:900,157,1,0 +BRDA:904,158,0,0 +BRDA:904,158,1,0 +BRDA:933,159,0,0 +BRDA:933,159,1,0 +BRDA:934,160,0,0 +BRDA:934,160,1,0 +BRDA:937,161,0,0 +BRDA:937,161,1,0 +BRDA:964,162,0,0 +BRDA:964,162,1,0 +BRDA:973,163,0,0 +BRDA:973,163,1,0 +BRDA:973,164,0,0 +BRDA:973,164,1,0 +BRDA:981,165,0,0 +BRDA:981,165,1,0 +BRDA:1000,166,0,0 +BRDA:1000,166,1,0 +BRDA:1000,167,0,0 +BRDA:1000,167,1,0 +BRDA:1006,168,0,0 +BRDA:1006,168,1,0 +BRDA:1006,169,0,0 +BRDA:1006,169,1,0 +BRDA:1010,170,0,0 +BRDA:1010,170,1,0 +BRDA:1012,171,0,0 +BRDA:1012,171,1,0 +BRDA:1017,172,0,0 +BRDA:1017,172,1,0 +BRDA:1020,173,0,0 +BRDA:1020,173,1,0 +BRDA:1025,174,0,0 +BRDA:1025,174,1,0 +BRDA:1025,175,0,0 +BRDA:1025,175,1,0 +BRDA:1032,176,0,0 +BRDA:1032,176,1,0 +BRDA:1045,177,0,0 +BRDA:1045,177,1,0 +BRDA:1049,178,0,0 +BRDA:1049,178,1,0 +BRDA:1052,179,0,0 +BRDA:1052,179,1,0 +BRDA:1055,180,0,0 +BRDA:1055,180,1,0 +BRDA:1060,181,0,0 +BRDA:1060,181,1,0 +BRDA:1070,182,0,0 +BRDA:1070,182,1,0 +BRDA:1078,183,0,0 +BRDA:1078,183,1,0 +BRDA:1080,184,0,0 +BRDA:1080,184,1,0 +BRDA:1082,185,0,0 +BRDA:1082,185,1,0 +BRDA:1090,186,0,0 +BRDA:1090,186,1,0 +BRDA:1100,187,0,0 +BRDA:1100,187,1,0 +BRDA:1102,188,0,0 +BRDA:1102,188,1,0 +BRDA:1104,189,0,0 +BRDA:1104,189,1,0 +BRDA:1106,190,0,0 +BRDA:1106,190,1,0 +BRDA:1115,191,0,0 +BRDA:1115,191,1,0 +BRDA:1127,192,0,0 +BRDA:1127,192,1,0 +BRDA:1130,193,0,0 +BRDA:1130,193,1,0 +BRDA:1132,194,0,0 +BRDA:1132,194,1,0 +BRDA:1132,195,0,0 +BRDA:1132,195,1,0 +BRDA:1132,195,2,0 +BRDA:1132,195,3,0 +BRDA:1134,196,0,0 +BRDA:1134,196,1,0 +BRDA:1134,197,0,0 +BRDA:1134,197,1,0 +BRDA:1134,197,2,0 +BRDA:1134,197,3,0 +BRDA:1143,198,0,0 +BRDA:1143,198,1,0 +BRDA:1143,199,0,0 +BRDA:1143,199,1,0 +BRDA:1162,200,0,0 +BRDA:1162,200,1,0 +BRDA:1166,201,0,0 +BRDA:1166,201,1,0 +BRDA:1167,202,0,0 +BRDA:1167,202,1,0 +BRDA:1173,203,0,0 +BRDA:1173,203,1,0 +BRDA:1180,204,0,0 +BRDA:1180,204,1,0 +BRDA:1182,205,0,0 +BRDA:1182,205,1,0 +BRDA:1187,206,0,0 +BRDA:1187,206,1,0 +BRDA:1187,207,0,0 +BRDA:1187,207,1,0 +BRDA:1187,207,2,0 +BRDA:1189,208,0,0 +BRDA:1189,208,1,0 +BRDA:1192,209,0,0 +BRDA:1192,209,1,0 +BRDA:1194,210,0,0 +BRDA:1194,210,1,0 +BRDA:1194,211,0,0 +BRDA:1194,211,1,0 +BRDA:1196,212,0,0 +BRDA:1196,212,1,0 +BRDA:1196,213,0,0 +BRDA:1196,213,1,0 +BRDA:1198,214,0,0 +BRDA:1198,214,1,0 +BRDA:1198,215,0,0 +BRDA:1198,215,1,0 +BRDA:1198,215,2,0 +BRDA:1198,215,3,0 +BRDA:1216,216,0,0 +BRDA:1216,216,1,0 +BRDA:1224,217,0,0 +BRDA:1224,217,1,0 +BRDA:1229,218,0,0 +BRDA:1229,218,1,0 +BRDA:1245,219,0,0 +BRDA:1245,219,1,0 +BRDA:1249,220,0,0 +BRDA:1249,220,1,0 +BRDA:1256,221,0,0 +BRDA:1256,221,1,0 +BRDA:1257,222,0,0 +BRDA:1257,222,1,0 +BRDA:1283,223,0,0 +BRDA:1283,223,1,0 +BRDA:1283,224,0,0 +BRDA:1283,224,1,0 +BRDA:1293,225,0,0 +BRDA:1293,225,1,0 +BRDA:1297,226,0,0 +BRDA:1297,226,1,0 +BRDA:1303,227,0,0 +BRDA:1303,227,1,0 +BRDA:1305,228,0,0 +BRDA:1305,228,1,0 +BRDA:1309,229,0,0 +BRDA:1309,229,1,0 +BRDA:1358,230,0,0 +BRDA:1358,230,1,0 +BRDA:1364,231,0,0 +BRDA:1364,231,1,0 +BRDA:1364,232,0,0 +BRDA:1364,232,1,0 +BRDA:1369,233,0,0 +BRDA:1369,233,1,0 +BRDA:1377,234,0,0 +BRDA:1377,234,1,0 +BRDA:1377,235,0,0 +BRDA:1377,235,1,0 +BRDA:1381,236,0,0 +BRDA:1381,236,1,0 +BRDA:1382,237,0,0 +BRDA:1382,237,1,0 +BRDA:1384,238,0,0 +BRDA:1384,238,1,0 +BRDA:1399,239,0,0 +BRDA:1399,239,1,0 +BRDA:1404,240,0,0 +BRDA:1404,240,1,0 +BRDA:1415,241,0,0 +BRDA:1415,241,1,0 +BRDA:1415,242,0,0 +BRDA:1415,242,1,0 +BRDA:1439,243,0,0 +BRDA:1439,243,1,0 +BRDA:1439,243,2,0 +BRDA:1439,243,3,0 +BRDA:1439,243,4,0 +BRDA:1448,244,0,0 +BRDA:1448,244,1,0 +BRDA:1468,245,0,0 +BRDA:1468,245,1,0 +BRDA:1469,246,0,0 +BRDA:1469,246,1,0 +BRDA:1518,247,0,0 +BRDA:1518,247,1,0 +BRDA:1529,248,0,0 +BRDA:1529,248,1,0 +BRDA:1529,249,0,0 +BRDA:1529,249,1,0 +BRDA:1531,250,0,0 +BRDA:1531,250,1,0 +BRDA:1584,251,0,0 +BRDA:1584,251,1,0 +BRDA:1587,252,0,0 +BRDA:1587,252,1,0 +BRDA:1589,253,0,0 +BRDA:1589,253,1,0 +BRDA:1597,254,0,0 +BRDA:1597,254,1,0 +BRDA:1606,255,0,0 +BRDA:1606,255,1,0 +BRDA:1656,256,0,0 +BRDA:1656,256,1,0 +BRDA:1660,257,0,0 +BRDA:1660,257,1,0 +BRDA:1697,258,0,0 +BRDA:1697,258,1,0 +BRDA:1699,259,0,0 +BRDA:1699,259,1,0 +BRDA:1700,260,0,0 +BRDA:1700,260,1,0 +BRDA:1704,261,0,0 +BRDA:1704,261,1,0 +BRDA:1704,262,0,0 +BRDA:1704,262,1,0 +BRDA:1727,263,0,0 +BRDA:1727,263,1,0 +BRDA:1732,264,0,0 +BRDA:1732,264,1,0 +BRDA:1737,265,0,0 +BRDA:1737,265,1,0 +BRDA:1751,266,0,0 +BRDA:1751,266,1,0 +BRDA:1754,267,0,0 +BRDA:1754,267,1,0 +BRDA:1765,268,0,0 +BRDA:1765,268,1,0 +BRDA:1771,269,0,0 +BRDA:1771,269,1,0 +BRDA:1777,270,0,0 +BRDA:1777,270,1,0 +BRDA:1792,271,0,0 +BRDA:1792,271,1,0 +BRDA:1797,272,0,0 +BRDA:1797,272,1,0 +BRDA:1869,273,0,0 +BRDA:1869,273,1,0 +BRDA:1879,274,0,0 +BRDA:1879,274,1,0 +BRDA:1879,274,2,0 +BRDA:1879,274,3,0 +BRDA:1889,275,0,0 +BRDA:1889,275,1,0 +BRDA:1907,276,0,0 +BRDA:1907,276,1,0 +BRDA:1909,277,0,0 +BRDA:1909,277,1,0 +BRDA:1913,278,0,0 +BRDA:1913,278,1,0 +BRDA:1919,279,0,0 +BRDA:1919,279,1,0 +BRDA:1924,280,0,0 +BRDA:1924,280,1,0 +BRDA:1925,281,0,0 +BRDA:1925,281,1,0 +BRDA:1933,282,0,0 +BRDA:1933,282,1,0 +BRDA:1934,283,0,0 +BRDA:1934,283,1,0 +BRDA:1943,284,0,0 +BRDA:1943,284,1,0 +BRDA:1943,285,0,0 +BRDA:1943,285,1,0 +BRDA:1954,286,0,0 +BRDA:1954,286,1,0 +BRDA:1956,287,0,0 +BRDA:1956,287,1,0 +BRDA:1958,288,0,0 +BRDA:1958,288,1,0 +BRDA:1962,289,0,0 +BRDA:1962,289,1,0 +BRDA:1963,290,0,0 +BRDA:1963,290,1,0 +BRDA:1966,291,0,0 +BRDA:1966,291,1,0 +BRDA:1971,292,0,0 +BRDA:1971,292,1,0 +BRDA:2006,293,0,0 +BRDA:2006,293,1,0 +BRDA:2032,294,0,0 +BRDA:2032,294,1,0 +BRDA:2032,295,0,0 +BRDA:2032,295,1,0 +BRDA:2044,296,0,0 +BRDA:2044,296,1,0 +BRDA:2054,297,0,0 +BRDA:2054,297,1,0 +BRDA:2064,298,0,0 +BRDA:2064,298,1,0 +BRDA:2065,299,0,0 +BRDA:2065,299,1,0 +BRDA:2073,300,0,0 +BRDA:2073,300,1,0 +BRDA:2081,301,0,0 +BRDA:2081,301,1,0 +BRDA:2089,302,0,0 +BRDA:2089,302,1,0 +BRDA:2093,303,0,0 +BRDA:2093,303,1,0 +BRDA:2093,304,0,0 +BRDA:2093,304,1,0 +BRDA:2097,305,0,0 +BRDA:2097,305,1,0 +BRDA:2105,306,0,0 +BRDA:2105,306,1,0 +BRDA:2110,307,0,0 +BRDA:2110,307,1,0 +BRDA:2115,308,0,0 +BRDA:2115,308,1,0 +BRDA:2116,309,0,0 +BRDA:2116,309,1,0 +BRDA:2121,310,0,0 +BRDA:2121,310,1,0 +BRDA:2121,310,2,0 +BRDA:2121,310,3,0 +BRDA:2121,310,4,0 +BRDA:2121,310,5,0 +BRDA:2121,310,6,0 +BRDA:2121,310,7,0 +BRDA:2121,310,8,0 +BRDA:2121,310,9,0 +BRDA:2121,310,10,0 +BRDA:2121,310,11,0 +BRDA:2140,311,0,0 +BRDA:2140,311,1,0 +BRDA:2142,312,0,0 +BRDA:2142,312,1,0 +BRDA:2147,313,0,0 +BRDA:2147,313,1,0 +BRDA:2165,314,0,0 +BRDA:2165,314,1,0 +BRDA:2168,315,0,0 +BRDA:2168,315,1,0 +BRDA:2173,316,0,0 +BRDA:2173,316,1,0 +BRDA:2173,316,2,0 +BRDA:2173,316,3,0 +BRDA:2173,316,4,0 +BRDA:2173,316,5,0 +BRDA:2173,316,6,0 +BRDA:2173,316,7,0 +BRDA:2173,316,8,0 +BRDA:2173,316,9,0 +BRDA:2173,316,10,0 +BRDA:2173,316,11,0 +BRDA:2173,316,12,0 +BRDA:2193,317,0,0 +BRDA:2193,317,1,0 +BRDA:2205,318,0,0 +BRDA:2205,318,1,0 +BRDA:2205,319,0,0 +BRDA:2205,319,1,0 +BRDA:2207,320,0,0 +BRDA:2207,320,1,0 +BRDA:2208,321,0,0 +BRDA:2208,321,1,0 +BRDA:2209,322,0,0 +BRDA:2209,322,1,0 +BRDA:2210,323,0,0 +BRDA:2210,323,1,0 +BRDA:2213,324,0,0 +BRDA:2213,324,1,0 +BRDA:2213,324,2,0 +BRDA:2213,324,3,0 +BRDA:2213,324,4,0 +BRDA:2213,324,5,0 +BRDA:2213,324,6,0 +BRDA:2213,324,7,0 +BRDA:2213,324,8,0 +BRDA:2213,324,9,0 +BRDA:2213,324,10,0 +BRDA:2237,325,0,0 +BRDA:2237,325,1,0 +BRDA:2246,326,0,0 +BRDA:2246,326,1,0 +BRDA:2247,327,0,0 +BRDA:2247,327,1,0 +BRDA:2252,328,0,0 +BRDA:2252,328,1,0 +BRDA:2253,329,0,0 +BRDA:2253,329,1,0 +BRDA:2260,330,0,0 +BRDA:2260,330,1,0 +BRDA:2262,331,0,0 +BRDA:2262,331,1,0 +BRDA:2268,332,0,0 +BRDA:2268,332,1,0 +BRDA:2269,333,0,0 +BRDA:2269,333,1,0 +BRDA:2274,334,0,0 +BRDA:2274,334,1,0 +BRDA:2275,335,0,0 +BRDA:2275,335,1,0 +BRDA:2278,336,0,0 +BRDA:2278,336,1,0 +BRDA:2279,337,0,0 +BRDA:2279,337,1,0 +BRDA:2282,338,0,0 +BRDA:2282,338,1,0 +BRDA:2284,339,0,0 +BRDA:2284,339,1,0 +BRDA:2285,340,0,0 +BRDA:2285,340,1,0 +BRDA:2288,341,0,0 +BRDA:2288,341,1,0 +BRDA:2291,342,0,0 +BRDA:2291,342,1,0 +BRDA:2292,343,0,0 +BRDA:2292,343,1,0 +BRDA:2292,344,0,0 +BRDA:2292,344,1,0 +BRDA:2301,345,0,0 +BRDA:2301,345,1,0 +BRDA:2301,346,0,0 +BRDA:2301,346,1,0 +BRDA:2302,347,0,0 +BRDA:2302,347,1,0 +BRDA:2303,348,0,0 +BRDA:2303,348,1,0 +BRDA:2327,349,0,0 +BRDA:2327,349,1,0 +BRDA:2329,350,0,0 +BRDA:2329,350,1,0 +BRDA:2333,351,0,0 +BRDA:2333,351,1,0 +BRDA:2340,352,0,0 +BRDA:2340,352,1,0 +BRDA:2342,353,0,0 +BRDA:2342,353,1,0 +BRDA:2347,354,0,0 +BRDA:2347,354,1,0 +BRDA:2375,355,0,0 +BRDA:2375,355,1,0 +BRDA:2380,356,0,0 +BRDA:2380,356,1,0 +BRDA:2380,357,0,0 +BRDA:2380,357,1,0 +BRDA:2385,358,0,0 +BRDA:2385,358,1,0 +BRDA:2387,359,0,0 +BRDA:2387,359,1,0 +BRDA:2389,360,0,0 +BRDA:2389,360,1,0 +BRDA:2403,361,0,0 +BRDA:2403,361,1,0 +BRDA:2403,362,0,0 +BRDA:2403,362,1,0 +BRDA:2405,363,0,0 +BRDA:2405,363,1,0 +BRDA:2405,364,0,0 +BRDA:2405,364,1,0 +BRDA:2405,364,2,0 +BRDA:2405,364,3,0 +BRDA:2409,365,0,0 +BRDA:2409,365,1,0 +BRDA:2413,366,0,0 +BRDA:2413,366,1,0 +BRDA:2413,366,2,0 +BRDA:2413,366,3,0 +BRDA:2413,366,4,0 +BRDA:2413,366,5,0 +BRDA:2413,366,6,0 +BRDA:2413,366,7,0 +BRDA:2413,366,8,0 +BRDA:2413,366,9,0 +BRDA:2413,366,10,0 +BRDA:2438,367,0,0 +BRDA:2438,367,1,0 +BRDA:2448,368,0,0 +BRDA:2448,368,1,0 +BRDA:2453,369,0,0 +BRDA:2453,369,1,0 +BRDA:2453,370,0,0 +BRDA:2453,370,1,0 +BRDA:2468,371,0,0 +BRDA:2468,371,1,0 +BRDA:2469,372,0,0 +BRDA:2469,372,1,0 +BRDA:2470,373,0,0 +BRDA:2470,373,1,0 +BRDA:2473,374,0,0 +BRDA:2473,374,1,0 +BRDA:2476,375,0,0 +BRDA:2476,375,1,0 +BRDA:2476,375,2,0 +BRDA:2476,375,3,0 +BRDA:2478,376,0,0 +BRDA:2478,376,1,0 +BRDA:2484,377,0,0 +BRDA:2484,377,1,0 +BRDA:2486,378,0,0 +BRDA:2486,378,1,0 +BRDA:2494,379,0,0 +BRDA:2494,379,1,0 +BRDA:2494,380,0,0 +BRDA:2494,380,1,0 +BRDA:2496,381,0,0 +BRDA:2496,381,1,0 +BRDA:2496,382,0,0 +BRDA:2496,382,1,0 +BRDA:2496,382,2,0 +BRDA:2505,383,0,0 +BRDA:2505,383,1,0 +BRDA:2505,384,0,0 +BRDA:2505,384,1,0 +BRDA:2505,384,2,0 +BRDA:2507,385,0,0 +BRDA:2507,385,1,0 +BRDA:2507,386,0,0 +BRDA:2507,386,1,0 +BRDA:2514,387,0,0 +BRDA:2514,387,1,0 +BRDA:2519,388,0,0 +BRDA:2519,388,1,0 +BRDA:2540,389,0,0 +BRDA:2540,389,1,0 +BRDA:2579,390,0,0 +BRDA:2579,390,1,0 +BRDA:2579,391,0,0 +BRDA:2579,391,1,0 +BRDA:2580,392,0,0 +BRDA:2580,392,1,0 +BRDA:2580,393,0,0 +BRDA:2580,393,1,0 +BRDA:2580,393,2,0 +BRDA:2601,394,0,0 +BRDA:2601,394,1,0 +BRDA:2603,395,0,0 +BRDA:2603,395,1,0 +BRDA:2605,396,0,0 +BRDA:2605,396,1,0 +BRDA:2606,397,0,0 +BRDA:2606,397,1,0 +BRDA:2610,398,0,0 +BRDA:2610,398,1,0 +BRDA:2612,399,0,0 +BRDA:2612,399,1,0 +BRDA:2613,400,0,0 +BRDA:2613,400,1,0 +BRDA:2617,401,0,0 +BRDA:2617,401,1,0 +BRDA:2620,402,0,0 +BRDA:2620,402,1,0 +BRDA:2630,403,0,0 +BRDA:2630,403,1,0 +BRDA:2630,404,0,0 +BRDA:2630,404,1,0 +BRDA:2639,405,0,0 +BRDA:2639,405,1,0 +BRDA:2639,406,0,0 +BRDA:2639,406,1,0 +BRDA:2640,407,0,0 +BRDA:2640,407,1,0 +BRDA:2646,408,0,0 +BRDA:2646,408,1,0 +BRDA:2651,409,0,0 +BRDA:2651,409,1,0 +BRDA:2661,410,0,0 +BRDA:2661,410,1,0 +BRDA:2667,411,0,0 +BRDA:2667,411,1,0 +BRDA:2675,412,0,0 +BRDA:2675,412,1,0 +BRDA:2680,413,0,0 +BRDA:2680,413,1,0 +BRDA:2685,414,0,0 +BRDA:2685,414,1,0 +BRDA:2690,415,0,0 +BRDA:2690,415,1,0 +BRDA:2699,416,0,0 +BRDA:2699,416,1,0 +BRDA:2710,417,0,0 +BRDA:2710,417,1,0 +BRDA:2715,418,0,0 +BRDA:2715,418,1,0 +BRDA:2720,419,0,0 +BRDA:2720,419,1,0 +BRDA:2728,420,0,0 +BRDA:2728,420,1,0 +BRDA:2733,421,0,0 +BRDA:2733,421,1,0 +BRDA:2738,422,0,0 +BRDA:2738,422,1,0 +BRDA:2744,423,0,0 +BRDA:2744,423,1,0 +BRDA:2745,424,0,0 +BRDA:2745,424,1,0 +BRDA:2750,425,0,0 +BRDA:2750,425,1,0 +BRDA:2752,426,0,0 +BRDA:2752,426,1,0 +BRDA:2756,427,0,0 +BRDA:2756,427,1,0 +BRDA:2758,428,0,0 +BRDA:2758,428,1,0 +BRDA:2762,429,0,0 +BRDA:2762,429,1,0 +BRDA:2771,430,0,0 +BRDA:2771,430,1,0 +BRDA:2780,431,0,0 +BRDA:2780,431,1,0 +BRDA:2785,432,0,0 +BRDA:2785,432,1,0 +BRDA:2790,433,0,0 +BRDA:2790,433,1,0 +BRDA:2795,434,0,0 +BRDA:2795,434,1,0 +BRDA:2800,435,0,0 +BRDA:2800,435,1,0 +BRDA:2801,436,0,0 +BRDA:2801,436,1,0 +BRDA:2801,437,0,0 +BRDA:2801,437,1,0 +BRDA:2802,438,0,0 +BRDA:2802,438,1,0 +BRDA:2809,439,0,0 +BRDA:2809,439,1,0 +BRDA:2814,440,0,0 +BRDA:2814,440,1,0 +BRDA:2825,441,0,0 +BRDA:2825,441,1,0 +BRDA:2830,442,0,0 +BRDA:2830,442,1,0 +BRDA:2840,443,0,0 +BRDA:2840,443,1,0 +BRDA:2841,444,0,0 +BRDA:2841,444,1,0 +BRDA:2847,445,0,0 +BRDA:2847,445,1,0 +BRDA:2849,446,0,0 +BRDA:2849,446,1,0 +BRDA:2850,447,0,0 +BRDA:2850,447,1,0 +BRDA:2857,448,0,0 +BRDA:2857,448,1,0 +BRDA:2858,449,0,0 +BRDA:2858,449,1,0 +BRDA:2870,450,0,0 +BRDA:2870,450,1,0 +BRDA:2871,451,0,0 +BRDA:2871,451,1,0 +BRDA:2881,452,0,0 +BRDA:2881,452,1,0 +BRDA:2883,453,0,0 +BRDA:2883,453,1,0 +BRDA:2890,454,0,0 +BRDA:2890,454,1,0 +BRDA:2891,455,0,0 +BRDA:2891,455,1,0 +BRDA:2905,456,0,0 +BRDA:2905,456,1,0 +BRDA:2906,457,0,0 +BRDA:2906,457,1,0 +BRDA:2920,458,0,0 +BRDA:2920,458,1,0 +BRDA:2928,459,0,0 +BRDA:2928,459,1,0 +BRDA:2930,460,0,0 +BRDA:2930,460,1,0 +BRDA:2940,461,0,0 +BRDA:2940,461,1,0 +BRDA:2948,462,0,0 +BRDA:2948,462,1,0 +BRDA:2950,463,0,0 +BRDA:2950,463,1,0 +BRDA:2960,464,0,0 +BRDA:2960,464,1,0 +BRDA:2961,465,0,0 +BRDA:2961,465,1,0 +BRDA:2962,466,0,0 +BRDA:2962,466,1,0 +BRDA:2970,467,0,0 +BRDA:2970,467,1,0 +BRDA:2971,468,0,0 +BRDA:2971,468,1,0 +BRDA:2983,469,0,0 +BRDA:2983,469,1,0 +BRDA:2984,470,0,0 +BRDA:2984,470,1,0 +BRDA:2996,471,0,0 +BRDA:2996,471,1,0 +BRDA:2997,472,0,0 +BRDA:2997,472,1,0 +BRDA:3011,473,0,0 +BRDA:3011,473,1,0 +BRDA:3012,474,0,0 +BRDA:3012,474,1,0 +BRDA:3013,475,0,0 +BRDA:3013,475,1,0 +BRDA:3025,476,0,0 +BRDA:3025,476,1,0 +BRDA:3025,477,0,0 +BRDA:3025,477,1,0 +BRDA:3026,478,0,0 +BRDA:3026,478,1,0 +BRDA:3027,479,0,0 +BRDA:3027,479,1,0 +BRDA:3031,480,0,0 +BRDA:3031,480,1,0 +BRDA:3047,481,0,0 +BRDA:3047,481,1,0 +BRDA:3064,482,0,0 +BRDA:3064,482,1,0 +BRDA:3065,483,0,0 +BRDA:3065,483,1,0 +BRDA:3065,484,0,0 +BRDA:3065,484,1,0 +BRDA:3066,485,0,0 +BRDA:3066,485,1,0 +BRDA:3067,486,0,0 +BRDA:3067,486,1,0 +BRDA:3068,487,0,0 +BRDA:3068,487,1,0 +BRDA:3068,488,0,0 +BRDA:3068,488,1,0 +BRDA:3071,489,0,0 +BRDA:3071,489,1,0 +BRDA:3072,490,0,0 +BRDA:3072,490,1,0 +BRDA:3072,491,0,0 +BRDA:3072,491,1,0 +BRDA:3075,492,0,0 +BRDA:3075,492,1,0 +BRDA:3078,493,0,0 +BRDA:3078,493,1,0 +BRDA:3078,494,0,0 +BRDA:3078,494,1,0 +BRDA:3079,495,0,0 +BRDA:3079,495,1,0 +BRDA:3082,496,0,0 +BRDA:3082,496,1,0 +BRDA:3083,497,0,0 +BRDA:3083,497,1,0 +BRDA:3090,498,0,0 +BRDA:3090,498,1,0 +BRDA:3090,499,0,0 +BRDA:3090,499,1,0 +BRDA:3090,499,2,0 +BRDA:3095,500,0,0 +BRDA:3095,500,1,0 +BRDA:3095,501,0,0 +BRDA:3095,501,1,0 +BRDA:3109,502,0,0 +BRDA:3109,502,1,0 +BRDA:3110,503,0,0 +BRDA:3110,503,1,0 +BRDA:3111,504,0,0 +BRDA:3111,504,1,0 +BRDA:3113,505,0,0 +BRDA:3113,505,1,0 +BRDA:3116,506,0,0 +BRDA:3116,506,1,0 +BRDA:3117,507,0,0 +BRDA:3117,507,1,0 +BRDA:3119,508,0,0 +BRDA:3119,508,1,0 +BRDA:3119,509,0,0 +BRDA:3119,509,1,0 +BRDA:3120,510,0,0 +BRDA:3120,510,1,0 +BRDA:3120,511,0,0 +BRDA:3120,511,1,0 +BRDA:3123,512,0,0 +BRDA:3123,512,1,0 +BRDA:3143,513,0,0 +BRDA:3143,513,1,0 +BRDA:3144,514,0,0 +BRDA:3144,514,1,0 +BRDA:3235,515,0,0 +BRDA:3235,515,1,0 +BRDA:3244,516,0,0 +BRDA:3244,516,1,0 +BRDA:3249,517,0,0 +BRDA:3249,517,1,0 +BRDA:3254,518,0,0 +BRDA:3254,518,1,0 +BRDA:3264,519,0,0 +BRDA:3264,519,1,0 +BRDA:3264,520,0,0 +BRDA:3264,520,1,0 +BRDA:3266,521,0,0 +BRDA:3266,521,1,0 +BRDA:3268,522,0,0 +BRDA:3268,522,1,0 +BRDA:3270,523,0,0 +BRDA:3270,523,1,0 +BRDA:3272,524,0,0 +BRDA:3272,524,1,0 +BRDA:3274,525,0,0 +BRDA:3274,525,1,0 +BRDA:3285,526,0,0 +BRDA:3285,526,1,0 +BRDA:3286,527,0,0 +BRDA:3286,527,1,0 +BRDA:3293,528,0,0 +BRDA:3293,528,1,0 +BRDA:3295,529,0,0 +BRDA:3295,529,1,0 +BRDA:3301,530,0,0 +BRDA:3301,530,1,0 +BRDA:3302,531,0,0 +BRDA:3302,531,1,0 +BRDA:3304,532,0,0 +BRDA:3304,532,1,0 +BRDA:3305,533,0,0 +BRDA:3305,533,1,0 +BRDA:3310,534,0,0 +BRDA:3310,534,1,0 +BRDA:3311,535,0,0 +BRDA:3311,535,1,0 +BRDA:3317,536,0,0 +BRDA:3317,536,1,0 +BRDA:3318,537,0,0 +BRDA:3318,537,1,0 +BRDA:3346,538,0,0 +BRDA:3346,538,1,0 +BRDA:3364,539,0,0 +BRDA:3364,539,1,0 +BRDA:3364,540,0,0 +BRDA:3364,540,1,0 +BRDA:3370,541,0,0 +BRDA:3370,541,1,0 +BRDA:3370,542,0,0 +BRDA:3370,542,1,0 +BRDA:3370,543,0,0 +BRDA:3370,543,1,0 +BRDA:3377,544,0,0 +BRDA:3377,544,1,0 +BRDA:3391,545,0,0 +BRDA:3391,545,1,0 +BRDA:3391,546,0,0 +BRDA:3391,546,1,0 +BRDA:3394,547,0,0 +BRDA:3394,547,1,0 +BRDA:3394,548,0,0 +BRDA:3394,548,1,0 +BRDA:3397,549,0,0 +BRDA:3397,549,1,0 +BRDA:3399,550,0,0 +BRDA:3399,550,1,0 +BRDA:3401,551,0,0 +BRDA:3401,551,1,0 +BRDA:3403,552,0,0 +BRDA:3403,552,1,0 +BRDA:3410,553,0,0 +BRDA:3410,553,1,0 +BRDA:3420,554,0,0 +BRDA:3420,554,1,0 +BRDA:3420,555,0,0 +BRDA:3420,555,1,0 +BRDA:3426,556,0,0 +BRDA:3426,556,1,0 +BRDA:3441,557,0,0 +BRDA:3441,557,1,0 +BRDA:3444,558,0,0 +BRDA:3444,558,1,0 +BRDA:3474,559,0,0 +BRDA:3474,559,1,0 +BRDA:3495,560,0,0 +BRDA:3495,560,1,0 +BRDA:3504,561,0,0 +BRDA:3504,561,1,0 +BRDA:3505,562,0,0 +BRDA:3505,562,1,0 +BRDA:3520,563,0,0 +BRDA:3520,563,1,0 +BRDA:3522,564,0,0 +BRDA:3522,564,1,0 +BRDA:3523,565,0,0 +BRDA:3523,565,1,0 +BRDA:3523,566,0,0 +BRDA:3523,566,1,0 +BRDA:3528,567,0,0 +BRDA:3528,567,1,0 +BRDA:3536,568,0,0 +BRDA:3536,568,1,0 +BRDA:3537,569,0,0 +BRDA:3537,569,1,0 +BRDA:3538,570,0,0 +BRDA:3538,570,1,0 +BRDA:3539,571,0,0 +BRDA:3539,571,1,0 +BRDA:3539,572,0,0 +BRDA:3539,572,1,0 +BRDA:3539,572,2,0 +BRDA:3543,573,0,0 +BRDA:3543,573,1,0 +BRDA:3543,574,0,0 +BRDA:3543,574,1,0 +BRDA:3544,575,0,0 +BRDA:3544,575,1,0 +BRDA:3548,576,0,0 +BRDA:3548,576,1,0 +BRDA:3552,577,0,0 +BRDA:3552,577,1,0 +BRDA:3557,578,0,0 +BRDA:3557,578,1,0 +BRDA:3562,579,0,0 +BRDA:3562,579,1,0 +BRDA:3565,580,0,0 +BRDA:3565,580,1,0 +BRDA:3586,581,0,0 +BRDA:3586,581,1,0 +BRDA:3613,582,0,0 +BRDA:3613,582,1,0 +BRDA:3614,583,0,0 +BRDA:3614,583,1,0 +BRDA:3631,584,0,0 +BRDA:3631,584,1,0 +BRDA:3631,585,0,0 +BRDA:3631,585,1,0 +BRDA:3631,585,2,0 +BRDA:3640,586,0,0 +BRDA:3640,586,1,0 +BRDA:3644,587,0,0 +BRDA:3644,587,1,0 +BRDA:3645,588,0,0 +BRDA:3645,588,1,0 +BRDA:3645,589,0,0 +BRDA:3645,589,1,0 +BRDA:3645,589,2,0 +BRDA:3648,590,0,0 +BRDA:3648,590,1,0 +BRDA:3657,591,0,0 +BRDA:3657,591,1,0 +BRDA:3660,592,0,0 +BRDA:3660,592,1,0 +BRDA:3661,593,0,0 +BRDA:3661,593,1,0 +BRDA:3661,593,2,0 +BRDA:3661,593,3,0 +BRDA:3680,594,0,0 +BRDA:3680,594,1,0 +BRDA:3698,595,0,0 +BRDA:3698,595,1,0 +BRDA:3701,596,0,0 +BRDA:3701,596,1,0 +BRDA:3706,597,0,0 +BRDA:3706,597,1,0 +BRDA:3708,598,0,0 +BRDA:3708,598,1,0 +BRDA:3711,599,0,0 +BRDA:3711,599,1,0 +BRDA:3714,600,0,0 +BRDA:3714,600,1,0 +BRDA:3722,601,0,0 +BRDA:3722,601,1,0 +BRDA:3722,602,0,0 +BRDA:3722,602,1,0 +BRDA:3724,603,0,0 +BRDA:3724,603,1,0 +BRDA:3730,604,0,0 +BRDA:3730,604,1,0 +BRDA:3730,605,0,0 +BRDA:3730,605,1,0 +BRDA:3730,605,2,0 +BRDA:3736,606,0,0 +BRDA:3736,606,1,0 +BRDA:3749,607,0,0 +BRDA:3749,607,1,0 +BRDA:3757,608,0,0 +BRDA:3757,608,1,0 +BRDA:3773,609,0,0 +BRDA:3773,609,1,0 +BRDA:3776,610,0,0 +BRDA:3776,610,1,0 +BRDA:3776,611,0,0 +BRDA:3776,611,1,0 +BRDA:3783,612,0,0 +BRDA:3783,612,1,0 +BRDA:3783,613,0,0 +BRDA:3783,613,1,0 +BRDA:3783,613,2,0 +BRDA:3786,614,0,0 +BRDA:3786,614,1,0 +BRDA:3789,615,0,0 +BRDA:3789,615,1,0 +BRDA:3791,616,0,0 +BRDA:3791,616,1,0 +BRDA:3791,617,0,0 +BRDA:3791,617,1,0 +BRDA:3791,617,2,0 +BRDA:3798,618,0,0 +BRDA:3798,618,1,0 +BRDA:3801,619,0,0 +BRDA:3801,619,1,0 +BRDA:3808,620,0,0 +BRDA:3808,620,1,0 +BRDA:3818,621,0,0 +BRDA:3818,621,1,0 +BRDA:3822,622,0,0 +BRDA:3822,622,1,0 +BRDA:3823,623,0,0 +BRDA:3823,623,1,0 +BRDA:3825,624,0,0 +BRDA:3825,624,1,0 +BRDA:3831,625,0,0 +BRDA:3831,625,1,0 +BRDA:3833,626,0,0 +BRDA:3833,626,1,0 +BRDA:3843,627,0,0 +BRDA:3843,627,1,0 +BRDA:3857,628,0,0 +BRDA:3857,628,1,0 +BRDA:3857,629,0,0 +BRDA:3857,629,1,0 +BRDA:3859,630,0,0 +BRDA:3859,630,1,0 +BRDA:3868,631,0,0 +BRDA:3868,631,1,0 +BRDA:3868,632,0,0 +BRDA:3868,632,1,0 +BRDA:3870,633,0,0 +BRDA:3870,633,1,0 +BRDA:3886,634,0,0 +BRDA:3886,634,1,0 +BRDA:3894,635,0,0 +BRDA:3894,635,1,0 +BRDA:3929,636,0,0 +BRDA:3929,636,1,0 +BRDA:3929,636,2,0 +BRDA:3929,636,3,0 +BRDA:3929,636,4,0 +BRDA:3938,637,0,0 +BRDA:3938,637,1,0 +BRDA:3946,638,0,0 +BRDA:3946,638,1,0 +BRDA:3969,639,0,0 +BRDA:3969,639,1,0 +BRDA:4000,640,0,0 +BRDA:4000,640,1,0 +BRDA:4005,641,0,0 +BRDA:4005,641,1,0 +BRDA:4011,642,0,0 +BRDA:4011,642,1,0 +BRDA:4022,643,0,0 +BRDA:4022,643,1,0 +BRDA:4036,644,0,0 +BRDA:4036,644,1,0 +BRDA:4042,645,0,0 +BRDA:4042,645,1,0 +BRDA:4042,646,0,0 +BRDA:4042,646,1,0 +BRDA:4088,647,0,0 +BRDA:4088,647,1,0 +BRDA:4088,647,2,0 +BRDA:4088,647,3,0 +BRDA:4090,648,0,0 +BRDA:4090,648,1,0 +BRDA:4090,648,2,0 +BRDA:4090,648,3,0 +BRDA:4092,649,0,0 +BRDA:4092,649,1,0 +BRDA:4093,650,0,0 +BRDA:4093,650,1,0 +BRDA:4094,651,0,0 +BRDA:4094,651,1,0 +BRDA:4094,651,2,0 +BRDA:4183,652,0,0 +BRDA:4183,652,1,0 +BRDA:4217,653,0,0 +BRDA:4217,653,1,0 +BRDA:4217,654,0,0 +BRDA:4217,654,1,0 +BRDA:4217,654,2,0 +BRDA:4220,655,0,0 +BRDA:4220,655,1,0 +BRDA:4246,656,0,0 +BRDA:4246,656,1,0 +BRDA:4266,657,0,0 +BRDA:4266,657,1,0 +BRDA:4269,658,0,0 +BRDA:4269,658,1,0 +BRDA:4272,659,0,0 +BRDA:4272,659,1,0 +BRDA:4302,660,0,0 +BRDA:4302,660,1,0 +BRDA:4341,661,0,0 +BRDA:4341,661,1,0 +BRDA:4347,662,0,0 +BRDA:4347,662,1,0 +BRDA:4356,663,0,0 +BRDA:4356,663,1,0 +BRDA:4365,664,0,0 +BRDA:4365,664,1,0 +BRDA:4371,665,0,0 +BRDA:4371,665,1,0 +BRDA:4371,666,0,0 +BRDA:4371,666,1,0 +BRDA:4376,667,0,0 +BRDA:4376,667,1,0 +BRDA:4376,668,0,0 +BRDA:4376,668,1,0 +BRDA:4378,669,0,0 +BRDA:4378,669,1,0 +BRDA:4383,670,0,0 +BRDA:4383,670,1,0 +BRDA:4396,671,0,0 +BRDA:4396,671,1,0 +BRDA:4452,672,0,0 +BRDA:4452,672,1,0 +BRDA:4463,673,0,0 +BRDA:4463,673,1,0 +BRDA:4474,674,0,0 +BRDA:4474,674,1,0 +BRDA:4474,675,0,0 +BRDA:4474,675,1,0 +BRDA:4482,676,0,0 +BRDA:4482,676,1,0 +BRDA:4492,677,0,0 +BRDA:4492,677,1,0 +BRDA:4492,678,0,0 +BRDA:4492,678,1,0 +BRDA:4496,679,0,0 +BRDA:4496,679,1,0 +BRDA:4499,680,0,0 +BRDA:4499,680,1,0 +BRDA:4499,681,0,0 +BRDA:4499,681,1,0 +BRDA:4500,682,0,0 +BRDA:4500,682,1,0 +BRDA:4538,683,0,0 +BRDA:4538,683,1,0 +BRDA:4557,684,0,0 +BRDA:4557,684,1,0 +BRDA:4593,685,0,0 +BRDA:4593,685,1,0 +BRDA:4594,686,0,0 +BRDA:4594,686,1,0 +BRDA:4594,686,2,0 +BRDA:4601,687,0,0 +BRDA:4601,687,1,0 +BRDA:4601,688,0,0 +BRDA:4601,688,1,0 +BRDA:4602,689,0,0 +BRDA:4602,689,1,0 +BRDA:4608,690,0,0 +BRDA:4608,690,1,0 +BRDA:4618,691,0,0 +BRDA:4618,691,1,0 +BRDA:4618,692,0,0 +BRDA:4618,692,1,0 +BRDA:4618,693,0,0 +BRDA:4618,693,1,0 +BRDA:4651,694,0,0 +BRDA:4651,694,1,0 +BRDA:4652,695,0,0 +BRDA:4652,695,1,0 +BRDA:4655,696,0,0 +BRDA:4655,696,1,0 +BRDA:4655,697,0,0 +BRDA:4655,697,1,0 +BRDA:4663,698,0,0 +BRDA:4663,698,1,0 +BRDA:4663,699,0,0 +BRDA:4663,699,1,0 +BRDA:4669,700,0,0 +BRDA:4669,700,1,0 +BRDA:4669,701,0,0 +BRDA:4669,701,1,0 +BRDA:4678,702,0,0 +BRDA:4678,702,1,0 +BRDA:4689,703,0,0 +BRDA:4689,703,1,0 +BRDA:4691,704,0,0 +BRDA:4691,704,1,0 +BRDA:4701,705,0,0 +BRDA:4701,705,1,0 +BRDA:4730,706,0,0 +BRDA:4730,706,1,0 +BRDA:4730,706,2,0 +BRDA:4730,706,3,0 +BRDA:4735,707,0,0 +BRDA:4735,707,1,0 +BRDA:4738,708,0,0 +BRDA:4738,708,1,0 +BRDA:4746,709,0,0 +BRDA:4746,709,1,0 +BRDA:4747,710,0,0 +BRDA:4747,710,1,0 +BRDA:4748,711,0,0 +BRDA:4748,711,1,0 +BRDA:4752,712,0,0 +BRDA:4752,712,1,0 +BRDA:4755,713,0,0 +BRDA:4755,713,1,0 +BRDA:4766,714,0,0 +BRDA:4766,714,1,0 +BRDA:4771,715,0,0 +BRDA:4771,715,1,0 +BRDA:4776,716,0,0 +BRDA:4776,716,1,0 +BRDA:4784,717,0,0 +BRDA:4784,717,1,0 +BRDA:4787,718,0,0 +BRDA:4787,718,1,0 +BRDA:4810,719,0,0 +BRDA:4810,719,1,0 +BRDA:4839,720,0,0 +BRDA:4839,720,1,0 +BRDA:4844,721,0,0 +BRDA:4844,721,1,0 +BRDA:4850,722,0,0 +BRDA:4850,722,1,0 +BRDA:4850,723,0,0 +BRDA:4850,723,1,0 +BRDA:4853,724,0,0 +BRDA:4853,724,1,0 +BRDA:4853,725,0,0 +BRDA:4853,725,1,0 +BRDA:4857,726,0,0 +BRDA:4857,726,1,0 +BRDA:4857,727,0,0 +BRDA:4857,727,1,0 +BRDA:4867,728,0,0 +BRDA:4867,728,1,0 +BRDA:4867,729,0,0 +BRDA:4867,729,1,0 +BRDA:4904,730,0,0 +BRDA:4904,730,1,0 +BRDA:4951,731,0,0 +BRDA:4951,731,1,0 +BRDA:4968,732,0,0 +BRDA:4968,732,1,0 +BRDA:4968,733,0,0 +BRDA:4968,733,1,0 +BRDA:4981,734,0,0 +BRDA:4981,734,1,0 +BRDA:4983,735,0,0 +BRDA:4983,735,1,0 +BRDA:4989,736,0,0 +BRDA:4989,736,1,0 +BRDA:4990,737,0,0 +BRDA:4990,737,1,0 +BRDA:4995,738,0,0 +BRDA:4995,738,1,0 +BRDA:4996,739,0,0 +BRDA:4996,739,1,0 +BRDA:4996,740,0,0 +BRDA:4996,740,1,0 +BRDA:5025,741,0,0 +BRDA:5025,741,1,0 +BRDA:5039,742,0,0 +BRDA:5039,742,1,0 +BRDA:5040,743,0,0 +BRDA:5040,743,1,0 +BRDA:5049,744,0,0 +BRDA:5049,744,1,0 +BRDA:5051,745,0,0 +BRDA:5051,745,1,0 +BRDA:5059,746,0,0 +BRDA:5059,746,1,0 +BRDA:5059,747,0,0 +BRDA:5059,747,1,0 +BRDA:5072,748,0,0 +BRDA:5072,748,1,0 +BRDA:5072,749,0,0 +BRDA:5072,749,1,0 +BRDA:5073,750,0,0 +BRDA:5073,750,1,0 +BRDA:5074,751,0,0 +BRDA:5074,751,1,0 +BRDA:5095,752,0,0 +BRDA:5095,752,1,0 +BRDA:5097,753,0,0 +BRDA:5097,753,1,0 +BRDA:5100,754,0,0 +BRDA:5100,754,1,0 +BRDA:5100,755,0,0 +BRDA:5100,755,1,0 +BRDA:5100,755,2,0 +BRDA:5101,756,0,0 +BRDA:5101,756,1,0 +BRDA:5101,757,0,0 +BRDA:5101,757,1,0 +BRDA:5104,758,0,0 +BRDA:5104,758,1,0 +BRDA:5104,759,0,0 +BRDA:5104,759,1,0 +BRDA:5108,760,0,0 +BRDA:5108,760,1,0 +BRDA:5108,761,0,0 +BRDA:5108,761,1,0 +BRDA:5108,761,2,0 +BRDA:5111,762,0,0 +BRDA:5111,762,1,0 +BRDA:5115,763,0,0 +BRDA:5115,763,1,0 +BRDA:5115,764,0,0 +BRDA:5115,764,1,0 +BRDA:5115,764,2,0 +BRDA:5120,765,0,0 +BRDA:5120,765,1,0 +BRDA:5121,766,0,0 +BRDA:5121,766,1,0 +BRDA:5126,767,0,0 +BRDA:5126,767,1,0 +BRDA:5132,768,0,0 +BRDA:5132,768,1,0 +BRDA:5148,769,0,0 +BRDA:5148,769,1,0 +BRDA:5148,769,2,0 +BRDA:5148,769,3,0 +BRDA:5156,770,0,0 +BRDA:5156,770,1,0 +BRDA:5166,771,0,0 +BRDA:5166,771,1,0 +BRDA:5182,772,0,0 +BRDA:5182,772,1,0 +BRDA:5182,773,0,0 +BRDA:5182,773,1,0 +BRDA:5185,774,0,0 +BRDA:5185,774,1,0 +BRDA:5186,775,0,0 +BRDA:5186,775,1,0 +BRDA:5188,776,0,0 +BRDA:5188,776,1,0 +BRDA:5188,777,0,0 +BRDA:5188,777,1,0 +BRDA:5190,778,0,0 +BRDA:5190,778,1,0 +BRDA:5190,779,0,0 +BRDA:5190,779,1,0 +BRDA:5196,780,0,0 +BRDA:5196,780,1,0 +BRDA:5203,781,0,0 +BRDA:5203,781,1,0 +BRDA:5207,782,0,0 +BRDA:5207,782,1,0 +BRDA:5208,783,0,0 +BRDA:5208,783,1,0 +BRDA:5225,784,0,0 +BRDA:5225,784,1,0 +BRDA:5225,785,0,0 +BRDA:5225,785,1,0 +BRDA:5231,786,0,0 +BRDA:5231,786,1,0 +BRDA:5231,787,0,0 +BRDA:5231,787,1,0 +BRDA:5231,787,2,0 +BRDA:5231,787,3,0 +BRDA:5235,788,0,0 +BRDA:5235,788,1,0 +BRDA:5235,789,0,0 +BRDA:5235,789,1,0 +BRDA:5245,790,0,0 +BRDA:5245,790,1,0 +BRDA:5245,791,0,0 +BRDA:5245,791,1,0 +BRDA:5246,792,0,0 +BRDA:5246,792,1,0 +BRDA:5278,793,0,0 +BRDA:5278,793,1,0 +BRDA:5278,794,0,0 +BRDA:5278,794,1,0 +BRDA:5285,795,0,0 +BRDA:5285,795,1,0 +BRDA:5285,796,0,0 +BRDA:5285,796,1,0 +BRDA:5290,797,0,0 +BRDA:5290,797,1,0 +BRDA:5295,798,0,0 +BRDA:5295,798,1,0 +BRDA:5304,799,0,0 +BRDA:5304,799,1,0 +BRDA:5304,800,0,0 +BRDA:5304,800,1,0 +BRDA:5308,801,0,0 +BRDA:5308,801,1,0 +BRDA:5313,802,0,0 +BRDA:5313,802,1,0 +BRDA:5322,803,0,0 +BRDA:5322,803,1,0 +BRDA:5322,804,0,0 +BRDA:5322,804,1,0 +BRDA:5326,805,0,0 +BRDA:5326,805,1,0 +BRDA:5326,806,0,0 +BRDA:5326,806,1,0 +BRDA:5326,806,2,0 +BRDA:5329,807,0,0 +BRDA:5329,807,1,0 +BRDA:5337,808,0,0 +BRDA:5337,808,1,0 +BRDA:5337,809,0,0 +BRDA:5337,809,1,0 +BRDA:5337,809,2,0 +BRDA:5337,809,3,0 +BRDA:5337,809,4,0 +BRDA:5349,810,0,0 +BRDA:5349,810,1,0 +BRDA:5350,811,0,0 +BRDA:5350,811,1,0 +BRDA:5352,812,0,0 +BRDA:5352,812,1,0 +BRDA:5352,813,0,0 +BRDA:5352,813,1,0 +BRDA:5354,814,0,0 +BRDA:5354,814,1,0 +BRDA:5369,815,0,0 +BRDA:5369,815,1,0 +BRDA:5372,816,0,0 +BRDA:5372,816,1,0 +BRDA:5393,817,0,0 +BRDA:5393,817,1,0 +BRDA:5401,818,0,0 +BRDA:5401,818,1,0 +BRDA:5401,818,2,0 +BRDA:5401,818,3,0 +BRDA:5405,819,0,0 +BRDA:5405,819,1,0 +BRDA:5426,820,0,0 +BRDA:5426,820,1,0 +BRDA:5426,820,2,0 +BRDA:5440,821,0,0 +BRDA:5440,821,1,0 +BRDA:5440,821,2,0 +BRDA:5440,821,3,0 +BRDA:5444,822,0,0 +BRDA:5444,822,1,0 +BRDA:5445,823,0,0 +BRDA:5445,823,1,0 +BRDA:5453,824,0,0 +BRDA:5453,824,1,0 +BRDA:5490,825,0,0 +BRDA:5490,825,1,0 +BRDA:5490,826,0,0 +BRDA:5490,826,1,0 +BRDA:5490,826,2,0 +BRDA:5499,827,0,0 +BRDA:5499,827,1,0 +BRDA:5503,828,0,0 +BRDA:5503,828,1,0 +BRDA:5503,829,0,0 +BRDA:5503,829,1,0 +BRDA:5503,829,2,0 +BRDA:5503,829,3,0 +BRDA:5520,830,0,0 +BRDA:5520,830,1,0 +BRDA:5525,831,0,0 +BRDA:5525,831,1,0 +BRDA:5525,832,0,0 +BRDA:5525,832,1,0 +BRDA:5527,833,0,0 +BRDA:5527,833,1,0 +BRDA:5555,834,0,0 +BRDA:5555,834,1,0 +BRDA:5567,835,0,0 +BRDA:5567,835,1,0 +BRDA:5569,836,0,0 +BRDA:5569,836,1,0 +BRDA:5569,837,0,0 +BRDA:5569,837,1,0 +BRDA:5581,838,0,0 +BRDA:5581,838,1,0 +BRDA:5585,839,0,0 +BRDA:5585,839,1,0 +BRDA:5587,840,0,0 +BRDA:5587,840,1,0 +BRDA:5587,841,0,0 +BRDA:5587,841,1,0 +BRDA:5590,842,0,0 +BRDA:5590,842,1,0 +BRDA:5597,843,0,0 +BRDA:5597,843,1,0 +BRDA:5604,844,0,0 +BRDA:5604,844,1,0 +BRDA:5619,845,0,0 +BRDA:5619,845,1,0 +BRDA:5624,846,0,0 +BRDA:5624,846,1,0 +BRDA:5639,847,0,0 +BRDA:5639,847,1,0 +BRDA:5639,848,0,0 +BRDA:5639,848,1,0 +BRDA:5643,849,0,0 +BRDA:5643,849,1,0 +BRDA:5643,850,0,0 +BRDA:5643,850,1,0 +BRDA:5645,851,0,0 +BRDA:5645,851,1,0 +BRDA:5649,852,0,0 +BRDA:5649,852,1,0 +BRDA:5651,853,0,0 +BRDA:5651,853,1,0 +BRDA:5670,854,0,0 +BRDA:5670,854,1,0 +BRDA:5679,855,0,0 +BRDA:5679,855,1,0 +BRDA:5686,856,0,0 +BRDA:5686,856,1,0 +BRDA:5694,857,0,0 +BRDA:5694,857,1,0 +BRDA:5694,858,0,0 +BRDA:5694,858,1,0 +BRDA:5700,859,0,0 +BRDA:5700,859,1,0 +BRDA:5711,860,0,0 +BRDA:5711,860,1,0 +BRDA:5714,861,0,0 +BRDA:5714,861,1,0 +BRDA:5728,862,0,0 +BRDA:5728,862,1,0 +BRDA:5728,863,0,0 +BRDA:5728,863,1,0 +BRDA:5730,864,0,0 +BRDA:5730,864,1,0 +BRDA:5730,865,0,0 +BRDA:5730,865,1,0 +BRDA:5739,866,0,0 +BRDA:5739,866,1,0 +BRDA:5743,867,0,0 +BRDA:5743,867,1,0 +BRDA:5743,868,0,0 +BRDA:5743,868,1,0 +BRDA:5743,868,2,0 +BRDA:5745,869,0,0 +BRDA:5745,869,1,0 +BRDA:5745,870,0,0 +BRDA:5745,870,1,0 +BRDA:5745,870,2,0 +BRDA:5749,871,0,0 +BRDA:5749,871,1,0 +BRDA:5758,872,0,0 +BRDA:5758,872,1,0 +BRDA:5758,873,0,0 +BRDA:5758,873,1,0 +BRDA:5775,874,0,0 +BRDA:5775,874,1,0 +BRDA:5798,875,0,0 +BRDA:5798,875,1,0 +BRDA:5801,876,0,0 +BRDA:5801,876,1,0 +BRDA:5803,877,0,0 +BRDA:5803,877,1,0 +BRDA:5805,878,0,0 +BRDA:5805,878,1,0 +BRDA:5805,879,0,0 +BRDA:5805,879,1,0 +BRDA:5807,880,0,0 +BRDA:5807,880,1,0 +BRDA:5809,881,0,0 +BRDA:5809,881,1,0 +BRDA:5816,882,0,0 +BRDA:5816,882,1,0 +BRDA:5822,883,0,0 +BRDA:5822,883,1,0 +BRDA:5828,884,0,0 +BRDA:5828,884,1,0 +BRDA:5834,885,0,0 +BRDA:5834,885,1,0 +BRDA:5838,886,0,0 +BRDA:5838,886,1,0 +BRDA:5843,887,0,0 +BRDA:5843,887,1,0 +BRDA:5861,888,0,0 +BRDA:5861,888,1,0 +BRDA:5864,889,0,0 +BRDA:5864,889,1,0 +BRDA:5872,890,0,0 +BRDA:5872,890,1,0 +BRDA:5872,891,0,0 +BRDA:5872,891,1,0 +BRDA:5887,892,0,0 +BRDA:5887,892,1,0 +BRDA:5967,893,0,0 +BRDA:5967,893,1,0 +BRDA:5973,894,0,0 +BRDA:5973,894,1,0 +BRDA:5973,895,0,0 +BRDA:5973,895,1,0 +BRDA:5976,896,0,0 +BRDA:5976,896,1,0 +BRDA:5981,897,0,0 +BRDA:5981,897,1,0 +BRDA:5981,898,0,0 +BRDA:5981,898,1,0 +BRDA:5988,899,0,0 +BRDA:5988,899,1,0 +BRDA:6006,900,0,0 +BRDA:6006,900,1,0 +BRDA:6007,901,0,0 +BRDA:6007,901,1,0 +BRDA:6010,902,0,0 +BRDA:6010,902,1,0 +BRDA:6015,903,0,0 +BRDA:6015,903,1,0 +BRDA:6048,904,0,0 +BRDA:6048,904,1,0 +BRDA:6050,905,0,0 +BRDA:6050,905,1,0 +BRDA:6050,906,0,0 +BRDA:6050,906,1,0 +BRDA:6050,906,2,0 +BRDA:6063,907,0,0 +BRDA:6063,907,1,0 +BRDA:6063,908,0,0 +BRDA:6063,908,1,0 +BRDA:6063,908,2,0 +BRDA:6075,909,0,0 +BRDA:6075,909,1,0 +BRDA:6083,910,0,0 +BRDA:6083,910,1,0 +BRDA:6086,911,0,0 +BRDA:6086,911,1,0 +BRDA:6132,912,0,0 +BRDA:6132,912,1,0 +BRDA:6152,913,0,0 +BRDA:6152,913,1,0 +BRDA:6154,914,0,0 +BRDA:6154,914,1,0 +BRDA:6160,915,0,0 +BRDA:6160,915,1,0 +BRDA:6161,916,0,0 +BRDA:6161,916,1,0 +BRDA:6167,917,0,0 +BRDA:6167,917,1,0 +BRDA:6168,918,0,0 +BRDA:6168,918,1,0 +BRDA:6168,919,0,0 +BRDA:6168,919,1,0 +BRDA:6190,920,0,0 +BRDA:6190,920,1,0 +BRDA:6262,921,0,0 +BRDA:6262,921,1,0 +BRDA:6266,922,0,0 +BRDA:6266,922,1,0 +BRDA:6266,923,0,0 +BRDA:6266,923,1,0 +BRDA:6274,924,0,0 +BRDA:6274,924,1,0 +BRDA:6275,925,0,0 +BRDA:6275,925,1,0 +BRDA:6278,926,0,0 +BRDA:6278,926,1,0 +BRDA:6306,927,0,0 +BRDA:6306,927,1,0 +BRDA:6306,928,0,0 +BRDA:6306,928,1,0 +BRDA:6306,928,2,0 +BRDA:6306,928,3,0 +BRDA:6306,928,4,0 +BRDA:6323,929,0,0 +BRDA:6323,929,1,0 +BRDA:6328,930,0,0 +BRDA:6328,930,1,0 +BRDA:6330,931,0,0 +BRDA:6330,931,1,0 +BRDA:6333,932,0,0 +BRDA:6333,932,1,0 +BRDA:6336,933,0,0 +BRDA:6336,933,1,0 +BRDA:6338,934,0,0 +BRDA:6338,934,1,0 +BRDA:6355,935,0,0 +BRDA:6355,935,1,0 +BRDA:6358,936,0,0 +BRDA:6358,936,1,0 +BRDA:6358,937,0,0 +BRDA:6358,937,1,0 +BRDA:6358,937,2,0 +BRDA:6358,937,3,0 +BRDA:6358,937,4,0 +BRDA:6369,938,0,0 +BRDA:6369,938,1,0 +BRDA:6371,939,0,0 +BRDA:6371,939,1,0 +BRDA:6379,940,0,0 +BRDA:6379,940,1,0 +BRDA:6379,941,0,0 +BRDA:6379,941,1,0 +BRDA:6379,941,2,0 +BRDA:6393,942,0,0 +BRDA:6393,942,1,0 +BRDA:6395,943,0,0 +BRDA:6395,943,1,0 +BRDA:6401,944,0,0 +BRDA:6401,944,1,0 +BRDA:6404,945,0,0 +BRDA:6404,945,1,0 +BRDA:6404,946,0,0 +BRDA:6404,946,1,0 +BRDA:6407,947,0,0 +BRDA:6407,947,1,0 +BRDA:6424,948,0,0 +BRDA:6424,948,1,0 +BRDA:6433,949,0,0 +BRDA:6433,949,1,0 +BRDA:6456,950,0,0 +BRDA:6456,950,1,0 +BRDA:6462,951,0,0 +BRDA:6462,951,1,0 +BRDA:6462,952,0,0 +BRDA:6462,952,1,0 +BRDA:6462,952,2,0 +BRDA:6462,952,3,0 +BRDA:6469,953,0,0 +BRDA:6469,953,1,0 +BRDA:6478,954,0,0 +BRDA:6478,954,1,0 +BRDA:6489,955,0,0 +BRDA:6489,955,1,0 +BRDA:6489,956,0,0 +BRDA:6489,956,1,0 +BRDA:6501,957,0,0 +BRDA:6501,957,1,0 +BRDA:6501,958,0,0 +BRDA:6501,958,1,0 +BRDA:6501,958,2,0 +BRDA:6529,959,0,0 +BRDA:6529,959,1,0 +BRDA:6537,960,0,0 +BRDA:6537,960,1,0 +BRDA:6542,961,0,0 +BRDA:6542,961,1,0 +BRDA:6558,962,0,0 +BRDA:6558,962,1,0 +BRDA:6562,963,0,0 +BRDA:6562,963,1,0 +BRDA:6567,964,0,0 +BRDA:6567,964,1,0 +BRDA:6567,965,0,0 +BRDA:6567,965,1,0 +BRDA:6571,966,0,0 +BRDA:6571,966,1,0 +BRDA:6577,967,0,0 +BRDA:6577,967,1,0 +BRDA:6577,968,0,0 +BRDA:6577,968,1,0 +BRDA:6583,969,0,0 +BRDA:6583,969,1,0 +BRDA:6583,969,2,0 +BRDA:6583,969,3,0 +BRDA:6583,969,4,0 +BRDA:6591,970,0,0 +BRDA:6591,970,1,0 +BRDA:6599,971,0,0 +BRDA:6599,971,1,0 +BRDA:6600,972,0,0 +BRDA:6600,972,1,0 +BRDA:6614,973,0,0 +BRDA:6614,973,1,0 +BRDA:6615,974,0,0 +BRDA:6615,974,1,0 +BRDA:6650,975,0,0 +BRDA:6650,975,1,0 +BRDA:6698,976,0,0 +BRDA:6698,976,1,0 +BRDA:6708,977,0,0 +BRDA:6708,977,1,0 +BRDA:6718,978,0,0 +BRDA:6718,978,1,0 +BRDA:6718,978,2,0 +BRDA:6718,978,3,0 +BRDA:6718,978,4,0 +BRDA:6718,978,5,0 +BRDA:6738,979,0,0 +BRDA:6738,979,1,0 +BRDA:6738,980,0,0 +BRDA:6738,980,1,0 +BRDA:6738,980,2,0 +BRDA:6738,980,3,0 +BRDA:6786,981,0,0 +BRDA:6786,981,1,0 +BRDA:6792,982,0,0 +BRDA:6792,982,1,0 +BRDA:6793,983,0,0 +BRDA:6793,983,1,0 +BRDA:6795,984,0,0 +BRDA:6795,984,1,0 +BRDA:6819,985,0,0 +BRDA:6819,985,1,0 +BRDA:6824,986,0,0 +BRDA:6824,986,1,0 +BRDA:6828,987,0,0 +BRDA:6828,987,1,0 +BRDA:6828,988,0,0 +BRDA:6828,988,1,0 +BRDA:6828,989,0,0 +BRDA:6828,989,1,0 +BRDA:6839,990,0,0 +BRDA:6839,990,1,0 +BRDA:6902,991,0,0 +BRDA:6902,991,1,0 +BRDA:6903,992,0,0 +BRDA:6903,992,1,0 +BRDA:6903,993,0,0 +BRDA:6903,993,1,0 +BRDA:6912,994,0,0 +BRDA:6912,994,1,0 +BRDA:6912,995,0,0 +BRDA:6912,995,1,0 +BRDA:6921,996,0,0 +BRDA:6921,996,1,0 +BRDA:6921,997,0,0 +BRDA:6921,997,1,0 +BRDA:6921,997,2,0 +BRDA:6928,998,0,0 +BRDA:6928,998,1,0 +BRDA:6936,999,0,0 +BRDA:6936,999,1,0 +BRDA:6939,1000,0,0 +BRDA:6939,1000,1,0 +BRDA:6945,1001,0,0 +BRDA:6945,1001,1,0 +BRDA:6990,1002,0,0 +BRDA:6990,1002,1,0 +BRDA:6995,1003,0,0 +BRDA:6995,1003,1,0 +BRDA:6996,1004,0,0 +BRDA:6996,1004,1,0 +BRDA:6998,1005,0,0 +BRDA:6998,1005,1,0 +BRDA:7001,1006,0,0 +BRDA:7001,1006,1,0 +BRDA:7001,1007,0,0 +BRDA:7001,1007,1,0 +BRDA:7005,1008,0,0 +BRDA:7005,1008,1,0 +BRDA:7005,1009,0,0 +BRDA:7005,1009,1,0 +BRDA:7006,1010,0,0 +BRDA:7006,1010,1,0 +BRDA:7007,1011,0,0 +BRDA:7007,1011,1,0 +BRDA:7012,1012,0,0 +BRDA:7012,1012,1,0 +BRDA:7058,1013,0,0 +BRDA:7058,1013,1,0 +BRDA:7069,1014,0,0 +BRDA:7069,1014,1,0 +BRDA:7082,1015,0,0 +BRDA:7082,1015,1,0 +BRDA:7084,1016,0,0 +BRDA:7084,1016,1,0 +BRDA:7087,1017,0,0 +BRDA:7087,1017,1,0 +BRDA:7087,1017,2,0 +BRDA:7088,1018,0,0 +BRDA:7088,1018,1,0 +BRDA:7088,1018,2,0 +BRDA:7099,1019,0,0 +BRDA:7099,1019,1,0 +BRDA:7099,1020,0,0 +BRDA:7099,1020,1,0 +BRDA:7099,1021,0,0 +BRDA:7099,1021,1,0 +BRDA:7115,1022,0,0 +BRDA:7115,1022,1,0 +BRDA:7117,1023,0,0 +BRDA:7117,1023,1,0 +BRDA:7119,1024,0,0 +BRDA:7119,1024,1,0 +BRDA:7121,1025,0,0 +BRDA:7121,1025,1,0 +BRDA:7121,1026,0,0 +BRDA:7121,1026,1,0 +BRDA:7123,1027,0,0 +BRDA:7123,1027,1,0 +BRDA:7123,1028,0,0 +BRDA:7123,1028,1,0 +BRDA:7137,1029,0,0 +BRDA:7137,1029,1,0 +BRDA:7144,1030,0,0 +BRDA:7144,1030,1,0 +BRDA:7148,1031,0,0 +BRDA:7148,1031,1,0 +BRDA:7151,1032,0,0 +BRDA:7151,1032,1,0 +BRDA:7151,1033,0,0 +BRDA:7151,1033,1,0 +BRDA:7151,1033,2,0 +BRDA:7172,1034,0,0 +BRDA:7172,1034,1,0 +BRDA:7194,1035,0,0 +BRDA:7194,1035,1,0 +BRDA:7200,1036,0,0 +BRDA:7200,1036,1,0 +BRDA:7200,1037,0,0 +BRDA:7200,1037,1,0 +BRDA:7201,1038,0,0 +BRDA:7201,1038,1,0 +BRDA:7205,1039,0,0 +BRDA:7205,1039,1,0 +BRDA:7205,1040,0,0 +BRDA:7205,1040,1,0 +BRDA:7213,1041,0,0 +BRDA:7213,1041,1,0 +BRDA:7223,1042,0,0 +BRDA:7223,1042,1,0 +BRDA:7242,1043,0,0 +BRDA:7242,1043,1,0 +BRDA:7245,1044,0,0 +BRDA:7245,1044,1,0 +BRDA:7248,1045,0,0 +BRDA:7248,1045,1,0 +BRDA:7248,1046,0,0 +BRDA:7248,1046,1,0 +BRDA:7257,1047,0,0 +BRDA:7257,1047,1,0 +BRDA:7266,1048,0,0 +BRDA:7266,1048,1,0 +BRDA:7273,1049,0,0 +BRDA:7273,1049,1,0 +BRDA:7304,1050,0,0 +BRDA:7304,1050,1,0 +BRDA:7304,1051,0,0 +BRDA:7304,1051,1,0 +BRDA:7307,1052,0,0 +BRDA:7307,1052,1,0 +BRDA:7316,1053,0,0 +BRDA:7316,1053,1,0 +BRDA:7333,1054,0,0 +BRDA:7333,1054,1,0 +BRDA:7335,1055,0,0 +BRDA:7335,1055,1,0 +BRDA:7343,1056,0,0 +BRDA:7343,1056,1,0 +BRDA:7381,1057,0,0 +BRDA:7381,1057,1,0 +BRDA:7381,1058,0,0 +BRDA:7381,1058,1,0 +BRDA:7381,1059,0,0 +BRDA:7381,1059,1,0 +BRDA:7415,1060,0,0 +BRDA:7415,1060,1,0 +BRDA:7431,1061,0,0 +BRDA:7431,1061,1,0 +BRDA:7433,1062,0,0 +BRDA:7433,1062,1,0 +BRDA:7452,1063,0,0 +BRDA:7452,1063,1,0 +BRDA:7454,1064,0,0 +BRDA:7454,1064,1,0 +BRDA:7463,1065,0,0 +BRDA:7463,1065,1,0 +BRDA:7465,1066,0,0 +BRDA:7465,1066,1,0 +BRDA:7467,1067,0,0 +BRDA:7467,1067,1,0 +BRDA:7471,1068,0,0 +BRDA:7471,1068,1,0 +BRDA:7487,1069,0,0 +BRDA:7487,1069,1,0 +BRDA:7487,1069,2,0 +BRDA:7487,1069,3,0 +BRDA:7487,1069,4,0 +BRDA:7489,1070,0,0 +BRDA:7489,1070,1,0 +BRDA:7495,1071,0,0 +BRDA:7495,1071,1,0 +BRDA:7507,1072,0,0 +BRDA:7507,1072,1,0 +BRDA:7509,1073,0,0 +BRDA:7509,1073,1,0 +BRDA:7522,1074,0,0 +BRDA:7522,1074,1,0 +BRDA:7529,1075,0,0 +BRDA:7529,1075,1,0 +BRDA:7529,1076,0,0 +BRDA:7529,1076,1,0 +BRDA:7535,1077,0,0 +BRDA:7535,1077,1,0 +BRDA:7539,1078,0,0 +BRDA:7539,1078,1,0 +BRDA:7553,1079,0,0 +BRDA:7553,1079,1,0 +BRDA:7553,1080,0,0 +BRDA:7553,1080,1,0 +BRDA:7558,1081,0,0 +BRDA:7558,1081,1,0 +BRDA:7558,1082,0,0 +BRDA:7558,1082,1,0 +BRDA:7558,1083,0,0 +BRDA:7558,1083,1,0 +BRDA:7626,1084,0,0 +BRDA:7626,1084,1,0 +BRDA:7630,1085,0,0 +BRDA:7630,1085,1,0 +BRDA:7636,1086,0,0 +BRDA:7636,1086,1,0 +BRDA:7649,1087,0,0 +BRDA:7649,1087,1,0 +BRDA:7651,1088,0,0 +BRDA:7651,1088,1,0 +BRDA:7676,1089,0,0 +BRDA:7676,1089,1,0 +BRDA:7691,1090,0,0 +BRDA:7691,1090,1,0 +BRDA:7694,1091,0,0 +BRDA:7694,1091,1,0 +BRDA:7694,1092,0,0 +BRDA:7694,1092,1,0 +BRDA:7694,1092,2,0 +BRDA:7694,1092,3,0 +BRDA:7709,1093,0,0 +BRDA:7709,1093,1,0 +BRDA:7709,1094,0,0 +BRDA:7709,1094,1,0 +BRDA:7720,1095,0,0 +BRDA:7720,1095,1,0 +BRDA:7723,1096,0,0 +BRDA:7723,1096,1,0 +BRDA:7726,1097,0,0 +BRDA:7726,1097,1,0 +BRDA:7726,1098,0,0 +BRDA:7726,1098,1,0 +BRDA:7726,1098,2,0 +BRDA:7730,1099,0,0 +BRDA:7730,1099,1,0 +BRDA:7731,1100,0,0 +BRDA:7731,1100,1,0 +BRDA:7731,1101,0,0 +BRDA:7731,1101,1,0 +BRDA:7731,1101,2,0 +BRDA:7737,1102,0,0 +BRDA:7737,1102,1,0 +BRDA:7737,1103,0,0 +BRDA:7737,1103,1,0 +BRDA:7743,1104,0,0 +BRDA:7743,1104,1,0 +BRDA:7743,1105,0,0 +BRDA:7743,1105,1,0 +BRDA:7743,1106,0,0 +BRDA:7743,1106,1,0 +BRDA:7749,1107,0,0 +BRDA:7749,1107,1,0 +BRDA:7753,1108,0,0 +BRDA:7753,1108,1,0 +BRDA:7753,1109,0,0 +BRDA:7753,1109,1,0 +BRDA:7753,1110,0,0 +BRDA:7753,1110,1,0 +BRDA:7762,1111,0,0 +BRDA:7762,1111,1,0 +BRDA:7765,1112,0,0 +BRDA:7765,1112,1,0 +BRDA:7767,1113,0,0 +BRDA:7767,1113,1,0 +BRDA:7770,1114,0,0 +BRDA:7770,1114,1,0 +BRDA:7780,1115,0,0 +BRDA:7780,1115,1,0 +BRDA:7793,1116,0,0 +BRDA:7793,1116,1,0 +BRDA:7794,1117,0,0 +BRDA:7794,1117,1,0 +BRDA:7794,1117,2,0 +BRDA:7794,1117,3,0 +BRDA:7794,1117,4,0 +BRDA:7794,1117,5,0 +BRDA:7828,1118,0,0 +BRDA:7828,1118,1,0 +BRDA:7830,1119,0,0 +BRDA:7830,1119,1,0 +BRDA:7830,1119,2,0 +BRDA:7830,1119,3,0 +BRDA:7830,1119,4,0 +BRDA:7830,1119,5,0 +BRDA:7830,1119,6,0 +BRDA:7830,1119,7,0 +BRDA:7830,1119,8,0 +BRDA:7830,1119,9,0 +BRDA:7830,1119,10,0 +BRDA:7830,1119,11,0 +BRDA:7830,1120,0,0 +BRDA:7830,1120,1,0 +BRDA:7838,1121,0,0 +BRDA:7838,1121,1,0 +BRDA:7838,1122,0,0 +BRDA:7838,1122,1,0 +BRDA:7852,1123,0,0 +BRDA:7852,1123,1,0 +BRDA:7854,1124,0,0 +BRDA:7854,1124,1,0 +BRDA:7854,1124,2,0 +BRDA:7854,1124,3,0 +BRDA:7854,1124,4,0 +BRDA:7899,1125,0,0 +BRDA:7899,1125,1,0 +BRDA:7907,1126,0,0 +BRDA:7907,1126,1,0 +BRDA:7920,1127,0,0 +BRDA:7920,1127,1,0 +BRDA:7920,1128,0,0 +BRDA:7920,1128,1,0 +BRDA:7928,1129,0,0 +BRDA:7928,1129,1,0 +BRDA:7938,1130,0,0 +BRDA:7938,1130,1,0 +BRDA:7949,1131,0,0 +BRDA:7949,1131,1,0 +BRDA:7949,1132,0,0 +BRDA:7949,1132,1,0 +BRDA:7968,1133,0,0 +BRDA:7968,1133,1,0 +BRDA:7978,1134,0,0 +BRDA:7978,1134,1,0 +BRDA:7978,1135,0,0 +BRDA:7978,1135,1,0 +BRDA:7984,1136,0,0 +BRDA:7984,1136,1,0 +BRDA:7984,1137,0,0 +BRDA:7984,1137,1,0 +BRDA:7990,1138,0,0 +BRDA:7990,1138,1,0 +BRDA:7990,1139,0,0 +BRDA:7990,1139,1,0 +BRDA:8000,1140,0,0 +BRDA:8000,1140,1,0 +BRDA:8000,1141,0,0 +BRDA:8000,1141,1,0 +BRDA:8003,1142,0,0 +BRDA:8003,1142,1,0 +BRDA:8019,1143,0,0 +BRDA:8019,1143,1,0 +BRDA:8024,1144,0,0 +BRDA:8024,1144,1,0 +BRDA:8124,1145,0,0 +BRDA:8124,1145,1,0 +BRDA:8124,1146,0,0 +BRDA:8124,1146,1,0 +BRDA:8124,1146,2,0 +BRDA:8132,1147,0,0 +BRDA:8132,1147,1,0 +BRDA:8143,1148,0,0 +BRDA:8143,1148,1,0 +BRDA:8154,1149,0,0 +BRDA:8154,1149,1,0 +BRDA:8154,1150,0,0 +BRDA:8154,1150,1,0 +BRDA:8154,1150,2,0 +BRDA:8156,1151,0,0 +BRDA:8156,1151,1,0 +BRDA:8156,1152,0,0 +BRDA:8156,1152,1,0 +BRDA:8156,1153,0,0 +BRDA:8156,1153,1,0 +BRDA:8162,1154,0,0 +BRDA:8162,1154,1,0 +BRDA:8162,1155,0,0 +BRDA:8162,1155,1,0 +BRDA:8162,1155,2,0 +BRDA:8162,1155,3,0 +BRDA:8184,1156,0,0 +BRDA:8184,1156,1,0 +BRDA:8184,1157,0,0 +BRDA:8184,1157,1,0 +BRDA:8184,1157,2,0 +BRDA:8191,1158,0,0 +BRDA:8191,1158,1,0 +BRDA:8202,1159,0,0 +BRDA:8202,1159,1,0 +BRDA:8212,1160,0,0 +BRDA:8212,1160,1,0 +BRDA:8212,1161,0,0 +BRDA:8212,1161,1,0 +BRDA:8212,1161,2,0 +BRDA:8216,1162,0,0 +BRDA:8216,1162,1,0 +BRDA:8227,1163,0,0 +BRDA:8227,1163,1,0 +BRDA:8231,1164,0,0 +BRDA:8231,1164,1,0 +BRDA:8235,1165,0,0 +BRDA:8235,1165,1,0 +BRDA:8239,1166,0,0 +BRDA:8239,1166,1,0 +BRDA:8240,1167,0,0 +BRDA:8240,1167,1,0 +BRDA:8243,1168,0,0 +BRDA:8243,1168,1,0 +BRDA:8253,1169,0,0 +BRDA:8253,1169,1,0 +BRDA:8257,1170,0,0 +BRDA:8257,1170,1,0 +BRDA:8261,1171,0,0 +BRDA:8261,1171,1,0 +BRDA:8271,1172,0,0 +BRDA:8271,1172,1,0 +BRDA:8278,1173,0,0 +BRDA:8278,1173,1,0 +BRDA:8287,1174,0,0 +BRDA:8287,1174,1,0 +BRDA:8293,1175,0,0 +BRDA:8293,1175,1,0 +BRDA:8294,1176,0,0 +BRDA:8294,1176,1,0 +BRDA:8300,1177,0,0 +BRDA:8300,1177,1,0 +BRDA:8302,1178,0,0 +BRDA:8302,1178,1,0 +BRDA:8310,1179,0,0 +BRDA:8310,1179,1,0 +BRDA:8318,1180,0,0 +BRDA:8318,1180,1,0 +BRDA:8328,1181,0,0 +BRDA:8328,1181,1,0 +BRDA:8334,1182,0,0 +BRDA:8334,1182,1,0 +BRDA:8337,1183,0,0 +BRDA:8337,1183,1,0 +BRDA:8341,1184,0,0 +BRDA:8341,1184,1,0 +BRDA:8346,1185,0,0 +BRDA:8346,1185,1,0 +BRDA:8347,1186,0,0 +BRDA:8347,1186,1,0 +BRDA:8347,1187,0,0 +BRDA:8347,1187,1,0 +BRDA:8347,1187,2,0 +BRDA:8353,1188,0,0 +BRDA:8353,1188,1,0 +BRDA:8353,1189,0,0 +BRDA:8353,1189,1,0 +BRDA:8354,1190,0,0 +BRDA:8354,1190,1,0 +BRDA:8355,1191,0,0 +BRDA:8355,1191,1,0 +BRDA:8370,1192,0,0 +BRDA:8370,1192,1,0 +BRDA:8371,1193,0,0 +BRDA:8371,1193,1,0 +BRDA:8376,1194,0,0 +BRDA:8376,1194,1,0 +BRDA:8377,1195,0,0 +BRDA:8377,1195,1,0 +BRDA:8383,1196,0,0 +BRDA:8383,1196,1,0 +BRDA:8384,1197,0,0 +BRDA:8384,1197,1,0 +BRDA:8385,1198,0,0 +BRDA:8385,1198,1,0 +BRDA:8389,1199,0,0 +BRDA:8389,1199,1,0 +BRDA:8391,1200,0,0 +BRDA:8391,1200,1,0 +BRDA:8392,1201,0,0 +BRDA:8392,1201,1,0 +BRDA:8395,1202,0,0 +BRDA:8395,1202,1,0 +BRDA:8400,1203,0,0 +BRDA:8400,1203,1,0 +BRDA:8400,1204,0,0 +BRDA:8400,1204,1,0 +BRDA:8400,1204,2,0 +BRDA:8406,1205,0,0 +BRDA:8406,1205,1,0 +BRDA:8406,1205,2,0 +BRDA:8406,1205,3,0 +BRDA:8408,1206,0,0 +BRDA:8408,1206,1,0 +BRDA:8408,1207,0,0 +BRDA:8408,1207,1,0 +BRDA:8412,1208,0,0 +BRDA:8412,1208,1,0 +BRDA:8412,1209,0,0 +BRDA:8412,1209,1,0 +BRDA:8412,1209,2,0 +BRDA:8412,1209,3,0 +BRDA:8414,1210,0,0 +BRDA:8414,1210,1,0 +BRDA:8415,1211,0,0 +BRDA:8415,1211,1,0 +BRDA:8415,1212,0,0 +BRDA:8415,1212,1,0 +BRDA:8416,1213,0,0 +BRDA:8416,1213,1,0 +BRDA:8420,1214,0,0 +BRDA:8420,1214,1,0 +BRDA:8420,1215,0,0 +BRDA:8420,1215,1,0 +BRDA:8421,1216,0,0 +BRDA:8421,1216,1,0 +BRDA:8421,1217,0,0 +BRDA:8421,1217,1,0 +BRDA:8440,1218,0,0 +BRDA:8440,1218,1,0 +BRDA:8445,1219,0,0 +BRDA:8445,1219,1,0 +BRDA:8461,1220,0,0 +BRDA:8461,1220,1,0 +BRDA:8467,1221,0,0 +BRDA:8467,1221,1,0 +BRDA:8467,1222,0,0 +BRDA:8467,1222,1,0 +BRDA:8470,1223,0,0 +BRDA:8470,1223,1,0 +BRDA:8475,1224,0,0 +BRDA:8475,1224,1,0 +BRDA:8475,1225,0,0 +BRDA:8475,1225,1,0 +BRDA:8475,1225,2,0 +BRDA:8484,1226,0,0 +BRDA:8484,1226,1,0 +BRDA:8484,1227,0,0 +BRDA:8484,1227,1,0 +BRDA:8493,1228,0,0 +BRDA:8493,1228,1,0 +BRDA:8502,1229,0,0 +BRDA:8502,1229,1,0 +BRDA:8502,1230,0,0 +BRDA:8502,1230,1,0 +BRDA:8503,1231,0,0 +BRDA:8503,1231,1,0 +BRDA:8504,1232,0,0 +BRDA:8504,1232,1,0 +BRDA:8505,1233,0,0 +BRDA:8505,1233,1,0 +BRDA:8506,1234,0,0 +BRDA:8506,1234,1,0 +BRDA:8507,1235,0,0 +BRDA:8507,1235,1,0 +BRDA:8508,1236,0,0 +BRDA:8508,1236,1,0 +BRDA:8515,1237,0,0 +BRDA:8515,1237,1,0 +BRDA:8517,1238,0,0 +BRDA:8517,1238,1,0 +BRDA:8520,1239,0,0 +BRDA:8520,1239,1,0 +BRDA:8520,1240,0,0 +BRDA:8520,1240,1,0 +BRDA:8521,1241,0,0 +BRDA:8521,1241,1,0 +BRDA:8522,1242,0,0 +BRDA:8522,1242,1,0 +BRDA:8525,1243,0,0 +BRDA:8525,1243,1,0 +BRDA:8530,1244,0,0 +BRDA:8530,1244,1,0 +BRDA:8532,1245,0,0 +BRDA:8532,1245,1,0 +BRDA:8532,1245,2,0 +BRDA:8535,1246,0,0 +BRDA:8535,1246,1,0 +BRDA:8535,1246,2,0 +BRDA:8535,1246,3,0 +BRDA:8538,1247,0,0 +BRDA:8538,1247,1,0 +BRDA:8538,1247,2,0 +BRDA:8539,1248,0,0 +BRDA:8539,1248,1,0 +BRDA:8539,1248,2,0 +BRDA:8540,1249,0,0 +BRDA:8540,1249,1,0 +BRDA:8547,1250,0,0 +BRDA:8547,1250,1,0 +BRDA:8550,1251,0,0 +BRDA:8550,1251,1,0 +BRDA:8551,1252,0,0 +BRDA:8551,1252,1,0 +BRDA:8555,1253,0,0 +BRDA:8555,1253,1,0 +BRDA:8558,1254,0,0 +BRDA:8558,1254,1,0 +BRDA:8559,1255,0,0 +BRDA:8559,1255,1,0 +BRDA:8564,1256,0,0 +BRDA:8564,1256,1,0 +BRDA:8564,1256,2,0 +BRDA:8567,1257,0,0 +BRDA:8567,1257,1,0 +BRDA:8569,1258,0,0 +BRDA:8569,1258,1,0 +BRDA:8569,1259,0,0 +BRDA:8569,1259,1,0 +BRDA:8571,1260,0,0 +BRDA:8571,1260,1,0 +BRDA:8571,1261,0,0 +BRDA:8571,1261,1,0 +BRDA:8577,1262,0,0 +BRDA:8577,1262,1,0 +BRDA:8580,1263,0,0 +BRDA:8580,1263,1,0 +BRDA:8585,1264,0,0 +BRDA:8585,1264,1,0 +BRDA:8589,1265,0,0 +BRDA:8589,1265,1,0 +BRDA:8594,1266,0,0 +BRDA:8594,1266,1,0 +BRDA:8594,1267,0,0 +BRDA:8594,1267,1,0 +BRDA:8596,1268,0,0 +BRDA:8596,1268,1,0 +BRDA:8604,1269,0,0 +BRDA:8604,1269,1,0 +BRDA:8604,1270,0,0 +BRDA:8604,1270,1,0 +BRDA:8605,1271,0,0 +BRDA:8605,1271,1,0 +BRDA:8606,1272,0,0 +BRDA:8606,1272,1,0 +BRDA:8612,1273,0,0 +BRDA:8612,1273,1,0 +BRDA:8617,1274,0,0 +BRDA:8617,1274,1,0 +BRDA:8631,1275,0,0 +BRDA:8631,1275,1,0 +BRDA:8631,1275,2,0 +BRDA:8631,1275,3,0 +BRDA:8631,1275,4,0 +BRDA:8639,1276,0,0 +BRDA:8639,1276,1,0 +BRDA:8641,1277,0,0 +BRDA:8641,1277,1,0 +BRDA:8644,1278,0,0 +BRDA:8644,1278,1,0 +BRDA:8651,1279,0,0 +BRDA:8651,1279,1,0 +BRDA:8651,1280,0,0 +BRDA:8651,1280,1,0 +BRDA:8657,1281,0,0 +BRDA:8657,1281,1,0 +BRDA:8657,1282,0,0 +BRDA:8657,1282,1,0 +BRDA:8657,1282,2,0 +BRDA:8657,1282,3,0 +BRDA:8662,1283,0,0 +BRDA:8662,1283,1,0 +BRDA:8662,1284,0,0 +BRDA:8662,1284,1,0 +BRDA:8666,1285,0,0 +BRDA:8666,1285,1,0 +BRDA:8666,1285,2,0 +BRDA:8670,1286,0,0 +BRDA:8670,1286,1,0 +BRDA:8671,1287,0,0 +BRDA:8671,1287,1,0 +BRDA:8672,1288,0,0 +BRDA:8672,1288,1,0 +BRDA:8676,1289,0,0 +BRDA:8676,1289,1,0 +BRDA:8676,1290,0,0 +BRDA:8676,1290,1,0 +BRDA:8678,1291,0,0 +BRDA:8678,1291,1,0 +BRDA:8684,1292,0,0 +BRDA:8684,1292,1,0 +BRDA:8684,1292,2,0 +BRDA:8686,1293,0,0 +BRDA:8686,1293,1,0 +BRDA:8686,1294,0,0 +BRDA:8686,1294,1,0 +BRDA:8690,1295,0,0 +BRDA:8690,1295,1,0 +BRDA:8698,1296,0,0 +BRDA:8698,1296,1,0 +BRDA:8698,1297,0,0 +BRDA:8698,1297,1,0 +BRDA:8699,1298,0,0 +BRDA:8699,1298,1,0 +BRDA:8700,1299,0,0 +BRDA:8700,1299,1,0 +BRDA:8702,1300,0,0 +BRDA:8702,1300,1,0 +BRDA:8703,1301,0,0 +BRDA:8703,1301,1,0 +BRDA:8711,1302,0,0 +BRDA:8711,1302,1,0 +BRDA:8713,1303,0,0 +BRDA:8713,1303,1,0 +BRDA:8718,1304,0,0 +BRDA:8718,1304,1,0 +BRDA:8726,1305,0,0 +BRDA:8726,1305,1,0 +BRDA:8738,1306,0,0 +BRDA:8738,1306,1,0 +BRDA:8738,1306,2,0 +BRDA:8738,1306,3,0 +BRDA:8738,1306,4,0 +BRDA:8768,1307,0,0 +BRDA:8768,1307,1,0 +BRDA:8780,1308,0,0 +BRDA:8780,1308,1,0 +BRDA:8781,1309,0,0 +BRDA:8781,1309,1,0 +BRDA:8782,1310,0,0 +BRDA:8782,1310,1,0 +BRDA:8782,1310,2,0 +BRDA:8782,1310,3,0 +BRDA:8796,1311,0,0 +BRDA:8796,1311,1,0 +BRDA:8796,1312,0,0 +BRDA:8796,1312,1,0 +BRDA:8811,1313,0,0 +BRDA:8811,1313,1,0 +BRDA:8817,1314,0,0 +BRDA:8817,1314,1,0 +BRDA:8823,1315,0,0 +BRDA:8823,1315,1,0 +BRDA:8824,1316,0,0 +BRDA:8824,1316,1,0 +BRDA:8826,1317,0,0 +BRDA:8826,1317,1,0 +BRDA:8843,1318,0,0 +BRDA:8843,1318,1,0 +BRDA:8844,1319,0,0 +BRDA:8844,1319,1,0 +BRDA:8846,1320,0,0 +BRDA:8846,1320,1,0 +BRDA:8847,1321,0,0 +BRDA:8847,1321,1,0 +BRDA:8876,1322,0,0 +BRDA:8876,1322,1,0 +BRDA:8877,1323,0,0 +BRDA:8877,1323,1,0 +BRDA:8878,1324,0,0 +BRDA:8878,1324,1,0 +BRDA:8881,1325,0,0 +BRDA:8881,1325,1,0 +BRDA:8886,1326,0,0 +BRDA:8886,1326,1,0 +BRDA:8887,1327,0,0 +BRDA:8887,1327,1,0 +BRDA:8888,1328,0,0 +BRDA:8888,1328,1,0 +BRDA:8889,1329,0,0 +BRDA:8889,1329,1,0 +BRDA:8890,1330,0,0 +BRDA:8890,1330,1,0 +BRDA:8930,1331,0,0 +BRDA:8930,1331,1,0 +BRDA:8958,1332,0,0 +BRDA:8958,1332,1,0 +BRDA:8958,1333,0,0 +BRDA:8958,1333,1,0 +BRDA:8958,1333,2,0 +BRDA:8958,1333,3,0 +BRDA:8958,1333,4,0 +BRDA:8964,1334,0,0 +BRDA:8964,1334,1,0 +BRDA:8966,1335,0,0 +BRDA:8966,1335,1,0 +BRDA:8974,1336,0,0 +BRDA:8974,1336,1,0 +BRDA:8982,1337,0,0 +BRDA:8982,1337,1,0 +BRDA:8988,1338,0,0 +BRDA:8988,1338,1,0 +BRDA:8988,1339,0,0 +BRDA:8988,1339,1,0 +BRDA:8988,1339,2,0 +BRDA:8994,1340,0,0 +BRDA:8994,1340,1,0 +BRDA:8995,1341,0,0 +BRDA:8995,1341,1,0 +BRDA:8996,1342,0,0 +BRDA:8996,1342,1,0 +BRDA:8999,1343,0,0 +BRDA:8999,1343,1,0 +BRDA:9002,1344,0,0 +BRDA:9002,1344,1,0 +BRDA:9005,1345,0,0 +BRDA:9005,1345,1,0 +BRDA:9013,1346,0,0 +BRDA:9013,1346,1,0 +BRDA:9019,1347,0,0 +BRDA:9019,1347,1,0 +BRDA:9020,1348,0,0 +BRDA:9020,1348,1,0 +BRDA:9025,1349,0,0 +BRDA:9025,1349,1,0 +BRDA:9030,1350,0,0 +BRDA:9030,1350,1,0 +BRDA:9035,1351,0,0 +BRDA:9035,1351,1,0 +BRDA:9039,1352,0,0 +BRDA:9039,1352,1,0 +BRDA:9039,1353,0,0 +BRDA:9039,1353,1,0 +BRDA:9039,1353,2,0 +BRDA:9043,1354,0,0 +BRDA:9043,1354,1,0 +BRDA:9044,1355,0,0 +BRDA:9044,1355,1,0 +BRDA:9054,1356,0,0 +BRDA:9054,1356,1,0 +BRDA:9069,1357,0,0 +BRDA:9069,1357,1,0 +BRDA:9071,1358,0,0 +BRDA:9071,1358,1,0 +BRDA:9077,1359,0,0 +BRDA:9077,1359,1,0 +BRDA:9079,1360,0,0 +BRDA:9079,1360,1,0 +BRDA:9082,1361,0,0 +BRDA:9082,1361,1,0 +BRDA:9095,1362,0,0 +BRDA:9095,1362,1,0 +BRDA:9103,1363,0,0 +BRDA:9103,1363,1,0 +BRDA:9114,1364,0,0 +BRDA:9114,1364,1,0 +BRDA:9115,1365,0,0 +BRDA:9115,1365,1,0 +BRDA:9116,1366,0,0 +BRDA:9116,1366,1,0 +BRDA:9122,1367,0,0 +BRDA:9122,1367,1,0 +BRDA:9126,1368,0,0 +BRDA:9126,1368,1,0 +BRDA:9129,1369,0,0 +BRDA:9129,1369,1,0 +BRDA:9130,1370,0,0 +BRDA:9130,1370,1,0 +BRDA:9131,1371,0,0 +BRDA:9131,1371,1,0 +BRDA:9136,1372,0,0 +BRDA:9136,1372,1,0 +BRDA:9137,1373,0,0 +BRDA:9137,1373,1,0 +BRDA:9151,1374,0,0 +BRDA:9151,1374,1,0 +BRDA:9152,1375,0,0 +BRDA:9152,1375,1,0 +BRDA:9152,1376,0,0 +BRDA:9152,1376,1,0 +BRDA:9156,1377,0,0 +BRDA:9156,1377,1,0 +BRDA:9175,1378,0,0 +BRDA:9175,1378,1,0 +BRDA:9179,1379,0,0 +BRDA:9179,1379,1,0 +BRDA:9181,1380,0,0 +BRDA:9181,1380,1,0 +BRDA:9235,1381,0,0 +BRDA:9235,1381,1,0 +BRDA:9240,1382,0,0 +BRDA:9240,1382,1,0 +BRDA:9245,1383,0,0 +BRDA:9245,1383,1,0 +BRDA:9250,1384,0,0 +BRDA:9250,1384,1,0 +BRDA:9250,1384,2,0 +BRDA:9261,1385,0,0 +BRDA:9261,1385,1,0 +BRDA:9261,1385,2,0 +BRDA:9261,1385,3,0 +BRDA:9261,1385,4,0 +BRDA:9261,1385,5,0 +BRDA:9278,1386,0,0 +BRDA:9278,1386,1,0 +BRDA:9318,1387,0,0 +BRDA:9318,1387,1,0 +BRDA:9318,1388,0,0 +BRDA:9318,1388,1,0 +BRDA:9332,1389,0,0 +BRDA:9332,1389,1,0 +BRDA:9332,1390,0,0 +BRDA:9332,1390,1,0 +BRDA:9332,1391,0,0 +BRDA:9332,1391,1,0 +BRDA:9345,1392,0,0 +BRDA:9345,1392,1,0 +BRDA:9361,1393,0,0 +BRDA:9361,1393,1,0 +BRDA:9362,1394,0,0 +BRDA:9362,1394,1,0 +BRDA:9362,1394,2,0 +BRDA:9362,1394,3,0 +BRDA:9362,1394,4,0 +BRDA:9372,1395,0,0 +BRDA:9372,1395,1,0 +BRDA:9373,1396,0,0 +BRDA:9373,1396,1,0 +BRDA:9373,1396,2,0 +BRDA:9373,1396,3,0 +BRDA:9381,1397,0,0 +BRDA:9381,1397,1,0 +BRDA:9381,1398,0,0 +BRDA:9381,1398,1,0 +BRDA:9381,1398,2,0 +BRDA:9381,1398,3,0 +BRDA:9381,1398,4,0 +BRDA:9381,1398,5,0 +BRDA:9381,1398,6,0 +BRDA:9381,1398,7,0 +BRDA:9381,1398,8,0 +BRDA:9381,1398,9,0 +BRDA:9381,1398,10,0 +BRDA:9381,1398,11,0 +BRDA:9381,1398,12,0 +BRDA:9381,1398,13,0 +BRDA:9381,1398,14,0 +BRDA:9381,1398,15,0 +BRDA:9381,1398,16,0 +BRDA:9381,1398,17,0 +BRDA:9403,1399,0,0 +BRDA:9403,1399,1,0 +BRDA:9403,1400,0,0 +BRDA:9403,1400,1,0 +BRDA:9403,1400,2,0 +BRDA:9403,1400,3,0 +BRDA:9403,1400,4,0 +BRDA:9403,1400,5,0 +BRDA:9403,1400,6,0 +BRDA:9403,1400,7,0 +BRDA:9403,1400,8,0 +BRDA:9403,1400,9,0 +BRDA:9403,1400,10,0 +BRDA:9403,1400,11,0 +BRDA:9403,1400,12,0 +BRDA:9403,1400,13,0 +BRDA:9403,1400,14,0 +BRDA:9403,1400,15,0 +BRDA:9403,1400,16,0 +BRDA:9403,1400,17,0 +BRDA:9403,1400,18,0 +BRDA:9403,1400,19,0 +BRDA:9403,1400,20,0 +BRDA:9403,1400,21,0 +BRDA:9448,1401,0,0 +BRDA:9448,1401,1,0 +BRDA:9482,1402,0,0 +BRDA:9482,1402,1,0 +BRDA:9525,1403,0,0 +BRDA:9525,1403,1,0 +BRDA:9563,1404,0,0 +BRDA:9563,1404,1,0 +BRDA:9596,1405,0,0 +BRDA:9596,1405,1,0 +BRDA:9596,1406,0,0 +BRDA:9596,1406,1,0 +BRDA:9596,1406,2,0 +BRDA:9596,1407,0,0 +BRDA:9596,1407,1,0 +BRDA:9618,1408,0,0 +BRDA:9618,1408,1,0 +BRDA:9640,1409,0,0 +BRDA:9640,1409,1,0 +BRDA:9640,1410,0,0 +BRDA:9640,1410,1,0 +BRDA:9664,1411,0,0 +BRDA:9664,1411,1,0 +BRDA:9674,1412,0,0 +BRDA:9674,1412,1,0 +BRDA:9675,1413,0,0 +BRDA:9675,1413,1,0 +BRDA:9677,1414,0,0 +BRDA:9677,1414,1,0 +BRDA:9677,1415,0,0 +BRDA:9677,1415,1,0 +BRDA:9724,1416,0,0 +BRDA:9724,1416,1,0 +BRDA:9724,1417,0,0 +BRDA:9724,1417,1,0 +BRDA:9727,1418,0,0 +BRDA:9727,1418,1,0 +BRDA:9751,1419,0,0 +BRDA:9751,1419,1,0 +BRDA:9761,1420,0,0 +BRDA:9761,1420,1,0 +BRDA:9765,1421,0,0 +BRDA:9765,1421,1,0 +BRDA:9767,1422,0,0 +BRDA:9767,1422,1,0 +BRDA:9768,1423,0,0 +BRDA:9768,1423,1,0 +BRDA:9769,1424,0,0 +BRDA:9769,1424,1,0 +BRDA:9771,1425,0,0 +BRDA:9771,1425,1,0 +BRDA:9792,1426,0,0 +BRDA:9792,1426,1,0 +BRDA:9793,1427,0,0 +BRDA:9793,1427,1,0 +BRDA:9805,1428,0,0 +BRDA:9805,1428,1,0 +BRDA:9808,1429,0,0 +BRDA:9808,1429,1,0 +BRDA:9812,1430,0,0 +BRDA:9812,1430,1,0 +BRDA:9813,1431,0,0 +BRDA:9813,1431,1,0 +BRDA:9816,1432,0,0 +BRDA:9816,1432,1,0 +BRDA:9816,1433,0,0 +BRDA:9816,1433,1,0 +BRDA:9836,1434,0,0 +BRDA:9836,1434,1,0 +BRDA:9839,1435,0,0 +BRDA:9839,1435,1,0 +BRDA:9868,1436,0,0 +BRDA:9868,1436,1,0 +BRDA:9868,1436,2,0 +BRDA:9868,1436,3,0 +BRDA:9872,1437,0,0 +BRDA:9872,1437,1,0 +BRDA:9872,1438,0,0 +BRDA:9872,1438,1,0 +BRDA:9872,1439,0,0 +BRDA:9872,1439,1,0 +BRDA:9886,1440,0,0 +BRDA:9886,1440,1,0 +BRDA:9887,1441,0,0 +BRDA:9887,1441,1,0 +BRDA:9907,1442,0,0 +BRDA:9907,1442,1,0 +BRDA:9929,1443,0,0 +BRDA:9929,1443,1,0 +BRDA:9948,1444,0,0 +BRDA:9948,1444,1,0 +BRDA:9949,1445,0,0 +BRDA:9949,1445,1,0 +BRDA:9970,1446,0,0 +BRDA:9970,1446,1,0 +BRDA:9986,1447,0,0 +BRDA:9986,1447,1,0 +BRDA:10004,1448,0,0 +BRDA:10004,1448,1,0 +BRDA:10005,1449,0,0 +BRDA:10005,1449,1,0 +BRDA:10034,1450,0,0 +BRDA:10034,1450,1,0 +BRDA:10036,1451,0,0 +BRDA:10036,1451,1,0 +BRDA:10038,1452,0,0 +BRDA:10038,1452,1,0 +BRDA:10063,1453,0,0 +BRDA:10063,1453,1,0 +BRDA:10086,1454,0,0 +BRDA:10086,1454,1,0 +BRDA:10087,1455,0,0 +BRDA:10087,1455,1,0 +BRDA:10087,1456,0,0 +BRDA:10087,1456,1,0 +BRDA:10109,1457,0,0 +BRDA:10109,1457,1,0 +BRDA:10110,1458,0,0 +BRDA:10110,1458,1,0 +BRDA:10110,1458,2,0 +BRDA:10110,1458,3,0 +BRDA:10110,1458,4,0 +BRDA:10110,1458,5,0 +BRDA:10134,1459,0,0 +BRDA:10134,1459,1,0 +BRDA:10138,1460,0,0 +BRDA:10138,1460,1,0 +BRDA:10138,1461,0,0 +BRDA:10138,1461,1,0 +BRDA:10138,1461,2,0 +BRDA:10138,1461,3,0 +BRDA:10138,1461,4,0 +BRDA:10142,1462,0,0 +BRDA:10142,1462,1,0 +BRDA:10142,1462,2,0 +BRDA:10142,1462,3,0 +BRDA:10158,1463,0,0 +BRDA:10158,1463,1,0 +BRDA:10158,1464,0,0 +BRDA:10158,1464,1,0 +BRDA:10158,1464,2,0 +BRDA:10158,1464,3,0 +BRDA:10170,1465,0,0 +BRDA:10170,1465,1,0 +BRDA:10170,1465,2,0 +BRDA:10170,1465,3,0 +BRDA:10171,1466,0,0 +BRDA:10171,1466,1,0 +BRDA:10182,1467,0,0 +BRDA:10182,1467,1,0 +BRDA:10224,1468,0,0 +BRDA:10224,1468,1,0 +BRDA:10228,1469,0,0 +BRDA:10228,1469,1,0 +BRDA:10255,1470,0,0 +BRDA:10255,1470,1,0 +BRDA:10295,1471,0,0 +BRDA:10295,1471,1,0 +BRDA:10322,1472,0,0 +BRDA:10322,1472,1,0 +BRDA:10343,1473,0,0 +BRDA:10343,1473,1,0 +BRDA:10403,1474,0,0 +BRDA:10403,1474,1,0 +BRDA:10425,1475,0,0 +BRDA:10425,1475,1,0 +BRDA:10473,1476,0,0 +BRDA:10473,1476,1,0 +BRDA:10473,1476,2,0 +BRDA:10473,1476,3,0 +BRDA:10476,1477,0,0 +BRDA:10476,1477,1,0 +BRDA:10476,1477,2,0 +BRDA:10499,1478,0,0 +BRDA:10499,1478,1,0 +BRDA:10503,1479,0,0 +BRDA:10503,1479,1,0 +BRDA:10503,1480,0,0 +BRDA:10503,1480,1,0 +BRDA:10524,1481,0,0 +BRDA:10524,1481,1,0 +BRDA:10524,1482,0,0 +BRDA:10524,1482,1,0 +BRDA:10528,1483,0,0 +BRDA:10528,1483,1,0 +BRDA:10528,1484,0,0 +BRDA:10528,1484,1,0 +BRDA:10548,1485,0,0 +BRDA:10548,1485,1,0 +BRDA:10595,1486,0,0 +BRDA:10595,1486,1,0 +BRDA:10595,1486,2,0 +BRDA:10656,1487,0,0 +BRDA:10656,1487,1,0 +BRDA:10662,1488,0,0 +BRDA:10662,1488,1,0 +BRDA:10662,1488,2,0 +BRDA:10662,1488,3,0 +BRDA:10695,1489,0,0 +BRDA:10695,1489,1,0 +BRDA:10695,1489,2,0 +BRDA:10726,1490,0,0 +BRDA:10726,1490,1,0 +BRDA:10756,1491,0,0 +BRDA:10756,1491,1,0 +BRDA:10756,1491,2,0 +BRDA:11180,1492,0,0 +BRDA:11180,1492,1,0 +BRDA:11180,1492,2,0 +BRDA:11180,1492,3,0 +BRDA:11183,1493,0,0 +BRDA:11183,1493,1,0 +BRDA:11183,1493,2,0 +BRDA:11183,1493,3,0 +BRDA:11186,1494,0,0 +BRDA:11186,1494,1,0 +BRDA:11186,1494,2,0 +BRDA:11189,1495,0,0 +BRDA:11189,1495,1,0 +BRDA:11189,1495,2,0 +BRDA:11189,1495,3,0 +BRDA:11192,1496,0,0 +BRDA:11192,1496,1,0 +BRDA:11192,1496,2,0 +BRDA:11192,1496,3,0 +BRDA:11192,1496,4,0 +BRDA:11195,1497,0,0 +BRDA:11195,1497,1,0 +BRDA:11198,1498,0,0 +BRDA:11198,1498,1,0 +BRDA:11203,1499,0,0 +BRDA:11203,1499,1,0 +BRDA:11203,1499,2,0 +BRDA:11208,1500,0,0 +BRDA:11208,1500,1,0 +BRDA:11209,1501,0,0 +BRDA:11209,1501,1,0 +BRDA:11210,1502,0,0 +BRDA:11210,1502,1,0 +BRDA:11211,1503,0,0 +BRDA:11211,1503,1,0 +BRDA:11212,1504,0,0 +BRDA:11212,1504,1,0 +BRDA:11213,1505,0,0 +BRDA:11213,1505,1,0 +BRDA:11256,1506,0,0 +BRDA:11256,1506,1,0 +BRDA:11256,1506,2,0 +BRDA:11256,1506,3,0 +BRDA:11277,1507,0,0 +BRDA:11277,1507,1,0 +BRDA:11297,1508,0,0 +BRDA:11297,1508,1,0 +BRDA:11300,1509,0,0 +BRDA:11300,1509,1,0 +BRDA:11317,1510,0,0 +BRDA:11317,1510,1,0 +BRDA:11320,1511,0,0 +BRDA:11320,1511,1,0 +BRDA:11339,1512,0,0 +BRDA:11339,1512,1,0 +BRDA:11342,1513,0,0 +BRDA:11342,1513,1,0 +BRDA:11360,1514,0,0 +BRDA:11360,1514,1,0 +BRDA:11366,1515,0,0 +BRDA:11366,1515,1,0 +BRDA:11383,1516,0,0 +BRDA:11383,1516,1,0 +BRDA:11384,1517,0,0 +BRDA:11384,1517,1,0 +BRDA:11398,1518,0,0 +BRDA:11398,1518,1,0 +BRDA:11401,1519,0,0 +BRDA:11401,1519,1,0 +BRDA:11419,1520,0,0 +BRDA:11419,1520,1,0 +BRDA:11461,1521,0,0 +BRDA:11461,1521,1,0 +BRDA:11463,1522,0,0 +BRDA:11463,1522,1,0 +BRDA:11463,1523,0,0 +BRDA:11463,1523,1,0 +BRDA:11485,1524,0,0 +BRDA:11485,1524,1,0 +BRDA:11486,1525,0,0 +BRDA:11486,1525,1,0 +BRDA:11486,1526,0,0 +BRDA:11486,1526,1,0 +BRDA:11507,1527,0,0 +BRDA:11507,1527,1,0 +BRDA:11510,1528,0,0 +BRDA:11510,1528,1,0 +BRDA:11545,1529,0,0 +BRDA:11545,1529,1,0 +BRDA:11562,1530,0,0 +BRDA:11562,1530,1,0 +BRDA:11583,1531,0,0 +BRDA:11583,1531,1,0 +BRDA:11585,1532,0,0 +BRDA:11585,1532,1,0 +BRDA:11586,1533,0,0 +BRDA:11586,1533,1,0 +BRDA:11603,1534,0,0 +BRDA:11603,1534,1,0 +BRDA:11623,1535,0,0 +BRDA:11623,1535,1,0 +BRDA:11651,1536,0,0 +BRDA:11651,1536,1,0 +BRDA:11652,1537,0,0 +BRDA:11652,1537,1,0 +BRDA:11664,1538,0,0 +BRDA:11664,1538,1,0 +BRDA:11677,1539,0,0 +BRDA:11677,1539,1,0 +BRDA:11696,1540,0,0 +BRDA:11696,1540,1,0 +BRDA:11739,1541,0,0 +BRDA:11739,1541,1,0 +BRDA:11740,1542,0,0 +BRDA:11740,1542,1,0 +BRDA:11834,1543,0,0 +BRDA:11834,1543,1,0 +BRDA:11850,1544,0,0 +BRDA:11850,1544,1,0 +BRDA:11867,1545,0,0 +BRDA:11867,1545,1,0 +BRDA:11913,1546,0,0 +BRDA:11913,1546,1,0 +BRDA:12003,1547,0,0 +BRDA:12003,1547,1,0 +BRDA:12003,1548,0,0 +BRDA:12003,1548,1,0 +BRDA:12060,1549,0,0 +BRDA:12060,1549,1,0 +BRDA:12080,1550,0,0 +BRDA:12080,1550,1,0 +BRDA:12095,1551,0,0 +BRDA:12095,1551,1,0 +BRDA:12108,1552,0,0 +BRDA:12108,1552,1,0 +BRDA:12145,1553,0,0 +BRDA:12145,1553,1,0 +BRDA:12156,1554,0,0 +BRDA:12156,1554,1,0 +BRDA:12191,1555,0,0 +BRDA:12191,1555,1,0 +BRDA:12223,1556,0,0 +BRDA:12223,1556,1,0 +BRDA:12223,1556,2,0 +BRDA:12223,1556,3,0 +BRDA:12224,1557,0,0 +BRDA:12224,1557,1,0 +BRDA:12247,1558,0,0 +BRDA:12247,1558,1,0 +BRDA:12250,1559,0,0 +BRDA:12250,1559,1,0 +BRDA:12255,1560,0,0 +BRDA:12255,1560,1,0 +BRDA:12256,1561,0,0 +BRDA:12256,1561,1,0 +BRDA:12257,1562,0,0 +BRDA:12257,1562,1,0 +BRDA:12268,1563,0,0 +BRDA:12268,1563,1,0 +BRDA:12269,1564,0,0 +BRDA:12269,1564,1,0 +BRDA:12269,1564,2,0 +BRDA:12270,1565,0,0 +BRDA:12270,1565,1,0 +BRDA:12276,1566,0,0 +BRDA:12276,1566,1,0 +BRDA:12296,1567,0,0 +BRDA:12296,1567,1,0 +BRDA:12309,1568,0,0 +BRDA:12309,1568,1,0 +BRDA:12310,1569,0,0 +BRDA:12310,1569,1,0 +BRDA:12311,1570,0,0 +BRDA:12311,1570,1,0 +BRDA:12433,1571,0,0 +BRDA:12433,1571,1,0 +BRDA:12433,1572,0,0 +BRDA:12433,1572,1,0 +BRDA:12433,1572,2,0 +BRDA:12434,1573,0,0 +BRDA:12434,1573,1,0 +BRDA:12437,1574,0,0 +BRDA:12437,1574,1,0 +BRDA:12455,1575,0,0 +BRDA:12455,1575,1,0 +BRDA:12458,1576,0,0 +BRDA:12458,1576,1,0 +BRDA:12607,1577,0,0 +BRDA:12607,1577,1,0 +BRDA:12631,1578,0,0 +BRDA:12631,1578,1,0 +BRDA:12636,1579,0,0 +BRDA:12636,1579,1,0 +BRDA:12642,1580,0,0 +BRDA:12642,1580,1,0 +BRDA:12642,1581,0,0 +BRDA:12642,1581,1,0 +BRDA:12642,1581,2,0 +BRDA:12642,1581,3,0 +BRDA:12648,1582,0,0 +BRDA:12648,1582,1,0 +BRDA:12660,1583,0,0 +BRDA:12660,1583,1,0 +BRDA:12662,1584,0,0 +BRDA:12662,1584,1,0 +BRDA:12663,1585,0,0 +BRDA:12663,1585,1,0 +BRDA:12690,1586,0,0 +BRDA:12690,1586,1,0 +BRDA:12707,1587,0,0 +BRDA:12707,1587,1,0 +BRDA:12722,1588,0,0 +BRDA:12722,1588,1,0 +BRDA:12723,1589,0,0 +BRDA:12723,1589,1,0 +BRDA:12738,1590,0,0 +BRDA:12738,1590,1,0 +BRDA:12740,1591,0,0 +BRDA:12740,1591,1,0 +BRDA:12742,1592,0,0 +BRDA:12742,1592,1,0 +BRDA:12756,1593,0,0 +BRDA:12756,1593,1,0 +BRDA:12771,1594,0,0 +BRDA:12771,1594,1,0 +BRDA:12772,1595,0,0 +BRDA:12772,1595,1,0 +BRDA:12772,1596,0,0 +BRDA:12772,1596,1,0 +BRDA:12794,1597,0,0 +BRDA:12794,1597,1,0 +BRDA:12828,1598,0,0 +BRDA:12828,1598,1,0 +BRDA:12832,1599,0,0 +BRDA:12832,1599,1,0 +BRDA:12854,1600,0,0 +BRDA:12854,1600,1,0 +BRDA:12884,1601,0,0 +BRDA:12884,1601,1,0 +BRDA:12911,1602,0,0 +BRDA:12911,1602,1,0 +BRDA:12931,1603,0,0 +BRDA:12931,1603,1,0 +BRDA:12947,1604,0,0 +BRDA:12947,1604,1,0 +BRDA:12992,1605,0,0 +BRDA:12992,1605,1,0 +BRDA:13015,1606,0,0 +BRDA:13015,1606,1,0 +BRDA:13136,1607,0,0 +BRDA:13136,1607,1,0 +BRDA:13138,1608,0,0 +BRDA:13138,1608,1,0 +BRDA:13138,1609,0,0 +BRDA:13138,1609,1,0 +BRDA:13169,1610,0,0 +BRDA:13169,1610,1,0 +BRDA:13170,1611,0,0 +BRDA:13170,1611,1,0 +BRDA:13170,1611,2,0 +BRDA:13171,1612,0,0 +BRDA:13171,1612,1,0 +BRDA:13171,1612,2,0 +BRDA:13171,1612,3,0 +BRDA:13172,1613,0,0 +BRDA:13172,1613,1,0 +BRDA:13172,1613,2,0 +BRDA:13172,1613,3,0 +BRDA:13173,1614,0,0 +BRDA:13173,1614,1,0 +BRDA:13177,1615,0,0 +BRDA:13177,1615,1,0 +BRDA:13177,1616,0,0 +BRDA:13177,1616,1,0 +BRDA:13177,1616,2,0 +BRDA:13178,1617,0,0 +BRDA:13178,1617,1,0 +BRDA:13178,1617,2,0 +BRDA:13178,1617,3,0 +BRDA:13178,1617,4,0 +BRDA:13178,1617,5,0 +BRDA:13178,1617,6,0 +BRDA:13178,1617,7,0 +BRDA:13178,1617,8,0 +BRDA:13178,1617,9,0 +BRDA:13203,1618,0,0 +BRDA:13203,1618,1,0 +BRDA:13239,1619,0,0 +BRDA:13239,1619,1,0 +BRDA:13239,1620,0,0 +BRDA:13239,1620,1,0 +BRDA:13239,1620,2,0 +BRDA:13239,1620,3,0 +BRDA:13257,1621,0,0 +BRDA:13257,1621,1,0 +BRDA:13257,1622,0,0 +BRDA:13257,1622,1,0 +BRDA:13257,1622,2,0 +BRDA:13257,1623,0,0 +BRDA:13257,1623,1,0 +BRDA:13274,1624,0,0 +BRDA:13274,1624,1,0 +BRDA:13309,1625,0,0 +BRDA:13309,1625,1,0 +BRDA:13322,1626,0,0 +BRDA:13322,1626,1,0 +BRDA:13335,1627,0,0 +BRDA:13335,1627,1,0 +BRDA:13335,1628,0,0 +BRDA:13335,1628,1,0 +BRDA:13362,1629,0,0 +BRDA:13362,1629,1,0 +BRDA:13377,1630,0,0 +BRDA:13377,1630,1,0 +BRDA:13378,1631,0,0 +BRDA:13378,1631,1,0 +BRDA:13379,1632,0,0 +BRDA:13379,1632,1,0 +BRDA:13381,1633,0,0 +BRDA:13381,1633,1,0 +BRDA:13382,1634,0,0 +BRDA:13382,1634,1,0 +BRDA:13410,1635,0,0 +BRDA:13410,1635,1,0 +BRDA:13411,1636,0,0 +BRDA:13411,1636,1,0 +BRDA:13413,1637,0,0 +BRDA:13413,1637,1,0 +BRDA:13416,1638,0,0 +BRDA:13416,1638,1,0 +BRDA:13420,1639,0,0 +BRDA:13420,1639,1,0 +BRDA:13422,1640,0,0 +BRDA:13422,1640,1,0 +BRDA:13427,1641,0,0 +BRDA:13427,1641,1,0 +BRDA:13429,1642,0,0 +BRDA:13429,1642,1,0 +BRDA:13432,1643,0,0 +BRDA:13432,1643,1,0 +BRDA:13432,1644,0,0 +BRDA:13432,1644,1,0 +BRDA:13432,1644,2,0 +BRDA:13432,1644,3,0 +BRDA:13433,1645,0,0 +BRDA:13433,1645,1,0 +BRDA:13433,1646,0,0 +BRDA:13433,1646,1,0 +BRDA:13434,1647,0,0 +BRDA:13434,1647,1,0 +BRDA:13435,1648,0,0 +BRDA:13435,1648,1,0 +BRDA:13440,1649,0,0 +BRDA:13440,1649,1,0 +BRDA:13441,1650,0,0 +BRDA:13441,1650,1,0 +BRDA:13447,1651,0,0 +BRDA:13447,1651,1,0 +BRDA:13449,1652,0,0 +BRDA:13449,1652,1,0 +BRDA:13454,1653,0,0 +BRDA:13454,1653,1,0 +BRDA:13455,1654,0,0 +BRDA:13455,1654,1,0 +BRDA:13456,1655,0,0 +BRDA:13456,1655,1,0 +BRDA:13458,1656,0,0 +BRDA:13458,1656,1,0 +BRDA:13459,1657,0,0 +BRDA:13459,1657,1,0 +BRDA:13460,1658,0,0 +BRDA:13460,1658,1,0 +BRDA:13494,1659,0,0 +BRDA:13494,1659,1,0 +BRDA:13503,1660,0,0 +BRDA:13503,1660,1,0 +BRDA:13503,1661,0,0 +BRDA:13503,1661,1,0 +BRDA:13503,1661,2,0 +BRDA:13521,1662,0,0 +BRDA:13521,1662,1,0 +BRDA:13546,1663,0,0 +BRDA:13546,1663,1,0 +BRDA:13549,1664,0,0 +BRDA:13549,1664,1,0 +BRDA:13552,1665,0,0 +BRDA:13552,1665,1,0 +BRDA:13556,1666,0,0 +BRDA:13556,1666,1,0 +BRDA:13564,1667,0,0 +BRDA:13564,1667,1,0 +BRDA:13566,1668,0,0 +BRDA:13566,1668,1,0 +BRDA:13566,1669,0,0 +BRDA:13566,1669,1,0 +BRDA:13567,1670,0,0 +BRDA:13567,1670,1,0 +BRDA:13567,1671,0,0 +BRDA:13567,1671,1,0 +BRDA:13570,1672,0,0 +BRDA:13570,1672,1,0 +BRDA:13576,1673,0,0 +BRDA:13576,1673,1,0 +BRDA:13639,1674,0,0 +BRDA:13639,1674,1,0 +BRDA:13639,1675,0,0 +BRDA:13639,1675,1,0 +BRDA:13639,1676,0,0 +BRDA:13639,1676,1,0 +BRDA:13640,1677,0,0 +BRDA:13640,1677,1,0 +BRDA:13664,1678,0,0 +BRDA:13664,1678,1,0 +BRDA:13665,1679,0,0 +BRDA:13665,1679,1,0 +BRDA:13667,1680,0,0 +BRDA:13667,1680,1,0 +BRDA:13667,1681,0,0 +BRDA:13667,1681,1,0 +BRDA:13668,1682,0,0 +BRDA:13668,1682,1,0 +BRDA:13671,1683,0,0 +BRDA:13671,1683,1,0 +BRDA:13689,1684,0,0 +BRDA:13689,1684,1,0 +BRDA:13711,1685,0,0 +BRDA:13711,1685,1,0 +BRDA:13712,1686,0,0 +BRDA:13712,1686,1,0 +BRDA:13716,1687,0,0 +BRDA:13716,1687,1,0 +BRDA:13716,1688,0,0 +BRDA:13716,1688,1,0 +BRDA:13717,1689,0,0 +BRDA:13717,1689,1,0 +BRDA:13723,1690,0,0 +BRDA:13723,1690,1,0 +BRDA:13764,1691,0,0 +BRDA:13764,1691,1,0 +BRDA:13776,1692,0,0 +BRDA:13776,1692,1,0 +BRDA:13808,1693,0,0 +BRDA:13808,1693,1,0 +BRDA:13811,1694,0,0 +BRDA:13811,1694,1,0 +BRDA:13811,1695,0,0 +BRDA:13811,1695,1,0 +BRDA:13827,1696,0,0 +BRDA:13827,1696,1,0 +BRDA:13838,1697,0,0 +BRDA:13838,1697,1,0 +BRDA:13839,1698,0,0 +BRDA:13839,1698,1,0 +BRDA:13841,1699,0,0 +BRDA:13841,1699,1,0 +BRDA:13841,1700,0,0 +BRDA:13841,1700,1,0 +BRDA:13868,1701,0,0 +BRDA:13868,1701,1,0 +BRDA:13880,1702,0,0 +BRDA:13880,1702,1,0 +BRDA:13893,1703,0,0 +BRDA:13893,1703,1,0 +BRDA:13907,1704,0,0 +BRDA:13907,1704,1,0 +BRDA:13917,1705,0,0 +BRDA:13917,1705,1,0 +BRDA:13917,1706,0,0 +BRDA:13917,1706,1,0 +BRDA:13921,1707,0,0 +BRDA:13921,1707,1,0 +BRDA:13921,1708,0,0 +BRDA:13921,1708,1,0 +BRDA:13921,1708,2,0 +BRDA:13921,1708,3,0 +BRDA:13922,1709,0,0 +BRDA:13922,1709,1,0 +BRDA:13931,1710,0,0 +BRDA:13931,1710,1,0 +BRDA:13933,1711,0,0 +BRDA:13933,1711,1,0 +BRDA:13935,1712,0,0 +BRDA:13935,1712,1,0 +BRDA:13935,1713,0,0 +BRDA:13935,1713,1,0 +BRDA:13936,1714,0,0 +BRDA:13936,1714,1,0 +BRDA:13936,1715,0,0 +BRDA:13936,1715,1,0 +BRDA:13943,1716,0,0 +BRDA:13943,1716,1,0 +BRDA:13943,1717,0,0 +BRDA:13943,1717,1,0 +BRDA:13950,1718,0,0 +BRDA:13950,1718,1,0 +BRDA:13990,1719,0,0 +BRDA:13990,1719,1,0 +BRDA:13991,1720,0,0 +BRDA:13991,1720,1,0 +BRDA:14002,1721,0,0 +BRDA:14002,1721,1,0 +BRDA:14013,1722,0,0 +BRDA:14013,1722,1,0 +BRDA:14024,1723,0,0 +BRDA:14024,1723,1,0 +BRDA:14042,1724,0,0 +BRDA:14042,1724,1,0 +BRDA:14045,1725,0,0 +BRDA:14045,1725,1,0 +BRDA:14045,1726,0,0 +BRDA:14045,1726,1,0 +BRDA:14045,1726,2,0 +BRDA:14045,1726,3,0 +BRDA:14046,1727,0,0 +BRDA:14046,1727,1,0 +BRDA:14068,1728,0,0 +BRDA:14068,1728,1,0 +BRDA:14069,1729,0,0 +BRDA:14069,1729,1,0 +BRDA:14071,1730,0,0 +BRDA:14071,1730,1,0 +BRDA:14072,1731,0,0 +BRDA:14072,1731,1,0 +BRDA:14078,1732,0,0 +BRDA:14078,1732,1,0 +BRDA:14078,1733,0,0 +BRDA:14078,1733,1,0 +BRDA:14079,1734,0,0 +BRDA:14079,1734,1,0 +BRDA:14085,1735,0,0 +BRDA:14085,1735,1,0 +BRDA:14085,1736,0,0 +BRDA:14085,1736,1,0 +BRDA:14086,1737,0,0 +BRDA:14086,1737,1,0 +BRDA:14087,1738,0,0 +BRDA:14087,1738,1,0 +BRDA:14087,1739,0,0 +BRDA:14087,1739,1,0 +BRDA:14091,1740,0,0 +BRDA:14091,1740,1,0 +BRDA:14092,1741,0,0 +BRDA:14092,1741,1,0 +BRDA:14093,1742,0,0 +BRDA:14093,1742,1,0 +BRDA:14095,1743,0,0 +BRDA:14095,1743,1,0 +BRDA:14095,1744,0,0 +BRDA:14095,1744,1,0 +BRDA:14096,1745,0,0 +BRDA:14096,1745,1,0 +BRDA:14097,1746,0,0 +BRDA:14097,1746,1,0 +BRDA:14099,1747,0,0 +BRDA:14099,1747,1,0 +BRDA:14103,1748,0,0 +BRDA:14103,1748,1,0 +BRDA:14106,1749,0,0 +BRDA:14106,1749,1,0 +BRDA:14118,1750,0,0 +BRDA:14118,1750,1,0 +BRDA:14136,1751,0,0 +BRDA:14136,1751,1,0 +BRDA:14142,1752,0,0 +BRDA:14142,1752,1,0 +BRDA:14142,1753,0,0 +BRDA:14142,1753,1,0 +BRDA:14142,1754,0,0 +BRDA:14142,1754,1,0 +BRDA:14155,1755,0,0 +BRDA:14155,1755,1,0 +BRDA:14155,1756,0,0 +BRDA:14155,1756,1,0 +BRDA:14156,1757,0,0 +BRDA:14156,1757,1,0 +BRDA:14156,1758,0,0 +BRDA:14156,1758,1,0 +BRDA:14161,1759,0,0 +BRDA:14161,1759,1,0 +BRDA:14164,1760,0,0 +BRDA:14164,1760,1,0 +BRDA:14164,1761,0,0 +BRDA:14164,1761,1,0 +BRDA:14184,1762,0,0 +BRDA:14184,1762,1,0 +BRDA:14184,1763,0,0 +BRDA:14184,1763,1,0 +BRDA:14187,1764,0,0 +BRDA:14187,1764,1,0 +BRDA:14199,1765,0,0 +BRDA:14199,1765,1,0 +BRDA:14210,1766,0,0 +BRDA:14210,1766,1,0 +BRDA:14221,1767,0,0 +BRDA:14221,1767,1,0 +BRDA:14221,1767,2,0 +BRDA:14235,1768,0,0 +BRDA:14235,1768,1,0 +BRDA:14238,1769,0,0 +BRDA:14238,1769,1,0 +BRDA:14241,1770,0,0 +BRDA:14241,1770,1,0 +BRDA:14242,1771,0,0 +BRDA:14242,1771,1,0 +BRDA:14257,1772,0,0 +BRDA:14257,1772,1,0 +BRDA:14262,1773,0,0 +BRDA:14262,1773,1,0 +BRDA:14262,1774,0,0 +BRDA:14262,1774,1,0 +BRDA:14277,1775,0,0 +BRDA:14277,1775,1,0 +BRDA:14284,1776,0,0 +BRDA:14284,1776,1,0 +BRDA:14284,1777,0,0 +BRDA:14284,1777,1,0 +BRDA:14284,1777,2,0 +BRDA:14314,1778,0,0 +BRDA:14314,1778,1,0 +BRDA:14331,1779,0,0 +BRDA:14331,1779,1,0 +BRDA:14331,1780,0,0 +BRDA:14331,1780,1,0 +BRDA:14335,1781,0,0 +BRDA:14335,1781,1,0 +BRDA:14348,1782,0,0 +BRDA:14348,1782,1,0 +BRDA:14348,1783,0,0 +BRDA:14348,1783,1,0 +BRDA:14353,1784,0,0 +BRDA:14353,1784,1,0 +BRDA:14353,1785,0,0 +BRDA:14353,1785,1,0 +BRDA:14371,1786,0,0 +BRDA:14371,1786,1,0 +BRDA:14375,1787,0,0 +BRDA:14375,1787,1,0 +BRDA:14376,1788,0,0 +BRDA:14376,1788,1,0 +BRDA:14380,1789,0,0 +BRDA:14380,1789,1,0 +BRDA:14384,1790,0,0 +BRDA:14384,1790,1,0 +BRDA:14412,1791,0,0 +BRDA:14412,1791,1,0 +BRDA:14416,1792,0,0 +BRDA:14416,1792,1,0 +BRDA:14422,1793,0,0 +BRDA:14422,1793,1,0 +BRDA:14424,1794,0,0 +BRDA:14424,1794,1,0 +BRDA:14425,1795,0,0 +BRDA:14425,1795,1,0 +BRDA:14425,1795,2,0 +BRDA:14428,1796,0,0 +BRDA:14428,1796,1,0 +BRDA:14428,1797,0,0 +BRDA:14428,1797,1,0 +BRDA:14428,1797,2,0 +BRDA:14429,1798,0,0 +BRDA:14429,1798,1,0 +BRDA:14432,1799,0,0 +BRDA:14432,1799,1,0 +BRDA:14435,1800,0,0 +BRDA:14435,1800,1,0 +BRDA:14439,1801,0,0 +BRDA:14439,1801,1,0 +BRDA:14447,1802,0,0 +BRDA:14447,1802,1,0 +BRDA:14447,1803,0,0 +BRDA:14447,1803,1,0 +BRDA:14449,1804,0,0 +BRDA:14449,1804,1,0 +BRDA:14452,1805,0,0 +BRDA:14452,1805,1,0 +BRDA:14452,1806,0,0 +BRDA:14452,1806,1,0 +BRDA:14452,1806,2,0 +BRDA:14460,1807,0,0 +BRDA:14460,1807,1,0 +BRDA:14479,1808,0,0 +BRDA:14479,1808,1,0 +BRDA:14482,1809,0,0 +BRDA:14482,1809,1,0 +BRDA:14483,1810,0,0 +BRDA:14483,1810,1,0 +BRDA:14497,1811,0,0 +BRDA:14497,1811,1,0 +BRDA:14544,1812,0,0 +BRDA:14544,1812,1,0 +BRDA:14576,1813,0,0 +BRDA:14576,1813,1,0 +BRDA:14581,1814,0,0 +BRDA:14581,1814,1,0 +BRDA:14584,1815,0,0 +BRDA:14584,1815,1,0 +BRDA:14590,1816,0,0 +BRDA:14590,1816,1,0 +BRDA:14593,1817,0,0 +BRDA:14593,1817,1,0 +BRDA:14612,1818,0,0 +BRDA:14612,1818,1,0 +BRDA:14617,1819,0,0 +BRDA:14617,1819,1,0 +BRDA:14617,1820,0,0 +BRDA:14617,1820,1,0 +BRDA:14619,1821,0,0 +BRDA:14619,1821,1,0 +BRDA:14655,1822,0,0 +BRDA:14655,1822,1,0 +BRDA:14659,1823,0,0 +BRDA:14659,1823,1,0 +BRDA:14675,1824,0,0 +BRDA:14675,1824,1,0 +BRDA:14675,1825,0,0 +BRDA:14675,1825,1,0 +BRDA:14675,1825,2,0 +BRDA:14681,1826,0,0 +BRDA:14681,1826,1,0 +BRDA:14685,1827,0,0 +BRDA:14685,1827,1,0 +BRDA:14740,1828,0,0 +BRDA:14740,1828,1,0 +BRDA:14750,1829,0,0 +BRDA:14750,1829,1,0 +BRDA:14754,1830,0,0 +BRDA:14754,1830,1,0 +BRDA:14756,1831,0,0 +BRDA:14756,1831,1,0 +BRDA:14757,1832,0,0 +BRDA:14757,1832,1,0 +BRDA:14758,1833,0,0 +BRDA:14758,1833,1,0 +BRDA:14760,1834,0,0 +BRDA:14760,1834,1,0 +BRDA:14777,1835,0,0 +BRDA:14777,1835,1,0 +BRDA:14790,1836,0,0 +BRDA:14790,1836,1,0 +BRDA:14823,1837,0,0 +BRDA:14823,1837,1,0 +BRDA:14824,1838,0,0 +BRDA:14824,1838,1,0 +BRDA:14826,1839,0,0 +BRDA:14826,1839,1,0 +BRDA:14827,1840,0,0 +BRDA:14827,1840,1,0 +BRDA:14830,1841,0,0 +BRDA:14830,1841,1,0 +BRDA:14873,1842,0,0 +BRDA:14873,1842,1,0 +BRDA:14875,1843,0,0 +BRDA:14875,1843,1,0 +BRDA:14875,1844,0,0 +BRDA:14875,1844,1,0 +BRDA:14875,1844,2,0 +BRDA:14880,1845,0,0 +BRDA:14880,1845,1,0 +BRDA:14880,1846,0,0 +BRDA:14880,1846,1,0 +BRDA:14880,1846,2,0 +BRDA:14881,1847,0,0 +BRDA:14881,1847,1,0 +BRDA:14909,1848,0,0 +BRDA:14909,1848,1,0 +BRDA:14923,1849,0,0 +BRDA:14923,1849,1,0 +BRDA:14924,1850,0,0 +BRDA:14924,1850,1,0 +BRDA:14925,1851,0,0 +BRDA:14925,1851,1,0 +BRDA:14926,1852,0,0 +BRDA:14926,1852,1,0 +BRDA:14926,1852,2,0 +BRDA:14927,1853,0,0 +BRDA:14927,1853,1,0 +BRDA:14928,1854,0,0 +BRDA:14928,1854,1,0 +BRDA:14928,1854,2,0 +BRDA:14928,1854,3,0 +BRDA:14929,1855,0,0 +BRDA:14929,1855,1,0 +BRDA:14930,1856,0,0 +BRDA:14930,1856,1,0 +BRDA:14930,1856,2,0 +BRDA:14930,1856,3,0 +BRDA:14930,1856,4,0 +BRDA:14931,1857,0,0 +BRDA:14931,1857,1,0 +BRDA:14931,1858,0,0 +BRDA:14931,1858,1,0 +BRDA:14934,1859,0,0 +BRDA:14934,1859,1,0 +BRDA:14936,1860,0,0 +BRDA:14936,1860,1,0 +BRDA:14962,1861,0,0 +BRDA:14962,1861,1,0 +BRDA:14964,1862,0,0 +BRDA:14964,1862,1,0 +BRDA:14964,1863,0,0 +BRDA:14964,1863,1,0 +BRDA:14966,1864,0,0 +BRDA:14966,1864,1,0 +BRDA:14981,1865,0,0 +BRDA:14981,1865,1,0 +BRDA:14984,1866,0,0 +BRDA:14984,1866,1,0 +BRDA:15000,1867,0,0 +BRDA:15000,1867,1,0 +BRDA:15003,1868,0,0 +BRDA:15003,1868,1,0 +BRDA:15007,1869,0,0 +BRDA:15007,1869,1,0 +BRDA:15008,1870,0,0 +BRDA:15008,1870,1,0 +BRDA:15011,1871,0,0 +BRDA:15011,1871,1,0 +BRDA:15011,1872,0,0 +BRDA:15011,1872,1,0 +BRDA:15031,1873,0,0 +BRDA:15031,1873,1,0 +BRDA:15035,1874,0,0 +BRDA:15035,1874,1,0 +BRDA:15036,1875,0,0 +BRDA:15036,1875,1,0 +BRDA:15037,1876,0,0 +BRDA:15037,1876,1,0 +BRDA:15045,1877,0,0 +BRDA:15045,1877,1,0 +BRDA:15050,1878,0,0 +BRDA:15050,1878,1,0 +BRDA:15052,1879,0,0 +BRDA:15052,1879,1,0 +BRDA:15052,1880,0,0 +BRDA:15052,1880,1,0 +BRDA:15053,1881,0,0 +BRDA:15053,1881,1,0 +BRDA:15053,1882,0,0 +BRDA:15053,1882,1,0 +BRDA:15056,1883,0,0 +BRDA:15056,1883,1,0 +BRDA:15060,1884,0,0 +BRDA:15060,1884,1,0 +BRDA:15065,1885,0,0 +BRDA:15065,1885,1,0 +BRDA:15066,1886,0,0 +BRDA:15066,1886,1,0 +BRDA:15086,1887,0,0 +BRDA:15086,1887,1,0 +BRDA:15116,1888,0,0 +BRDA:15116,1888,1,0 +BRDA:15118,1889,0,0 +BRDA:15118,1889,1,0 +BRDA:15118,1890,0,0 +BRDA:15118,1890,1,0 +BRDA:15121,1891,0,0 +BRDA:15121,1891,1,0 +BRDA:15122,1892,0,0 +BRDA:15122,1892,1,0 +BRDA:15122,1893,0,0 +BRDA:15122,1893,1,0 +BRDA:15123,1894,0,0 +BRDA:15123,1894,1,0 +BRDA:15123,1895,0,0 +BRDA:15123,1895,1,0 +BRDA:15138,1896,0,0 +BRDA:15138,1896,1,0 +BRDA:15158,1897,0,0 +BRDA:15158,1897,1,0 +BRDA:15159,1898,0,0 +BRDA:15159,1898,1,0 +BRDA:15169,1899,0,0 +BRDA:15169,1899,1,0 +BRDA:15170,1900,0,0 +BRDA:15170,1900,1,0 +BRDA:15193,1901,0,0 +BRDA:15193,1901,1,0 +BRDA:15207,1902,0,0 +BRDA:15207,1902,1,0 +BRDA:15218,1903,0,0 +BRDA:15218,1903,1,0 +BRDA:15230,1904,0,0 +BRDA:15230,1904,1,0 +BRDA:15233,1905,0,0 +BRDA:15233,1905,1,0 +BRDA:15258,1906,0,0 +BRDA:15258,1906,1,0 +BRDA:15259,1907,0,0 +BRDA:15259,1907,1,0 +BRDA:15259,1908,0,0 +BRDA:15259,1908,1,0 +BRDA:15268,1909,0,0 +BRDA:15268,1909,1,0 +BRDA:15281,1910,0,0 +BRDA:15281,1910,1,0 +BRDA:15285,1911,0,0 +BRDA:15285,1911,1,0 +BRDA:15313,1912,0,0 +BRDA:15313,1912,1,0 +BRDA:15327,1913,0,0 +BRDA:15327,1913,1,0 +BRDA:15354,1914,0,0 +BRDA:15354,1914,1,0 +BRDA:15366,1915,0,0 +BRDA:15366,1915,1,0 +BRDA:15378,1916,0,0 +BRDA:15378,1916,1,0 +BRDA:15391,1917,0,0 +BRDA:15391,1917,1,0 +BRDA:15402,1918,0,0 +BRDA:15402,1918,1,0 +BRDA:15402,1919,0,0 +BRDA:15402,1919,1,0 +BRDA:15402,1919,2,0 +BRDA:15402,1919,3,0 +BRDA:15402,1919,4,0 +BRDA:15402,1919,5,0 +BRDA:15402,1919,6,0 +BRDA:15402,1919,7,0 +BRDA:15402,1919,8,0 +BRDA:15402,1919,9,0 +BRDA:15402,1919,10,0 +BRDA:15402,1919,11,0 +BRDA:15402,1919,12,0 +BRDA:15402,1919,13,0 +BRDA:15402,1919,14,0 +BRDA:15409,1920,0,0 +BRDA:15409,1920,1,0 +BRDA:15409,1921,0,0 +BRDA:15409,1921,1,0 +BRDA:15409,1921,2,0 +BRDA:15409,1921,3,0 +BRDA:15409,1921,4,0 +BRDA:15409,1921,5,0 +BRDA:15409,1921,6,0 +BRDA:15409,1921,7,0 +BRDA:15409,1921,8,0 +BRDA:15409,1921,9,0 +BRDA:15409,1921,10,0 +BRDA:15409,1921,11,0 +BRDA:15409,1921,12,0 +BRDA:15409,1921,13,0 +BRDA:15409,1921,14,0 +BRDA:15443,1922,0,0 +BRDA:15443,1922,1,0 +BRDA:15444,1923,0,0 +BRDA:15444,1923,1,0 +BRDA:15448,1924,0,0 +BRDA:15448,1924,1,0 +BRDA:15486,1925,0,0 +BRDA:15486,1925,1,0 +BRDA:15486,1926,0,0 +BRDA:15486,1926,1,0 +BRDA:15526,1927,0,0 +BRDA:15526,1927,1,0 +BRDA:15526,1928,0,0 +BRDA:15526,1928,1,0 +BRDA:15545,1929,0,0 +BRDA:15545,1929,1,0 +BRDA:15564,1930,0,0 +BRDA:15564,1930,1,0 +BRDA:15572,1931,0,0 +BRDA:15572,1931,1,0 +BRDA:15576,1932,0,0 +BRDA:15576,1932,1,0 +BRDA:15579,1933,0,0 +BRDA:15579,1933,1,0 +BRDA:15622,1934,0,0 +BRDA:15622,1934,1,0 +BRDA:15623,1935,0,0 +BRDA:15623,1935,1,0 +BRDA:15640,1936,0,0 +BRDA:15640,1936,1,0 +BRDA:15641,1937,0,0 +BRDA:15641,1937,1,0 +BRDA:15643,1938,0,0 +BRDA:15643,1938,1,0 +BRDA:15643,1939,0,0 +BRDA:15643,1939,1,0 +BRDA:15647,1940,0,0 +BRDA:15647,1940,1,0 +BRDA:15647,1941,0,0 +BRDA:15647,1941,1,0 +BRDA:15648,1942,0,0 +BRDA:15648,1942,1,0 +BRDA:15654,1943,0,0 +BRDA:15654,1943,1,0 +BRDA:15672,1944,0,0 +BRDA:15672,1944,1,0 +BRDA:15675,1945,0,0 +BRDA:15675,1945,1,0 +BRDA:15679,1946,0,0 +BRDA:15679,1946,1,0 +BRDA:15682,1947,0,0 +BRDA:15682,1947,1,0 +BRDA:15683,1948,0,0 +BRDA:15683,1948,1,0 +BRDA:15706,1949,0,0 +BRDA:15706,1949,1,0 +BRDA:15707,1950,0,0 +BRDA:15707,1950,1,0 +BRDA:15730,1951,0,0 +BRDA:15730,1951,1,0 +BRDA:15730,1952,0,0 +BRDA:15730,1952,1,0 +BRDA:15730,1952,2,0 +BRDA:15731,1953,0,0 +BRDA:15731,1953,1,0 +BRDA:15747,1954,0,0 +BRDA:15747,1954,1,0 +BRDA:15751,1955,0,0 +BRDA:15751,1955,1,0 +BRDA:15755,1956,0,0 +BRDA:15755,1956,1,0 +BRDA:15790,1957,0,0 +BRDA:15790,1957,1,0 +BRDA:15790,1957,2,0 +BRDA:15790,1957,3,0 +BRDA:15790,1957,4,0 +BRDA:15790,1957,5,0 +BRDA:15790,1957,6,0 +BRDA:15790,1957,7,0 +BRDA:15805,1958,0,0 +BRDA:15805,1958,1,0 +BRDA:15830,1959,0,0 +BRDA:15830,1959,1,0 +BRDA:15830,1960,0,0 +BRDA:15830,1960,1,0 +BRDA:15830,1960,2,0 +BRDA:15835,1961,0,0 +BRDA:15835,1961,1,0 +BRDA:15840,1962,0,0 +BRDA:15840,1962,1,0 +BRDA:15840,1963,0,0 +BRDA:15840,1963,1,0 +BRDA:15840,1963,2,0 +BRDA:15856,1964,0,0 +BRDA:15856,1964,1,0 +BRDA:15862,1965,0,0 +BRDA:15862,1965,1,0 +BRDA:15862,1966,0,0 +BRDA:15862,1966,1,0 +BRDA:15879,1967,0,0 +BRDA:15879,1967,1,0 +BRDA:15884,1968,0,0 +BRDA:15884,1968,1,0 +BRDA:15887,1969,0,0 +BRDA:15887,1969,1,0 +BRDA:15887,1970,0,0 +BRDA:15887,1970,1,0 +BRDA:15887,1970,2,0 +BRDA:15891,1971,0,0 +BRDA:15891,1971,1,0 +BRDA:15896,1972,0,0 +BRDA:15896,1972,1,0 +BRDA:15898,1973,0,0 +BRDA:15898,1973,1,0 +BRDA:15898,1974,0,0 +BRDA:15898,1974,1,0 +BRDA:15898,1974,2,0 +BRDA:15898,1974,3,0 +BRDA:15898,1974,4,0 +BRDA:15904,1975,0,0 +BRDA:15904,1975,1,0 +BRDA:15904,1976,0,0 +BRDA:15904,1976,1,0 +BRDA:15913,1977,0,0 +BRDA:15913,1977,1,0 +BRDA:15913,1978,0,0 +BRDA:15913,1978,1,0 +BRDA:15913,1978,2,0 +BRDA:15917,1979,0,0 +BRDA:15917,1979,1,0 +BRDA:15952,1980,0,0 +BRDA:15952,1980,1,0 +BRDA:15962,1981,0,0 +BRDA:15962,1981,1,0 +BRDA:15966,1982,0,0 +BRDA:15966,1982,1,0 +BRDA:15969,1983,0,0 +BRDA:15969,1983,1,0 +BRDA:15973,1984,0,0 +BRDA:15973,1984,1,0 +BRDA:15973,1985,0,0 +BRDA:15973,1985,1,0 +BRDA:15980,1986,0,0 +BRDA:15980,1986,1,0 +BRDA:15981,1987,0,0 +BRDA:15981,1987,1,0 +BRDA:15984,1988,0,0 +BRDA:15984,1988,1,0 +BRDA:15986,1989,0,0 +BRDA:15986,1989,1,0 +BRDA:15986,1990,0,0 +BRDA:15986,1990,1,0 +BRDA:15989,1991,0,0 +BRDA:15989,1991,1,0 +BRDA:15989,1992,0,0 +BRDA:15989,1992,1,0 +BRDA:15992,1993,0,0 +BRDA:15992,1993,1,0 +BRDA:15992,1994,0,0 +BRDA:15992,1994,1,0 +BRDA:15992,1994,2,0 +BRDA:15993,1995,0,0 +BRDA:15993,1995,1,0 +BRDA:16025,1996,0,0 +BRDA:16025,1996,1,0 +BRDA:16025,1997,0,0 +BRDA:16025,1997,1,0 +BRDA:16028,1998,0,0 +BRDA:16028,1998,1,0 +BRDA:16031,1999,0,0 +BRDA:16031,1999,1,0 +BRDA:16032,2000,0,0 +BRDA:16032,2000,1,0 +BRDA:16035,2001,0,0 +BRDA:16035,2001,1,0 +BRDA:16035,2002,0,0 +BRDA:16035,2002,1,0 +BRDA:16077,2003,0,0 +BRDA:16077,2003,1,0 +BRDA:16080,2004,0,0 +BRDA:16080,2004,1,0 +BRDA:16081,2005,0,0 +BRDA:16081,2005,1,0 +BRDA:16084,2006,0,0 +BRDA:16084,2006,1,0 +BRDA:16111,2007,0,0 +BRDA:16111,2007,1,0 +BRDA:16111,2008,0,0 +BRDA:16111,2008,1,0 +BRDA:16111,2008,2,0 +BRDA:16119,2009,0,0 +BRDA:16119,2009,1,0 +BRDA:16133,2010,0,0 +BRDA:16133,2010,1,0 +BRDA:16133,2011,0,0 +BRDA:16133,2011,1,0 +BRDA:16133,2011,2,0 +BRDA:16138,2012,0,0 +BRDA:16138,2012,1,0 +BRDA:16144,2013,0,0 +BRDA:16144,2013,1,0 +BRDA:16144,2014,0,0 +BRDA:16144,2014,1,0 +BRDA:16158,2015,0,0 +BRDA:16158,2015,1,0 +BRDA:16158,2016,0,0 +BRDA:16158,2016,1,0 +BRDA:16185,2017,0,0 +BRDA:16185,2017,1,0 +BRDA:16186,2018,0,0 +BRDA:16186,2018,1,0 +BRDA:16187,2019,0,0 +BRDA:16187,2019,1,0 +BRDA:16188,2020,0,0 +BRDA:16188,2020,1,0 +BRDA:16190,2021,0,0 +BRDA:16190,2021,1,0 +BRDA:16191,2022,0,0 +BRDA:16191,2022,1,0 +BRDA:16193,2023,0,0 +BRDA:16193,2023,1,0 +BRDA:16202,2024,0,0 +BRDA:16202,2024,1,0 +BRDA:16220,2025,0,0 +BRDA:16220,2025,1,0 +BRDA:16221,2026,0,0 +BRDA:16221,2026,1,0 +BRDA:16241,2027,0,0 +BRDA:16241,2027,1,0 +BRDA:16241,2028,0,0 +BRDA:16241,2028,1,0 +BRDA:16255,2029,0,0 +BRDA:16255,2029,1,0 +BRDA:16258,2030,0,0 +BRDA:16258,2030,1,0 +BRDA:16292,2031,0,0 +BRDA:16292,2031,1,0 +BRDA:16292,2032,0,0 +BRDA:16292,2032,1,0 +BRDA:16295,2033,0,0 +BRDA:16295,2033,1,0 +BRDA:16296,2034,0,0 +BRDA:16296,2034,1,0 +BRDA:16300,2035,0,0 +BRDA:16300,2035,1,0 +BRDA:16301,2036,0,0 +BRDA:16301,2036,1,0 +BRDA:16302,2037,0,0 +BRDA:16302,2037,1,0 +BRDA:16304,2038,0,0 +BRDA:16304,2038,1,0 +BRDA:16310,2039,0,0 +BRDA:16310,2039,1,0 +BRDA:16317,2040,0,0 +BRDA:16317,2040,1,0 +BRDA:16325,2041,0,0 +BRDA:16325,2041,1,0 +BRDA:16326,2042,0,0 +BRDA:16326,2042,1,0 +BRDA:16329,2043,0,0 +BRDA:16329,2043,1,0 +BRDA:16329,2044,0,0 +BRDA:16329,2044,1,0 +BRDA:16332,2045,0,0 +BRDA:16332,2045,1,0 +BRDA:16332,2046,0,0 +BRDA:16332,2046,1,0 +BRDA:16334,2047,0,0 +BRDA:16334,2047,1,0 +BRDA:16334,2048,0,0 +BRDA:16334,2048,1,0 +BRDA:16336,2049,0,0 +BRDA:16336,2049,1,0 +BRDA:16336,2050,0,0 +BRDA:16336,2050,1,0 +BRDA:16336,2050,2,0 +BRDA:16341,2051,0,0 +BRDA:16341,2051,1,0 +BRDA:16358,2052,0,0 +BRDA:16358,2052,1,0 +BRDA:16358,2053,0,0 +BRDA:16358,2053,1,0 +BRDA:16358,2053,2,0 +BRDA:16380,2054,0,0 +BRDA:16380,2054,1,0 +BRDA:16380,2055,0,0 +BRDA:16380,2055,1,0 +BRDA:16399,2056,0,0 +BRDA:16399,2056,1,0 +BRDA:16399,2057,0,0 +BRDA:16399,2057,1,0 +BRDA:16420,2058,0,0 +BRDA:16420,2058,1,0 +BRDA:16420,2059,0,0 +BRDA:16420,2059,1,0 +BRDA:16420,2060,0,0 +BRDA:16420,2060,1,0 +BRDA:16425,2061,0,0 +BRDA:16425,2061,1,0 +BRDA:16425,2062,0,0 +BRDA:16425,2062,1,0 +BRDA:16430,2063,0,0 +BRDA:16430,2063,1,0 +BRDA:16440,2064,0,0 +BRDA:16440,2064,1,0 +BRDA:16441,2065,0,0 +BRDA:16441,2065,1,0 +BRDA:16445,2066,0,0 +BRDA:16445,2066,1,0 +BRDA:16446,2067,0,0 +BRDA:16446,2067,1,0 +BRDA:16453,2068,0,0 +BRDA:16453,2068,1,0 +BRDA:16454,2069,0,0 +BRDA:16454,2069,1,0 +BRDA:16455,2070,0,0 +BRDA:16455,2070,1,0 +BRDA:16455,2071,0,0 +BRDA:16455,2071,1,0 +BRDA:16455,2071,2,0 +BRDA:16463,2072,0,0 +BRDA:16463,2072,1,0 +BRDA:16464,2073,0,0 +BRDA:16464,2073,1,0 +BRDA:16494,2074,0,0 +BRDA:16494,2074,1,0 +BRDA:16494,2074,2,0 +BRDA:16494,2074,3,0 +BRDA:16494,2074,4,0 +BRDA:16494,2074,5,0 +BRDA:16494,2074,6,0 +BRDA:16494,2074,7,0 +BRDA:16494,2074,8,0 +BRDA:16494,2074,9,0 +BRDA:16494,2074,10,0 +BRDA:16496,2075,0,0 +BRDA:16496,2075,1,0 +BRDA:16496,2076,0,0 +BRDA:16496,2076,1,0 +BRDA:16504,2077,0,0 +BRDA:16504,2077,1,0 +BRDA:16504,2078,0,0 +BRDA:16504,2078,1,0 +BRDA:16518,2079,0,0 +BRDA:16518,2079,1,0 +BRDA:16532,2080,0,0 +BRDA:16532,2080,1,0 +BRDA:16534,2081,0,0 +BRDA:16534,2081,1,0 +BRDA:16534,2082,0,0 +BRDA:16534,2082,1,0 +BRDA:16539,2083,0,0 +BRDA:16539,2083,1,0 +BRDA:16551,2084,0,0 +BRDA:16551,2084,1,0 +BRDA:16578,2085,0,0 +BRDA:16578,2085,1,0 +BRDA:16578,2086,0,0 +BRDA:16578,2086,1,0 +BRDA:16584,2087,0,0 +BRDA:16584,2087,1,0 +BRDA:16584,2088,0,0 +BRDA:16584,2088,1,0 +BRDA:16590,2089,0,0 +BRDA:16590,2089,1,0 +BRDA:16590,2090,0,0 +BRDA:16590,2090,1,0 +BRDA:16603,2091,0,0 +BRDA:16603,2091,1,0 +BRDA:16604,2092,0,0 +BRDA:16604,2092,1,0 +BRDA:16609,2093,0,0 +BRDA:16609,2093,1,0 +BRDA:16609,2094,0,0 +BRDA:16609,2094,1,0 +BRDA:16610,2095,0,0 +BRDA:16610,2095,1,0 +BRDA:16616,2096,0,0 +BRDA:16616,2096,1,0 +BRDA:16618,2097,0,0 +BRDA:16618,2097,1,0 +BRDA:16618,2098,0,0 +BRDA:16618,2098,1,0 +BRDA:16623,2099,0,0 +BRDA:16623,2099,1,0 +BRDA:16623,2100,0,0 +BRDA:16623,2100,1,0 +BRDA:16623,2100,2,0 +BRDA:16623,2100,3,0 +BRDA:16625,2101,0,0 +BRDA:16625,2101,1,0 +BRDA:16625,2101,2,0 +BRDA:16625,2101,3,0 +BRDA:16676,2102,0,0 +BRDA:16676,2102,1,0 +BRDA:16690,2103,0,0 +BRDA:16690,2103,1,0 +BRDA:16695,2104,0,0 +BRDA:16695,2104,1,0 +BRDA:16695,2105,0,0 +BRDA:16695,2105,1,0 +BRDA:16710,2106,0,0 +BRDA:16710,2106,1,0 +BRDA:16726,2107,0,0 +BRDA:16726,2107,1,0 +BRDA:16727,2108,0,0 +BRDA:16727,2108,1,0 +BRDA:16728,2109,0,0 +BRDA:16728,2109,1,0 +BRDA:16741,2110,0,0 +BRDA:16741,2110,1,0 +BRDA:16742,2111,0,0 +BRDA:16742,2111,1,0 +BRDA:16776,2112,0,0 +BRDA:16776,2112,1,0 +BRDA:16796,2113,0,0 +BRDA:16796,2113,1,0 +BRDA:16797,2114,0,0 +BRDA:16797,2114,1,0 +BRDA:16813,2115,0,0 +BRDA:16813,2115,1,0 +BRDA:16814,2116,0,0 +BRDA:16814,2116,1,0 +BRDA:16830,2117,0,0 +BRDA:16830,2117,1,0 +BRDA:16849,2118,0,0 +BRDA:16849,2118,1,0 +BRDA:16849,2119,0,0 +BRDA:16849,2119,1,0 +BRDA:16849,2119,2,0 +BRDA:16849,2119,3,0 +BRDA:16849,2119,4,0 +BRDA:16849,2119,5,0 +BRDA:16849,2119,6,0 +BRDA:16849,2119,7,0 +BRDA:16849,2119,8,0 +BRDA:16849,2119,9,0 +BRDA:16856,2120,0,0 +BRDA:16856,2120,1,0 +BRDA:16857,2121,0,0 +BRDA:16857,2121,1,0 +BRDA:16859,2122,0,0 +BRDA:16859,2122,1,0 +BRDA:16860,2123,0,0 +BRDA:16860,2123,1,0 +BRDA:16860,2123,2,0 +BRDA:16860,2123,3,0 +BRDA:16860,2123,4,0 +BRDA:16890,2124,0,0 +BRDA:16890,2124,1,0 +BRDA:16890,2124,2,0 +BRDA:16890,2124,3,0 +BRDA:16909,2125,0,0 +BRDA:16909,2125,1,0 +BRDA:16930,2126,0,0 +BRDA:16930,2126,1,0 +BRDA:16930,2127,0,0 +BRDA:16930,2127,1,0 +BRDA:16935,2128,0,0 +BRDA:16935,2128,1,0 +BRDA:16935,2129,0,0 +BRDA:16935,2129,1,0 +BRDA:16938,2130,0,0 +BRDA:16938,2130,1,0 +BRDA:16939,2131,0,0 +BRDA:16939,2131,1,0 +BRDA:16939,2131,2,0 +BRDA:16939,2131,3,0 +BRDA:16939,2131,4,0 +BRDA:16955,2132,0,0 +BRDA:16955,2132,1,0 +BRDA:16955,2133,0,0 +BRDA:16955,2133,1,0 +BRDA:16955,2133,2,0 +BRDA:16970,2134,0,0 +BRDA:16970,2134,1,0 +BRDA:16970,2135,0,0 +BRDA:16970,2135,1,0 +BRDA:16990,2136,0,0 +BRDA:16990,2136,1,0 +BRDA:16990,2136,2,0 +BRDA:16990,2136,3,0 +BRDA:16990,2136,4,0 +BRDA:16990,2136,5,0 +BRDA:16990,2136,6,0 +BRDA:16990,2136,7,0 +BRDA:16990,2136,8,0 +BRDA:16990,2136,9,0 +BRDA:16990,2136,10,0 +BRDA:16990,2136,11,0 +BRDA:16990,2136,12,0 +BRDA:16990,2136,13,0 +BRDA:16990,2136,14,0 +BRDA:16990,2136,15,0 +BRDA:16990,2136,16,0 +BRDA:16990,2136,17,0 +BRDA:16990,2136,18,0 +BRDA:17034,2137,0,0 +BRDA:17034,2137,1,0 +BRDA:17038,2138,0,0 +BRDA:17038,2138,1,0 +BRDA:17039,2139,0,0 +BRDA:17039,2139,1,0 +BRDA:17051,2140,0,0 +BRDA:17051,2140,1,0 +BRDA:17051,2140,2,0 +BRDA:17052,2141,0,0 +BRDA:17052,2141,1,0 +BRDA:17052,2141,2,0 +BRDA:17064,2142,0,0 +BRDA:17064,2142,1,0 +BRDA:17065,2143,0,0 +BRDA:17065,2143,1,0 +BRDA:17065,2143,2,0 +BRDA:17065,2143,3,0 +BRDA:17065,2143,4,0 +BRDA:17065,2143,5,0 +BRDA:17081,2144,0,0 +BRDA:17081,2144,1,0 +BRDA:17085,2145,0,0 +BRDA:17085,2145,1,0 +BRDA:17085,2146,0,0 +BRDA:17085,2146,1,0 +BRDA:17086,2147,0,0 +BRDA:17086,2147,1,0 +BRDA:17087,2148,0,0 +BRDA:17087,2148,1,0 +BRDA:17103,2149,0,0 +BRDA:17103,2149,1,0 +BRDA:17107,2150,0,0 +BRDA:17107,2150,1,0 +BRDA:17107,2151,0,0 +BRDA:17107,2151,1,0 +BRDA:17107,2151,2,0 +BRDA:17107,2151,3,0 +BRDA:17107,2151,4,0 +BRDA:17111,2152,0,0 +BRDA:17111,2152,1,0 +BRDA:17111,2152,2,0 +BRDA:17111,2152,3,0 +BRDA:17124,2153,0,0 +BRDA:17124,2153,1,0 +BRDA:17124,2154,0,0 +BRDA:17124,2154,1,0 +BRDA:17124,2154,2,0 +BRDA:17124,2154,3,0 +BRDA:17141,2155,0,0 +BRDA:17141,2155,1,0 +BRDA:17141,2156,0,0 +BRDA:17141,2156,1,0 +BRDA:17144,2157,0,0 +BRDA:17144,2157,1,0 +BRDA:17148,2158,0,0 +BRDA:17148,2158,1,0 +BRDA:17159,2159,0,0 +BRDA:17159,2159,1,0 +BRDA:17169,2160,0,0 +BRDA:17169,2160,1,0 +BRDA:17179,2161,0,0 +BRDA:17179,2161,1,0 +BRDA:17180,2162,0,0 +BRDA:17180,2162,1,0 +BRDA:17180,2162,2,0 +BRDA:17194,2163,0,0 +BRDA:17194,2163,1,0 +BRDA:17208,2164,0,0 +BRDA:17208,2164,1,0 +BRDA:17211,2165,0,0 +BRDA:17211,2165,1,0 +BRDA:17211,2165,2,0 +BRDA:17226,2166,0,0 +BRDA:17226,2166,1,0 +BRDA:17259,2167,0,0 +BRDA:17259,2167,1,0 +BRDA:17259,2167,2,0 +BRDA:17259,2167,3,0 +BRDA:17259,2167,4,0 +BRDA:17259,2167,5,0 +BRDA:17259,2167,6,0 +BRDA:17259,2167,7,0 +BRDA:17264,2168,0,0 +BRDA:17264,2168,1,0 +BRDA:17264,2169,0,0 +BRDA:17264,2169,1,0 +BRDA:17268,2170,0,0 +BRDA:17268,2170,1,0 +BRDA:17271,2171,0,0 +BRDA:17271,2171,1,0 +BRDA:17275,2172,0,0 +BRDA:17275,2172,1,0 +BRDA:17277,2173,0,0 +BRDA:17277,2173,1,0 +BRDA:17278,2174,0,0 +BRDA:17278,2174,1,0 +BRDA:17282,2175,0,0 +BRDA:17282,2175,1,0 +BRDA:17284,2176,0,0 +BRDA:17284,2176,1,0 +BRDA:17285,2177,0,0 +BRDA:17285,2177,1,0 +BRDA:17289,2178,0,0 +BRDA:17289,2178,1,0 +BRDA:17293,2179,0,0 +BRDA:17293,2179,1,0 +BRDA:17294,2180,0,0 +BRDA:17294,2180,1,0 +BRDA:17297,2181,0,0 +BRDA:17297,2181,1,0 +BRDA:17318,2182,0,0 +BRDA:17318,2182,1,0 +BRDA:17347,2183,0,0 +BRDA:17347,2183,1,0 +BRDA:17376,2184,0,0 +BRDA:17376,2184,1,0 +BRDA:17396,2185,0,0 +BRDA:17396,2185,1,0 +BRDA:17425,2186,0,0 +BRDA:17425,2186,1,0 +BRDA:17472,2187,0,0 +BRDA:17472,2187,1,0 +BRDA:17473,2188,0,0 +BRDA:17473,2188,1,0 +BRDA:17496,2189,0,0 +BRDA:17496,2189,1,0 +BRDA:17517,2190,0,0 +BRDA:17517,2190,1,0 +BRDA:17521,2191,0,0 +BRDA:17521,2191,1,0 +BRDA:17521,2192,0,0 +BRDA:17521,2192,1,0 +BRDA:17534,2193,0,0 +BRDA:17534,2193,1,0 +BRDA:17534,2194,0,0 +BRDA:17534,2194,1,0 +BRDA:17538,2195,0,0 +BRDA:17538,2195,1,0 +BRDA:17538,2196,0,0 +BRDA:17538,2196,1,0 +BRDA:17549,2197,0,0 +BRDA:17549,2197,1,0 +BRDA:17571,2198,0,0 +BRDA:17571,2198,1,0 +BRDA:17571,2199,0,0 +BRDA:17571,2199,1,0 +BRDA:17586,2200,0,0 +BRDA:17586,2200,1,0 +BRDA:17620,2201,0,0 +BRDA:17620,2201,1,0 +BRDA:17620,2202,0,0 +BRDA:17620,2202,1,0 +BRDA:17625,2203,0,0 +BRDA:17625,2203,1,0 +BRDA:17626,2204,0,0 +BRDA:17626,2204,1,0 +BRDA:17626,2205,0,0 +BRDA:17626,2205,1,0 +BRDA:17656,2206,0,0 +BRDA:17656,2206,1,0 +BRDA:17662,2207,0,0 +BRDA:17662,2207,1,0 +BRDA:17693,2208,0,0 +BRDA:17693,2208,1,0 +BRDA:17703,2209,0,0 +BRDA:17703,2209,1,0 +BRDA:17728,2210,0,0 +BRDA:17728,2210,1,0 +BRDA:17761,2211,0,0 +BRDA:17761,2211,1,0 +BRDA:17764,2212,0,0 +BRDA:17764,2212,1,0 +BRDA:17794,2213,0,0 +BRDA:17794,2213,1,0 +BRDA:17797,2214,0,0 +BRDA:17797,2214,1,0 +BRDA:17828,2215,0,0 +BRDA:17828,2215,1,0 +BRDA:17829,2216,0,0 +BRDA:17829,2216,1,0 +BRDA:17832,2217,0,0 +BRDA:17832,2217,1,0 +BRDA:17832,2218,0,0 +BRDA:17832,2218,1,0 +BRDA:17833,2219,0,0 +BRDA:17833,2219,1,0 +BRDA:17862,2220,0,0 +BRDA:17862,2220,1,0 +BRDA:17863,2221,0,0 +BRDA:17863,2221,1,0 +BRDA:17866,2222,0,0 +BRDA:17866,2222,1,0 +BRDA:17866,2223,0,0 +BRDA:17866,2223,1,0 +BRDA:17868,2224,0,0 +BRDA:17868,2224,1,0 +BRDA:17907,2225,0,0 +BRDA:17907,2225,1,0 +BRDA:17907,2226,0,0 +BRDA:17907,2226,1,0 +BRDA:17948,2227,0,0 +BRDA:17948,2227,1,0 +BRDA:17948,2228,0,0 +BRDA:17948,2228,1,0 +BRDA:17983,2229,0,0 +BRDA:17983,2229,1,0 +BRDA:17984,2230,0,0 +BRDA:17984,2230,1,0 +BRDA:17987,2231,0,0 +BRDA:17987,2231,1,0 +BRDA:17987,2232,0,0 +BRDA:17987,2232,1,0 +BRDA:17987,2232,2,0 +BRDA:18030,2233,0,0 +BRDA:18030,2233,1,0 +BRDA:18031,2234,0,0 +BRDA:18031,2234,1,0 +BRDA:18034,2235,0,0 +BRDA:18034,2235,1,0 +BRDA:18035,2236,0,0 +BRDA:18035,2236,1,0 +BRDA:18077,2237,0,0 +BRDA:18077,2237,1,0 +BRDA:18078,2238,0,0 +BRDA:18078,2238,1,0 +BRDA:18082,2239,0,0 +BRDA:18082,2239,1,0 +BRDA:18084,2240,0,0 +BRDA:18084,2240,1,0 +BRDA:18106,2241,0,0 +BRDA:18106,2241,1,0 +BRDA:18107,2242,0,0 +BRDA:18107,2242,1,0 +BRDA:18125,2243,0,0 +BRDA:18125,2243,1,0 +BRDA:18126,2244,0,0 +BRDA:18126,2244,1,0 +BRDA:18150,2245,0,0 +BRDA:18150,2245,1,0 +BRDA:18151,2246,0,0 +BRDA:18151,2246,1,0 +BRDA:18154,2247,0,0 +BRDA:18154,2247,1,0 +BRDA:18175,2248,0,0 +BRDA:18175,2248,1,0 +BRDA:18204,2249,0,0 +BRDA:18204,2249,1,0 +BRDA:18204,2250,0,0 +BRDA:18204,2250,1,0 +BRDA:18231,2251,0,0 +BRDA:18231,2251,1,0 +BRDA:18232,2252,0,0 +BRDA:18232,2252,1,0 +BRDA:18235,2253,0,0 +BRDA:18235,2253,1,0 +BRDA:18236,2254,0,0 +BRDA:18236,2254,1,0 +BRDA:18257,2255,0,0 +BRDA:18257,2255,1,0 +BRDA:18258,2256,0,0 +BRDA:18258,2256,1,0 +BRDA:18280,2257,0,0 +BRDA:18280,2257,1,0 +BRDA:18280,2258,0,0 +BRDA:18280,2258,1,0 +BRDA:18312,2259,0,0 +BRDA:18312,2259,1,0 +BRDA:18317,2260,0,0 +BRDA:18317,2260,1,0 +BRDA:18317,2261,0,0 +BRDA:18317,2261,1,0 +BRDA:18347,2262,0,0 +BRDA:18347,2262,1,0 +BRDA:18348,2263,0,0 +BRDA:18348,2263,1,0 +BRDA:18351,2264,0,0 +BRDA:18351,2264,1,0 +BRDA:18351,2265,0,0 +BRDA:18351,2265,1,0 +BRDA:18372,2266,0,0 +BRDA:18372,2266,1,0 +BRDA:18390,2267,0,0 +BRDA:18390,2267,1,0 +BRDA:18391,2268,0,0 +BRDA:18391,2268,1,0 +BRDA:18416,2269,0,0 +BRDA:18416,2269,1,0 +BRDA:18417,2270,0,0 +BRDA:18417,2270,1,0 +BRDA:18421,2271,0,0 +BRDA:18421,2271,1,0 +BRDA:18423,2272,0,0 +BRDA:18423,2272,1,0 +BRDA:18425,2273,0,0 +BRDA:18425,2273,1,0 +BRDA:18452,2274,0,0 +BRDA:18452,2274,1,0 +BRDA:18452,2275,0,0 +BRDA:18452,2275,1,0 +BRDA:18501,2276,0,0 +BRDA:18501,2276,1,0 +BRDA:18501,2277,0,0 +BRDA:18501,2277,1,0 +BRDA:18501,2277,2,0 +BRDA:18501,2277,3,0 +BRDA:18530,2278,0,0 +BRDA:18530,2278,1,0 +BRDA:18530,2279,0,0 +BRDA:18530,2279,1,0 +BRDA:18530,2279,2,0 +BRDA:18530,2279,3,0 +BRDA:18559,2280,0,0 +BRDA:18559,2280,1,0 +BRDA:18559,2281,0,0 +BRDA:18559,2281,1,0 +BRDA:18559,2281,2,0 +BRDA:18559,2281,3,0 +BRDA:18589,2282,0,0 +BRDA:18589,2282,1,0 +BRDA:18593,2283,0,0 +BRDA:18593,2283,1,0 +BRDA:18629,2284,0,0 +BRDA:18629,2284,1,0 +BRDA:18629,2285,0,0 +BRDA:18629,2285,1,0 +BRDA:18639,2286,0,0 +BRDA:18639,2286,1,0 +BRDA:18672,2287,0,0 +BRDA:18672,2287,1,0 +BRDA:18692,2288,0,0 +BRDA:18692,2288,1,0 +BRDA:18693,2289,0,0 +BRDA:18693,2289,1,0 +BRDA:18696,2290,0,0 +BRDA:18696,2290,1,0 +BRDA:18696,2291,0,0 +BRDA:18696,2291,1,0 +BRDA:18696,2291,2,0 +BRDA:18701,2292,0,0 +BRDA:18701,2292,1,0 +BRDA:18702,2293,0,0 +BRDA:18702,2293,1,0 +BRDA:18774,2294,0,0 +BRDA:18774,2294,1,0 +BRDA:18775,2295,0,0 +BRDA:18775,2295,1,0 +BRDA:18777,2296,0,0 +BRDA:18777,2296,1,0 +BRDA:18777,2297,0,0 +BRDA:18777,2297,1,0 +BRDA:18852,2298,0,0 +BRDA:18852,2298,1,0 +BRDA:18853,2299,0,0 +BRDA:18853,2299,1,0 +BRDA:18855,2300,0,0 +BRDA:18855,2300,1,0 +BRDA:18878,2301,0,0 +BRDA:18878,2301,1,0 +BRDA:18878,2302,0,0 +BRDA:18878,2302,1,0 +BRDA:18900,2303,0,0 +BRDA:18900,2303,1,0 +BRDA:18900,2304,0,0 +BRDA:18900,2304,1,0 +BRDA:18920,2305,0,0 +BRDA:18920,2305,1,0 +BRDA:18921,2306,0,0 +BRDA:18921,2306,1,0 +BRDA:18950,2307,0,0 +BRDA:18950,2307,1,0 +BRDA:18950,2308,0,0 +BRDA:18950,2308,1,0 +BRDA:18953,2309,0,0 +BRDA:18953,2309,1,0 +BRDA:18953,2310,0,0 +BRDA:18953,2310,1,0 +BRDA:18954,2311,0,0 +BRDA:18954,2311,1,0 +BRDA:18983,2312,0,0 +BRDA:18983,2312,1,0 +BRDA:18984,2313,0,0 +BRDA:18984,2313,1,0 +BRDA:18987,2314,0,0 +BRDA:18987,2314,1,0 +BRDA:18987,2315,0,0 +BRDA:18987,2315,1,0 +BRDA:18989,2316,0,0 +BRDA:18989,2316,1,0 +BRDA:19028,2317,0,0 +BRDA:19028,2317,1,0 +BRDA:19028,2318,0,0 +BRDA:19028,2318,1,0 +BRDA:19069,2319,0,0 +BRDA:19069,2319,1,0 +BRDA:19069,2320,0,0 +BRDA:19069,2320,1,0 +BRDA:19119,2321,0,0 +BRDA:19119,2321,1,0 +BRDA:19148,2322,0,0 +BRDA:19148,2322,1,0 +BRDA:19171,2323,0,0 +BRDA:19171,2323,1,0 +BRDA:19171,2324,0,0 +BRDA:19171,2324,1,0 +BRDA:19198,2325,0,0 +BRDA:19198,2325,1,0 +BRDA:19198,2326,0,0 +BRDA:19198,2326,1,0 +BRDA:19222,2327,0,0 +BRDA:19222,2327,1,0 +BRDA:19223,2328,0,0 +BRDA:19223,2328,1,0 +BRDA:19223,2329,0,0 +BRDA:19223,2329,1,0 +BRDA:19246,2330,0,0 +BRDA:19246,2330,1,0 +BRDA:19246,2331,0,0 +BRDA:19246,2331,1,0 +BRDA:19251,2332,0,0 +BRDA:19251,2332,1,0 +BRDA:19283,2333,0,0 +BRDA:19283,2333,1,0 +BRDA:19283,2334,0,0 +BRDA:19283,2334,1,0 +BRDA:19287,2335,0,0 +BRDA:19287,2335,1,0 +BRDA:19316,2336,0,0 +BRDA:19316,2336,1,0 +BRDA:19368,2337,0,0 +BRDA:19368,2337,1,0 +BRDA:19397,2338,0,0 +BRDA:19397,2338,1,0 +BRDA:19436,2339,0,0 +BRDA:19436,2339,1,0 +BRDA:19436,2340,0,0 +BRDA:19436,2340,1,0 +BRDA:19455,2341,0,0 +BRDA:19455,2341,1,0 +BRDA:19455,2342,0,0 +BRDA:19455,2342,1,0 +BRDA:19480,2343,0,0 +BRDA:19480,2343,1,0 +BRDA:19482,2344,0,0 +BRDA:19482,2344,1,0 +BRDA:19596,2345,0,0 +BRDA:19596,2345,1,0 +BRDA:19600,2346,0,0 +BRDA:19600,2346,1,0 +BRDA:19600,2347,0,0 +BRDA:19600,2347,1,0 +BRDA:19600,2347,2,0 +BRDA:19600,2347,3,0 +BRDA:19604,2348,0,0 +BRDA:19604,2348,1,0 +BRDA:19611,2349,0,0 +BRDA:19611,2349,1,0 +BRDA:19611,2350,0,0 +BRDA:19611,2350,1,0 +BRDA:19702,2351,0,0 +BRDA:19702,2351,1,0 +BRDA:19706,2352,0,0 +BRDA:19706,2352,1,0 +BRDA:19765,2353,0,0 +BRDA:19765,2353,1,0 +BRDA:19799,2354,0,0 +BRDA:19799,2354,1,0 +BRDA:19801,2355,0,0 +BRDA:19801,2355,1,0 +BRDA:19858,2356,0,0 +BRDA:19858,2356,1,0 +BRDA:19907,2357,0,0 +BRDA:19907,2357,1,0 +BRDA:19908,2358,0,0 +BRDA:19908,2358,1,0 +BRDA:19908,2359,0,0 +BRDA:19908,2359,1,0 +BRDA:19952,2360,0,0 +BRDA:19952,2360,1,0 +BRDA:20086,2361,0,0 +BRDA:20086,2361,1,0 +BRDA:20121,2362,0,0 +BRDA:20121,2362,1,0 +BRDA:20146,2363,0,0 +BRDA:20146,2363,1,0 +BRDA:20174,2364,0,0 +BRDA:20174,2364,1,0 +BRDA:20212,2365,0,0 +BRDA:20212,2365,1,0 +BRDA:20213,2366,0,0 +BRDA:20213,2366,1,0 +BRDA:20213,2367,0,0 +BRDA:20213,2367,1,0 +BRDA:20216,2368,0,0 +BRDA:20216,2368,1,0 +BRDA:20219,2369,0,0 +BRDA:20219,2369,1,0 +BRDA:20220,2370,0,0 +BRDA:20220,2370,1,0 +BRDA:20221,2371,0,0 +BRDA:20221,2371,1,0 +BRDA:20250,2372,0,0 +BRDA:20250,2372,1,0 +BRDA:20253,2373,0,0 +BRDA:20253,2373,1,0 +BRDA:20333,2374,0,0 +BRDA:20333,2374,1,0 +BRDA:20367,2375,0,0 +BRDA:20367,2375,1,0 +BRDA:20370,2376,0,0 +BRDA:20370,2376,1,0 +BRDA:20371,2377,0,0 +BRDA:20371,2377,1,0 +BRDA:20373,2378,0,0 +BRDA:20373,2378,1,0 +BRDA:20374,2379,0,0 +BRDA:20374,2379,1,0 +BRDA:20375,2380,0,0 +BRDA:20375,2380,1,0 +BRDA:20417,2381,0,0 +BRDA:20417,2381,1,0 +BRDA:20458,2382,0,0 +BRDA:20458,2382,1,0 +BRDA:20487,2383,0,0 +BRDA:20487,2383,1,0 +BRDA:20528,2384,0,0 +BRDA:20528,2384,1,0 +BRDA:20547,2385,0,0 +BRDA:20547,2385,1,0 +BRDA:20572,2386,0,0 +BRDA:20572,2386,1,0 +BRDA:20572,2387,0,0 +BRDA:20572,2387,1,0 +BRDA:20577,2388,0,0 +BRDA:20577,2388,1,0 +BRDA:20597,2389,0,0 +BRDA:20597,2389,1,0 +BRDA:20623,2390,0,0 +BRDA:20623,2390,1,0 +BRDA:20626,2391,0,0 +BRDA:20626,2391,1,0 +BRDA:20627,2392,0,0 +BRDA:20627,2392,1,0 +BRDA:20630,2393,0,0 +BRDA:20630,2393,1,0 +BRDA:20630,2394,0,0 +BRDA:20630,2394,1,0 +BRDA:20673,2395,0,0 +BRDA:20673,2395,1,0 +BRDA:20674,2396,0,0 +BRDA:20674,2396,1,0 +BRDA:20674,2397,0,0 +BRDA:20674,2397,1,0 +BRDA:20710,2398,0,0 +BRDA:20710,2398,1,0 +BRDA:20714,2399,0,0 +BRDA:20714,2399,1,0 +BRDA:20714,2400,0,0 +BRDA:20714,2400,1,0 +BRDA:20716,2401,0,0 +BRDA:20716,2401,1,0 +BRDA:20716,2402,0,0 +BRDA:20716,2402,1,0 +BRDA:20740,2403,0,0 +BRDA:20740,2403,1,0 +BRDA:20771,2404,0,0 +BRDA:20771,2404,1,0 +BRDA:20776,2405,0,0 +BRDA:20776,2405,1,0 +BRDA:20800,2406,0,0 +BRDA:20800,2406,1,0 +BRDA:20801,2407,0,0 +BRDA:20801,2407,1,0 +BRDA:20801,2408,0,0 +BRDA:20801,2408,1,0 +BRDA:20824,2409,0,0 +BRDA:20824,2409,1,0 +BRDA:20829,2410,0,0 +BRDA:20829,2410,1,0 +BRDA:20832,2411,0,0 +BRDA:20832,2411,1,0 +BRDA:20876,2412,0,0 +BRDA:20876,2412,1,0 +BRDA:20930,2413,0,0 +BRDA:20930,2413,1,0 +BRDA:20979,2414,0,0 +BRDA:20979,2414,1,0 +BRDA:21024,2415,0,0 +BRDA:21024,2415,1,0 +BRDA:21096,2416,0,0 +BRDA:21096,2416,1,0 +BRDA:21099,2417,0,0 +BRDA:21099,2417,1,0 +BRDA:21100,2418,0,0 +BRDA:21100,2418,1,0 +BRDA:21103,2419,0,0 +BRDA:21103,2419,1,0 +BRDA:21103,2420,0,0 +BRDA:21103,2420,1,0 +BRDA:21104,2421,0,0 +BRDA:21104,2421,1,0 +BRDA:21123,2422,0,0 +BRDA:21123,2422,1,0 +BRDA:21131,2423,0,0 +BRDA:21131,2423,1,0 +BRDA:21141,2424,0,0 +BRDA:21141,2424,1,0 +BRDA:21141,2424,2,0 +BRDA:21141,2424,3,0 +BRDA:21141,2424,4,0 +BRDA:21147,2425,0,0 +BRDA:21147,2425,1,0 +BRDA:21159,2426,0,0 +BRDA:21159,2426,1,0 +BRDA:21159,2427,0,0 +BRDA:21159,2427,1,0 +BRDA:21167,2428,0,0 +BRDA:21167,2428,1,0 +BRDA:21175,2429,0,0 +BRDA:21175,2429,1,0 +BRDA:21186,2430,0,0 +BRDA:21186,2430,1,0 +BRDA:21187,2431,0,0 +BRDA:21187,2431,1,0 +BRDA:21190,2432,0,0 +BRDA:21190,2432,1,0 +BRDA:21196,2433,0,0 +BRDA:21196,2433,1,0 +BRDA:21248,2434,0,0 +BRDA:21248,2434,1,0 +BRDA:21318,2435,0,0 +BRDA:21318,2435,1,0 +BRDA:21318,2436,0,0 +BRDA:21318,2436,1,0 +BRDA:21318,2436,2,0 +BRDA:21323,2437,0,0 +BRDA:21323,2437,1,0 +BRDA:21326,2438,0,0 +BRDA:21326,2438,1,0 +BRDA:21330,2439,0,0 +BRDA:21330,2439,1,0 +BRDA:21333,2440,0,0 +BRDA:21333,2440,1,0 +BRDA:21361,2441,0,0 +BRDA:21361,2441,1,0 +BRDA:21366,2442,0,0 +BRDA:21366,2442,1,0 +BRDA:21366,2442,2,0 +BRDA:21366,2442,3,0 +BRDA:21430,2443,0,0 +BRDA:21430,2443,1,0 +BRDA:21430,2444,0,0 +BRDA:21430,2444,1,0 +BRDA:21573,2445,0,0 +BRDA:21573,2445,1,0 +BRDA:21576,2446,0,0 +BRDA:21576,2446,1,0 +BRDA:21615,2447,0,0 +BRDA:21615,2447,1,0 +BRDA:21618,2448,0,0 +BRDA:21618,2448,1,0 +BRDA:21623,2449,0,0 +BRDA:21623,2449,1,0 +BRDA:21678,2450,0,0 +BRDA:21678,2450,1,0 +BRDA:21681,2451,0,0 +BRDA:21681,2451,1,0 +BRDA:21682,2452,0,0 +BRDA:21682,2452,1,0 +BRDA:21683,2453,0,0 +BRDA:21683,2453,1,0 +BRDA:21773,2454,0,0 +BRDA:21773,2454,1,0 +BRDA:21777,2455,0,0 +BRDA:21777,2455,1,0 +BRDA:21842,2456,0,0 +BRDA:21842,2456,1,0 +BRDA:21897,2457,0,0 +BRDA:21897,2457,1,0 +BRDA:21926,2458,0,0 +BRDA:21926,2458,1,0 +BRDA:21962,2459,0,0 +BRDA:21962,2459,1,0 +BRDA:21962,2459,2,0 +BRDA:22035,2460,0,0 +BRDA:22035,2460,1,0 +BRDA:22036,2461,0,0 +BRDA:22036,2461,1,0 +BRDA:22036,2461,2,0 +BRDA:22082,2462,0,0 +BRDA:22082,2462,1,0 +BRDA:22110,2463,0,0 +BRDA:22110,2463,1,0 +BRDA:22110,2463,2,0 +BRDA:22139,2464,0,0 +BRDA:22139,2464,1,0 +BRDA:22160,2465,0,0 +BRDA:22160,2465,1,0 +BRDA:22160,2465,2,0 +BRDA:22160,2465,3,0 +BRDA:22181,2466,0,0 +BRDA:22181,2466,1,0 +BRDA:22200,2467,0,0 +BRDA:22200,2467,1,0 +BRDA:22220,2468,0,0 +BRDA:22220,2468,1,0 +BRDA:22220,2468,2,0 +BRDA:22257,2469,0,0 +BRDA:22257,2469,1,0 +BRDA:22260,2470,0,0 +BRDA:22260,2470,1,0 +BRDA:22260,2471,0,0 +BRDA:22260,2471,1,0 +BRDA:22260,2471,2,0 +BRDA:22260,2471,3,0 +BRDA:22260,2471,4,0 +BRDA:22260,2471,5,0 +BRDA:22260,2471,6,0 +BRDA:22266,2472,0,0 +BRDA:22266,2472,1,0 +BRDA:22266,2473,0,0 +BRDA:22266,2473,1,0 +BRDA:22269,2474,0,0 +BRDA:22269,2474,1,0 +BRDA:22273,2475,0,0 +BRDA:22273,2475,1,0 +BRDA:22345,2476,0,0 +BRDA:22345,2476,1,0 +BRDA:22346,2477,0,0 +BRDA:22346,2477,1,0 +BRDA:22347,2478,0,0 +BRDA:22347,2478,1,0 +BRDA:22369,2479,0,0 +BRDA:22369,2479,1,0 +BRDA:22373,2480,0,0 +BRDA:22373,2480,1,0 +BRDA:22373,2480,2,0 +BRDA:22373,2480,3,0 +BRDA:22373,2480,4,0 +BRDA:22404,2481,0,0 +BRDA:22404,2481,1,0 +BRDA:22425,2482,0,0 +BRDA:22425,2482,1,0 +BRDA:22431,2483,0,0 +BRDA:22431,2483,1,0 +BRDA:22431,2483,2,0 +BRDA:22431,2483,3,0 +BRDA:22461,2484,0,0 +BRDA:22461,2484,1,0 +BRDA:22491,2485,0,0 +BRDA:22491,2485,1,0 +BRDA:22491,2485,2,0 +BRDA:22491,2485,3,0 +BRDA:22522,2486,0,0 +BRDA:22522,2486,1,0 +BRDA:22522,2486,2,0 +BRDA:22550,2487,0,0 +BRDA:22550,2487,1,0 +BRDA:22570,2488,0,0 +BRDA:22570,2488,1,0 +BRDA:22601,2489,0,0 +BRDA:22601,2489,1,0 +BRDA:22637,2490,0,0 +BRDA:22637,2490,1,0 +BRDA:22673,2491,0,0 +BRDA:22673,2491,1,0 +BRDA:22703,2492,0,0 +BRDA:22703,2492,1,0 +BRDA:22781,2493,0,0 +BRDA:22781,2493,1,0 +BRDA:22781,2493,2,0 +BRDA:22814,2494,0,0 +BRDA:22814,2494,1,0 +BRDA:22814,2495,0,0 +BRDA:22814,2495,1,0 +BRDA:22818,2496,0,0 +BRDA:22818,2496,1,0 +BRDA:22821,2497,0,0 +BRDA:22821,2497,1,0 +BRDA:22822,2498,0,0 +BRDA:22822,2498,1,0 +BRDA:22822,2498,2,0 +BRDA:22843,2499,0,0 +BRDA:22843,2499,1,0 +BRDA:22873,2500,0,0 +BRDA:22873,2500,1,0 +BRDA:22873,2500,2,0 +BRDA:22893,2501,0,0 +BRDA:22893,2501,1,0 +BRDA:22913,2502,0,0 +BRDA:22913,2502,1,0 +BRDA:22913,2502,2,0 +BRDA:22913,2502,3,0 +BRDA:22935,2503,0,0 +BRDA:22935,2503,1,0 +BRDA:22935,2503,2,0 +BRDA:22956,2504,0,0 +BRDA:22956,2504,1,0 +BRDA:22997,2505,0,0 +BRDA:22997,2505,1,0 +BRDA:23018,2506,0,0 +BRDA:23018,2506,1,0 +BRDA:23097,2507,0,0 +BRDA:23097,2507,1,0 +BRDA:23100,2508,0,0 +BRDA:23100,2508,1,0 +BRDA:23101,2509,0,0 +BRDA:23101,2509,1,0 +BRDA:23103,2510,0,0 +BRDA:23103,2510,1,0 +BRDA:23103,2511,0,0 +BRDA:23103,2511,1,0 +BRDA:23107,2512,0,0 +BRDA:23107,2512,1,0 +BRDA:23107,2513,0,0 +BRDA:23107,2513,1,0 +BRDA:23136,2514,0,0 +BRDA:23136,2514,1,0 +BRDA:23137,2515,0,0 +BRDA:23137,2515,1,0 +BRDA:23140,2516,0,0 +BRDA:23140,2516,1,0 +BRDA:23140,2517,0,0 +BRDA:23140,2517,1,0 +BRDA:23141,2518,0,0 +BRDA:23141,2518,1,0 +BRDA:23144,2519,0,0 +BRDA:23144,2519,1,0 +BRDA:23177,2520,0,0 +BRDA:23177,2520,1,0 +BRDA:23177,2521,0,0 +BRDA:23177,2521,1,0 +BRDA:23208,2522,0,0 +BRDA:23208,2522,1,0 +BRDA:23235,2523,0,0 +BRDA:23235,2523,1,0 +BRDA:23238,2524,0,0 +BRDA:23238,2524,1,0 +BRDA:23241,2525,0,0 +BRDA:23241,2525,1,0 +BRDA:23242,2526,0,0 +BRDA:23242,2526,1,0 +BRDA:23243,2527,0,0 +BRDA:23243,2527,1,0 +BRDA:23245,2528,0,0 +BRDA:23245,2528,1,0 +BRDA:23246,2529,0,0 +BRDA:23246,2529,1,0 +BRDA:23250,2530,0,0 +BRDA:23250,2530,1,0 +BRDA:23250,2531,0,0 +BRDA:23250,2531,1,0 +BRDA:23251,2532,0,0 +BRDA:23251,2532,1,0 +BRDA:23252,2533,0,0 +BRDA:23252,2533,1,0 +BRDA:23308,2534,0,0 +BRDA:23308,2534,1,0 +BRDA:23310,2535,0,0 +BRDA:23310,2535,1,0 +BRDA:23335,2536,0,0 +BRDA:23335,2536,1,0 +BRDA:23373,2537,0,0 +BRDA:23373,2537,1,0 +BRDA:23373,2538,0,0 +BRDA:23373,2538,1,0 +BRDA:23378,2539,0,0 +BRDA:23378,2539,1,0 +BRDA:23539,2540,0,0 +BRDA:23539,2540,1,0 +BRDA:23699,2541,0,0 +BRDA:23699,2541,1,0 +BRDA:23731,2542,0,0 +BRDA:23731,2542,1,0 +BRDA:23765,2543,0,0 +BRDA:23765,2543,1,0 +BRDA:23795,2544,0,0 +BRDA:23795,2544,1,0 +BRDA:23822,2545,0,0 +BRDA:23822,2545,1,0 +BRDA:23849,2546,0,0 +BRDA:23849,2546,1,0 +BRDA:23878,2547,0,0 +BRDA:23878,2547,1,0 +BRDA:23879,2548,0,0 +BRDA:23879,2548,1,0 +BRDA:23910,2549,0,0 +BRDA:23910,2549,1,0 +BRDA:23940,2550,0,0 +BRDA:23940,2550,1,0 +BRDA:23992,2551,0,0 +BRDA:23992,2551,1,0 +BRDA:24048,2552,0,0 +BRDA:24048,2552,1,0 +BRDA:24075,2553,0,0 +BRDA:24075,2553,1,0 +BRDA:24239,2554,0,0 +BRDA:24239,2554,1,0 +BRDA:24245,2555,0,0 +BRDA:24245,2555,1,0 +BRDA:24249,2556,0,0 +BRDA:24249,2556,1,0 +BRDA:24301,2557,0,0 +BRDA:24301,2557,1,0 +BRDA:24323,2558,0,0 +BRDA:24323,2558,1,0 +BRDA:24371,2559,0,0 +BRDA:24371,2559,1,0 +BRDA:24376,2560,0,0 +BRDA:24376,2560,1,0 +BRDA:24377,2561,0,0 +BRDA:24377,2561,1,0 +BRDA:24381,2562,0,0 +BRDA:24381,2562,1,0 +BRDA:24415,2563,0,0 +BRDA:24415,2563,1,0 +BRDA:24443,2564,0,0 +BRDA:24443,2564,1,0 +BRDA:24444,2565,0,0 +BRDA:24444,2565,1,0 +BRDA:24531,2566,0,0 +BRDA:24531,2566,1,0 +BRDA:24531,2566,2,0 +BRDA:24534,2567,0,0 +BRDA:24534,2567,1,0 +BRDA:24535,2568,0,0 +BRDA:24535,2568,1,0 +BRDA:24536,2569,0,0 +BRDA:24536,2569,1,0 +BRDA:24537,2570,0,0 +BRDA:24537,2570,1,0 +BRDA:24539,2571,0,0 +BRDA:24539,2571,1,0 +BRDA:24540,2572,0,0 +BRDA:24540,2572,1,0 +BRDA:24546,2573,0,0 +BRDA:24546,2573,1,0 +BRDA:24580,2574,0,0 +BRDA:24580,2574,1,0 +BRDA:24611,2575,0,0 +BRDA:24611,2575,1,0 +BRDA:24639,2576,0,0 +BRDA:24639,2576,1,0 +BRDA:24640,2577,0,0 +BRDA:24640,2577,1,0 +BRDA:24670,2578,0,0 +BRDA:24670,2578,1,0 +BRDA:24698,2579,0,0 +BRDA:24698,2579,1,0 +BRDA:24723,2580,0,0 +BRDA:24723,2580,1,0 +BRDA:24727,2581,0,0 +BRDA:24727,2581,1,0 +BRDA:24729,2582,0,0 +BRDA:24729,2582,1,0 +BRDA:24731,2583,0,0 +BRDA:24731,2583,1,0 +BRDA:24733,2584,0,0 +BRDA:24733,2584,1,0 +BRDA:24778,2585,0,0 +BRDA:24778,2585,1,0 +BRDA:24820,2586,0,0 +BRDA:24820,2586,1,0 +BRDA:24820,2587,0,0 +BRDA:24820,2587,1,0 +BRDA:24820,2587,2,0 +BRDA:24823,2588,0,0 +BRDA:24823,2588,1,0 +BRDA:24824,2589,0,0 +BRDA:24824,2589,1,0 +BRDA:24828,2590,0,0 +BRDA:24828,2590,1,0 +BRDA:24833,2591,0,0 +BRDA:24833,2591,1,0 +BRDA:24833,2592,0,0 +BRDA:24833,2592,1,0 +BRDA:24839,2593,0,0 +BRDA:24839,2593,1,0 +BRDA:24846,2594,0,0 +BRDA:24846,2594,1,0 +BRDA:24851,2595,0,0 +BRDA:24851,2595,1,0 +BRDA:24851,2596,0,0 +BRDA:24851,2596,1,0 +BRDA:24851,2596,2,0 +BRDA:24882,2597,0,0 +BRDA:24882,2597,1,0 +BRDA:24924,2598,0,0 +BRDA:24924,2598,1,0 +BRDA:24955,2599,0,0 +BRDA:24955,2599,1,0 +BRDA:24961,2600,0,0 +BRDA:24961,2600,1,0 +BRDA:24994,2601,0,0 +BRDA:24994,2601,1,0 +BRDA:24994,2602,0,0 +BRDA:24994,2602,1,0 +BRDA:25016,2603,0,0 +BRDA:25016,2603,1,0 +BRDA:25016,2604,0,0 +BRDA:25016,2604,1,0 +BRDA:25043,2605,0,0 +BRDA:25043,2605,1,0 +BRDA:25067,2606,0,0 +BRDA:25067,2606,1,0 +BRDA:25116,2607,0,0 +BRDA:25116,2607,1,0 +BRDA:25117,2608,0,0 +BRDA:25117,2608,1,0 +BRDA:25117,2609,0,0 +BRDA:25117,2609,1,0 +BRDA:25155,2610,0,0 +BRDA:25155,2610,1,0 +BRDA:25156,2611,0,0 +BRDA:25156,2611,1,0 +BRDA:25156,2612,0,0 +BRDA:25156,2612,1,0 +BRDA:25188,2613,0,0 +BRDA:25188,2613,1,0 +BRDA:25189,2614,0,0 +BRDA:25189,2614,1,0 +BRDA:25189,2615,0,0 +BRDA:25189,2615,1,0 +BRDA:25219,2616,0,0 +BRDA:25219,2616,1,0 +BRDA:25219,2617,0,0 +BRDA:25219,2617,1,0 +BRDA:25221,2618,0,0 +BRDA:25221,2618,1,0 +BRDA:25224,2619,0,0 +BRDA:25224,2619,1,0 +BRDA:25250,2620,0,0 +BRDA:25250,2620,1,0 +BRDA:25250,2621,0,0 +BRDA:25250,2621,1,0 +BRDA:25281,2622,0,0 +BRDA:25281,2622,1,0 +BRDA:25306,2623,0,0 +BRDA:25306,2623,1,0 +BRDA:25329,2624,0,0 +BRDA:25329,2624,1,0 +BRDA:25329,2625,0,0 +BRDA:25329,2625,1,0 +BRDA:25329,2625,2,0 +BRDA:25332,2626,0,0 +BRDA:25332,2626,1,0 +BRDA:25333,2627,0,0 +BRDA:25333,2627,1,0 +BRDA:25337,2628,0,0 +BRDA:25337,2628,1,0 +BRDA:25337,2629,0,0 +BRDA:25337,2629,1,0 +BRDA:25337,2629,2,0 +BRDA:25337,2629,3,0 +BRDA:25342,2630,0,0 +BRDA:25342,2630,1,0 +BRDA:25342,2631,0,0 +BRDA:25342,2631,1,0 +BRDA:25371,2632,0,0 +BRDA:25371,2632,1,0 +BRDA:25399,2633,0,0 +BRDA:25399,2633,1,0 +BRDA:25517,2634,0,0 +BRDA:25517,2634,1,0 +BRDA:25517,2635,0,0 +BRDA:25517,2635,1,0 +BRDA:25530,2636,0,0 +BRDA:25530,2636,1,0 +BRDA:25535,2637,0,0 +BRDA:25535,2637,1,0 +BRDA:25537,2638,0,0 +BRDA:25537,2638,1,0 +BRDA:25538,2639,0,0 +BRDA:25538,2639,1,0 +BRDA:25543,2640,0,0 +BRDA:25543,2640,1,0 +BRDA:25549,2641,0,0 +BRDA:25549,2641,1,0 +BRDA:25555,2642,0,0 +BRDA:25555,2642,1,0 +BRDA:25559,2643,0,0 +BRDA:25559,2643,1,0 +BRDA:25563,2644,0,0 +BRDA:25563,2644,1,0 +BRDA:25578,2645,0,0 +BRDA:25578,2645,1,0 +BRDA:25582,2646,0,0 +BRDA:25582,2646,1,0 +BRDA:25587,2647,0,0 +BRDA:25587,2647,1,0 +BRDA:25588,2648,0,0 +BRDA:25588,2648,1,0 +BRDA:25593,2649,0,0 +BRDA:25593,2649,1,0 +BRDA:25597,2650,0,0 +BRDA:25597,2650,1,0 +BRDA:25613,2651,0,0 +BRDA:25613,2651,1,0 +BRDA:25693,2652,0,0 +BRDA:25693,2652,1,0 +BRDA:25693,2653,0,0 +BRDA:25693,2653,1,0 +BRDA:25693,2653,2,0 +BRDA:25696,2654,0,0 +BRDA:25696,2654,1,0 +BRDA:25696,2655,0,0 +BRDA:25696,2655,1,0 +BRDA:25728,2656,0,0 +BRDA:25728,2656,1,0 +BRDA:25728,2657,0,0 +BRDA:25728,2657,1,0 +BRDA:25728,2657,2,0 +BRDA:25731,2658,0,0 +BRDA:25731,2658,1,0 +BRDA:25731,2659,0,0 +BRDA:25731,2659,1,0 +BRDA:25761,2660,0,0 +BRDA:25761,2660,1,0 +BRDA:25761,2661,0,0 +BRDA:25761,2661,1,0 +BRDA:25761,2661,2,0 +BRDA:25764,2662,0,0 +BRDA:25764,2662,1,0 +BRDA:25764,2663,0,0 +BRDA:25764,2663,1,0 +BRDA:25814,2664,0,0 +BRDA:25814,2664,1,0 +BRDA:25815,2665,0,0 +BRDA:25815,2665,1,0 +BRDA:25816,2666,0,0 +BRDA:25816,2666,1,0 +BRDA:25817,2667,0,0 +BRDA:25817,2667,1,0 +BRDA:25822,2668,0,0 +BRDA:25822,2668,1,0 +BRDA:25826,2669,0,0 +BRDA:25826,2669,1,0 +BRDA:25830,2670,0,0 +BRDA:25830,2670,1,0 +BRDA:25833,2671,0,0 +BRDA:25833,2671,1,0 +BRDA:25837,2672,0,0 +BRDA:25837,2672,1,0 +BRDA:25840,2673,0,0 +BRDA:25840,2673,1,0 +BRDA:25843,2674,0,0 +BRDA:25843,2674,1,0 +BRDA:25844,2675,0,0 +BRDA:25844,2675,1,0 +BRDA:25848,2676,0,0 +BRDA:25848,2676,1,0 +BRDA:25855,2677,0,0 +BRDA:25855,2677,1,0 +BRDA:25857,2678,0,0 +BRDA:25857,2678,1,0 +BRDA:25859,2679,0,0 +BRDA:25859,2679,1,0 +BRDA:25887,2680,0,0 +BRDA:25887,2680,1,0 +BRDA:25887,2681,0,0 +BRDA:25887,2681,1,0 +BRDA:25913,2682,0,0 +BRDA:25913,2682,1,0 +BRDA:25956,2683,0,0 +BRDA:25956,2683,1,0 +BRDA:25958,2684,0,0 +BRDA:25958,2684,1,0 +BRDA:25959,2685,0,0 +BRDA:25959,2685,1,0 +BRDA:25961,2686,0,0 +BRDA:25961,2686,1,0 +BRDA:25992,2687,0,0 +BRDA:25992,2687,1,0 +BRDA:26060,2688,0,0 +BRDA:26060,2688,1,0 +BRDA:26063,2689,0,0 +BRDA:26063,2689,1,0 +BRDA:26064,2690,0,0 +BRDA:26064,2690,1,0 +BRDA:26074,2691,0,0 +BRDA:26074,2691,1,0 +BRDA:26155,2692,0,0 +BRDA:26155,2692,1,0 +BRDA:26155,2693,0,0 +BRDA:26155,2693,1,0 +BRDA:26268,2694,0,0 +BRDA:26268,2694,1,0 +BRDA:26432,2695,0,0 +BRDA:26432,2695,1,0 +BRDA:26432,2696,0,0 +BRDA:26432,2696,1,0 +BRDA:26433,2697,0,0 +BRDA:26433,2697,1,0 +BRDA:26433,2697,2,0 +BRDA:26439,2698,0,0 +BRDA:26439,2698,1,0 +BRDA:26439,2699,0,0 +BRDA:26439,2699,1,0 +BRDA:26445,2700,0,0 +BRDA:26445,2700,1,0 +BRDA:26448,2701,0,0 +BRDA:26448,2701,1,0 +BRDA:26448,2702,0,0 +BRDA:26448,2702,1,0 +BRDA:26478,2703,0,0 +BRDA:26478,2703,1,0 +BRDA:26622,2704,0,0 +BRDA:26622,2704,1,0 +BRDA:26648,2705,0,0 +BRDA:26648,2705,1,0 +BRDA:26849,2706,0,0 +BRDA:26849,2706,1,0 +BRDA:26849,2707,0,0 +BRDA:26849,2707,1,0 +BRDA:26883,2708,0,0 +BRDA:26883,2708,1,0 +BRDA:26886,2709,0,0 +BRDA:26886,2709,1,0 +BRDA:27016,2710,0,0 +BRDA:27016,2710,1,0 +BRDA:27016,2711,0,0 +BRDA:27016,2711,1,0 +BRDA:27045,2712,0,0 +BRDA:27045,2712,1,0 +BRDA:27045,2713,0,0 +BRDA:27045,2713,1,0 +BRDA:27114,2714,0,0 +BRDA:27114,2714,1,0 +BRDA:27114,2715,0,0 +BRDA:27114,2715,1,0 +BRDA:27143,2716,0,0 +BRDA:27143,2716,1,0 +BRDA:27143,2717,0,0 +BRDA:27143,2717,1,0 +BRDA:27224,2718,0,0 +BRDA:27224,2718,1,0 +BRDA:27224,2719,0,0 +BRDA:27224,2719,1,0 +BRDA:27253,2720,0,0 +BRDA:27253,2720,1,0 +BRDA:27253,2721,0,0 +BRDA:27253,2721,1,0 +BRDA:27581,2722,0,0 +BRDA:27581,2722,1,0 +BRDA:27607,2723,0,0 +BRDA:27607,2723,1,0 +BRDA:27609,2724,0,0 +BRDA:27609,2724,1,0 +BRDA:27609,2725,0,0 +BRDA:27609,2725,1,0 +BRDA:27613,2726,0,0 +BRDA:27613,2726,1,0 +BRDA:27618,2727,0,0 +BRDA:27618,2727,1,0 +BRDA:27632,2728,0,0 +BRDA:27632,2728,1,0 +BRDA:27640,2729,0,0 +BRDA:27640,2729,1,0 +BRDA:27647,2730,0,0 +BRDA:27647,2730,1,0 +BRDA:27656,2731,0,0 +BRDA:27656,2731,1,0 +BRDA:27659,2732,0,0 +BRDA:27659,2732,1,0 +BRDA:27676,2733,0,0 +BRDA:27676,2733,1,0 +BRDA:27692,2734,0,0 +BRDA:27692,2734,1,0 +BRDA:27692,2735,0,0 +BRDA:27692,2735,1,0 +BRDA:27692,2735,2,0 +BRDA:27695,2736,0,0 +BRDA:27695,2736,1,0 +BRDA:27697,2737,0,0 +BRDA:27697,2737,1,0 +BRDA:27700,2738,0,0 +BRDA:27700,2738,1,0 +BRDA:27702,2739,0,0 +BRDA:27702,2739,1,0 +BRDA:27719,2740,0,0 +BRDA:27719,2740,1,0 +BRDA:27719,2741,0,0 +BRDA:27719,2741,1,0 +BRDA:27720,2742,0,0 +BRDA:27720,2742,1,0 +BRDA:27722,2743,0,0 +BRDA:27722,2743,1,0 +BRDA:27727,2744,0,0 +BRDA:27727,2744,1,0 +BRDA:27730,2745,0,0 +BRDA:27730,2745,1,0 +BRDA:27734,2746,0,0 +BRDA:27734,2746,1,0 +BRDA:27734,2747,0,0 +BRDA:27734,2747,1,0 +BRDA:27737,2748,0,0 +BRDA:27737,2748,1,0 +BRDA:27737,2749,0,0 +BRDA:27737,2749,1,0 +BRDA:27737,2749,2,0 +BRDA:27737,2749,3,0 +BRDA:27743,2750,0,0 +BRDA:27743,2750,1,0 +BRDA:27744,2751,0,0 +BRDA:27744,2751,1,0 +BRDA:27746,2752,0,0 +BRDA:27746,2752,1,0 +BRDA:27746,2753,0,0 +BRDA:27746,2753,1,0 +BRDA:27747,2754,0,0 +BRDA:27747,2754,1,0 +BRDA:27752,2755,0,0 +BRDA:27752,2755,1,0 +BRDA:27752,2756,0,0 +BRDA:27752,2756,1,0 +BRDA:27756,2757,0,0 +BRDA:27756,2757,1,0 +BRDA:27756,2758,0,0 +BRDA:27756,2758,1,0 +BRDA:27763,2759,0,0 +BRDA:27763,2759,1,0 +BRDA:27768,2760,0,0 +BRDA:27768,2760,1,0 +BRDA:27768,2761,0,0 +BRDA:27768,2761,1,0 +BRDA:27770,2762,0,0 +BRDA:27770,2762,1,0 +BRDA:27773,2763,0,0 +BRDA:27773,2763,1,0 +BRDA:27781,2764,0,0 +BRDA:27781,2764,1,0 +BRDA:27783,2765,0,0 +BRDA:27783,2765,1,0 +BRDA:27811,2766,0,0 +BRDA:27811,2766,1,0 +BRDA:27823,2767,0,0 +BRDA:27823,2767,1,0 +BRDA:27823,2768,0,0 +BRDA:27823,2768,1,0 +BRDA:27823,2768,2,0 +BRDA:27837,2769,0,0 +BRDA:27837,2769,1,0 +BRDA:27849,2770,0,0 +BRDA:27849,2770,1,0 +BRDA:27849,2771,0,0 +BRDA:27849,2771,1,0 +BRDA:27849,2772,0,0 +BRDA:27849,2772,1,0 +BRDA:27901,2773,0,0 +BRDA:27901,2773,1,0 +BRDA:27901,2774,0,0 +BRDA:27901,2774,1,0 +BRDA:27901,2774,2,0 +BRDA:27906,2775,0,0 +BRDA:27906,2775,1,0 +BRDA:27909,2776,0,0 +BRDA:27909,2776,1,0 +BRDA:27913,2777,0,0 +BRDA:27913,2777,1,0 +BRDA:27916,2778,0,0 +BRDA:27916,2778,1,0 +BRDA:27957,2779,0,0 +BRDA:27957,2779,1,0 +BRDA:27987,2780,0,0 +BRDA:27987,2780,1,0 +BRDA:27998,2781,0,0 +BRDA:27998,2781,1,0 +BRDA:28002,2782,0,0 +BRDA:28002,2782,1,0 +BRDA:28002,2783,0,0 +BRDA:28002,2783,1,0 +BRDA:28002,2783,2,0 +BRDA:28002,2783,3,0 +BRDA:28002,2783,4,0 +BRF:6057 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/dist/csvtojson.min.js +FN:2,a +FN:2,e +FN:2,(anonymous_2) +FN:2,(anonymous_3) +FN:2,(anonymous_4) +FN:2,(anonymous_5) +FN:2,d +FN:2,(anonymous_7) +FN:2,(anonymous_8) +FN:2,(anonymous_9) +FN:2,(anonymous_10) +FN:2,(anonymous_11) +FN:2,(anonymous_12) +FN:2,e +FN:2,(anonymous_14) +FN:2,f +FN:2,(anonymous_16) +FN:2,(anonymous_17) +FN:2,g +FN:2,h +FN:2,(anonymous_20) +FN:2,(anonymous_21) +FN:2,(anonymous_22) +FN:2,(anonymous_23) +FN:2,(anonymous_24) +FN:2,(anonymous_25) +FN:2,(anonymous_26) +FN:2,(anonymous_27) +FN:2,(anonymous_28) +FN:2,(anonymous_29) +FN:2,(anonymous_30) +FN:2,(anonymous_31) +FN:2,(anonymous_32) +FN:2,(anonymous_33) +FN:2,(anonymous_34) +FN:2,(anonymous_35) +FN:2,(anonymous_36) +FN:2,(anonymous_37) +FN:2,(anonymous_38) +FN:2,(anonymous_39) +FN:2,(anonymous_40) +FN:2,(anonymous_41) +FN:2,(anonymous_42) +FN:2,(anonymous_43) +FN:2,(anonymous_44) +FN:2,(anonymous_45) +FN:2,(anonymous_46) +FN:2,(anonymous_47) +FN:2,(anonymous_48) +FN:2,(anonymous_49) +FN:2,(anonymous_50) +FN:2,(anonymous_51) +FN:2,(anonymous_52) +FN:2,(anonymous_53) +FN:2,(anonymous_54) +FN:2,(anonymous_55) +FN:2,(anonymous_56) +FN:2,(anonymous_57) +FN:2,(anonymous_58) +FN:2,(anonymous_59) +FN:2,c +FN:2,(anonymous_61) +FN:2,(anonymous_62) +FN:2,(anonymous_63) +FN:2,(anonymous_64) +FN:2,(anonymous_65) +FN:2,(anonymous_66) +FN:2,(anonymous_67) +FN:2,(anonymous_68) +FN:2,d +FN:2,(anonymous_70) +FN:2,(anonymous_71) +FN:2,(anonymous_72) +FN:2,(anonymous_73) +FN:2,(anonymous_74) +FN:2,(anonymous_75) +FN:2,(anonymous_76) +FN:2,(anonymous_77) +FN:2,(anonymous_78) +FN:2,(anonymous_79) +FN:2,(anonymous_80) +FN:2,(anonymous_81) +FN:2,d +FN:2,(anonymous_83) +FN:2,(anonymous_84) +FN:2,(anonymous_85) +FN:2,(anonymous_86) +FN:2,d +FN:2,(anonymous_88) +FN:2,d +FN:2,e +FN:2,f +FN:2,g +FN:2,h +FN:2,i +FN:2,j +FN:2,k +FN:2,l +FN:2,m +FN:2,n +FN:2,o +FN:2,p +FN:2,q +FN:2,(anonymous_103) +FN:2,(anonymous_104) +FN:2,(anonymous_105) +FN:2,d +FN:2,(anonymous_107) +FN:2,(anonymous_108) +FN:2,(anonymous_109) +FN:2,(anonymous_110) +FN:2,(anonymous_111) +FN:2,(anonymous_112) +FN:2,(anonymous_113) +FN:2,(anonymous_114) +FN:2,(anonymous_115) +FN:2,(anonymous_116) +FN:2,d +FN:2,e +FN:2,c +FN:2,(anonymous_120) +FN:2,(anonymous_121) +FN:2,f +FN:2,g +FN:2,(anonymous_124) +FN:2,(anonymous_125) +FN:2,(anonymous_126) +FN:2,d +FN:2,e +FN:2,f +FN:2,(anonymous_130) +FN:2,(anonymous_131) +FN:2,(anonymous_132) +FN:2,e +FN:2,a +FN:2,b +FN:2,d +FN:2,(anonymous_137) +FN:2,e +FN:2,(anonymous_139) +FN:2,g +FN:2,(anonymous_141) +FN:2,(anonymous_142) +FN:2,f +FN:2,(anonymous_144) +FN:2,(anonymous_145) +FN:2,(anonymous_146) +FN:2,(anonymous_147) +FN:2,(anonymous_148) +FN:2,(anonymous_149) +FN:2,(anonymous_150) +FN:2,(anonymous_151) +FN:2,(anonymous_152) +FN:2,(anonymous_153) +FN:2,(anonymous_154) +FN:2,d +FN:2,(anonymous_156) +FN:2,(anonymous_157) +FN:2,(anonymous_158) +FN:2,e +FN:2,f +FN:2,(anonymous_161) +FN:2,(anonymous_162) +FN:2,(anonymous_163) +FN:2,d +FN:2,(anonymous_165) +FN:2,(anonymous_166) +FN:2,(anonymous_167) +FN:2,d +FN:2,d +FN:2,(anonymous_170) +FN:2,(anonymous_171) +FN:2,(anonymous_172) +FN:2,(anonymous_173) +FN:2,(anonymous_174) +FN:2,(anonymous_175) +FN:2,(anonymous_176) +FN:2,(anonymous_177) +FN:2,d +FN:2,a +FN:2,(anonymous_180) +FN:2,e +FN:2,f +FN:2,g +FN:2,h +FN:2,i +FN:2,j +FN:2,k +FN:2,l +FN:2,m +FN:2,n +FN:2,o +FN:2,p +FN:2,q +FN:2,r +FN:2,s +FN:2,t +FN:2,u +FN:2,v +FN:2,w +FN:2,x +FN:2,y +FN:2,z +FN:2,A +FN:2,B +FN:2,C +FN:2,D +FN:2,E +FN:2,F +FN:2,G +FN:2,H +FN:2,I +FN:2,J +FN:2,K +FN:2,L +FN:2,M +FN:2,N +FN:2,O +FN:2,P +FN:2,Q +FN:2,R +FN:2,S +FN:2,T +FN:2,U +FN:2,V +FN:2,(anonymous_225) +FN:3,(anonymous_226) +FN:3,(anonymous_227) +FN:3,(anonymous_228) +FN:3,(anonymous_229) +FN:3,(anonymous_230) +FN:3,(anonymous_231) +FN:3,(anonymous_232) +FN:3,(anonymous_233) +FN:3,c +FN:3,(anonymous_235) +FN:3,(anonymous_236) +FN:3,(anonymous_237) +FN:3,(anonymous_238) +FN:3,(anonymous_239) +FN:3,(anonymous_240) +FN:3,(anonymous_241) +FN:3,(anonymous_242) +FN:3,(anonymous_243) +FN:3,(anonymous_244) +FN:3,(anonymous_245) +FN:3,(anonymous_246) +FN:3,(anonymous_247) +FN:3,(anonymous_248) +FN:3,(anonymous_249) +FN:3,(anonymous_250) +FN:3,(anonymous_251) +FN:3,(anonymous_252) +FN:3,(anonymous_253) +FN:3,(anonymous_254) +FN:3,(anonymous_255) +FN:3,(anonymous_256) +FN:3,(anonymous_257) +FN:3,(anonymous_258) +FN:3,(anonymous_259) +FN:3,(anonymous_260) +FN:3,(anonymous_261) +FN:3,(anonymous_262) +FN:3,(anonymous_263) +FN:3,(anonymous_264) +FN:3,(anonymous_265) +FN:3,(anonymous_266) +FN:3,(anonymous_267) +FN:3,(anonymous_268) +FN:3,(anonymous_269) +FN:3,(anonymous_270) +FN:3,(anonymous_271) +FN:3,(anonymous_272) +FN:3,(anonymous_273) +FN:3,(anonymous_274) +FN:3,(anonymous_275) +FN:3,(anonymous_276) +FN:3,(anonymous_277) +FN:3,(anonymous_278) +FN:3,(anonymous_279) +FN:3,(anonymous_280) +FN:3,(anonymous_281) +FN:3,b +FN:3,c +FN:3,c +FN:3,e +FN:3,b +FN:3,c +FN:3,(anonymous_288) +FN:3,(anonymous_289) +FN:3,(anonymous_290) +FN:3,(anonymous_291) +FN:3,(anonymous_292) +FN:3,(anonymous_293) +FN:3,d +FN:3,e +FN:3,f +FN:3,g +FN:3,h +FN:3,(anonymous_299) +FN:3,(anonymous_300) +FN:3,(anonymous_301) +FN:3,(anonymous_302) +FN:3,c +FN:3,(anonymous_304) +FN:3,(anonymous_305) +FN:3,(anonymous_306) +FN:3,(anonymous_307) +FN:3,(anonymous_308) +FN:3,(anonymous_309) +FN:3,(anonymous_310) +FN:3,(anonymous_311) +FN:3,(anonymous_312) +FN:3,(anonymous_313) +FN:3,(anonymous_314) +FN:3,(anonymous_315) +FN:3,(anonymous_316) +FN:3,(anonymous_317) +FN:3,(anonymous_318) +FN:3,(anonymous_319) +FN:3,(anonymous_320) +FN:3,(anonymous_321) +FN:3,(anonymous_322) +FN:3,(anonymous_323) +FN:3,(anonymous_324) +FN:3,(anonymous_325) +FN:3,(anonymous_326) +FN:3,(anonymous_327) +FN:3,(anonymous_328) +FN:3,(anonymous_329) +FN:3,(anonymous_330) +FN:3,d +FN:3,e +FN:3,f +FN:3,g +FN:3,(anonymous_335) +FN:3,(anonymous_336) +FN:3,(anonymous_337) +FN:3,(anonymous_338) +FN:3,(anonymous_339) +FN:3,(anonymous_340) +FN:3,(anonymous_341) +FN:3,(anonymous_342) +FN:3,(anonymous_343) +FN:3,e +FN:3,f +FN:3,g +FN:3,h +FN:3,i +FN:3,(anonymous_349) +FN:3,j +FN:3,k +FN:3,l +FN:3,m +FN:3,n +FN:3,o +FN:3,(anonymous_356) +FN:3,p +FN:3,(anonymous_358) +FN:3,(anonymous_359) +FN:3,(anonymous_360) +FN:3,d +FN:3,(anonymous_362) +FN:3,(anonymous_363) +FN:3,(anonymous_364) +FN:3,d +FN:3,(anonymous_366) +FN:3,(anonymous_367) +FN:3,(anonymous_368) +FN:3,(anonymous_369) +FN:3,(anonymous_370) +FN:3,(anonymous_371) +FN:3,(anonymous_372) +FN:3,(anonymous_373) +FN:3,(anonymous_374) +FN:3,d +FN:3,e +FN:3,f +FN:3,(anonymous_378) +FN:3,(anonymous_379) +FN:3,d +FN:3,(anonymous_381) +FN:3,(anonymous_382) +FN:3,(anonymous_383) +FN:3,d +FN:3,e +FN:3,f +FN:3,g +FN:3,h +FN:3,i +FN:3,j +FN:3,k +FN:3,l +FN:3,m +FN:3,n +FN:3,o +FN:3,p +FN:3,(anonymous_397) +FN:3,q +FN:3,r +FN:3,s +FN:3,t +FN:3,u +FN:3,v +FN:3,w +FN:3,x +FN:3,y +FN:3,(anonymous_407) +FN:3,(anonymous_408) +FN:3,(anonymous_409) +FN:3,(anonymous_410) +FN:3,(anonymous_411) +FN:3,(anonymous_412) +FN:3,(anonymous_413) +FN:3,(anonymous_414) +FN:3,(anonymous_415) +FN:3,(anonymous_416) +FN:3,d +FN:3,e +FN:3,f +FN:3,g +FN:3,h +FN:3,i +FN:3,j +FN:3,k +FN:4,(anonymous_425) +FN:4,(anonymous_426) +FN:4,(anonymous_427) +FN:4,(anonymous_428) +FN:4,(anonymous_429) +FN:4,(anonymous_430) +FN:4,(anonymous_431) +FN:4,(anonymous_432) +FN:4,(anonymous_433) +FN:4,(anonymous_434) +FN:4,(anonymous_435) +FN:4,(anonymous_436) +FN:4,d +FN:4,(anonymous_438) +FN:4,e +FN:4,f +FN:4,(anonymous_441) +FN:4,(anonymous_442) +FN:4,g +FN:4,(anonymous_444) +FN:4,(anonymous_445) +FN:4,(anonymous_446) +FN:4,(anonymous_447) +FN:4,(anonymous_448) +FN:4,d +FN:4,e +FN:4,f +FN:4,(anonymous_452) +FN:4,g +FN:4,h +FN:4,i +FN:4,j +FN:4,k +FN:4,l +FN:4,m +FN:4,n +FN:4,o +FN:4,p +FN:4,q +FN:4,r +FN:4,(anonymous_465) +FN:4,s +FN:4,t +FN:4,u +FN:4,v +FN:4,(anonymous_470) +FN:4,(anonymous_471) +FN:4,(anonymous_472) +FN:4,(anonymous_473) +FN:4,(anonymous_474) +FN:4,(anonymous_475) +FN:4,(anonymous_476) +FN:4,(anonymous_477) +FN:4,(anonymous_478) +FN:4,(anonymous_479) +FN:4,(anonymous_480) +FN:4,(anonymous_481) +FN:4,(anonymous_482) +FN:4,b +FN:4,d +FN:4,e +FN:4,f +FN:4,g +FN:4,h +FN:4,i +FN:4,j +FN:4,k +FN:4,l +FN:4,m +FN:4,n +FN:4,o +FN:4,p +FN:4,q +FN:4,(anonymous_498) +FN:4,(anonymous_499) +FN:4,c +FN:4,(anonymous_501) +FN:4,(anonymous_502) +FN:4,(anonymous_503) +FN:4,c +FN:4,c +FN:4,d +FN:4,(anonymous_507) +FN:4,(anonymous_508) +FN:4,(anonymous_509) +FN:4,(anonymous_510) +FN:4,(anonymous_511) +FN:4,(anonymous_512) +FN:4,d +FN:4,(anonymous_514) +FN:4,c +FN:4,d +FN:4,f +FN:4,g +FN:4,h +FN:4,i +FN:4,(anonymous_521) +FN:4,(anonymous_522) +FN:4,(anonymous_523) +FN:4,(anonymous_524) +FN:4,(anonymous_525) +FN:4,(anonymous_526) +FN:4,b +FN:4,d +FN:4,(anonymous_529) +FN:4,(anonymous_530) +FN:4,f +FN:4,g +FN:4,(anonymous_533) +FN:4,(anonymous_534) +FN:4,(anonymous_535) +FN:4,(anonymous_536) +FN:4,(anonymous_537) +FN:4,(anonymous_538) +FN:4,(anonymous_539) +FN:4,(anonymous_540) +FN:4,(anonymous_541) +FN:4,(anonymous_542) +FN:4,(anonymous_543) +FN:4,(anonymous_544) +FN:4,(anonymous_545) +FN:4,(anonymous_546) +FN:4,(anonymous_547) +FN:4,(anonymous_548) +FN:4,(anonymous_549) +FN:4,(anonymous_550) +FN:4,(anonymous_551) +FN:4,(anonymous_552) +FN:4,(anonymous_553) +FN:4,(anonymous_554) +FN:4,(anonymous_555) +FN:4,(anonymous_556) +FN:4,(anonymous_557) +FN:4,(anonymous_558) +FN:4,(anonymous_559) +FN:4,(anonymous_560) +FN:4,(anonymous_561) +FN:4,h +FN:4,(anonymous_563) +FN:4,(anonymous_564) +FN:4,(anonymous_565) +FN:4,(anonymous_566) +FN:4,(anonymous_567) +FN:4,(anonymous_568) +FN:4,(anonymous_569) +FN:4,(anonymous_570) +FN:4,(anonymous_571) +FN:4,(anonymous_572) +FN:4,(anonymous_573) +FN:4,(anonymous_574) +FN:4,(anonymous_575) +FN:4,(anonymous_576) +FN:4,(anonymous_577) +FN:4,(anonymous_578) +FN:4,(anonymous_579) +FN:4,(anonymous_580) +FN:4,(anonymous_581) +FN:4,(anonymous_582) +FN:4,(anonymous_583) +FN:4,(anonymous_584) +FN:4,(anonymous_585) +FN:4,(anonymous_586) +FN:4,(anonymous_587) +FN:4,d +FN:4,e +FN:4,f +FN:4,g +FN:4,(anonymous_592) +FN:4,(anonymous_593) +FN:4,(anonymous_594) +FN:4,(anonymous_595) +FN:4,(anonymous_596) +FN:4,(anonymous_597) +FN:4,d +FN:4,e +FN:4,f +FN:4,g +FN:4,h +FN:4,i +FN:4,j +FN:4,k +FN:4,l +FN:4,(anonymous_607) +FN:4,(anonymous_608) +FN:5,(anonymous_609) +FN:5,(anonymous_610) +FN:5,(anonymous_611) +FN:5,(anonymous_612) +FN:5,(anonymous_613) +FN:5,(anonymous_614) +FN:5,(anonymous_615) +FN:5,(anonymous_616) +FN:5,(anonymous_617) +FN:5,(anonymous_618) +FN:5,(anonymous_619) +FN:5,e +FN:5,f +FN:5,g +FN:5,h +FN:5,(anonymous_624) +FN:5,i +FN:5,(anonymous_626) +FN:5,j +FN:5,k +FN:5,l +FN:5,(anonymous_630) +FN:5,m +FN:5,(anonymous_632) +FN:5,(anonymous_633) +FN:5,n +FN:5,(anonymous_635) +FN:5,o +FN:5,p +FN:5,q +FN:5,r +FN:5,s +FN:5,t +FN:5,u +FN:5,v +FN:5,w +FN:5,x +FN:5,y +FN:5,z +FN:5,A +FN:5,B +FN:5,C +FN:5,D +FN:5,E +FN:5,F +FN:5,(anonymous_654) +FN:5,(anonymous_655) +FN:5,f +FN:5,(anonymous_657) +FN:5,(anonymous_658) +FN:5,(anonymous_659) +FN:5,(anonymous_660) +FN:5,(anonymous_661) +FN:5,(anonymous_662) +FN:5,(anonymous_663) +FN:5,d +FN:5,(anonymous_665) +FN:5,(anonymous_666) +FN:5,(anonymous_667) +FN:5,d +FN:5,(anonymous_669) +FN:5,d +FN:5,(anonymous_671) +FN:5,(anonymous_672) +FN:5,d +FN:5,(anonymous_674) +FN:5,(anonymous_675) +FN:5,d +FN:5,(anonymous_677) +FN:5,d +FN:5,(anonymous_679) +FN:5,d +FN:5,(anonymous_681) +FN:5,d +FN:5,(anonymous_683) +FN:5,d +FN:5,(anonymous_685) +FN:5,d +FN:5,(anonymous_687) +FN:5,d +FN:5,(anonymous_689) +FN:5,d +FN:5,(anonymous_691) +FN:5,d +FN:5,(anonymous_693) +FN:5,(anonymous_694) +FN:5,(anonymous_695) +FN:5,(anonymous_696) +FN:5,(anonymous_697) +FN:5,(anonymous_698) +FN:5,d +FN:5,(anonymous_700) +FN:5,d +FN:5,(anonymous_702) +FN:5,d +FN:5,(anonymous_704) +FN:5,d +FN:5,(anonymous_706) +FN:5,d +FN:5,(anonymous_708) +FN:5,d +FN:5,(anonymous_710) +FN:5,d +FN:5,(anonymous_712) +FN:5,d +FN:5,(anonymous_714) +FN:5,d +FN:5,(anonymous_716) +FN:5,d +FN:5,(anonymous_718) +FN:5,d +FN:5,(anonymous_720) +FN:5,d +FN:5,(anonymous_722) +FN:5,d +FN:5,(anonymous_724) +FN:5,(anonymous_725) +FN:5,d +FN:5,(anonymous_727) +FN:5,d +FN:5,(anonymous_729) +FN:5,d +FN:5,(anonymous_731) +FN:5,d +FN:5,(anonymous_733) +FN:5,d +FN:5,(anonymous_735) +FN:5,d +FN:5,(anonymous_737) +FN:5,d +FN:5,(anonymous_739) +FN:5,d +FN:5,(anonymous_741) +FN:5,d +FN:5,(anonymous_743) +FN:5,d +FN:5,(anonymous_745) +FN:5,d +FN:5,(anonymous_747) +FN:5,(anonymous_748) +FN:5,(anonymous_749) +FN:5,d +FN:5,(anonymous_751) +FN:5,(anonymous_752) +FN:5,(anonymous_753) +FN:5,(anonymous_754) +FN:5,(anonymous_755) +FN:5,d +FN:5,(anonymous_757) +FN:5,d +FN:5,(anonymous_759) +FN:5,d +FN:5,(anonymous_761) +FN:5,(anonymous_762) +FN:5,d +FN:5,(anonymous_764) +FN:5,d +FN:5,(anonymous_766) +FN:5,d +FN:5,(anonymous_768) +FN:5,d +FN:5,(anonymous_770) +FN:5,(anonymous_771) +FN:5,(anonymous_772) +FN:5,d +FN:5,e +FN:5,f +FN:5,g +FN:5,h +FN:5,i +FN:5,j +FN:5,k +FN:5,l +FN:5,m +FN:5,n +FN:5,o +FN:5,p +FN:5,q +FN:5,r +FN:5,s +FN:5,t +FN:5,u +FN:5,(anonymous_791) +FN:5,v +FN:5,w +FN:5,x +FN:5,y +FN:5,z +FN:5,A +FN:5,(anonymous_798) +FN:5,B +FN:5,(anonymous_800) +FN:5,C +FN:5,(anonymous_802) +FN:5,D +FN:5,E +FN:5,F +FN:5,G +FN:5,(anonymous_807) +FN:5,H +FN:5,(anonymous_809) +FN:5,I +FN:5,(anonymous_811) +FN:5,J +FN:5,K +FN:5,L +FN:5,M +FN:5,N +FN:5,O +FN:5,P +FN:5,Q +FN:5,R +FN:5,S +FN:5,(anonymous_822) +FN:5,T +FN:5,(anonymous_824) +FN:5,U +FN:5,V +FN:5,(anonymous_827) +FN:5,W +FN:5,(anonymous_829) +FN:5,X +FN:5,Y +FN:5,Z +FN:5,$ +FN:5,_ +FN:5,aa +FN:5,ba +FN:5,(anonymous_837) +FN:5,wd +FN:5,b +FN:5,c +FN:5,s +FN:5,B +FN:6,X +FN:6,_ +FN:6,aa +FN:6,Pb +FN:6,_b +FN:6,ac +FN:6,bc +FN:6,cc +FN:6,dc +FN:6,ec +FN:6,fc +FN:6,gc +FN:6,hc +FN:6,ic +FN:6,jc +FN:6,kc +FN:6,lc +FN:6,mc +FN:6,nc +FN:6,oc +FN:6,pc +FN:6,qc +FN:6,rc +FN:6,sc +FN:6,tc +FN:6,uc +FN:6,vc +FN:6,wc +FN:6,xc +FN:6,yc +FN:6,zc +FN:6,Ac +FN:6,Bc +FN:6,Cc +FN:6,Dc +FN:6,Ec +FN:6,Fc +FN:6,Gc +FN:6,(anonymous_881) +FN:6,Hc +FN:6,Ic +FN:6,Jc +FN:6,Kc +FN:6,Lc +FN:6,Mc +FN:6,(anonymous_888) +FN:6,Nc +FN:6,(anonymous_890) +FN:6,Qc +FN:6,Rc +FN:6,(anonymous_893) +FN:6,Sc +FN:6,Tc +FN:6,(anonymous_896) +FN:6,Yc +FN:6,Zc +FN:6,$c +FN:6,(anonymous_900) +FN:6,_c +FN:6,cd +FN:6,dd +FN:6,fd +FN:6,(anonymous_905) +FN:6,gd +FN:6,id +FN:6,jd +FN:6,qd +FN:6,ud +FN:6,xd +FN:6,yd +FN:6,zd +FN:6,Ad +FN:6,(anonymous_915) +FN:6,Bd +FN:6,Cd +FN:6,Dd +FN:6,Ed +FN:6,Fd +FN:6,Gd +FN:6,Hd +FN:6,Id +FN:6,Jd +FN:6,Kd +FN:6,Ld +FN:6,Md +FN:6,Nd +FN:6,Od +FN:6,Pd +FN:6,Qd +FN:6,Rd +FN:6,(anonymous_933) +FN:6,Sd +FN:6,(anonymous_935) +FN:6,Td +FN:6,(anonymous_937) +FN:6,Ud +FN:6,(anonymous_939) +FN:6,Vd +FN:6,Wd +FN:6,Xd +FN:6,(anonymous_943) +FN:6,(anonymous_944) +FN:6,(anonymous_945) +FN:6,Yd +FN:6,(anonymous_947) +FN:6,Zd +FN:6,$d +FN:6,(anonymous_950) +FN:6,_d +FN:6,ae +FN:6,be +FN:6,ce +FN:6,de +FN:6,ee +FN:6,fe +FN:6,ge +FN:6,he +FN:6,ie +FN:6,je +FN:6,ke +FN:6,(anonymous_963) +FN:6,le +FN:6,me +FN:6,ne +FN:6,oe +FN:6,pe +FN:6,qe +FN:6,re +FN:6,se +FN:6,te +FN:6,ue +FN:6,(anonymous_974) +FN:6,ve +FN:6,we +FN:6,xe +FN:6,ye +FN:6,ze +FN:6,Ae +FN:6,Be +FN:6,Ce +FN:6,De +FN:6,Ee +FN:6,Fe +FN:6,Ge +FN:6,He +FN:6,Ie +FN:6,Je +FN:6,Ke +FN:6,Le +FN:6,Me +FN:6,Ne +FN:6,Oe +FN:6,Pe +FN:6,Qe +FN:6,Re +FN:6,(anonymous_998) +FN:6,Se +FN:6,(anonymous_1000) +FN:6,Te +FN:6,(anonymous_1002) +FN:6,Ue +FN:6,(anonymous_1004) +FN:6,Ve +FN:6,d +FN:6,We +FN:6,(anonymous_1008) +FN:6,Xe +FN:6,(anonymous_1010) +FN:6,Ye +FN:6,(anonymous_1012) +FN:6,Ze +FN:6,d +FN:6,$e +FN:6,(anonymous_1016) +FN:6,(anonymous_1017) +FN:6,_e +FN:6,(anonymous_1019) +FN:6,(anonymous_1020) +FN:6,af +FN:6,k +FN:6,bf +FN:6,(anonymous_1024) +FN:6,cf +FN:6,(anonymous_1026) +FN:6,df +FN:6,(anonymous_1028) +FN:6,(anonymous_1029) +FN:6,(anonymous_1030) +FN:6,ef +FN:6,ff +FN:6,e +FN:6,gf +FN:6,(anonymous_1035) +FN:6,hf +FN:6,(anonymous_1037) +FN:6,jf +FN:6,kf +FN:6,(anonymous_1040) +FN:6,lf +FN:6,(anonymous_1042) +FN:6,mf +FN:6,nf +FN:6,of +FN:6,pf +FN:6,qf +FN:6,(anonymous_1048) +FN:6,rf +FN:6,sf +FN:6,tf +FN:6,uf +FN:6,vf +FN:6,wf +FN:6,xf +FN:6,yf +FN:6,zf +FN:6,Af +FN:6,Bf +FN:6,Cf +FN:6,Df +FN:6,Ef +FN:6,Ff +FN:6,Gf +FN:6,Hf +FN:6,If +FN:6,Jf +FN:6,Kf +FN:6,Lf +FN:6,Mf +FN:6,Nf +FN:6,Of +FN:6,Pf +FN:6,Qf +FN:6,Rf +FN:6,Sf +FN:6,Tf +FN:6,(anonymous_1078) +FN:6,Uf +FN:6,(anonymous_1080) +FN:6,Vf +FN:6,Wf +FN:6,Xf +FN:6,Yf +FN:6,(anonymous_1085) +FN:6,Zf +FN:6,$f +FN:6,_f +FN:6,ag +FN:6,(anonymous_1090) +FN:6,bg +FN:6,cg +FN:6,dg +FN:6,eg +FN:6,(anonymous_1095) +FN:6,fg +FN:6,gg +FN:6,hg +FN:6,ig +FN:6,jg +FN:6,kg +FN:6,lg +FN:6,mg +FN:6,ng +FN:6,og +FN:6,pg +FN:6,qg +FN:6,rg +FN:6,sg +FN:6,tg +FN:6,ug +FN:6,vg +FN:6,wg +FN:6,xg +FN:6,yg +FN:6,zg +FN:6,Ag +FN:6,Bg +FN:6,Cg +FN:6,Dg +FN:6,Eg +FN:6,Fg +FN:6,Gg +FN:6,Hg +FN:6,Ig +FN:6,Jg +FN:6,Kg +FN:6,Lg +FN:6,Mg +FN:6,Ng +FN:6,Og +FN:6,Pg +FN:6,Qg +FN:6,Rg +FN:6,Sg +FN:6,Tg +FN:6,Ug +FN:6,Vg +FN:6,Wg +FN:6,Xg +FN:6,(anonymous_1141) +FN:6,(anonymous_1142) +FN:6,Yg +FN:6,(anonymous_1144) +FN:6,Zg +FN:6,$g +FN:6,_g +FN:6,ah +FN:6,bh +FN:6,ch +FN:6,dh +FN:6,eh +FN:6,fh +FN:6,gh +FN:6,hh +FN:6,ih +FN:6,jh +FN:6,kh +FN:6,lh +FN:6,mh +FN:6,nh +FN:6,oh +FN:6,ph +FN:6,qh +FN:6,rh +FN:6,sh +FN:6,th +FN:6,uh +FN:6,vh +FN:6,wh +FN:6,xh +FN:6,yh +FN:7,zh +FN:7,Ah +FN:7,Bh +FN:7,(anonymous_1176) +FN:7,Ch +FN:7,Dh +FN:7,(anonymous_1179) +FN:7,Eh +FN:7,Fh +FN:7,Gh +FN:7,d +FN:7,e +FN:7,f +FN:7,g +FN:7,h +FN:7,i +FN:7,j +FN:7,k +FN:7,l +FN:7,Hh +FN:7,Ih +FN:7,(anonymous_1194) +FN:7,Jh +FN:7,(anonymous_1196) +FN:7,Kh +FN:7,Lh +FN:7,Mh +FN:7,(anonymous_1200) +FN:7,Nh +FN:7,Oh +FN:7,Ph +FN:7,Qh +FN:7,Rh +FN:7,Sh +FN:7,Th +FN:7,Uh +FN:7,Vh +FN:7,Wh +FN:7,Xh +FN:7,Yh +FN:7,Zh +FN:7,$h +FN:7,_h +FN:7,ai +FN:7,bi +FN:7,ci +FN:7,di +FN:7,ei +FN:7,fi +FN:7,gi +FN:7,hi +FN:7,ii +FN:7,ji +FN:7,ki +FN:7,li +FN:7,mi +FN:7,ni +FN:7,oi +FN:7,pi +FN:7,qi +FN:7,ri +FN:7,si +FN:7,ti +FN:7,ui +FN:7,vi +FN:7,wi +FN:7,xi +FN:7,yi +FN:7,zi +FN:7,Ai +FN:7,Bi +FN:7,Ci +FN:7,Di +FN:7,Ei +FN:7,Fi +FN:7,Gi +FN:7,Hi +FN:7,Ii +FN:7,Ji +FN:7,Ki +FN:7,Li +FN:7,Mi +FN:7,Ni +FN:7,Oi +FN:7,Pi +FN:7,Qi +FN:7,Ri +FN:7,Si +FN:7,Ti +FN:7,(anonymous_1262) +FN:7,Ui +FN:7,(anonymous_1264) +FN:7,Vi +FN:7,Wi +FN:7,(anonymous_1267) +FN:7,(anonymous_1268) +FN:7,Xi +FN:7,Yi +FN:7,Zi +FN:7,$i +FN:7,(anonymous_1273) +FN:7,_i +FN:7,aj +FN:7,bj +FN:7,cj +FN:7,dj +FN:7,ej +FN:7,fj +FN:7,gj +FN:7,hj +FN:7,ij +FN:7,jj +FN:7,kj +FN:7,lj +FN:7,mj +FN:7,nj +FN:7,oj +FN:7,pj +FN:7,qj +FN:7,rj +FN:7,sj +FN:7,tj +FN:7,uj +FN:7,(anonymous_1296) +FN:7,(anonymous_1297) +FN:7,vj +FN:7,wj +FN:7,xj +FN:7,yj +FN:7,zj +FN:7,Aj +FN:7,Bj +FN:7,Cj +FN:7,Dj +FN:7,(anonymous_1307) +FN:7,(anonymous_1308) +FN:7,Ej +FN:7,Fj +FN:7,(anonymous_1311) +FN:7,Gj +FN:7,Hj +FN:7,Ij +FN:7,Jj +FN:7,Kj +FN:7,Lj +FN:7,(anonymous_1318) +FN:7,(anonymous_1319) +FN:7,Mj +FN:7,Nj +FN:7,Oj +FN:7,(anonymous_1323) +FN:7,Pj +FN:7,Qj +FN:7,(anonymous_1326) +FN:7,Rj +FN:7,Sj +FN:7,Tj +FN:7,Uj +FN:7,Vj +FN:7,Wj +FN:7,Xj +FN:7,Yj +FN:7,Zj +FN:7,$j +FN:7,_j +FN:7,ak +FN:7,bk +FN:7,ck +FN:7,dk +FN:7,ek +FN:7,(anonymous_1343) +FN:7,(anonymous_1344) +FN:7,(anonymous_1345) +FN:7,a +FN:7,(anonymous_1347) +FN:7,(anonymous_1348) +FN:7,(anonymous_1349) +FN:7,(anonymous_1350) +FN:7,(anonymous_1351) +FN:7,(anonymous_1352) +FN:7,(anonymous_1353) +FN:7,(anonymous_1354) +FN:7,(anonymous_1355) +FN:7,(anonymous_1356) +FN:7,(anonymous_1357) +FN:7,(anonymous_1358) +FN:7,(anonymous_1359) +FN:7,(anonymous_1360) +FN:7,(anonymous_1361) +FN:7,(anonymous_1362) +FN:7,(anonymous_1363) +FN:7,(anonymous_1364) +FN:7,(anonymous_1365) +FN:7,(anonymous_1366) +FN:7,(anonymous_1367) +FN:7,(anonymous_1368) +FN:7,(anonymous_1369) +FN:7,(anonymous_1370) +FN:7,(anonymous_1371) +FN:7,(anonymous_1372) +FN:7,(anonymous_1373) +FN:7,(anonymous_1374) +FN:7,(anonymous_1375) +FN:7,(anonymous_1376) +FN:7,(anonymous_1377) +FN:7,(anonymous_1378) +FN:7,(anonymous_1379) +FN:7,(anonymous_1380) +FN:7,(anonymous_1381) +FN:7,(anonymous_1382) +FN:7,(anonymous_1383) +FN:7,(anonymous_1384) +FN:7,(anonymous_1385) +FN:7,(anonymous_1386) +FN:7,(anonymous_1387) +FN:7,(anonymous_1388) +FN:7,(anonymous_1389) +FN:7,(anonymous_1390) +FN:7,(anonymous_1391) +FN:7,(anonymous_1392) +FN:7,(anonymous_1393) +FN:7,(anonymous_1394) +FN:7,(anonymous_1395) +FN:7,(anonymous_1396) +FN:7,(anonymous_1397) +FN:7,(anonymous_1398) +FN:7,(anonymous_1399) +FN:7,(anonymous_1400) +FN:7,(anonymous_1401) +FN:7,(anonymous_1402) +FN:7,(anonymous_1403) +FN:7,(anonymous_1404) +FN:7,(anonymous_1405) +FN:7,(anonymous_1406) +FN:7,(anonymous_1407) +FN:7,(anonymous_1408) +FN:7,(anonymous_1409) +FN:7,(anonymous_1410) +FN:7,(anonymous_1411) +FN:7,(anonymous_1412) +FN:7,(anonymous_1413) +FN:7,(anonymous_1414) +FN:7,(anonymous_1415) +FN:7,(anonymous_1416) +FN:7,(anonymous_1417) +FN:7,(anonymous_1418) +FN:7,(anonymous_1419) +FN:7,(anonymous_1420) +FN:7,(anonymous_1421) +FN:7,(anonymous_1422) +FN:7,(anonymous_1423) +FN:7,(anonymous_1424) +FN:7,(anonymous_1425) +FN:7,(anonymous_1426) +FN:7,(anonymous_1427) +FN:7,(anonymous_1428) +FN:7,(anonymous_1429) +FN:7,(anonymous_1430) +FN:7,(anonymous_1431) +FN:7,(anonymous_1432) +FN:7,(anonymous_1433) +FN:7,(anonymous_1434) +FN:7,(anonymous_1435) +FN:7,(anonymous_1436) +FN:7,(anonymous_1437) +FN:7,(anonymous_1438) +FN:7,(anonymous_1439) +FN:7,(anonymous_1440) +FN:7,(anonymous_1441) +FN:7,(anonymous_1442) +FN:7,(anonymous_1443) +FN:7,(anonymous_1444) +FN:7,(anonymous_1445) +FN:7,(anonymous_1446) +FN:7,(anonymous_1447) +FN:7,(anonymous_1448) +FN:7,(anonymous_1449) +FN:7,(anonymous_1450) +FN:7,(anonymous_1451) +FN:7,(anonymous_1452) +FN:7,(anonymous_1453) +FN:7,(anonymous_1454) +FN:7,(anonymous_1455) +FN:7,(anonymous_1456) +FN:7,(anonymous_1457) +FN:7,(anonymous_1458) +FN:7,(anonymous_1459) +FN:7,(anonymous_1460) +FN:7,d +FN:7,(anonymous_1462) +FN:7,(anonymous_1463) +FN:7,d +FN:7,(anonymous_1465) +FN:7,d +FN:7,(anonymous_1467) +FN:7,(anonymous_1468) +FN:7,(anonymous_1469) +FN:7,(anonymous_1470) +FN:7,(anonymous_1471) +FN:7,(anonymous_1472) +FNF:1473 +FNH:0 +FNDA:0,a +FNDA:0,e +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,d +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,e +FNDA:0,(anonymous_14) +FNDA:0,f +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,g +FNDA:0,h +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:0,(anonymous_32) +FNDA:0,(anonymous_33) +FNDA:0,(anonymous_34) +FNDA:0,(anonymous_35) +FNDA:0,(anonymous_36) +FNDA:0,(anonymous_37) +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_39) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_41) +FNDA:0,(anonymous_42) +FNDA:0,(anonymous_43) +FNDA:0,(anonymous_44) +FNDA:0,(anonymous_45) +FNDA:0,(anonymous_46) +FNDA:0,(anonymous_47) +FNDA:0,(anonymous_48) +FNDA:0,(anonymous_49) +FNDA:0,(anonymous_50) +FNDA:0,(anonymous_51) +FNDA:0,(anonymous_52) +FNDA:0,(anonymous_53) +FNDA:0,(anonymous_54) +FNDA:0,(anonymous_55) +FNDA:0,(anonymous_56) +FNDA:0,(anonymous_57) +FNDA:0,(anonymous_58) +FNDA:0,(anonymous_59) +FNDA:0,c +FNDA:0,(anonymous_61) +FNDA:0,(anonymous_62) +FNDA:0,(anonymous_63) +FNDA:0,(anonymous_64) +FNDA:0,(anonymous_65) +FNDA:0,(anonymous_66) +FNDA:0,(anonymous_67) +FNDA:0,(anonymous_68) +FNDA:0,d +FNDA:0,(anonymous_70) +FNDA:0,(anonymous_71) +FNDA:0,(anonymous_72) +FNDA:0,(anonymous_73) +FNDA:0,(anonymous_74) +FNDA:0,(anonymous_75) +FNDA:0,(anonymous_76) +FNDA:0,(anonymous_77) +FNDA:0,(anonymous_78) +FNDA:0,(anonymous_79) +FNDA:0,(anonymous_80) +FNDA:0,(anonymous_81) +FNDA:0,d +FNDA:0,(anonymous_83) +FNDA:0,(anonymous_84) +FNDA:0,(anonymous_85) +FNDA:0,(anonymous_86) +FNDA:0,d +FNDA:0,(anonymous_88) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,p +FNDA:0,q +FNDA:0,(anonymous_103) +FNDA:0,(anonymous_104) +FNDA:0,(anonymous_105) +FNDA:0,d +FNDA:0,(anonymous_107) +FNDA:0,(anonymous_108) +FNDA:0,(anonymous_109) +FNDA:0,(anonymous_110) +FNDA:0,(anonymous_111) +FNDA:0,(anonymous_112) +FNDA:0,(anonymous_113) +FNDA:0,(anonymous_114) +FNDA:0,(anonymous_115) +FNDA:0,(anonymous_116) +FNDA:0,d +FNDA:0,e +FNDA:0,c +FNDA:0,(anonymous_120) +FNDA:0,(anonymous_121) +FNDA:0,f +FNDA:0,g +FNDA:0,(anonymous_124) +FNDA:0,(anonymous_125) +FNDA:0,(anonymous_126) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,(anonymous_130) +FNDA:0,(anonymous_131) +FNDA:0,(anonymous_132) +FNDA:0,e +FNDA:0,a +FNDA:0,b +FNDA:0,d +FNDA:0,(anonymous_137) +FNDA:0,e +FNDA:0,(anonymous_139) +FNDA:0,g +FNDA:0,(anonymous_141) +FNDA:0,(anonymous_142) +FNDA:0,f +FNDA:0,(anonymous_144) +FNDA:0,(anonymous_145) +FNDA:0,(anonymous_146) +FNDA:0,(anonymous_147) +FNDA:0,(anonymous_148) +FNDA:0,(anonymous_149) +FNDA:0,(anonymous_150) +FNDA:0,(anonymous_151) +FNDA:0,(anonymous_152) +FNDA:0,(anonymous_153) +FNDA:0,(anonymous_154) +FNDA:0,d +FNDA:0,(anonymous_156) +FNDA:0,(anonymous_157) +FNDA:0,(anonymous_158) +FNDA:0,e +FNDA:0,f +FNDA:0,(anonymous_161) +FNDA:0,(anonymous_162) +FNDA:0,(anonymous_163) +FNDA:0,d +FNDA:0,(anonymous_165) +FNDA:0,(anonymous_166) +FNDA:0,(anonymous_167) +FNDA:0,d +FNDA:0,d +FNDA:0,(anonymous_170) +FNDA:0,(anonymous_171) +FNDA:0,(anonymous_172) +FNDA:0,(anonymous_173) +FNDA:0,(anonymous_174) +FNDA:0,(anonymous_175) +FNDA:0,(anonymous_176) +FNDA:0,(anonymous_177) +FNDA:0,d +FNDA:0,a +FNDA:0,(anonymous_180) +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,p +FNDA:0,q +FNDA:0,r +FNDA:0,s +FNDA:0,t +FNDA:0,u +FNDA:0,v +FNDA:0,w +FNDA:0,x +FNDA:0,y +FNDA:0,z +FNDA:0,A +FNDA:0,B +FNDA:0,C +FNDA:0,D +FNDA:0,E +FNDA:0,F +FNDA:0,G +FNDA:0,H +FNDA:0,I +FNDA:0,J +FNDA:0,K +FNDA:0,L +FNDA:0,M +FNDA:0,N +FNDA:0,O +FNDA:0,P +FNDA:0,Q +FNDA:0,R +FNDA:0,S +FNDA:0,T +FNDA:0,U +FNDA:0,V +FNDA:0,(anonymous_225) +FNDA:0,(anonymous_226) +FNDA:0,(anonymous_227) +FNDA:0,(anonymous_228) +FNDA:0,(anonymous_229) +FNDA:0,(anonymous_230) +FNDA:0,(anonymous_231) +FNDA:0,(anonymous_232) +FNDA:0,(anonymous_233) +FNDA:0,c +FNDA:0,(anonymous_235) +FNDA:0,(anonymous_236) +FNDA:0,(anonymous_237) +FNDA:0,(anonymous_238) +FNDA:0,(anonymous_239) +FNDA:0,(anonymous_240) +FNDA:0,(anonymous_241) +FNDA:0,(anonymous_242) +FNDA:0,(anonymous_243) +FNDA:0,(anonymous_244) +FNDA:0,(anonymous_245) +FNDA:0,(anonymous_246) +FNDA:0,(anonymous_247) +FNDA:0,(anonymous_248) +FNDA:0,(anonymous_249) +FNDA:0,(anonymous_250) +FNDA:0,(anonymous_251) +FNDA:0,(anonymous_252) +FNDA:0,(anonymous_253) +FNDA:0,(anonymous_254) +FNDA:0,(anonymous_255) +FNDA:0,(anonymous_256) +FNDA:0,(anonymous_257) +FNDA:0,(anonymous_258) +FNDA:0,(anonymous_259) +FNDA:0,(anonymous_260) +FNDA:0,(anonymous_261) +FNDA:0,(anonymous_262) +FNDA:0,(anonymous_263) +FNDA:0,(anonymous_264) +FNDA:0,(anonymous_265) +FNDA:0,(anonymous_266) +FNDA:0,(anonymous_267) +FNDA:0,(anonymous_268) +FNDA:0,(anonymous_269) +FNDA:0,(anonymous_270) +FNDA:0,(anonymous_271) +FNDA:0,(anonymous_272) +FNDA:0,(anonymous_273) +FNDA:0,(anonymous_274) +FNDA:0,(anonymous_275) +FNDA:0,(anonymous_276) +FNDA:0,(anonymous_277) +FNDA:0,(anonymous_278) +FNDA:0,(anonymous_279) +FNDA:0,(anonymous_280) +FNDA:0,(anonymous_281) +FNDA:0,b +FNDA:0,c +FNDA:0,c +FNDA:0,e +FNDA:0,b +FNDA:0,c +FNDA:0,(anonymous_288) +FNDA:0,(anonymous_289) +FNDA:0,(anonymous_290) +FNDA:0,(anonymous_291) +FNDA:0,(anonymous_292) +FNDA:0,(anonymous_293) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,(anonymous_299) +FNDA:0,(anonymous_300) +FNDA:0,(anonymous_301) +FNDA:0,(anonymous_302) +FNDA:0,c +FNDA:0,(anonymous_304) +FNDA:0,(anonymous_305) +FNDA:0,(anonymous_306) +FNDA:0,(anonymous_307) +FNDA:0,(anonymous_308) +FNDA:0,(anonymous_309) +FNDA:0,(anonymous_310) +FNDA:0,(anonymous_311) +FNDA:0,(anonymous_312) +FNDA:0,(anonymous_313) +FNDA:0,(anonymous_314) +FNDA:0,(anonymous_315) +FNDA:0,(anonymous_316) +FNDA:0,(anonymous_317) +FNDA:0,(anonymous_318) +FNDA:0,(anonymous_319) +FNDA:0,(anonymous_320) +FNDA:0,(anonymous_321) +FNDA:0,(anonymous_322) +FNDA:0,(anonymous_323) +FNDA:0,(anonymous_324) +FNDA:0,(anonymous_325) +FNDA:0,(anonymous_326) +FNDA:0,(anonymous_327) +FNDA:0,(anonymous_328) +FNDA:0,(anonymous_329) +FNDA:0,(anonymous_330) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,(anonymous_335) +FNDA:0,(anonymous_336) +FNDA:0,(anonymous_337) +FNDA:0,(anonymous_338) +FNDA:0,(anonymous_339) +FNDA:0,(anonymous_340) +FNDA:0,(anonymous_341) +FNDA:0,(anonymous_342) +FNDA:0,(anonymous_343) +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,(anonymous_349) +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,(anonymous_356) +FNDA:0,p +FNDA:0,(anonymous_358) +FNDA:0,(anonymous_359) +FNDA:0,(anonymous_360) +FNDA:0,d +FNDA:0,(anonymous_362) +FNDA:0,(anonymous_363) +FNDA:0,(anonymous_364) +FNDA:0,d +FNDA:0,(anonymous_366) +FNDA:0,(anonymous_367) +FNDA:0,(anonymous_368) +FNDA:0,(anonymous_369) +FNDA:0,(anonymous_370) +FNDA:0,(anonymous_371) +FNDA:0,(anonymous_372) +FNDA:0,(anonymous_373) +FNDA:0,(anonymous_374) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,(anonymous_378) +FNDA:0,(anonymous_379) +FNDA:0,d +FNDA:0,(anonymous_381) +FNDA:0,(anonymous_382) +FNDA:0,(anonymous_383) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,p +FNDA:0,(anonymous_397) +FNDA:0,q +FNDA:0,r +FNDA:0,s +FNDA:0,t +FNDA:0,u +FNDA:0,v +FNDA:0,w +FNDA:0,x +FNDA:0,y +FNDA:0,(anonymous_407) +FNDA:0,(anonymous_408) +FNDA:0,(anonymous_409) +FNDA:0,(anonymous_410) +FNDA:0,(anonymous_411) +FNDA:0,(anonymous_412) +FNDA:0,(anonymous_413) +FNDA:0,(anonymous_414) +FNDA:0,(anonymous_415) +FNDA:0,(anonymous_416) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,(anonymous_425) +FNDA:0,(anonymous_426) +FNDA:0,(anonymous_427) +FNDA:0,(anonymous_428) +FNDA:0,(anonymous_429) +FNDA:0,(anonymous_430) +FNDA:0,(anonymous_431) +FNDA:0,(anonymous_432) +FNDA:0,(anonymous_433) +FNDA:0,(anonymous_434) +FNDA:0,(anonymous_435) +FNDA:0,(anonymous_436) +FNDA:0,d +FNDA:0,(anonymous_438) +FNDA:0,e +FNDA:0,f +FNDA:0,(anonymous_441) +FNDA:0,(anonymous_442) +FNDA:0,g +FNDA:0,(anonymous_444) +FNDA:0,(anonymous_445) +FNDA:0,(anonymous_446) +FNDA:0,(anonymous_447) +FNDA:0,(anonymous_448) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,(anonymous_452) +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,p +FNDA:0,q +FNDA:0,r +FNDA:0,(anonymous_465) +FNDA:0,s +FNDA:0,t +FNDA:0,u +FNDA:0,v +FNDA:0,(anonymous_470) +FNDA:0,(anonymous_471) +FNDA:0,(anonymous_472) +FNDA:0,(anonymous_473) +FNDA:0,(anonymous_474) +FNDA:0,(anonymous_475) +FNDA:0,(anonymous_476) +FNDA:0,(anonymous_477) +FNDA:0,(anonymous_478) +FNDA:0,(anonymous_479) +FNDA:0,(anonymous_480) +FNDA:0,(anonymous_481) +FNDA:0,(anonymous_482) +FNDA:0,b +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,p +FNDA:0,q +FNDA:0,(anonymous_498) +FNDA:0,(anonymous_499) +FNDA:0,c +FNDA:0,(anonymous_501) +FNDA:0,(anonymous_502) +FNDA:0,(anonymous_503) +FNDA:0,c +FNDA:0,c +FNDA:0,d +FNDA:0,(anonymous_507) +FNDA:0,(anonymous_508) +FNDA:0,(anonymous_509) +FNDA:0,(anonymous_510) +FNDA:0,(anonymous_511) +FNDA:0,(anonymous_512) +FNDA:0,d +FNDA:0,(anonymous_514) +FNDA:0,c +FNDA:0,d +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,(anonymous_521) +FNDA:0,(anonymous_522) +FNDA:0,(anonymous_523) +FNDA:0,(anonymous_524) +FNDA:0,(anonymous_525) +FNDA:0,(anonymous_526) +FNDA:0,b +FNDA:0,d +FNDA:0,(anonymous_529) +FNDA:0,(anonymous_530) +FNDA:0,f +FNDA:0,g +FNDA:0,(anonymous_533) +FNDA:0,(anonymous_534) +FNDA:0,(anonymous_535) +FNDA:0,(anonymous_536) +FNDA:0,(anonymous_537) +FNDA:0,(anonymous_538) +FNDA:0,(anonymous_539) +FNDA:0,(anonymous_540) +FNDA:0,(anonymous_541) +FNDA:0,(anonymous_542) +FNDA:0,(anonymous_543) +FNDA:0,(anonymous_544) +FNDA:0,(anonymous_545) +FNDA:0,(anonymous_546) +FNDA:0,(anonymous_547) +FNDA:0,(anonymous_548) +FNDA:0,(anonymous_549) +FNDA:0,(anonymous_550) +FNDA:0,(anonymous_551) +FNDA:0,(anonymous_552) +FNDA:0,(anonymous_553) +FNDA:0,(anonymous_554) +FNDA:0,(anonymous_555) +FNDA:0,(anonymous_556) +FNDA:0,(anonymous_557) +FNDA:0,(anonymous_558) +FNDA:0,(anonymous_559) +FNDA:0,(anonymous_560) +FNDA:0,(anonymous_561) +FNDA:0,h +FNDA:0,(anonymous_563) +FNDA:0,(anonymous_564) +FNDA:0,(anonymous_565) +FNDA:0,(anonymous_566) +FNDA:0,(anonymous_567) +FNDA:0,(anonymous_568) +FNDA:0,(anonymous_569) +FNDA:0,(anonymous_570) +FNDA:0,(anonymous_571) +FNDA:0,(anonymous_572) +FNDA:0,(anonymous_573) +FNDA:0,(anonymous_574) +FNDA:0,(anonymous_575) +FNDA:0,(anonymous_576) +FNDA:0,(anonymous_577) +FNDA:0,(anonymous_578) +FNDA:0,(anonymous_579) +FNDA:0,(anonymous_580) +FNDA:0,(anonymous_581) +FNDA:0,(anonymous_582) +FNDA:0,(anonymous_583) +FNDA:0,(anonymous_584) +FNDA:0,(anonymous_585) +FNDA:0,(anonymous_586) +FNDA:0,(anonymous_587) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,(anonymous_592) +FNDA:0,(anonymous_593) +FNDA:0,(anonymous_594) +FNDA:0,(anonymous_595) +FNDA:0,(anonymous_596) +FNDA:0,(anonymous_597) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,(anonymous_607) +FNDA:0,(anonymous_608) +FNDA:0,(anonymous_609) +FNDA:0,(anonymous_610) +FNDA:0,(anonymous_611) +FNDA:0,(anonymous_612) +FNDA:0,(anonymous_613) +FNDA:0,(anonymous_614) +FNDA:0,(anonymous_615) +FNDA:0,(anonymous_616) +FNDA:0,(anonymous_617) +FNDA:0,(anonymous_618) +FNDA:0,(anonymous_619) +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,(anonymous_624) +FNDA:0,i +FNDA:0,(anonymous_626) +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,(anonymous_630) +FNDA:0,m +FNDA:0,(anonymous_632) +FNDA:0,(anonymous_633) +FNDA:0,n +FNDA:0,(anonymous_635) +FNDA:0,o +FNDA:0,p +FNDA:0,q +FNDA:0,r +FNDA:0,s +FNDA:0,t +FNDA:0,u +FNDA:0,v +FNDA:0,w +FNDA:0,x +FNDA:0,y +FNDA:0,z +FNDA:0,A +FNDA:0,B +FNDA:0,C +FNDA:0,D +FNDA:0,E +FNDA:0,F +FNDA:0,(anonymous_654) +FNDA:0,(anonymous_655) +FNDA:0,f +FNDA:0,(anonymous_657) +FNDA:0,(anonymous_658) +FNDA:0,(anonymous_659) +FNDA:0,(anonymous_660) +FNDA:0,(anonymous_661) +FNDA:0,(anonymous_662) +FNDA:0,(anonymous_663) +FNDA:0,d +FNDA:0,(anonymous_665) +FNDA:0,(anonymous_666) +FNDA:0,(anonymous_667) +FNDA:0,d +FNDA:0,(anonymous_669) +FNDA:0,d +FNDA:0,(anonymous_671) +FNDA:0,(anonymous_672) +FNDA:0,d +FNDA:0,(anonymous_674) +FNDA:0,(anonymous_675) +FNDA:0,d +FNDA:0,(anonymous_677) +FNDA:0,d +FNDA:0,(anonymous_679) +FNDA:0,d +FNDA:0,(anonymous_681) +FNDA:0,d +FNDA:0,(anonymous_683) +FNDA:0,d +FNDA:0,(anonymous_685) +FNDA:0,d +FNDA:0,(anonymous_687) +FNDA:0,d +FNDA:0,(anonymous_689) +FNDA:0,d +FNDA:0,(anonymous_691) +FNDA:0,d +FNDA:0,(anonymous_693) +FNDA:0,(anonymous_694) +FNDA:0,(anonymous_695) +FNDA:0,(anonymous_696) +FNDA:0,(anonymous_697) +FNDA:0,(anonymous_698) +FNDA:0,d +FNDA:0,(anonymous_700) +FNDA:0,d +FNDA:0,(anonymous_702) +FNDA:0,d +FNDA:0,(anonymous_704) +FNDA:0,d +FNDA:0,(anonymous_706) +FNDA:0,d +FNDA:0,(anonymous_708) +FNDA:0,d +FNDA:0,(anonymous_710) +FNDA:0,d +FNDA:0,(anonymous_712) +FNDA:0,d +FNDA:0,(anonymous_714) +FNDA:0,d +FNDA:0,(anonymous_716) +FNDA:0,d +FNDA:0,(anonymous_718) +FNDA:0,d +FNDA:0,(anonymous_720) +FNDA:0,d +FNDA:0,(anonymous_722) +FNDA:0,d +FNDA:0,(anonymous_724) +FNDA:0,(anonymous_725) +FNDA:0,d +FNDA:0,(anonymous_727) +FNDA:0,d +FNDA:0,(anonymous_729) +FNDA:0,d +FNDA:0,(anonymous_731) +FNDA:0,d +FNDA:0,(anonymous_733) +FNDA:0,d +FNDA:0,(anonymous_735) +FNDA:0,d +FNDA:0,(anonymous_737) +FNDA:0,d +FNDA:0,(anonymous_739) +FNDA:0,d +FNDA:0,(anonymous_741) +FNDA:0,d +FNDA:0,(anonymous_743) +FNDA:0,d +FNDA:0,(anonymous_745) +FNDA:0,d +FNDA:0,(anonymous_747) +FNDA:0,(anonymous_748) +FNDA:0,(anonymous_749) +FNDA:0,d +FNDA:0,(anonymous_751) +FNDA:0,(anonymous_752) +FNDA:0,(anonymous_753) +FNDA:0,(anonymous_754) +FNDA:0,(anonymous_755) +FNDA:0,d +FNDA:0,(anonymous_757) +FNDA:0,d +FNDA:0,(anonymous_759) +FNDA:0,d +FNDA:0,(anonymous_761) +FNDA:0,(anonymous_762) +FNDA:0,d +FNDA:0,(anonymous_764) +FNDA:0,d +FNDA:0,(anonymous_766) +FNDA:0,d +FNDA:0,(anonymous_768) +FNDA:0,d +FNDA:0,(anonymous_770) +FNDA:0,(anonymous_771) +FNDA:0,(anonymous_772) +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,m +FNDA:0,n +FNDA:0,o +FNDA:0,p +FNDA:0,q +FNDA:0,r +FNDA:0,s +FNDA:0,t +FNDA:0,u +FNDA:0,(anonymous_791) +FNDA:0,v +FNDA:0,w +FNDA:0,x +FNDA:0,y +FNDA:0,z +FNDA:0,A +FNDA:0,(anonymous_798) +FNDA:0,B +FNDA:0,(anonymous_800) +FNDA:0,C +FNDA:0,(anonymous_802) +FNDA:0,D +FNDA:0,E +FNDA:0,F +FNDA:0,G +FNDA:0,(anonymous_807) +FNDA:0,H +FNDA:0,(anonymous_809) +FNDA:0,I +FNDA:0,(anonymous_811) +FNDA:0,J +FNDA:0,K +FNDA:0,L +FNDA:0,M +FNDA:0,N +FNDA:0,O +FNDA:0,P +FNDA:0,Q +FNDA:0,R +FNDA:0,S +FNDA:0,(anonymous_822) +FNDA:0,T +FNDA:0,(anonymous_824) +FNDA:0,U +FNDA:0,V +FNDA:0,(anonymous_827) +FNDA:0,W +FNDA:0,(anonymous_829) +FNDA:0,X +FNDA:0,Y +FNDA:0,Z +FNDA:0,$ +FNDA:0,_ +FNDA:0,aa +FNDA:0,ba +FNDA:0,(anonymous_837) +FNDA:0,wd +FNDA:0,b +FNDA:0,c +FNDA:0,s +FNDA:0,B +FNDA:0,X +FNDA:0,_ +FNDA:0,aa +FNDA:0,Pb +FNDA:0,_b +FNDA:0,ac +FNDA:0,bc +FNDA:0,cc +FNDA:0,dc +FNDA:0,ec +FNDA:0,fc +FNDA:0,gc +FNDA:0,hc +FNDA:0,ic +FNDA:0,jc +FNDA:0,kc +FNDA:0,lc +FNDA:0,mc +FNDA:0,nc +FNDA:0,oc +FNDA:0,pc +FNDA:0,qc +FNDA:0,rc +FNDA:0,sc +FNDA:0,tc +FNDA:0,uc +FNDA:0,vc +FNDA:0,wc +FNDA:0,xc +FNDA:0,yc +FNDA:0,zc +FNDA:0,Ac +FNDA:0,Bc +FNDA:0,Cc +FNDA:0,Dc +FNDA:0,Ec +FNDA:0,Fc +FNDA:0,Gc +FNDA:0,(anonymous_881) +FNDA:0,Hc +FNDA:0,Ic +FNDA:0,Jc +FNDA:0,Kc +FNDA:0,Lc +FNDA:0,Mc +FNDA:0,(anonymous_888) +FNDA:0,Nc +FNDA:0,(anonymous_890) +FNDA:0,Qc +FNDA:0,Rc +FNDA:0,(anonymous_893) +FNDA:0,Sc +FNDA:0,Tc +FNDA:0,(anonymous_896) +FNDA:0,Yc +FNDA:0,Zc +FNDA:0,$c +FNDA:0,(anonymous_900) +FNDA:0,_c +FNDA:0,cd +FNDA:0,dd +FNDA:0,fd +FNDA:0,(anonymous_905) +FNDA:0,gd +FNDA:0,id +FNDA:0,jd +FNDA:0,qd +FNDA:0,ud +FNDA:0,xd +FNDA:0,yd +FNDA:0,zd +FNDA:0,Ad +FNDA:0,(anonymous_915) +FNDA:0,Bd +FNDA:0,Cd +FNDA:0,Dd +FNDA:0,Ed +FNDA:0,Fd +FNDA:0,Gd +FNDA:0,Hd +FNDA:0,Id +FNDA:0,Jd +FNDA:0,Kd +FNDA:0,Ld +FNDA:0,Md +FNDA:0,Nd +FNDA:0,Od +FNDA:0,Pd +FNDA:0,Qd +FNDA:0,Rd +FNDA:0,(anonymous_933) +FNDA:0,Sd +FNDA:0,(anonymous_935) +FNDA:0,Td +FNDA:0,(anonymous_937) +FNDA:0,Ud +FNDA:0,(anonymous_939) +FNDA:0,Vd +FNDA:0,Wd +FNDA:0,Xd +FNDA:0,(anonymous_943) +FNDA:0,(anonymous_944) +FNDA:0,(anonymous_945) +FNDA:0,Yd +FNDA:0,(anonymous_947) +FNDA:0,Zd +FNDA:0,$d +FNDA:0,(anonymous_950) +FNDA:0,_d +FNDA:0,ae +FNDA:0,be +FNDA:0,ce +FNDA:0,de +FNDA:0,ee +FNDA:0,fe +FNDA:0,ge +FNDA:0,he +FNDA:0,ie +FNDA:0,je +FNDA:0,ke +FNDA:0,(anonymous_963) +FNDA:0,le +FNDA:0,me +FNDA:0,ne +FNDA:0,oe +FNDA:0,pe +FNDA:0,qe +FNDA:0,re +FNDA:0,se +FNDA:0,te +FNDA:0,ue +FNDA:0,(anonymous_974) +FNDA:0,ve +FNDA:0,we +FNDA:0,xe +FNDA:0,ye +FNDA:0,ze +FNDA:0,Ae +FNDA:0,Be +FNDA:0,Ce +FNDA:0,De +FNDA:0,Ee +FNDA:0,Fe +FNDA:0,Ge +FNDA:0,He +FNDA:0,Ie +FNDA:0,Je +FNDA:0,Ke +FNDA:0,Le +FNDA:0,Me +FNDA:0,Ne +FNDA:0,Oe +FNDA:0,Pe +FNDA:0,Qe +FNDA:0,Re +FNDA:0,(anonymous_998) +FNDA:0,Se +FNDA:0,(anonymous_1000) +FNDA:0,Te +FNDA:0,(anonymous_1002) +FNDA:0,Ue +FNDA:0,(anonymous_1004) +FNDA:0,Ve +FNDA:0,d +FNDA:0,We +FNDA:0,(anonymous_1008) +FNDA:0,Xe +FNDA:0,(anonymous_1010) +FNDA:0,Ye +FNDA:0,(anonymous_1012) +FNDA:0,Ze +FNDA:0,d +FNDA:0,$e +FNDA:0,(anonymous_1016) +FNDA:0,(anonymous_1017) +FNDA:0,_e +FNDA:0,(anonymous_1019) +FNDA:0,(anonymous_1020) +FNDA:0,af +FNDA:0,k +FNDA:0,bf +FNDA:0,(anonymous_1024) +FNDA:0,cf +FNDA:0,(anonymous_1026) +FNDA:0,df +FNDA:0,(anonymous_1028) +FNDA:0,(anonymous_1029) +FNDA:0,(anonymous_1030) +FNDA:0,ef +FNDA:0,ff +FNDA:0,e +FNDA:0,gf +FNDA:0,(anonymous_1035) +FNDA:0,hf +FNDA:0,(anonymous_1037) +FNDA:0,jf +FNDA:0,kf +FNDA:0,(anonymous_1040) +FNDA:0,lf +FNDA:0,(anonymous_1042) +FNDA:0,mf +FNDA:0,nf +FNDA:0,of +FNDA:0,pf +FNDA:0,qf +FNDA:0,(anonymous_1048) +FNDA:0,rf +FNDA:0,sf +FNDA:0,tf +FNDA:0,uf +FNDA:0,vf +FNDA:0,wf +FNDA:0,xf +FNDA:0,yf +FNDA:0,zf +FNDA:0,Af +FNDA:0,Bf +FNDA:0,Cf +FNDA:0,Df +FNDA:0,Ef +FNDA:0,Ff +FNDA:0,Gf +FNDA:0,Hf +FNDA:0,If +FNDA:0,Jf +FNDA:0,Kf +FNDA:0,Lf +FNDA:0,Mf +FNDA:0,Nf +FNDA:0,Of +FNDA:0,Pf +FNDA:0,Qf +FNDA:0,Rf +FNDA:0,Sf +FNDA:0,Tf +FNDA:0,(anonymous_1078) +FNDA:0,Uf +FNDA:0,(anonymous_1080) +FNDA:0,Vf +FNDA:0,Wf +FNDA:0,Xf +FNDA:0,Yf +FNDA:0,(anonymous_1085) +FNDA:0,Zf +FNDA:0,$f +FNDA:0,_f +FNDA:0,ag +FNDA:0,(anonymous_1090) +FNDA:0,bg +FNDA:0,cg +FNDA:0,dg +FNDA:0,eg +FNDA:0,(anonymous_1095) +FNDA:0,fg +FNDA:0,gg +FNDA:0,hg +FNDA:0,ig +FNDA:0,jg +FNDA:0,kg +FNDA:0,lg +FNDA:0,mg +FNDA:0,ng +FNDA:0,og +FNDA:0,pg +FNDA:0,qg +FNDA:0,rg +FNDA:0,sg +FNDA:0,tg +FNDA:0,ug +FNDA:0,vg +FNDA:0,wg +FNDA:0,xg +FNDA:0,yg +FNDA:0,zg +FNDA:0,Ag +FNDA:0,Bg +FNDA:0,Cg +FNDA:0,Dg +FNDA:0,Eg +FNDA:0,Fg +FNDA:0,Gg +FNDA:0,Hg +FNDA:0,Ig +FNDA:0,Jg +FNDA:0,Kg +FNDA:0,Lg +FNDA:0,Mg +FNDA:0,Ng +FNDA:0,Og +FNDA:0,Pg +FNDA:0,Qg +FNDA:0,Rg +FNDA:0,Sg +FNDA:0,Tg +FNDA:0,Ug +FNDA:0,Vg +FNDA:0,Wg +FNDA:0,Xg +FNDA:0,(anonymous_1141) +FNDA:0,(anonymous_1142) +FNDA:0,Yg +FNDA:0,(anonymous_1144) +FNDA:0,Zg +FNDA:0,$g +FNDA:0,_g +FNDA:0,ah +FNDA:0,bh +FNDA:0,ch +FNDA:0,dh +FNDA:0,eh +FNDA:0,fh +FNDA:0,gh +FNDA:0,hh +FNDA:0,ih +FNDA:0,jh +FNDA:0,kh +FNDA:0,lh +FNDA:0,mh +FNDA:0,nh +FNDA:0,oh +FNDA:0,ph +FNDA:0,qh +FNDA:0,rh +FNDA:0,sh +FNDA:0,th +FNDA:0,uh +FNDA:0,vh +FNDA:0,wh +FNDA:0,xh +FNDA:0,yh +FNDA:0,zh +FNDA:0,Ah +FNDA:0,Bh +FNDA:0,(anonymous_1176) +FNDA:0,Ch +FNDA:0,Dh +FNDA:0,(anonymous_1179) +FNDA:0,Eh +FNDA:0,Fh +FNDA:0,Gh +FNDA:0,d +FNDA:0,e +FNDA:0,f +FNDA:0,g +FNDA:0,h +FNDA:0,i +FNDA:0,j +FNDA:0,k +FNDA:0,l +FNDA:0,Hh +FNDA:0,Ih +FNDA:0,(anonymous_1194) +FNDA:0,Jh +FNDA:0,(anonymous_1196) +FNDA:0,Kh +FNDA:0,Lh +FNDA:0,Mh +FNDA:0,(anonymous_1200) +FNDA:0,Nh +FNDA:0,Oh +FNDA:0,Ph +FNDA:0,Qh +FNDA:0,Rh +FNDA:0,Sh +FNDA:0,Th +FNDA:0,Uh +FNDA:0,Vh +FNDA:0,Wh +FNDA:0,Xh +FNDA:0,Yh +FNDA:0,Zh +FNDA:0,$h +FNDA:0,_h +FNDA:0,ai +FNDA:0,bi +FNDA:0,ci +FNDA:0,di +FNDA:0,ei +FNDA:0,fi +FNDA:0,gi +FNDA:0,hi +FNDA:0,ii +FNDA:0,ji +FNDA:0,ki +FNDA:0,li +FNDA:0,mi +FNDA:0,ni +FNDA:0,oi +FNDA:0,pi +FNDA:0,qi +FNDA:0,ri +FNDA:0,si +FNDA:0,ti +FNDA:0,ui +FNDA:0,vi +FNDA:0,wi +FNDA:0,xi +FNDA:0,yi +FNDA:0,zi +FNDA:0,Ai +FNDA:0,Bi +FNDA:0,Ci +FNDA:0,Di +FNDA:0,Ei +FNDA:0,Fi +FNDA:0,Gi +FNDA:0,Hi +FNDA:0,Ii +FNDA:0,Ji +FNDA:0,Ki +FNDA:0,Li +FNDA:0,Mi +FNDA:0,Ni +FNDA:0,Oi +FNDA:0,Pi +FNDA:0,Qi +FNDA:0,Ri +FNDA:0,Si +FNDA:0,Ti +FNDA:0,(anonymous_1262) +FNDA:0,Ui +FNDA:0,(anonymous_1264) +FNDA:0,Vi +FNDA:0,Wi +FNDA:0,(anonymous_1267) +FNDA:0,(anonymous_1268) +FNDA:0,Xi +FNDA:0,Yi +FNDA:0,Zi +FNDA:0,$i +FNDA:0,(anonymous_1273) +FNDA:0,_i +FNDA:0,aj +FNDA:0,bj +FNDA:0,cj +FNDA:0,dj +FNDA:0,ej +FNDA:0,fj +FNDA:0,gj +FNDA:0,hj +FNDA:0,ij +FNDA:0,jj +FNDA:0,kj +FNDA:0,lj +FNDA:0,mj +FNDA:0,nj +FNDA:0,oj +FNDA:0,pj +FNDA:0,qj +FNDA:0,rj +FNDA:0,sj +FNDA:0,tj +FNDA:0,uj +FNDA:0,(anonymous_1296) +FNDA:0,(anonymous_1297) +FNDA:0,vj +FNDA:0,wj +FNDA:0,xj +FNDA:0,yj +FNDA:0,zj +FNDA:0,Aj +FNDA:0,Bj +FNDA:0,Cj +FNDA:0,Dj +FNDA:0,(anonymous_1307) +FNDA:0,(anonymous_1308) +FNDA:0,Ej +FNDA:0,Fj +FNDA:0,(anonymous_1311) +FNDA:0,Gj +FNDA:0,Hj +FNDA:0,Ij +FNDA:0,Jj +FNDA:0,Kj +FNDA:0,Lj +FNDA:0,(anonymous_1318) +FNDA:0,(anonymous_1319) +FNDA:0,Mj +FNDA:0,Nj +FNDA:0,Oj +FNDA:0,(anonymous_1323) +FNDA:0,Pj +FNDA:0,Qj +FNDA:0,(anonymous_1326) +FNDA:0,Rj +FNDA:0,Sj +FNDA:0,Tj +FNDA:0,Uj +FNDA:0,Vj +FNDA:0,Wj +FNDA:0,Xj +FNDA:0,Yj +FNDA:0,Zj +FNDA:0,$j +FNDA:0,_j +FNDA:0,ak +FNDA:0,bk +FNDA:0,ck +FNDA:0,dk +FNDA:0,ek +FNDA:0,(anonymous_1343) +FNDA:0,(anonymous_1344) +FNDA:0,(anonymous_1345) +FNDA:0,a +FNDA:0,(anonymous_1347) +FNDA:0,(anonymous_1348) +FNDA:0,(anonymous_1349) +FNDA:0,(anonymous_1350) +FNDA:0,(anonymous_1351) +FNDA:0,(anonymous_1352) +FNDA:0,(anonymous_1353) +FNDA:0,(anonymous_1354) +FNDA:0,(anonymous_1355) +FNDA:0,(anonymous_1356) +FNDA:0,(anonymous_1357) +FNDA:0,(anonymous_1358) +FNDA:0,(anonymous_1359) +FNDA:0,(anonymous_1360) +FNDA:0,(anonymous_1361) +FNDA:0,(anonymous_1362) +FNDA:0,(anonymous_1363) +FNDA:0,(anonymous_1364) +FNDA:0,(anonymous_1365) +FNDA:0,(anonymous_1366) +FNDA:0,(anonymous_1367) +FNDA:0,(anonymous_1368) +FNDA:0,(anonymous_1369) +FNDA:0,(anonymous_1370) +FNDA:0,(anonymous_1371) +FNDA:0,(anonymous_1372) +FNDA:0,(anonymous_1373) +FNDA:0,(anonymous_1374) +FNDA:0,(anonymous_1375) +FNDA:0,(anonymous_1376) +FNDA:0,(anonymous_1377) +FNDA:0,(anonymous_1378) +FNDA:0,(anonymous_1379) +FNDA:0,(anonymous_1380) +FNDA:0,(anonymous_1381) +FNDA:0,(anonymous_1382) +FNDA:0,(anonymous_1383) +FNDA:0,(anonymous_1384) +FNDA:0,(anonymous_1385) +FNDA:0,(anonymous_1386) +FNDA:0,(anonymous_1387) +FNDA:0,(anonymous_1388) +FNDA:0,(anonymous_1389) +FNDA:0,(anonymous_1390) +FNDA:0,(anonymous_1391) +FNDA:0,(anonymous_1392) +FNDA:0,(anonymous_1393) +FNDA:0,(anonymous_1394) +FNDA:0,(anonymous_1395) +FNDA:0,(anonymous_1396) +FNDA:0,(anonymous_1397) +FNDA:0,(anonymous_1398) +FNDA:0,(anonymous_1399) +FNDA:0,(anonymous_1400) +FNDA:0,(anonymous_1401) +FNDA:0,(anonymous_1402) +FNDA:0,(anonymous_1403) +FNDA:0,(anonymous_1404) +FNDA:0,(anonymous_1405) +FNDA:0,(anonymous_1406) +FNDA:0,(anonymous_1407) +FNDA:0,(anonymous_1408) +FNDA:0,(anonymous_1409) +FNDA:0,(anonymous_1410) +FNDA:0,(anonymous_1411) +FNDA:0,(anonymous_1412) +FNDA:0,(anonymous_1413) +FNDA:0,(anonymous_1414) +FNDA:0,(anonymous_1415) +FNDA:0,(anonymous_1416) +FNDA:0,(anonymous_1417) +FNDA:0,(anonymous_1418) +FNDA:0,(anonymous_1419) +FNDA:0,(anonymous_1420) +FNDA:0,(anonymous_1421) +FNDA:0,(anonymous_1422) +FNDA:0,(anonymous_1423) +FNDA:0,(anonymous_1424) +FNDA:0,(anonymous_1425) +FNDA:0,(anonymous_1426) +FNDA:0,(anonymous_1427) +FNDA:0,(anonymous_1428) +FNDA:0,(anonymous_1429) +FNDA:0,(anonymous_1430) +FNDA:0,(anonymous_1431) +FNDA:0,(anonymous_1432) +FNDA:0,(anonymous_1433) +FNDA:0,(anonymous_1434) +FNDA:0,(anonymous_1435) +FNDA:0,(anonymous_1436) +FNDA:0,(anonymous_1437) +FNDA:0,(anonymous_1438) +FNDA:0,(anonymous_1439) +FNDA:0,(anonymous_1440) +FNDA:0,(anonymous_1441) +FNDA:0,(anonymous_1442) +FNDA:0,(anonymous_1443) +FNDA:0,(anonymous_1444) +FNDA:0,(anonymous_1445) +FNDA:0,(anonymous_1446) +FNDA:0,(anonymous_1447) +FNDA:0,(anonymous_1448) +FNDA:0,(anonymous_1449) +FNDA:0,(anonymous_1450) +FNDA:0,(anonymous_1451) +FNDA:0,(anonymous_1452) +FNDA:0,(anonymous_1453) +FNDA:0,(anonymous_1454) +FNDA:0,(anonymous_1455) +FNDA:0,(anonymous_1456) +FNDA:0,(anonymous_1457) +FNDA:0,(anonymous_1458) +FNDA:0,(anonymous_1459) +FNDA:0,(anonymous_1460) +FNDA:0,d +FNDA:0,(anonymous_1462) +FNDA:0,(anonymous_1463) +FNDA:0,d +FNDA:0,(anonymous_1465) +FNDA:0,d +FNDA:0,(anonymous_1467) +FNDA:0,(anonymous_1468) +FNDA:0,(anonymous_1469) +FNDA:0,(anonymous_1470) +FNDA:0,(anonymous_1471) +FNDA:0,(anonymous_1472) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +LF:6 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,1,0,0 +BRDA:2,1,1,0 +BRDA:2,2,0,0 +BRDA:2,2,1,0 +BRDA:2,3,0,0 +BRDA:2,3,1,0 +BRDA:2,4,0,0 +BRDA:2,4,1,0 +BRDA:2,5,0,0 +BRDA:2,5,1,0 +BRDA:2,6,0,0 +BRDA:2,6,1,0 +BRDA:2,7,0,0 +BRDA:2,7,1,0 +BRDA:2,8,0,0 +BRDA:2,8,1,0 +BRDA:2,9,0,0 +BRDA:2,9,1,0 +BRDA:2,10,0,0 +BRDA:2,10,1,0 +BRDA:2,11,0,0 +BRDA:2,11,1,0 +BRDA:2,12,0,0 +BRDA:2,12,1,0 +BRDA:2,13,0,0 +BRDA:2,13,1,0 +BRDA:2,14,0,0 +BRDA:2,14,1,0 +BRDA:2,15,0,0 +BRDA:2,15,1,0 +BRDA:2,16,0,0 +BRDA:2,16,1,0 +BRDA:2,16,2,0 +BRDA:2,16,3,0 +BRDA:2,16,4,0 +BRDA:2,17,0,0 +BRDA:2,17,1,0 +BRDA:2,18,0,0 +BRDA:2,18,1,0 +BRDA:2,19,0,0 +BRDA:2,19,1,0 +BRDA:2,20,0,0 +BRDA:2,20,1,0 +BRDA:2,21,0,0 +BRDA:2,21,1,0 +BRDA:2,22,0,0 +BRDA:2,22,1,0 +BRDA:2,23,0,0 +BRDA:2,23,1,0 +BRDA:2,24,0,0 +BRDA:2,24,1,0 +BRDA:2,25,0,0 +BRDA:2,25,1,0 +BRDA:2,26,0,0 +BRDA:2,26,1,0 +BRDA:2,27,0,0 +BRDA:2,27,1,0 +BRDA:2,28,0,0 +BRDA:2,28,1,0 +BRDA:2,29,0,0 +BRDA:2,29,1,0 +BRDA:2,30,0,0 +BRDA:2,30,1,0 +BRDA:2,31,0,0 +BRDA:2,31,1,0 +BRDA:2,32,0,0 +BRDA:2,32,1,0 +BRDA:2,32,2,0 +BRDA:2,33,0,0 +BRDA:2,33,1,0 +BRDA:2,34,0,0 +BRDA:2,34,1,0 +BRDA:2,35,0,0 +BRDA:2,35,1,0 +BRDA:2,36,0,0 +BRDA:2,36,1,0 +BRDA:2,37,0,0 +BRDA:2,37,1,0 +BRDA:2,38,0,0 +BRDA:2,38,1,0 +BRDA:2,38,2,0 +BRDA:2,39,0,0 +BRDA:2,39,1,0 +BRDA:2,40,0,0 +BRDA:2,40,1,0 +BRDA:2,41,0,0 +BRDA:2,41,1,0 +BRDA:2,41,2,0 +BRDA:2,42,0,0 +BRDA:2,42,1,0 +BRDA:2,43,0,0 +BRDA:2,43,1,0 +BRDA:2,44,0,0 +BRDA:2,44,1,0 +BRDA:2,45,0,0 +BRDA:2,45,1,0 +BRDA:2,46,0,0 +BRDA:2,46,1,0 +BRDA:2,47,0,0 +BRDA:2,47,1,0 +BRDA:2,48,0,0 +BRDA:2,48,1,0 +BRDA:2,49,0,0 +BRDA:2,49,1,0 +BRDA:2,50,0,0 +BRDA:2,50,1,0 +BRDA:2,51,0,0 +BRDA:2,51,1,0 +BRDA:2,52,0,0 +BRDA:2,52,1,0 +BRDA:2,53,0,0 +BRDA:2,53,1,0 +BRDA:2,54,0,0 +BRDA:2,54,1,0 +BRDA:2,55,0,0 +BRDA:2,55,1,0 +BRDA:2,56,0,0 +BRDA:2,56,1,0 +BRDA:2,57,0,0 +BRDA:2,57,1,0 +BRDA:2,58,0,0 +BRDA:2,58,1,0 +BRDA:2,59,0,0 +BRDA:2,59,1,0 +BRDA:2,59,2,0 +BRDA:2,60,0,0 +BRDA:2,60,1,0 +BRDA:2,61,0,0 +BRDA:2,61,1,0 +BRDA:2,61,2,0 +BRDA:2,62,0,0 +BRDA:2,62,1,0 +BRDA:2,63,0,0 +BRDA:2,63,1,0 +BRDA:2,64,0,0 +BRDA:2,64,1,0 +BRDA:2,65,0,0 +BRDA:2,65,1,0 +BRDA:2,65,2,0 +BRDA:2,66,0,0 +BRDA:2,66,1,0 +BRDA:2,67,0,0 +BRDA:2,67,1,0 +BRDA:2,67,2,0 +BRDA:2,67,3,0 +BRDA:2,68,0,0 +BRDA:2,68,1,0 +BRDA:2,69,0,0 +BRDA:2,69,1,0 +BRDA:2,70,0,0 +BRDA:2,70,1,0 +BRDA:2,71,0,0 +BRDA:2,71,1,0 +BRDA:2,72,0,0 +BRDA:2,72,1,0 +BRDA:2,73,0,0 +BRDA:2,73,1,0 +BRDA:2,74,0,0 +BRDA:2,74,1,0 +BRDA:2,75,0,0 +BRDA:2,75,1,0 +BRDA:2,76,0,0 +BRDA:2,76,1,0 +BRDA:2,77,0,0 +BRDA:2,77,1,0 +BRDA:2,78,0,0 +BRDA:2,78,1,0 +BRDA:2,78,2,0 +BRDA:2,79,0,0 +BRDA:2,79,1,0 +BRDA:2,80,0,0 +BRDA:2,80,1,0 +BRDA:2,81,0,0 +BRDA:2,81,1,0 +BRDA:2,82,0,0 +BRDA:2,82,1,0 +BRDA:2,83,0,0 +BRDA:2,83,1,0 +BRDA:2,84,0,0 +BRDA:2,84,1,0 +BRDA:2,85,0,0 +BRDA:2,85,1,0 +BRDA:2,86,0,0 +BRDA:2,86,1,0 +BRDA:2,87,0,0 +BRDA:2,87,1,0 +BRDA:2,87,2,0 +BRDA:2,88,0,0 +BRDA:2,88,1,0 +BRDA:2,88,2,0 +BRDA:2,89,0,0 +BRDA:2,89,1,0 +BRDA:2,90,0,0 +BRDA:2,90,1,0 +BRDA:2,90,2,0 +BRDA:2,91,0,0 +BRDA:2,91,1,0 +BRDA:2,92,0,0 +BRDA:2,92,1,0 +BRDA:2,92,2,0 +BRDA:2,93,0,0 +BRDA:2,93,1,0 +BRDA:2,94,0,0 +BRDA:2,94,1,0 +BRDA:2,94,2,0 +BRDA:2,95,0,0 +BRDA:2,95,1,0 +BRDA:2,96,0,0 +BRDA:2,96,1,0 +BRDA:2,96,2,0 +BRDA:2,97,0,0 +BRDA:2,97,1,0 +BRDA:2,98,0,0 +BRDA:2,98,1,0 +BRDA:2,99,0,0 +BRDA:2,99,1,0 +BRDA:2,100,0,0 +BRDA:2,100,1,0 +BRDA:2,101,0,0 +BRDA:2,101,1,0 +BRDA:2,102,0,0 +BRDA:2,102,1,0 +BRDA:2,102,2,0 +BRDA:2,103,0,0 +BRDA:2,103,1,0 +BRDA:2,103,2,0 +BRDA:2,104,0,0 +BRDA:2,104,1,0 +BRDA:2,104,2,0 +BRDA:2,105,0,0 +BRDA:2,105,1,0 +BRDA:2,106,0,0 +BRDA:2,106,1,0 +BRDA:2,107,0,0 +BRDA:2,107,1,0 +BRDA:2,108,0,0 +BRDA:2,108,1,0 +BRDA:2,109,0,0 +BRDA:2,109,1,0 +BRDA:2,110,0,0 +BRDA:2,110,1,0 +BRDA:2,111,0,0 +BRDA:2,111,1,0 +BRDA:2,112,0,0 +BRDA:2,112,1,0 +BRDA:2,113,0,0 +BRDA:2,113,1,0 +BRDA:2,114,0,0 +BRDA:2,114,1,0 +BRDA:2,115,0,0 +BRDA:2,115,1,0 +BRDA:2,116,0,0 +BRDA:2,116,1,0 +BRDA:2,117,0,0 +BRDA:2,117,1,0 +BRDA:2,118,0,0 +BRDA:2,118,1,0 +BRDA:2,119,0,0 +BRDA:2,119,1,0 +BRDA:2,119,2,0 +BRDA:2,120,0,0 +BRDA:2,120,1,0 +BRDA:2,121,0,0 +BRDA:2,121,1,0 +BRDA:2,122,0,0 +BRDA:2,122,1,0 +BRDA:2,123,0,0 +BRDA:2,123,1,0 +BRDA:2,124,0,0 +BRDA:2,124,1,0 +BRDA:2,125,0,0 +BRDA:2,125,1,0 +BRDA:2,126,0,0 +BRDA:2,126,1,0 +BRDA:2,127,0,0 +BRDA:2,127,1,0 +BRDA:2,128,0,0 +BRDA:2,128,1,0 +BRDA:2,129,0,0 +BRDA:2,129,1,0 +BRDA:2,130,0,0 +BRDA:2,130,1,0 +BRDA:2,131,0,0 +BRDA:2,131,1,0 +BRDA:2,132,0,0 +BRDA:2,132,1,0 +BRDA:2,133,0,0 +BRDA:2,133,1,0 +BRDA:2,134,0,0 +BRDA:2,134,1,0 +BRDA:2,135,0,0 +BRDA:2,135,1,0 +BRDA:2,136,0,0 +BRDA:2,136,1,0 +BRDA:2,137,0,0 +BRDA:2,137,1,0 +BRDA:2,138,0,0 +BRDA:2,138,1,0 +BRDA:2,139,0,0 +BRDA:2,139,1,0 +BRDA:2,140,0,0 +BRDA:2,140,1,0 +BRDA:2,141,0,0 +BRDA:2,141,1,0 +BRDA:2,142,0,0 +BRDA:2,142,1,0 +BRDA:2,143,0,0 +BRDA:2,143,1,0 +BRDA:2,144,0,0 +BRDA:2,144,1,0 +BRDA:2,145,0,0 +BRDA:2,145,1,0 +BRDA:2,146,0,0 +BRDA:2,146,1,0 +BRDA:2,146,2,0 +BRDA:2,147,0,0 +BRDA:2,147,1,0 +BRDA:2,148,0,0 +BRDA:2,148,1,0 +BRDA:2,149,0,0 +BRDA:2,149,1,0 +BRDA:2,150,0,0 +BRDA:2,150,1,0 +BRDA:2,151,0,0 +BRDA:2,151,1,0 +BRDA:2,152,0,0 +BRDA:2,152,1,0 +BRDA:2,153,0,0 +BRDA:2,153,1,0 +BRDA:2,154,0,0 +BRDA:2,154,1,0 +BRDA:2,155,0,0 +BRDA:2,155,1,0 +BRDA:2,156,0,0 +BRDA:2,156,1,0 +BRDA:2,157,0,0 +BRDA:2,157,1,0 +BRDA:2,158,0,0 +BRDA:2,158,1,0 +BRDA:2,159,0,0 +BRDA:2,159,1,0 +BRDA:2,160,0,0 +BRDA:2,160,1,0 +BRDA:2,161,0,0 +BRDA:2,161,1,0 +BRDA:2,162,0,0 +BRDA:2,162,1,0 +BRDA:2,163,0,0 +BRDA:2,163,1,0 +BRDA:2,164,0,0 +BRDA:2,164,1,0 +BRDA:2,165,0,0 +BRDA:2,165,1,0 +BRDA:2,166,0,0 +BRDA:2,166,1,0 +BRDA:2,167,0,0 +BRDA:2,167,1,0 +BRDA:2,168,0,0 +BRDA:2,168,1,0 +BRDA:2,169,0,0 +BRDA:2,169,1,0 +BRDA:2,170,0,0 +BRDA:2,170,1,0 +BRDA:2,171,0,0 +BRDA:2,171,1,0 +BRDA:2,172,0,0 +BRDA:2,172,1,0 +BRDA:2,172,2,0 +BRDA:2,172,3,0 +BRDA:2,173,0,0 +BRDA:2,173,1,0 +BRDA:2,174,0,0 +BRDA:2,174,1,0 +BRDA:2,174,2,0 +BRDA:2,174,3,0 +BRDA:2,175,0,0 +BRDA:2,175,1,0 +BRDA:2,176,0,0 +BRDA:2,176,1,0 +BRDA:2,177,0,0 +BRDA:2,177,1,0 +BRDA:2,178,0,0 +BRDA:2,178,1,0 +BRDA:2,179,0,0 +BRDA:2,179,1,0 +BRDA:2,180,0,0 +BRDA:2,180,1,0 +BRDA:2,181,0,0 +BRDA:2,181,1,0 +BRDA:2,182,0,0 +BRDA:2,182,1,0 +BRDA:2,183,0,0 +BRDA:2,183,1,0 +BRDA:2,184,0,0 +BRDA:2,184,1,0 +BRDA:2,185,0,0 +BRDA:2,185,1,0 +BRDA:2,186,0,0 +BRDA:2,186,1,0 +BRDA:2,187,0,0 +BRDA:2,187,1,0 +BRDA:2,187,2,0 +BRDA:2,188,0,0 +BRDA:2,188,1,0 +BRDA:2,189,0,0 +BRDA:2,189,1,0 +BRDA:2,190,0,0 +BRDA:2,190,1,0 +BRDA:2,191,0,0 +BRDA:2,191,1,0 +BRDA:2,192,0,0 +BRDA:2,192,1,0 +BRDA:2,193,0,0 +BRDA:2,193,1,0 +BRDA:2,194,0,0 +BRDA:2,194,1,0 +BRDA:2,195,0,0 +BRDA:2,195,1,0 +BRDA:2,195,2,0 +BRDA:2,195,3,0 +BRDA:2,196,0,0 +BRDA:2,196,1,0 +BRDA:2,197,0,0 +BRDA:2,197,1,0 +BRDA:2,198,0,0 +BRDA:2,198,1,0 +BRDA:2,199,0,0 +BRDA:2,199,1,0 +BRDA:2,200,0,0 +BRDA:2,200,1,0 +BRDA:2,201,0,0 +BRDA:2,201,1,0 +BRDA:2,202,0,0 +BRDA:2,202,1,0 +BRDA:2,203,0,0 +BRDA:2,203,1,0 +BRDA:2,203,2,0 +BRDA:2,204,0,0 +BRDA:2,204,1,0 +BRDA:2,205,0,0 +BRDA:2,205,1,0 +BRDA:2,206,0,0 +BRDA:2,206,1,0 +BRDA:2,207,0,0 +BRDA:2,207,1,0 +BRDA:2,208,0,0 +BRDA:2,208,1,0 +BRDA:2,209,0,0 +BRDA:2,209,1,0 +BRDA:2,209,2,0 +BRDA:2,209,3,0 +BRDA:2,209,4,0 +BRDA:2,210,0,0 +BRDA:2,210,1,0 +BRDA:2,211,0,0 +BRDA:2,211,1,0 +BRDA:2,212,0,0 +BRDA:2,212,1,0 +BRDA:2,213,0,0 +BRDA:2,213,1,0 +BRDA:2,214,0,0 +BRDA:2,214,1,0 +BRDA:2,214,2,0 +BRDA:2,215,0,0 +BRDA:2,215,1,0 +BRDA:2,216,0,0 +BRDA:2,216,1,0 +BRDA:2,216,2,0 +BRDA:2,217,0,0 +BRDA:2,217,1,0 +BRDA:2,218,0,0 +BRDA:2,218,1,0 +BRDA:2,219,0,0 +BRDA:2,219,1,0 +BRDA:2,220,0,0 +BRDA:2,220,1,0 +BRDA:2,221,0,0 +BRDA:2,221,1,0 +BRDA:2,222,0,0 +BRDA:2,222,1,0 +BRDA:2,222,2,0 +BRDA:2,223,0,0 +BRDA:2,223,1,0 +BRDA:2,224,0,0 +BRDA:2,224,1,0 +BRDA:2,225,0,0 +BRDA:2,225,1,0 +BRDA:2,226,0,0 +BRDA:2,226,1,0 +BRDA:2,227,0,0 +BRDA:2,227,1,0 +BRDA:2,228,0,0 +BRDA:2,228,1,0 +BRDA:2,229,0,0 +BRDA:2,229,1,0 +BRDA:2,230,0,0 +BRDA:2,230,1,0 +BRDA:2,231,0,0 +BRDA:2,231,1,0 +BRDA:2,232,0,0 +BRDA:2,232,1,0 +BRDA:2,233,0,0 +BRDA:2,233,1,0 +BRDA:2,234,0,0 +BRDA:2,234,1,0 +BRDA:2,235,0,0 +BRDA:2,235,1,0 +BRDA:2,236,0,0 +BRDA:2,236,1,0 +BRDA:2,237,0,0 +BRDA:2,237,1,0 +BRDA:2,238,0,0 +BRDA:2,238,1,0 +BRDA:2,239,0,0 +BRDA:2,239,1,0 +BRDA:2,240,0,0 +BRDA:2,240,1,0 +BRDA:2,241,0,0 +BRDA:2,241,1,0 +BRDA:2,242,0,0 +BRDA:2,242,1,0 +BRDA:2,243,0,0 +BRDA:2,243,1,0 +BRDA:2,244,0,0 +BRDA:2,244,1,0 +BRDA:2,245,0,0 +BRDA:2,245,1,0 +BRDA:2,246,0,0 +BRDA:2,246,1,0 +BRDA:2,247,0,0 +BRDA:2,247,1,0 +BRDA:2,248,0,0 +BRDA:2,248,1,0 +BRDA:2,249,0,0 +BRDA:2,249,1,0 +BRDA:2,249,2,0 +BRDA:2,249,3,0 +BRDA:2,250,0,0 +BRDA:2,250,1,0 +BRDA:2,251,0,0 +BRDA:2,251,1,0 +BRDA:2,252,0,0 +BRDA:2,252,1,0 +BRDA:2,253,0,0 +BRDA:2,253,1,0 +BRDA:2,254,0,0 +BRDA:2,254,1,0 +BRDA:2,255,0,0 +BRDA:2,255,1,0 +BRDA:2,256,0,0 +BRDA:2,256,1,0 +BRDA:2,257,0,0 +BRDA:2,257,1,0 +BRDA:2,258,0,0 +BRDA:2,258,1,0 +BRDA:2,259,0,0 +BRDA:2,259,1,0 +BRDA:2,259,2,0 +BRDA:2,260,0,0 +BRDA:2,260,1,0 +BRDA:2,261,0,0 +BRDA:2,261,1,0 +BRDA:2,262,0,0 +BRDA:2,262,1,0 +BRDA:2,263,0,0 +BRDA:2,263,1,0 +BRDA:2,264,0,0 +BRDA:2,264,1,0 +BRDA:2,265,0,0 +BRDA:2,265,1,0 +BRDA:2,266,0,0 +BRDA:2,266,1,0 +BRDA:2,267,0,0 +BRDA:2,267,1,0 +BRDA:2,268,0,0 +BRDA:2,268,1,0 +BRDA:2,268,2,0 +BRDA:2,269,0,0 +BRDA:2,269,1,0 +BRDA:2,270,0,0 +BRDA:2,270,1,0 +BRDA:2,271,0,0 +BRDA:2,271,1,0 +BRDA:2,272,0,0 +BRDA:2,272,1,0 +BRDA:2,273,0,0 +BRDA:2,273,1,0 +BRDA:2,274,0,0 +BRDA:2,274,1,0 +BRDA:2,275,0,0 +BRDA:2,275,1,0 +BRDA:2,276,0,0 +BRDA:2,276,1,0 +BRDA:2,276,2,0 +BRDA:2,276,3,0 +BRDA:2,276,4,0 +BRDA:2,276,5,0 +BRDA:2,276,6,0 +BRDA:2,276,7,0 +BRDA:2,276,8,0 +BRDA:2,276,9,0 +BRDA:2,276,10,0 +BRDA:2,276,11,0 +BRDA:2,276,12,0 +BRDA:2,277,0,0 +BRDA:2,277,1,0 +BRDA:2,278,0,0 +BRDA:2,278,1,0 +BRDA:2,279,0,0 +BRDA:2,279,1,0 +BRDA:2,280,0,0 +BRDA:2,280,1,0 +BRDA:2,281,0,0 +BRDA:2,281,1,0 +BRDA:2,282,0,0 +BRDA:2,282,1,0 +BRDA:2,283,0,0 +BRDA:2,283,1,0 +BRDA:2,284,0,0 +BRDA:2,284,1,0 +BRDA:2,284,2,0 +BRDA:2,284,3,0 +BRDA:2,284,4,0 +BRDA:2,284,5,0 +BRDA:2,284,6,0 +BRDA:2,284,7,0 +BRDA:2,284,8,0 +BRDA:2,284,9,0 +BRDA:2,284,10,0 +BRDA:2,285,0,0 +BRDA:2,285,1,0 +BRDA:2,286,0,0 +BRDA:2,286,1,0 +BRDA:2,287,0,0 +BRDA:2,287,1,0 +BRDA:2,288,0,0 +BRDA:2,288,1,0 +BRDA:2,289,0,0 +BRDA:2,289,1,0 +BRDA:2,290,0,0 +BRDA:2,290,1,0 +BRDA:2,291,0,0 +BRDA:2,291,1,0 +BRDA:2,292,0,0 +BRDA:2,292,1,0 +BRDA:2,293,0,0 +BRDA:2,293,1,0 +BRDA:2,294,0,0 +BRDA:2,294,1,0 +BRDA:2,295,0,0 +BRDA:2,295,1,0 +BRDA:2,296,0,0 +BRDA:2,296,1,0 +BRDA:2,297,0,0 +BRDA:2,297,1,0 +BRDA:2,298,0,0 +BRDA:2,298,1,0 +BRDA:2,298,2,0 +BRDA:2,298,3,0 +BRDA:2,299,0,0 +BRDA:2,299,1,0 +BRDA:2,300,0,0 +BRDA:2,300,1,0 +BRDA:2,301,0,0 +BRDA:2,301,1,0 +BRDA:2,302,0,0 +BRDA:2,302,1,0 +BRDA:2,302,2,0 +BRDA:2,303,0,0 +BRDA:2,303,1,0 +BRDA:2,303,2,0 +BRDA:2,303,3,0 +BRDA:2,304,0,0 +BRDA:2,304,1,0 +BRDA:2,304,2,0 +BRDA:2,304,3,0 +BRDA:2,305,0,0 +BRDA:2,305,1,0 +BRDA:2,305,2,0 +BRDA:2,306,0,0 +BRDA:2,306,1,0 +BRDA:2,307,0,0 +BRDA:2,307,1,0 +BRDA:2,308,0,0 +BRDA:2,308,1,0 +BRDA:2,309,0,0 +BRDA:2,309,1,0 +BRDA:2,309,2,0 +BRDA:2,310,0,0 +BRDA:2,310,1,0 +BRDA:2,310,2,0 +BRDA:2,310,3,0 +BRDA:2,311,0,0 +BRDA:2,311,1,0 +BRDA:2,312,0,0 +BRDA:2,312,1,0 +BRDA:2,313,0,0 +BRDA:2,313,1,0 +BRDA:2,314,0,0 +BRDA:2,314,1,0 +BRDA:2,315,0,0 +BRDA:2,315,1,0 +BRDA:2,316,0,0 +BRDA:2,316,1,0 +BRDA:2,317,0,0 +BRDA:2,317,1,0 +BRDA:2,318,0,0 +BRDA:2,318,1,0 +BRDA:2,319,0,0 +BRDA:2,319,1,0 +BRDA:2,320,0,0 +BRDA:2,320,1,0 +BRDA:2,321,0,0 +BRDA:2,321,1,0 +BRDA:2,322,0,0 +BRDA:2,322,1,0 +BRDA:2,323,0,0 +BRDA:2,323,1,0 +BRDA:2,324,0,0 +BRDA:2,324,1,0 +BRDA:2,325,0,0 +BRDA:2,325,1,0 +BRDA:2,326,0,0 +BRDA:2,326,1,0 +BRDA:2,327,0,0 +BRDA:2,327,1,0 +BRDA:2,328,0,0 +BRDA:2,328,1,0 +BRDA:2,329,0,0 +BRDA:2,329,1,0 +BRDA:2,330,0,0 +BRDA:2,330,1,0 +BRDA:2,331,0,0 +BRDA:2,331,1,0 +BRDA:2,332,0,0 +BRDA:2,332,1,0 +BRDA:2,333,0,0 +BRDA:2,333,1,0 +BRDA:2,334,0,0 +BRDA:2,334,1,0 +BRDA:2,335,0,0 +BRDA:2,335,1,0 +BRDA:2,336,0,0 +BRDA:2,336,1,0 +BRDA:2,337,0,0 +BRDA:2,337,1,0 +BRDA:2,338,0,0 +BRDA:2,338,1,0 +BRDA:2,339,0,0 +BRDA:2,339,1,0 +BRDA:2,340,0,0 +BRDA:2,340,1,0 +BRDA:2,341,0,0 +BRDA:2,341,1,0 +BRDA:2,342,0,0 +BRDA:2,342,1,0 +BRDA:2,342,2,0 +BRDA:2,343,0,0 +BRDA:2,343,1,0 +BRDA:2,344,0,0 +BRDA:2,344,1,0 +BRDA:2,345,0,0 +BRDA:2,345,1,0 +BRDA:2,346,0,0 +BRDA:2,346,1,0 +BRDA:2,347,0,0 +BRDA:2,347,1,0 +BRDA:2,348,0,0 +BRDA:2,348,1,0 +BRDA:2,349,0,0 +BRDA:2,349,1,0 +BRDA:2,350,0,0 +BRDA:2,350,1,0 +BRDA:2,351,0,0 +BRDA:2,351,1,0 +BRDA:2,352,0,0 +BRDA:2,352,1,0 +BRDA:2,353,0,0 +BRDA:2,353,1,0 +BRDA:2,354,0,0 +BRDA:2,354,1,0 +BRDA:2,355,0,0 +BRDA:2,355,1,0 +BRDA:2,356,0,0 +BRDA:2,356,1,0 +BRDA:3,357,0,0 +BRDA:3,357,1,0 +BRDA:3,358,0,0 +BRDA:3,358,1,0 +BRDA:3,359,0,0 +BRDA:3,359,1,0 +BRDA:3,360,0,0 +BRDA:3,360,1,0 +BRDA:3,361,0,0 +BRDA:3,361,1,0 +BRDA:3,362,0,0 +BRDA:3,362,1,0 +BRDA:3,363,0,0 +BRDA:3,363,1,0 +BRDA:3,364,0,0 +BRDA:3,364,1,0 +BRDA:3,364,2,0 +BRDA:3,364,3,0 +BRDA:3,364,4,0 +BRDA:3,364,5,0 +BRDA:3,364,6,0 +BRDA:3,364,7,0 +BRDA:3,364,8,0 +BRDA:3,364,9,0 +BRDA:3,364,10,0 +BRDA:3,364,11,0 +BRDA:3,365,0,0 +BRDA:3,365,1,0 +BRDA:3,366,0,0 +BRDA:3,366,1,0 +BRDA:3,367,0,0 +BRDA:3,367,1,0 +BRDA:3,368,0,0 +BRDA:3,368,1,0 +BRDA:3,369,0,0 +BRDA:3,369,1,0 +BRDA:3,370,0,0 +BRDA:3,370,1,0 +BRDA:3,371,0,0 +BRDA:3,371,1,0 +BRDA:3,372,0,0 +BRDA:3,372,1,0 +BRDA:3,373,0,0 +BRDA:3,373,1,0 +BRDA:3,374,0,0 +BRDA:3,374,1,0 +BRDA:3,375,0,0 +BRDA:3,375,1,0 +BRDA:3,376,0,0 +BRDA:3,376,1,0 +BRDA:3,377,0,0 +BRDA:3,377,1,0 +BRDA:3,378,0,0 +BRDA:3,378,1,0 +BRDA:3,379,0,0 +BRDA:3,379,1,0 +BRDA:3,380,0,0 +BRDA:3,380,1,0 +BRDA:3,381,0,0 +BRDA:3,381,1,0 +BRDA:3,382,0,0 +BRDA:3,382,1,0 +BRDA:3,383,0,0 +BRDA:3,383,1,0 +BRDA:3,384,0,0 +BRDA:3,384,1,0 +BRDA:3,385,0,0 +BRDA:3,385,1,0 +BRDA:3,386,0,0 +BRDA:3,386,1,0 +BRDA:3,387,0,0 +BRDA:3,387,1,0 +BRDA:3,388,0,0 +BRDA:3,388,1,0 +BRDA:3,389,0,0 +BRDA:3,389,1,0 +BRDA:3,390,0,0 +BRDA:3,390,1,0 +BRDA:3,391,0,0 +BRDA:3,391,1,0 +BRDA:3,392,0,0 +BRDA:3,392,1,0 +BRDA:3,393,0,0 +BRDA:3,393,1,0 +BRDA:3,394,0,0 +BRDA:3,394,1,0 +BRDA:3,395,0,0 +BRDA:3,395,1,0 +BRDA:3,396,0,0 +BRDA:3,396,1,0 +BRDA:3,397,0,0 +BRDA:3,397,1,0 +BRDA:3,398,0,0 +BRDA:3,398,1,0 +BRDA:3,398,2,0 +BRDA:3,399,0,0 +BRDA:3,399,1,0 +BRDA:3,399,2,0 +BRDA:3,399,3,0 +BRDA:3,400,0,0 +BRDA:3,400,1,0 +BRDA:3,401,0,0 +BRDA:3,401,1,0 +BRDA:3,401,2,0 +BRDA:3,401,3,0 +BRDA:3,401,4,0 +BRDA:3,401,5,0 +BRDA:3,401,6,0 +BRDA:3,401,7,0 +BRDA:3,401,8,0 +BRDA:3,401,9,0 +BRDA:3,401,10,0 +BRDA:3,402,0,0 +BRDA:3,402,1,0 +BRDA:3,403,0,0 +BRDA:3,403,1,0 +BRDA:3,404,0,0 +BRDA:3,404,1,0 +BRDA:3,405,0,0 +BRDA:3,405,1,0 +BRDA:3,406,0,0 +BRDA:3,406,1,0 +BRDA:3,407,0,0 +BRDA:3,407,1,0 +BRDA:3,408,0,0 +BRDA:3,408,1,0 +BRDA:3,409,0,0 +BRDA:3,409,1,0 +BRDA:3,410,0,0 +BRDA:3,410,1,0 +BRDA:3,411,0,0 +BRDA:3,411,1,0 +BRDA:3,412,0,0 +BRDA:3,412,1,0 +BRDA:3,413,0,0 +BRDA:3,413,1,0 +BRDA:3,414,0,0 +BRDA:3,414,1,0 +BRDA:3,415,0,0 +BRDA:3,415,1,0 +BRDA:3,416,0,0 +BRDA:3,416,1,0 +BRDA:3,417,0,0 +BRDA:3,417,1,0 +BRDA:3,418,0,0 +BRDA:3,418,1,0 +BRDA:3,419,0,0 +BRDA:3,419,1,0 +BRDA:3,420,0,0 +BRDA:3,420,1,0 +BRDA:3,421,0,0 +BRDA:3,421,1,0 +BRDA:3,422,0,0 +BRDA:3,422,1,0 +BRDA:3,423,0,0 +BRDA:3,423,1,0 +BRDA:3,424,0,0 +BRDA:3,424,1,0 +BRDA:3,425,0,0 +BRDA:3,425,1,0 +BRDA:3,426,0,0 +BRDA:3,426,1,0 +BRDA:3,427,0,0 +BRDA:3,427,1,0 +BRDA:3,428,0,0 +BRDA:3,428,1,0 +BRDA:3,429,0,0 +BRDA:3,429,1,0 +BRDA:3,430,0,0 +BRDA:3,430,1,0 +BRDA:3,431,0,0 +BRDA:3,431,1,0 +BRDA:3,432,0,0 +BRDA:3,432,1,0 +BRDA:3,433,0,0 +BRDA:3,433,1,0 +BRDA:3,434,0,0 +BRDA:3,434,1,0 +BRDA:3,435,0,0 +BRDA:3,435,1,0 +BRDA:3,436,0,0 +BRDA:3,436,1,0 +BRDA:3,437,0,0 +BRDA:3,437,1,0 +BRDA:3,438,0,0 +BRDA:3,438,1,0 +BRDA:3,439,0,0 +BRDA:3,439,1,0 +BRDA:3,440,0,0 +BRDA:3,440,1,0 +BRDA:3,441,0,0 +BRDA:3,441,1,0 +BRDA:3,442,0,0 +BRDA:3,442,1,0 +BRDA:3,443,0,0 +BRDA:3,443,1,0 +BRDA:3,444,0,0 +BRDA:3,444,1,0 +BRDA:3,445,0,0 +BRDA:3,445,1,0 +BRDA:3,446,0,0 +BRDA:3,446,1,0 +BRDA:3,447,0,0 +BRDA:3,447,1,0 +BRDA:3,448,0,0 +BRDA:3,448,1,0 +BRDA:3,449,0,0 +BRDA:3,449,1,0 +BRDA:3,450,0,0 +BRDA:3,450,1,0 +BRDA:3,451,0,0 +BRDA:3,451,1,0 +BRDA:3,452,0,0 +BRDA:3,452,1,0 +BRDA:3,453,0,0 +BRDA:3,453,1,0 +BRDA:3,454,0,0 +BRDA:3,454,1,0 +BRDA:3,455,0,0 +BRDA:3,455,1,0 +BRDA:3,456,0,0 +BRDA:3,456,1,0 +BRDA:3,457,0,0 +BRDA:3,457,1,0 +BRDA:3,458,0,0 +BRDA:3,458,1,0 +BRDA:3,459,0,0 +BRDA:3,459,1,0 +BRDA:3,460,0,0 +BRDA:3,460,1,0 +BRDA:3,461,0,0 +BRDA:3,461,1,0 +BRDA:3,462,0,0 +BRDA:3,462,1,0 +BRDA:3,463,0,0 +BRDA:3,463,1,0 +BRDA:3,464,0,0 +BRDA:3,464,1,0 +BRDA:3,465,0,0 +BRDA:3,465,1,0 +BRDA:3,466,0,0 +BRDA:3,466,1,0 +BRDA:3,467,0,0 +BRDA:3,467,1,0 +BRDA:3,468,0,0 +BRDA:3,468,1,0 +BRDA:3,469,0,0 +BRDA:3,469,1,0 +BRDA:3,470,0,0 +BRDA:3,470,1,0 +BRDA:3,471,0,0 +BRDA:3,471,1,0 +BRDA:3,472,0,0 +BRDA:3,472,1,0 +BRDA:3,473,0,0 +BRDA:3,473,1,0 +BRDA:3,474,0,0 +BRDA:3,474,1,0 +BRDA:3,475,0,0 +BRDA:3,475,1,0 +BRDA:3,476,0,0 +BRDA:3,476,1,0 +BRDA:3,476,2,0 +BRDA:3,477,0,0 +BRDA:3,477,1,0 +BRDA:3,478,0,0 +BRDA:3,478,1,0 +BRDA:3,479,0,0 +BRDA:3,479,1,0 +BRDA:3,479,2,0 +BRDA:3,480,0,0 +BRDA:3,480,1,0 +BRDA:3,481,0,0 +BRDA:3,481,1,0 +BRDA:3,482,0,0 +BRDA:3,482,1,0 +BRDA:3,483,0,0 +BRDA:3,483,1,0 +BRDA:3,484,0,0 +BRDA:3,484,1,0 +BRDA:3,485,0,0 +BRDA:3,485,1,0 +BRDA:3,486,0,0 +BRDA:3,486,1,0 +BRDA:3,487,0,0 +BRDA:3,487,1,0 +BRDA:3,488,0,0 +BRDA:3,488,1,0 +BRDA:3,489,0,0 +BRDA:3,489,1,0 +BRDA:3,489,2,0 +BRDA:3,490,0,0 +BRDA:3,490,1,0 +BRDA:3,491,0,0 +BRDA:3,491,1,0 +BRDA:3,492,0,0 +BRDA:3,492,1,0 +BRDA:3,493,0,0 +BRDA:3,493,1,0 +BRDA:3,494,0,0 +BRDA:3,494,1,0 +BRDA:3,495,0,0 +BRDA:3,495,1,0 +BRDA:3,496,0,0 +BRDA:3,496,1,0 +BRDA:3,497,0,0 +BRDA:3,497,1,0 +BRDA:3,498,0,0 +BRDA:3,498,1,0 +BRDA:3,499,0,0 +BRDA:3,499,1,0 +BRDA:3,500,0,0 +BRDA:3,500,1,0 +BRDA:3,501,0,0 +BRDA:3,501,1,0 +BRDA:3,502,0,0 +BRDA:3,502,1,0 +BRDA:3,503,0,0 +BRDA:3,503,1,0 +BRDA:3,504,0,0 +BRDA:3,504,1,0 +BRDA:3,505,0,0 +BRDA:3,505,1,0 +BRDA:3,506,0,0 +BRDA:3,506,1,0 +BRDA:3,507,0,0 +BRDA:3,507,1,0 +BRDA:3,508,0,0 +BRDA:3,508,1,0 +BRDA:3,509,0,0 +BRDA:3,509,1,0 +BRDA:3,510,0,0 +BRDA:3,510,1,0 +BRDA:3,511,0,0 +BRDA:3,511,1,0 +BRDA:3,512,0,0 +BRDA:3,512,1,0 +BRDA:3,513,0,0 +BRDA:3,513,1,0 +BRDA:3,514,0,0 +BRDA:3,514,1,0 +BRDA:3,515,0,0 +BRDA:3,515,1,0 +BRDA:3,516,0,0 +BRDA:3,516,1,0 +BRDA:3,517,0,0 +BRDA:3,517,1,0 +BRDA:3,518,0,0 +BRDA:3,518,1,0 +BRDA:3,519,0,0 +BRDA:3,519,1,0 +BRDA:3,520,0,0 +BRDA:3,520,1,0 +BRDA:3,521,0,0 +BRDA:3,521,1,0 +BRDA:3,522,0,0 +BRDA:3,522,1,0 +BRDA:3,523,0,0 +BRDA:3,523,1,0 +BRDA:3,524,0,0 +BRDA:3,524,1,0 +BRDA:3,525,0,0 +BRDA:3,525,1,0 +BRDA:3,526,0,0 +BRDA:3,526,1,0 +BRDA:3,527,0,0 +BRDA:3,527,1,0 +BRDA:3,528,0,0 +BRDA:3,528,1,0 +BRDA:3,529,0,0 +BRDA:3,529,1,0 +BRDA:3,530,0,0 +BRDA:3,530,1,0 +BRDA:3,531,0,0 +BRDA:3,531,1,0 +BRDA:3,532,0,0 +BRDA:3,532,1,0 +BRDA:3,533,0,0 +BRDA:3,533,1,0 +BRDA:3,534,0,0 +BRDA:3,534,1,0 +BRDA:3,535,0,0 +BRDA:3,535,1,0 +BRDA:3,536,0,0 +BRDA:3,536,1,0 +BRDA:3,536,2,0 +BRDA:3,537,0,0 +BRDA:3,537,1,0 +BRDA:3,538,0,0 +BRDA:3,538,1,0 +BRDA:3,539,0,0 +BRDA:3,539,1,0 +BRDA:3,540,0,0 +BRDA:3,540,1,0 +BRDA:3,541,0,0 +BRDA:3,541,1,0 +BRDA:3,542,0,0 +BRDA:3,542,1,0 +BRDA:3,543,0,0 +BRDA:3,543,1,0 +BRDA:3,544,0,0 +BRDA:3,544,1,0 +BRDA:3,545,0,0 +BRDA:3,545,1,0 +BRDA:3,546,0,0 +BRDA:3,546,1,0 +BRDA:3,547,0,0 +BRDA:3,547,1,0 +BRDA:3,548,0,0 +BRDA:3,548,1,0 +BRDA:3,549,0,0 +BRDA:3,549,1,0 +BRDA:3,550,0,0 +BRDA:3,550,1,0 +BRDA:3,550,2,0 +BRDA:3,551,0,0 +BRDA:3,551,1,0 +BRDA:3,552,0,0 +BRDA:3,552,1,0 +BRDA:3,553,0,0 +BRDA:3,553,1,0 +BRDA:3,553,2,0 +BRDA:3,553,3,0 +BRDA:3,554,0,0 +BRDA:3,554,1,0 +BRDA:3,555,0,0 +BRDA:3,555,1,0 +BRDA:3,556,0,0 +BRDA:3,556,1,0 +BRDA:3,557,0,0 +BRDA:3,557,1,0 +BRDA:3,557,2,0 +BRDA:3,557,3,0 +BRDA:3,558,0,0 +BRDA:3,558,1,0 +BRDA:3,559,0,0 +BRDA:3,559,1,0 +BRDA:3,560,0,0 +BRDA:3,560,1,0 +BRDA:3,561,0,0 +BRDA:3,561,1,0 +BRDA:3,562,0,0 +BRDA:3,562,1,0 +BRDA:3,563,0,0 +BRDA:3,563,1,0 +BRDA:3,564,0,0 +BRDA:3,564,1,0 +BRDA:3,565,0,0 +BRDA:3,565,1,0 +BRDA:3,566,0,0 +BRDA:3,566,1,0 +BRDA:3,567,0,0 +BRDA:3,567,1,0 +BRDA:3,568,0,0 +BRDA:3,568,1,0 +BRDA:3,568,2,0 +BRDA:3,568,3,0 +BRDA:3,569,0,0 +BRDA:3,569,1,0 +BRDA:3,570,0,0 +BRDA:3,570,1,0 +BRDA:3,571,0,0 +BRDA:3,571,1,0 +BRDA:3,572,0,0 +BRDA:3,572,1,0 +BRDA:3,573,0,0 +BRDA:3,573,1,0 +BRDA:3,574,0,0 +BRDA:3,574,1,0 +BRDA:3,575,0,0 +BRDA:3,575,1,0 +BRDA:3,576,0,0 +BRDA:3,576,1,0 +BRDA:3,576,2,0 +BRDA:3,577,0,0 +BRDA:3,577,1,0 +BRDA:3,578,0,0 +BRDA:3,578,1,0 +BRDA:3,579,0,0 +BRDA:3,579,1,0 +BRDA:3,580,0,0 +BRDA:3,580,1,0 +BRDA:3,580,2,0 +BRDA:3,581,0,0 +BRDA:3,581,1,0 +BRDA:3,582,0,0 +BRDA:3,582,1,0 +BRDA:3,583,0,0 +BRDA:3,583,1,0 +BRDA:3,584,0,0 +BRDA:3,584,1,0 +BRDA:3,585,0,0 +BRDA:3,585,1,0 +BRDA:3,586,0,0 +BRDA:3,586,1,0 +BRDA:3,587,0,0 +BRDA:3,587,1,0 +BRDA:3,588,0,0 +BRDA:3,588,1,0 +BRDA:3,589,0,0 +BRDA:3,589,1,0 +BRDA:3,590,0,0 +BRDA:3,590,1,0 +BRDA:3,591,0,0 +BRDA:3,591,1,0 +BRDA:3,592,0,0 +BRDA:3,592,1,0 +BRDA:3,593,0,0 +BRDA:3,593,1,0 +BRDA:3,594,0,0 +BRDA:3,594,1,0 +BRDA:3,595,0,0 +BRDA:3,595,1,0 +BRDA:3,596,0,0 +BRDA:3,596,1,0 +BRDA:3,597,0,0 +BRDA:3,597,1,0 +BRDA:3,598,0,0 +BRDA:3,598,1,0 +BRDA:3,599,0,0 +BRDA:3,599,1,0 +BRDA:3,599,2,0 +BRDA:3,599,3,0 +BRDA:3,600,0,0 +BRDA:3,600,1,0 +BRDA:3,601,0,0 +BRDA:3,601,1,0 +BRDA:3,602,0,0 +BRDA:3,602,1,0 +BRDA:3,603,0,0 +BRDA:3,603,1,0 +BRDA:3,604,0,0 +BRDA:3,604,1,0 +BRDA:3,605,0,0 +BRDA:3,605,1,0 +BRDA:3,606,0,0 +BRDA:3,606,1,0 +BRDA:3,607,0,0 +BRDA:3,607,1,0 +BRDA:3,608,0,0 +BRDA:3,608,1,0 +BRDA:3,608,2,0 +BRDA:3,609,0,0 +BRDA:3,609,1,0 +BRDA:3,610,0,0 +BRDA:3,610,1,0 +BRDA:3,611,0,0 +BRDA:3,611,1,0 +BRDA:3,611,2,0 +BRDA:3,612,0,0 +BRDA:3,612,1,0 +BRDA:3,613,0,0 +BRDA:3,613,1,0 +BRDA:3,614,0,0 +BRDA:3,614,1,0 +BRDA:3,615,0,0 +BRDA:3,615,1,0 +BRDA:3,616,0,0 +BRDA:3,616,1,0 +BRDA:3,617,0,0 +BRDA:3,617,1,0 +BRDA:3,618,0,0 +BRDA:3,618,1,0 +BRDA:3,619,0,0 +BRDA:3,619,1,0 +BRDA:3,620,0,0 +BRDA:3,620,1,0 +BRDA:3,621,0,0 +BRDA:3,621,1,0 +BRDA:3,622,0,0 +BRDA:3,622,1,0 +BRDA:3,622,2,0 +BRDA:3,623,0,0 +BRDA:3,623,1,0 +BRDA:3,624,0,0 +BRDA:3,624,1,0 +BRDA:3,625,0,0 +BRDA:3,625,1,0 +BRDA:3,626,0,0 +BRDA:3,626,1,0 +BRDA:3,627,0,0 +BRDA:3,627,1,0 +BRDA:3,628,0,0 +BRDA:3,628,1,0 +BRDA:3,629,0,0 +BRDA:3,629,1,0 +BRDA:3,629,2,0 +BRDA:3,630,0,0 +BRDA:3,630,1,0 +BRDA:3,631,0,0 +BRDA:3,631,1,0 +BRDA:3,632,0,0 +BRDA:3,632,1,0 +BRDA:3,632,2,0 +BRDA:3,633,0,0 +BRDA:3,633,1,0 +BRDA:3,634,0,0 +BRDA:3,634,1,0 +BRDA:3,635,0,0 +BRDA:3,635,1,0 +BRDA:3,636,0,0 +BRDA:3,636,1,0 +BRDA:3,637,0,0 +BRDA:3,637,1,0 +BRDA:3,637,2,0 +BRDA:3,637,3,0 +BRDA:3,638,0,0 +BRDA:3,638,1,0 +BRDA:3,638,2,0 +BRDA:3,638,3,0 +BRDA:3,639,0,0 +BRDA:3,639,1,0 +BRDA:3,640,0,0 +BRDA:3,640,1,0 +BRDA:3,640,2,0 +BRDA:3,640,3,0 +BRDA:3,641,0,0 +BRDA:3,641,1,0 +BRDA:3,642,0,0 +BRDA:3,642,1,0 +BRDA:3,642,2,0 +BRDA:3,643,0,0 +BRDA:3,643,1,0 +BRDA:3,644,0,0 +BRDA:3,644,1,0 +BRDA:3,645,0,0 +BRDA:3,645,1,0 +BRDA:3,646,0,0 +BRDA:3,646,1,0 +BRDA:3,647,0,0 +BRDA:3,647,1,0 +BRDA:3,648,0,0 +BRDA:3,648,1,0 +BRDA:3,649,0,0 +BRDA:3,649,1,0 +BRDA:3,650,0,0 +BRDA:3,650,1,0 +BRDA:3,651,0,0 +BRDA:3,651,1,0 +BRDA:3,652,0,0 +BRDA:3,652,1,0 +BRDA:3,653,0,0 +BRDA:3,653,1,0 +BRDA:3,654,0,0 +BRDA:3,654,1,0 +BRDA:3,654,2,0 +BRDA:3,655,0,0 +BRDA:3,655,1,0 +BRDA:3,655,2,0 +BRDA:3,656,0,0 +BRDA:3,656,1,0 +BRDA:3,657,0,0 +BRDA:3,657,1,0 +BRDA:3,658,0,0 +BRDA:3,658,1,0 +BRDA:3,659,0,0 +BRDA:3,659,1,0 +BRDA:3,660,0,0 +BRDA:3,660,1,0 +BRDA:3,661,0,0 +BRDA:3,661,1,0 +BRDA:3,661,2,0 +BRDA:3,661,3,0 +BRDA:3,662,0,0 +BRDA:3,662,1,0 +BRDA:3,663,0,0 +BRDA:3,663,1,0 +BRDA:3,664,0,0 +BRDA:3,664,1,0 +BRDA:3,665,0,0 +BRDA:3,665,1,0 +BRDA:3,666,0,0 +BRDA:3,666,1,0 +BRDA:3,667,0,0 +BRDA:3,667,1,0 +BRDA:3,668,0,0 +BRDA:3,668,1,0 +BRDA:3,669,0,0 +BRDA:3,669,1,0 +BRDA:3,670,0,0 +BRDA:3,670,1,0 +BRDA:3,671,0,0 +BRDA:3,671,1,0 +BRDA:3,672,0,0 +BRDA:3,672,1,0 +BRDA:3,673,0,0 +BRDA:3,673,1,0 +BRDA:3,674,0,0 +BRDA:3,674,1,0 +BRDA:3,674,2,0 +BRDA:3,675,0,0 +BRDA:3,675,1,0 +BRDA:3,675,2,0 +BRDA:3,676,0,0 +BRDA:3,676,1,0 +BRDA:3,676,2,0 +BRDA:3,677,0,0 +BRDA:3,677,1,0 +BRDA:3,677,2,0 +BRDA:3,678,0,0 +BRDA:3,678,1,0 +BRDA:3,679,0,0 +BRDA:3,679,1,0 +BRDA:3,680,0,0 +BRDA:3,680,1,0 +BRDA:3,681,0,0 +BRDA:3,681,1,0 +BRDA:3,682,0,0 +BRDA:3,682,1,0 +BRDA:3,683,0,0 +BRDA:3,683,1,0 +BRDA:3,684,0,0 +BRDA:3,684,1,0 +BRDA:3,685,0,0 +BRDA:3,685,1,0 +BRDA:3,686,0,0 +BRDA:3,686,1,0 +BRDA:3,687,0,0 +BRDA:3,687,1,0 +BRDA:3,688,0,0 +BRDA:3,688,1,0 +BRDA:3,689,0,0 +BRDA:3,689,1,0 +BRDA:3,690,0,0 +BRDA:3,690,1,0 +BRDA:3,691,0,0 +BRDA:3,691,1,0 +BRDA:3,692,0,0 +BRDA:3,692,1,0 +BRDA:3,693,0,0 +BRDA:3,693,1,0 +BRDA:3,693,2,0 +BRDA:3,694,0,0 +BRDA:3,694,1,0 +BRDA:3,695,0,0 +BRDA:3,695,1,0 +BRDA:3,696,0,0 +BRDA:3,696,1,0 +BRDA:3,697,0,0 +BRDA:3,697,1,0 +BRDA:3,697,2,0 +BRDA:3,698,0,0 +BRDA:3,698,1,0 +BRDA:3,699,0,0 +BRDA:3,699,1,0 +BRDA:3,700,0,0 +BRDA:3,700,1,0 +BRDA:3,701,0,0 +BRDA:3,701,1,0 +BRDA:3,702,0,0 +BRDA:3,702,1,0 +BRDA:3,702,2,0 +BRDA:3,702,3,0 +BRDA:3,703,0,0 +BRDA:3,703,1,0 +BRDA:3,704,0,0 +BRDA:3,704,1,0 +BRDA:3,705,0,0 +BRDA:3,705,1,0 +BRDA:3,705,2,0 +BRDA:3,706,0,0 +BRDA:3,706,1,0 +BRDA:3,707,0,0 +BRDA:3,707,1,0 +BRDA:3,708,0,0 +BRDA:3,708,1,0 +BRDA:3,709,0,0 +BRDA:3,709,1,0 +BRDA:3,710,0,0 +BRDA:3,710,1,0 +BRDA:3,710,2,0 +BRDA:3,710,3,0 +BRDA:3,711,0,0 +BRDA:3,711,1,0 +BRDA:3,712,0,0 +BRDA:3,712,1,0 +BRDA:3,713,0,0 +BRDA:3,713,1,0 +BRDA:3,714,0,0 +BRDA:3,714,1,0 +BRDA:3,715,0,0 +BRDA:3,715,1,0 +BRDA:3,716,0,0 +BRDA:3,716,1,0 +BRDA:3,717,0,0 +BRDA:3,717,1,0 +BRDA:3,718,0,0 +BRDA:3,718,1,0 +BRDA:3,719,0,0 +BRDA:3,719,1,0 +BRDA:3,720,0,0 +BRDA:3,720,1,0 +BRDA:3,721,0,0 +BRDA:3,721,1,0 +BRDA:3,722,0,0 +BRDA:3,722,1,0 +BRDA:3,723,0,0 +BRDA:3,723,1,0 +BRDA:3,724,0,0 +BRDA:3,724,1,0 +BRDA:3,724,2,0 +BRDA:3,724,3,0 +BRDA:3,724,4,0 +BRDA:3,724,5,0 +BRDA:3,725,0,0 +BRDA:3,725,1,0 +BRDA:3,726,0,0 +BRDA:3,726,1,0 +BRDA:3,727,0,0 +BRDA:3,727,1,0 +BRDA:3,727,2,0 +BRDA:3,728,0,0 +BRDA:3,728,1,0 +BRDA:3,729,0,0 +BRDA:3,729,1,0 +BRDA:3,730,0,0 +BRDA:3,730,1,0 +BRDA:3,731,0,0 +BRDA:3,731,1,0 +BRDA:3,732,0,0 +BRDA:3,732,1,0 +BRDA:3,732,2,0 +BRDA:3,732,3,0 +BRDA:3,732,4,0 +BRDA:3,733,0,0 +BRDA:3,733,1,0 +BRDA:3,734,0,0 +BRDA:3,734,1,0 +BRDA:3,734,2,0 +BRDA:3,735,0,0 +BRDA:3,735,1,0 +BRDA:3,736,0,0 +BRDA:3,736,1,0 +BRDA:3,737,0,0 +BRDA:3,737,1,0 +BRDA:3,737,2,0 +BRDA:3,738,0,0 +BRDA:3,738,1,0 +BRDA:3,739,0,0 +BRDA:3,739,1,0 +BRDA:3,740,0,0 +BRDA:3,740,1,0 +BRDA:3,741,0,0 +BRDA:3,741,1,0 +BRDA:3,742,0,0 +BRDA:3,742,1,0 +BRDA:3,743,0,0 +BRDA:3,743,1,0 +BRDA:3,744,0,0 +BRDA:3,744,1,0 +BRDA:3,745,0,0 +BRDA:3,745,1,0 +BRDA:3,746,0,0 +BRDA:3,746,1,0 +BRDA:3,747,0,0 +BRDA:3,747,1,0 +BRDA:3,748,0,0 +BRDA:3,748,1,0 +BRDA:3,749,0,0 +BRDA:3,749,1,0 +BRDA:3,750,0,0 +BRDA:3,750,1,0 +BRDA:3,751,0,0 +BRDA:3,751,1,0 +BRDA:3,752,0,0 +BRDA:3,752,1,0 +BRDA:3,753,0,0 +BRDA:3,753,1,0 +BRDA:3,754,0,0 +BRDA:3,754,1,0 +BRDA:3,755,0,0 +BRDA:3,755,1,0 +BRDA:3,755,2,0 +BRDA:3,756,0,0 +BRDA:3,756,1,0 +BRDA:3,757,0,0 +BRDA:3,757,1,0 +BRDA:3,758,0,0 +BRDA:3,758,1,0 +BRDA:3,759,0,0 +BRDA:3,759,1,0 +BRDA:3,760,0,0 +BRDA:3,760,1,0 +BRDA:3,760,2,0 +BRDA:3,761,0,0 +BRDA:3,761,1,0 +BRDA:3,762,0,0 +BRDA:3,762,1,0 +BRDA:3,763,0,0 +BRDA:3,763,1,0 +BRDA:3,764,0,0 +BRDA:3,764,1,0 +BRDA:3,765,0,0 +BRDA:3,765,1,0 +BRDA:3,765,2,0 +BRDA:3,766,0,0 +BRDA:3,766,1,0 +BRDA:3,766,2,0 +BRDA:3,766,3,0 +BRDA:3,767,0,0 +BRDA:3,767,1,0 +BRDA:3,768,0,0 +BRDA:3,768,1,0 +BRDA:3,769,0,0 +BRDA:3,769,1,0 +BRDA:3,770,0,0 +BRDA:3,770,1,0 +BRDA:3,771,0,0 +BRDA:3,771,1,0 +BRDA:3,772,0,0 +BRDA:3,772,1,0 +BRDA:3,772,2,0 +BRDA:3,773,0,0 +BRDA:3,773,1,0 +BRDA:3,773,2,0 +BRDA:3,774,0,0 +BRDA:3,774,1,0 +BRDA:3,775,0,0 +BRDA:3,775,1,0 +BRDA:3,776,0,0 +BRDA:3,776,1,0 +BRDA:3,776,2,0 +BRDA:3,777,0,0 +BRDA:3,777,1,0 +BRDA:3,778,0,0 +BRDA:3,778,1,0 +BRDA:3,779,0,0 +BRDA:3,779,1,0 +BRDA:3,779,2,0 +BRDA:3,780,0,0 +BRDA:3,780,1,0 +BRDA:3,780,2,0 +BRDA:3,780,3,0 +BRDA:3,781,0,0 +BRDA:3,781,1,0 +BRDA:3,782,0,0 +BRDA:3,782,1,0 +BRDA:3,783,0,0 +BRDA:3,783,1,0 +BRDA:3,783,2,0 +BRDA:3,783,3,0 +BRDA:3,784,0,0 +BRDA:3,784,1,0 +BRDA:3,785,0,0 +BRDA:3,785,1,0 +BRDA:3,785,2,0 +BRDA:3,785,3,0 +BRDA:3,785,4,0 +BRDA:3,786,0,0 +BRDA:3,786,1,0 +BRDA:3,787,0,0 +BRDA:3,787,1,0 +BRDA:3,787,2,0 +BRDA:4,788,0,0 +BRDA:4,788,1,0 +BRDA:4,788,2,0 +BRDA:4,788,3,0 +BRDA:4,789,0,0 +BRDA:4,789,1,0 +BRDA:4,790,0,0 +BRDA:4,790,1,0 +BRDA:4,791,0,0 +BRDA:4,791,1,0 +BRDA:4,792,0,0 +BRDA:4,792,1,0 +BRDA:4,793,0,0 +BRDA:4,793,1,0 +BRDA:4,794,0,0 +BRDA:4,794,1,0 +BRDA:4,795,0,0 +BRDA:4,795,1,0 +BRDA:4,796,0,0 +BRDA:4,796,1,0 +BRDA:4,797,0,0 +BRDA:4,797,1,0 +BRDA:4,798,0,0 +BRDA:4,798,1,0 +BRDA:4,799,0,0 +BRDA:4,799,1,0 +BRDA:4,800,0,0 +BRDA:4,800,1,0 +BRDA:4,801,0,0 +BRDA:4,801,1,0 +BRDA:4,802,0,0 +BRDA:4,802,1,0 +BRDA:4,803,0,0 +BRDA:4,803,1,0 +BRDA:4,804,0,0 +BRDA:4,804,1,0 +BRDA:4,805,0,0 +BRDA:4,805,1,0 +BRDA:4,805,2,0 +BRDA:4,806,0,0 +BRDA:4,806,1,0 +BRDA:4,807,0,0 +BRDA:4,807,1,0 +BRDA:4,808,0,0 +BRDA:4,808,1,0 +BRDA:4,809,0,0 +BRDA:4,809,1,0 +BRDA:4,810,0,0 +BRDA:4,810,1,0 +BRDA:4,811,0,0 +BRDA:4,811,1,0 +BRDA:4,812,0,0 +BRDA:4,812,1,0 +BRDA:4,813,0,0 +BRDA:4,813,1,0 +BRDA:4,814,0,0 +BRDA:4,814,1,0 +BRDA:4,814,2,0 +BRDA:4,815,0,0 +BRDA:4,815,1,0 +BRDA:4,816,0,0 +BRDA:4,816,1,0 +BRDA:4,817,0,0 +BRDA:4,817,1,0 +BRDA:4,817,2,0 +BRDA:4,817,3,0 +BRDA:4,817,4,0 +BRDA:4,817,5,0 +BRDA:4,818,0,0 +BRDA:4,818,1,0 +BRDA:4,819,0,0 +BRDA:4,819,1,0 +BRDA:4,819,2,0 +BRDA:4,820,0,0 +BRDA:4,820,1,0 +BRDA:4,821,0,0 +BRDA:4,821,1,0 +BRDA:4,822,0,0 +BRDA:4,822,1,0 +BRDA:4,822,2,0 +BRDA:4,823,0,0 +BRDA:4,823,1,0 +BRDA:4,824,0,0 +BRDA:4,824,1,0 +BRDA:4,824,2,0 +BRDA:4,825,0,0 +BRDA:4,825,1,0 +BRDA:4,826,0,0 +BRDA:4,826,1,0 +BRDA:4,827,0,0 +BRDA:4,827,1,0 +BRDA:4,828,0,0 +BRDA:4,828,1,0 +BRDA:4,829,0,0 +BRDA:4,829,1,0 +BRDA:4,830,0,0 +BRDA:4,830,1,0 +BRDA:4,831,0,0 +BRDA:4,831,1,0 +BRDA:4,832,0,0 +BRDA:4,832,1,0 +BRDA:4,833,0,0 +BRDA:4,833,1,0 +BRDA:4,834,0,0 +BRDA:4,834,1,0 +BRDA:4,834,2,0 +BRDA:4,834,3,0 +BRDA:4,835,0,0 +BRDA:4,835,1,0 +BRDA:4,836,0,0 +BRDA:4,836,1,0 +BRDA:4,836,2,0 +BRDA:4,837,0,0 +BRDA:4,837,1,0 +BRDA:4,838,0,0 +BRDA:4,838,1,0 +BRDA:4,839,0,0 +BRDA:4,839,1,0 +BRDA:4,840,0,0 +BRDA:4,840,1,0 +BRDA:4,841,0,0 +BRDA:4,841,1,0 +BRDA:4,842,0,0 +BRDA:4,842,1,0 +BRDA:4,843,0,0 +BRDA:4,843,1,0 +BRDA:4,844,0,0 +BRDA:4,844,1,0 +BRDA:4,845,0,0 +BRDA:4,845,1,0 +BRDA:4,846,0,0 +BRDA:4,846,1,0 +BRDA:4,847,0,0 +BRDA:4,847,1,0 +BRDA:4,848,0,0 +BRDA:4,848,1,0 +BRDA:4,849,0,0 +BRDA:4,849,1,0 +BRDA:4,850,0,0 +BRDA:4,850,1,0 +BRDA:4,851,0,0 +BRDA:4,851,1,0 +BRDA:4,852,0,0 +BRDA:4,852,1,0 +BRDA:4,852,2,0 +BRDA:4,852,3,0 +BRDA:4,852,4,0 +BRDA:4,853,0,0 +BRDA:4,853,1,0 +BRDA:4,853,2,0 +BRDA:4,853,3,0 +BRDA:4,854,0,0 +BRDA:4,854,1,0 +BRDA:4,855,0,0 +BRDA:4,855,1,0 +BRDA:4,856,0,0 +BRDA:4,856,1,0 +BRDA:4,857,0,0 +BRDA:4,857,1,0 +BRDA:4,858,0,0 +BRDA:4,858,1,0 +BRDA:4,859,0,0 +BRDA:4,859,1,0 +BRDA:4,860,0,0 +BRDA:4,860,1,0 +BRDA:4,861,0,0 +BRDA:4,861,1,0 +BRDA:4,862,0,0 +BRDA:4,862,1,0 +BRDA:4,863,0,0 +BRDA:4,863,1,0 +BRDA:4,863,2,0 +BRDA:4,863,3,0 +BRDA:4,863,4,0 +BRDA:4,864,0,0 +BRDA:4,864,1,0 +BRDA:4,865,0,0 +BRDA:4,865,1,0 +BRDA:4,866,0,0 +BRDA:4,866,1,0 +BRDA:4,866,2,0 +BRDA:4,867,0,0 +BRDA:4,867,1,0 +BRDA:4,868,0,0 +BRDA:4,868,1,0 +BRDA:4,868,2,0 +BRDA:4,869,0,0 +BRDA:4,869,1,0 +BRDA:4,870,0,0 +BRDA:4,870,1,0 +BRDA:4,871,0,0 +BRDA:4,871,1,0 +BRDA:4,872,0,0 +BRDA:4,872,1,0 +BRDA:4,872,2,0 +BRDA:4,872,3,0 +BRDA:4,872,4,0 +BRDA:4,873,0,0 +BRDA:4,873,1,0 +BRDA:4,874,0,0 +BRDA:4,874,1,0 +BRDA:4,875,0,0 +BRDA:4,875,1,0 +BRDA:4,876,0,0 +BRDA:4,876,1,0 +BRDA:4,877,0,0 +BRDA:4,877,1,0 +BRDA:4,878,0,0 +BRDA:4,878,1,0 +BRDA:4,879,0,0 +BRDA:4,879,1,0 +BRDA:4,880,0,0 +BRDA:4,880,1,0 +BRDA:4,881,0,0 +BRDA:4,881,1,0 +BRDA:4,882,0,0 +BRDA:4,882,1,0 +BRDA:4,883,0,0 +BRDA:4,883,1,0 +BRDA:4,884,0,0 +BRDA:4,884,1,0 +BRDA:4,885,0,0 +BRDA:4,885,1,0 +BRDA:4,886,0,0 +BRDA:4,886,1,0 +BRDA:4,886,2,0 +BRDA:4,886,3,0 +BRDA:4,886,4,0 +BRDA:4,886,5,0 +BRDA:4,887,0,0 +BRDA:4,887,1,0 +BRDA:4,888,0,0 +BRDA:4,888,1,0 +BRDA:4,889,0,0 +BRDA:4,889,1,0 +BRDA:4,890,0,0 +BRDA:4,890,1,0 +BRDA:4,891,0,0 +BRDA:4,891,1,0 +BRDA:4,891,2,0 +BRDA:4,892,0,0 +BRDA:4,892,1,0 +BRDA:4,893,0,0 +BRDA:4,893,1,0 +BRDA:4,893,2,0 +BRDA:4,894,0,0 +BRDA:4,894,1,0 +BRDA:4,895,0,0 +BRDA:4,895,1,0 +BRDA:4,896,0,0 +BRDA:4,896,1,0 +BRDA:4,897,0,0 +BRDA:4,897,1,0 +BRDA:4,897,2,0 +BRDA:4,897,3,0 +BRDA:4,897,4,0 +BRDA:4,897,5,0 +BRDA:4,898,0,0 +BRDA:4,898,1,0 +BRDA:4,899,0,0 +BRDA:4,899,1,0 +BRDA:4,899,2,0 +BRDA:4,899,3,0 +BRDA:4,900,0,0 +BRDA:4,900,1,0 +BRDA:4,901,0,0 +BRDA:4,901,1,0 +BRDA:4,902,0,0 +BRDA:4,902,1,0 +BRDA:4,903,0,0 +BRDA:4,903,1,0 +BRDA:4,904,0,0 +BRDA:4,904,1,0 +BRDA:4,905,0,0 +BRDA:4,905,1,0 +BRDA:4,906,0,0 +BRDA:4,906,1,0 +BRDA:4,907,0,0 +BRDA:4,907,1,0 +BRDA:4,908,0,0 +BRDA:4,908,1,0 +BRDA:4,909,0,0 +BRDA:4,909,1,0 +BRDA:4,910,0,0 +BRDA:4,910,1,0 +BRDA:4,910,2,0 +BRDA:4,910,3,0 +BRDA:4,911,0,0 +BRDA:4,911,1,0 +BRDA:4,911,2,0 +BRDA:4,912,0,0 +BRDA:4,912,1,0 +BRDA:4,913,0,0 +BRDA:4,913,1,0 +BRDA:4,914,0,0 +BRDA:4,914,1,0 +BRDA:4,915,0,0 +BRDA:4,915,1,0 +BRDA:4,916,0,0 +BRDA:4,916,1,0 +BRDA:4,916,2,0 +BRDA:4,916,3,0 +BRDA:4,917,0,0 +BRDA:4,917,1,0 +BRDA:4,918,0,0 +BRDA:4,918,1,0 +BRDA:4,919,0,0 +BRDA:4,919,1,0 +BRDA:4,920,0,0 +BRDA:4,920,1,0 +BRDA:4,921,0,0 +BRDA:4,921,1,0 +BRDA:4,921,2,0 +BRDA:4,922,0,0 +BRDA:4,922,1,0 +BRDA:4,923,0,0 +BRDA:4,923,1,0 +BRDA:4,924,0,0 +BRDA:4,924,1,0 +BRDA:4,925,0,0 +BRDA:4,925,1,0 +BRDA:4,926,0,0 +BRDA:4,926,1,0 +BRDA:4,927,0,0 +BRDA:4,927,1,0 +BRDA:4,928,0,0 +BRDA:4,928,1,0 +BRDA:4,929,0,0 +BRDA:4,929,1,0 +BRDA:4,930,0,0 +BRDA:4,930,1,0 +BRDA:4,931,0,0 +BRDA:4,931,1,0 +BRDA:4,931,2,0 +BRDA:4,932,0,0 +BRDA:4,932,1,0 +BRDA:4,932,2,0 +BRDA:4,933,0,0 +BRDA:4,933,1,0 +BRDA:4,934,0,0 +BRDA:4,934,1,0 +BRDA:4,935,0,0 +BRDA:4,935,1,0 +BRDA:4,936,0,0 +BRDA:4,936,1,0 +BRDA:4,937,0,0 +BRDA:4,937,1,0 +BRDA:4,938,0,0 +BRDA:4,938,1,0 +BRDA:4,939,0,0 +BRDA:4,939,1,0 +BRDA:4,940,0,0 +BRDA:4,940,1,0 +BRDA:4,941,0,0 +BRDA:4,941,1,0 +BRDA:4,942,0,0 +BRDA:4,942,1,0 +BRDA:4,943,0,0 +BRDA:4,943,1,0 +BRDA:4,944,0,0 +BRDA:4,944,1,0 +BRDA:4,945,0,0 +BRDA:4,945,1,0 +BRDA:4,946,0,0 +BRDA:4,946,1,0 +BRDA:4,947,0,0 +BRDA:4,947,1,0 +BRDA:4,947,2,0 +BRDA:4,948,0,0 +BRDA:4,948,1,0 +BRDA:4,949,0,0 +BRDA:4,949,1,0 +BRDA:4,950,0,0 +BRDA:4,950,1,0 +BRDA:4,951,0,0 +BRDA:4,951,1,0 +BRDA:4,951,2,0 +BRDA:4,952,0,0 +BRDA:4,952,1,0 +BRDA:4,953,0,0 +BRDA:4,953,1,0 +BRDA:4,954,0,0 +BRDA:4,954,1,0 +BRDA:4,955,0,0 +BRDA:4,955,1,0 +BRDA:4,956,0,0 +BRDA:4,956,1,0 +BRDA:4,957,0,0 +BRDA:4,957,1,0 +BRDA:4,958,0,0 +BRDA:4,958,1,0 +BRDA:4,958,2,0 +BRDA:4,959,0,0 +BRDA:4,959,1,0 +BRDA:4,960,0,0 +BRDA:4,960,1,0 +BRDA:4,961,0,0 +BRDA:4,961,1,0 +BRDA:4,962,0,0 +BRDA:4,962,1,0 +BRDA:4,962,2,0 +BRDA:4,963,0,0 +BRDA:4,963,1,0 +BRDA:4,964,0,0 +BRDA:4,964,1,0 +BRDA:4,965,0,0 +BRDA:4,965,1,0 +BRDA:4,966,0,0 +BRDA:4,966,1,0 +BRDA:4,967,0,0 +BRDA:4,967,1,0 +BRDA:4,968,0,0 +BRDA:4,968,1,0 +BRDA:4,969,0,0 +BRDA:4,969,1,0 +BRDA:4,970,0,0 +BRDA:4,970,1,0 +BRDA:4,971,0,0 +BRDA:4,971,1,0 +BRDA:4,972,0,0 +BRDA:4,972,1,0 +BRDA:4,973,0,0 +BRDA:4,973,1,0 +BRDA:4,974,0,0 +BRDA:4,974,1,0 +BRDA:4,975,0,0 +BRDA:4,975,1,0 +BRDA:4,976,0,0 +BRDA:4,976,1,0 +BRDA:4,977,0,0 +BRDA:4,977,1,0 +BRDA:4,978,0,0 +BRDA:4,978,1,0 +BRDA:4,979,0,0 +BRDA:4,979,1,0 +BRDA:4,980,0,0 +BRDA:4,980,1,0 +BRDA:4,980,2,0 +BRDA:4,980,3,0 +BRDA:4,980,4,0 +BRDA:4,981,0,0 +BRDA:4,981,1,0 +BRDA:4,982,0,0 +BRDA:4,982,1,0 +BRDA:4,983,0,0 +BRDA:4,983,1,0 +BRDA:4,984,0,0 +BRDA:4,984,1,0 +BRDA:4,985,0,0 +BRDA:4,985,1,0 +BRDA:4,986,0,0 +BRDA:4,986,1,0 +BRDA:4,987,0,0 +BRDA:4,987,1,0 +BRDA:4,988,0,0 +BRDA:4,988,1,0 +BRDA:4,989,0,0 +BRDA:4,989,1,0 +BRDA:4,990,0,0 +BRDA:4,990,1,0 +BRDA:4,990,2,0 +BRDA:4,991,0,0 +BRDA:4,991,1,0 +BRDA:4,992,0,0 +BRDA:4,992,1,0 +BRDA:4,993,0,0 +BRDA:4,993,1,0 +BRDA:4,994,0,0 +BRDA:4,994,1,0 +BRDA:4,995,0,0 +BRDA:4,995,1,0 +BRDA:4,996,0,0 +BRDA:4,996,1,0 +BRDA:4,997,0,0 +BRDA:4,997,1,0 +BRDA:4,998,0,0 +BRDA:4,998,1,0 +BRDA:4,999,0,0 +BRDA:4,999,1,0 +BRDA:4,1000,0,0 +BRDA:4,1000,1,0 +BRDA:4,1001,0,0 +BRDA:4,1001,1,0 +BRDA:4,1002,0,0 +BRDA:4,1002,1,0 +BRDA:4,1002,2,0 +BRDA:4,1002,3,0 +BRDA:4,1003,0,0 +BRDA:4,1003,1,0 +BRDA:4,1004,0,0 +BRDA:4,1004,1,0 +BRDA:4,1005,0,0 +BRDA:4,1005,1,0 +BRDA:4,1006,0,0 +BRDA:4,1006,1,0 +BRDA:4,1007,0,0 +BRDA:4,1007,1,0 +BRDA:4,1008,0,0 +BRDA:4,1008,1,0 +BRDA:4,1008,2,0 +BRDA:4,1009,0,0 +BRDA:4,1009,1,0 +BRDA:4,1010,0,0 +BRDA:4,1010,1,0 +BRDA:4,1011,0,0 +BRDA:4,1011,1,0 +BRDA:4,1011,2,0 +BRDA:4,1012,0,0 +BRDA:4,1012,1,0 +BRDA:4,1013,0,0 +BRDA:4,1013,1,0 +BRDA:4,1014,0,0 +BRDA:4,1014,1,0 +BRDA:4,1014,2,0 +BRDA:4,1014,3,0 +BRDA:4,1015,0,0 +BRDA:4,1015,1,0 +BRDA:4,1016,0,0 +BRDA:4,1016,1,0 +BRDA:4,1016,2,0 +BRDA:4,1016,3,0 +BRDA:4,1017,0,0 +BRDA:4,1017,1,0 +BRDA:4,1018,0,0 +BRDA:4,1018,1,0 +BRDA:4,1019,0,0 +BRDA:4,1019,1,0 +BRDA:4,1020,0,0 +BRDA:4,1020,1,0 +BRDA:4,1021,0,0 +BRDA:4,1021,1,0 +BRDA:4,1022,0,0 +BRDA:4,1022,1,0 +BRDA:4,1023,0,0 +BRDA:4,1023,1,0 +BRDA:4,1023,2,0 +BRDA:4,1023,3,0 +BRDA:4,1023,4,0 +BRDA:4,1023,5,0 +BRDA:4,1024,0,0 +BRDA:4,1024,1,0 +BRDA:4,1025,0,0 +BRDA:4,1025,1,0 +BRDA:4,1026,0,0 +BRDA:4,1026,1,0 +BRDA:4,1027,0,0 +BRDA:4,1027,1,0 +BRDA:4,1028,0,0 +BRDA:4,1028,1,0 +BRDA:4,1029,0,0 +BRDA:4,1029,1,0 +BRDA:4,1029,2,0 +BRDA:4,1029,3,0 +BRDA:4,1029,4,0 +BRDA:4,1029,5,0 +BRDA:4,1029,6,0 +BRDA:4,1029,7,0 +BRDA:4,1029,8,0 +BRDA:4,1029,9,0 +BRDA:4,1029,10,0 +BRDA:4,1029,11,0 +BRDA:4,1030,0,0 +BRDA:4,1030,1,0 +BRDA:4,1031,0,0 +BRDA:4,1031,1,0 +BRDA:4,1031,2,0 +BRDA:4,1031,3,0 +BRDA:4,1031,4,0 +BRDA:4,1032,0,0 +BRDA:4,1032,1,0 +BRDA:4,1033,0,0 +BRDA:4,1033,1,0 +BRDA:4,1034,0,0 +BRDA:4,1034,1,0 +BRDA:4,1035,0,0 +BRDA:4,1035,1,0 +BRDA:4,1036,0,0 +BRDA:4,1036,1,0 +BRDA:4,1037,0,0 +BRDA:4,1037,1,0 +BRDA:4,1038,0,0 +BRDA:4,1038,1,0 +BRDA:4,1039,0,0 +BRDA:4,1039,1,0 +BRDA:4,1040,0,0 +BRDA:4,1040,1,0 +BRDA:4,1041,0,0 +BRDA:4,1041,1,0 +BRDA:4,1042,0,0 +BRDA:4,1042,1,0 +BRDA:4,1043,0,0 +BRDA:4,1043,1,0 +BRDA:4,1044,0,0 +BRDA:4,1044,1,0 +BRDA:4,1045,0,0 +BRDA:4,1045,1,0 +BRDA:4,1046,0,0 +BRDA:4,1046,1,0 +BRDA:4,1047,0,0 +BRDA:4,1047,1,0 +BRDA:4,1048,0,0 +BRDA:4,1048,1,0 +BRDA:4,1048,2,0 +BRDA:4,1049,0,0 +BRDA:4,1049,1,0 +BRDA:4,1050,0,0 +BRDA:4,1050,1,0 +BRDA:4,1050,2,0 +BRDA:4,1051,0,0 +BRDA:4,1051,1,0 +BRDA:4,1052,0,0 +BRDA:4,1052,1,0 +BRDA:4,1053,0,0 +BRDA:4,1053,1,0 +BRDA:4,1054,0,0 +BRDA:4,1054,1,0 +BRDA:4,1055,0,0 +BRDA:4,1055,1,0 +BRDA:4,1056,0,0 +BRDA:4,1056,1,0 +BRDA:4,1057,0,0 +BRDA:4,1057,1,0 +BRDA:4,1058,0,0 +BRDA:4,1058,1,0 +BRDA:4,1058,2,0 +BRDA:4,1059,0,0 +BRDA:4,1059,1,0 +BRDA:4,1059,2,0 +BRDA:4,1059,3,0 +BRDA:4,1060,0,0 +BRDA:4,1060,1,0 +BRDA:4,1061,0,0 +BRDA:4,1061,1,0 +BRDA:4,1061,2,0 +BRDA:4,1061,3,0 +BRDA:4,1062,0,0 +BRDA:4,1062,1,0 +BRDA:4,1062,2,0 +BRDA:4,1062,3,0 +BRDA:4,1063,0,0 +BRDA:4,1063,1,0 +BRDA:4,1064,0,0 +BRDA:4,1064,1,0 +BRDA:4,1065,0,0 +BRDA:4,1065,1,0 +BRDA:4,1065,2,0 +BRDA:4,1065,3,0 +BRDA:4,1066,0,0 +BRDA:4,1066,1,0 +BRDA:4,1067,0,0 +BRDA:4,1067,1,0 +BRDA:4,1068,0,0 +BRDA:4,1068,1,0 +BRDA:4,1069,0,0 +BRDA:4,1069,1,0 +BRDA:4,1070,0,0 +BRDA:4,1070,1,0 +BRDA:4,1071,0,0 +BRDA:4,1071,1,0 +BRDA:4,1072,0,0 +BRDA:4,1072,1,0 +BRDA:4,1073,0,0 +BRDA:4,1073,1,0 +BRDA:4,1074,0,0 +BRDA:4,1074,1,0 +BRDA:4,1075,0,0 +BRDA:4,1075,1,0 +BRDA:4,1076,0,0 +BRDA:4,1076,1,0 +BRDA:4,1077,0,0 +BRDA:4,1077,1,0 +BRDA:4,1078,0,0 +BRDA:4,1078,1,0 +BRDA:4,1079,0,0 +BRDA:4,1079,1,0 +BRDA:4,1080,0,0 +BRDA:4,1080,1,0 +BRDA:4,1081,0,0 +BRDA:4,1081,1,0 +BRDA:4,1082,0,0 +BRDA:4,1082,1,0 +BRDA:4,1083,0,0 +BRDA:4,1083,1,0 +BRDA:4,1084,0,0 +BRDA:4,1084,1,0 +BRDA:4,1085,0,0 +BRDA:4,1085,1,0 +BRDA:4,1086,0,0 +BRDA:4,1086,1,0 +BRDA:4,1087,0,0 +BRDA:4,1087,1,0 +BRDA:4,1088,0,0 +BRDA:4,1088,1,0 +BRDA:4,1089,0,0 +BRDA:4,1089,1,0 +BRDA:4,1090,0,0 +BRDA:4,1090,1,0 +BRDA:4,1091,0,0 +BRDA:4,1091,1,0 +BRDA:4,1091,2,0 +BRDA:4,1091,3,0 +BRDA:4,1092,0,0 +BRDA:4,1092,1,0 +BRDA:4,1093,0,0 +BRDA:4,1093,1,0 +BRDA:4,1094,0,0 +BRDA:4,1094,1,0 +BRDA:4,1095,0,0 +BRDA:4,1095,1,0 +BRDA:4,1096,0,0 +BRDA:4,1096,1,0 +BRDA:4,1097,0,0 +BRDA:4,1097,1,0 +BRDA:4,1098,0,0 +BRDA:4,1098,1,0 +BRDA:4,1099,0,0 +BRDA:4,1099,1,0 +BRDA:4,1100,0,0 +BRDA:4,1100,1,0 +BRDA:4,1101,0,0 +BRDA:4,1101,1,0 +BRDA:4,1102,0,0 +BRDA:4,1102,1,0 +BRDA:4,1103,0,0 +BRDA:4,1103,1,0 +BRDA:4,1104,0,0 +BRDA:4,1104,1,0 +BRDA:4,1104,2,0 +BRDA:4,1104,3,0 +BRDA:4,1105,0,0 +BRDA:4,1105,1,0 +BRDA:4,1105,2,0 +BRDA:4,1105,3,0 +BRDA:4,1106,0,0 +BRDA:4,1106,1,0 +BRDA:4,1106,2,0 +BRDA:4,1107,0,0 +BRDA:4,1107,1,0 +BRDA:4,1108,0,0 +BRDA:4,1108,1,0 +BRDA:4,1108,2,0 +BRDA:4,1108,3,0 +BRDA:4,1109,0,0 +BRDA:4,1109,1,0 +BRDA:4,1110,0,0 +BRDA:4,1110,1,0 +BRDA:4,1110,2,0 +BRDA:4,1111,0,0 +BRDA:4,1111,1,0 +BRDA:4,1112,0,0 +BRDA:4,1112,1,0 +BRDA:4,1112,2,0 +BRDA:5,1113,0,0 +BRDA:5,1113,1,0 +BRDA:5,1113,2,0 +BRDA:5,1114,0,0 +BRDA:5,1114,1,0 +BRDA:5,1115,0,0 +BRDA:5,1115,1,0 +BRDA:5,1116,0,0 +BRDA:5,1116,1,0 +BRDA:5,1117,0,0 +BRDA:5,1117,1,0 +BRDA:5,1118,0,0 +BRDA:5,1118,1,0 +BRDA:5,1119,0,0 +BRDA:5,1119,1,0 +BRDA:5,1119,2,0 +BRDA:5,1119,3,0 +BRDA:5,1120,0,0 +BRDA:5,1120,1,0 +BRDA:5,1121,0,0 +BRDA:5,1121,1,0 +BRDA:5,1122,0,0 +BRDA:5,1122,1,0 +BRDA:5,1123,0,0 +BRDA:5,1123,1,0 +BRDA:5,1124,0,0 +BRDA:5,1124,1,0 +BRDA:5,1125,0,0 +BRDA:5,1125,1,0 +BRDA:5,1126,0,0 +BRDA:5,1126,1,0 +BRDA:5,1127,0,0 +BRDA:5,1127,1,0 +BRDA:5,1128,0,0 +BRDA:5,1128,1,0 +BRDA:5,1129,0,0 +BRDA:5,1129,1,0 +BRDA:5,1130,0,0 +BRDA:5,1130,1,0 +BRDA:5,1131,0,0 +BRDA:5,1131,1,0 +BRDA:5,1132,0,0 +BRDA:5,1132,1,0 +BRDA:5,1133,0,0 +BRDA:5,1133,1,0 +BRDA:5,1134,0,0 +BRDA:5,1134,1,0 +BRDA:5,1135,0,0 +BRDA:5,1135,1,0 +BRDA:5,1136,0,0 +BRDA:5,1136,1,0 +BRDA:5,1137,0,0 +BRDA:5,1137,1,0 +BRDA:5,1138,0,0 +BRDA:5,1138,1,0 +BRDA:5,1138,2,0 +BRDA:5,1139,0,0 +BRDA:5,1139,1,0 +BRDA:5,1139,2,0 +BRDA:5,1139,3,0 +BRDA:5,1140,0,0 +BRDA:5,1140,1,0 +BRDA:5,1140,2,0 +BRDA:5,1141,0,0 +BRDA:5,1141,1,0 +BRDA:5,1141,2,0 +BRDA:5,1142,0,0 +BRDA:5,1142,1,0 +BRDA:5,1143,0,0 +BRDA:5,1143,1,0 +BRDA:5,1144,0,0 +BRDA:5,1144,1,0 +BRDA:5,1145,0,0 +BRDA:5,1145,1,0 +BRDA:5,1146,0,0 +BRDA:5,1146,1,0 +BRDA:5,1147,0,0 +BRDA:5,1147,1,0 +BRDA:5,1148,0,0 +BRDA:5,1148,1,0 +BRDA:5,1149,0,0 +BRDA:5,1149,1,0 +BRDA:5,1150,0,0 +BRDA:5,1150,1,0 +BRDA:5,1150,2,0 +BRDA:5,1151,0,0 +BRDA:5,1151,1,0 +BRDA:5,1152,0,0 +BRDA:5,1152,1,0 +BRDA:5,1153,0,0 +BRDA:5,1153,1,0 +BRDA:5,1154,0,0 +BRDA:5,1154,1,0 +BRDA:5,1155,0,0 +BRDA:5,1155,1,0 +BRDA:5,1156,0,0 +BRDA:5,1156,1,0 +BRDA:5,1157,0,0 +BRDA:5,1157,1,0 +BRDA:5,1158,0,0 +BRDA:5,1158,1,0 +BRDA:5,1159,0,0 +BRDA:5,1159,1,0 +BRDA:5,1160,0,0 +BRDA:5,1160,1,0 +BRDA:5,1161,0,0 +BRDA:5,1161,1,0 +BRDA:5,1162,0,0 +BRDA:5,1162,1,0 +BRDA:5,1162,2,0 +BRDA:5,1163,0,0 +BRDA:5,1163,1,0 +BRDA:5,1164,0,0 +BRDA:5,1164,1,0 +BRDA:5,1165,0,0 +BRDA:5,1165,1,0 +BRDA:5,1166,0,0 +BRDA:5,1166,1,0 +BRDA:5,1167,0,0 +BRDA:5,1167,1,0 +BRDA:5,1168,0,0 +BRDA:5,1168,1,0 +BRDA:5,1169,0,0 +BRDA:5,1169,1,0 +BRDA:5,1170,0,0 +BRDA:5,1170,1,0 +BRDA:5,1171,0,0 +BRDA:5,1171,1,0 +BRDA:5,1172,0,0 +BRDA:5,1172,1,0 +BRDA:5,1172,2,0 +BRDA:5,1172,3,0 +BRDA:5,1172,4,0 +BRDA:5,1173,0,0 +BRDA:5,1173,1,0 +BRDA:5,1173,2,0 +BRDA:5,1174,0,0 +BRDA:5,1174,1,0 +BRDA:5,1174,2,0 +BRDA:5,1175,0,0 +BRDA:5,1175,1,0 +BRDA:5,1176,0,0 +BRDA:5,1176,1,0 +BRDA:5,1177,0,0 +BRDA:5,1177,1,0 +BRDA:5,1178,0,0 +BRDA:5,1178,1,0 +BRDA:5,1179,0,0 +BRDA:5,1179,1,0 +BRDA:5,1180,0,0 +BRDA:5,1180,1,0 +BRDA:5,1181,0,0 +BRDA:5,1181,1,0 +BRDA:5,1181,2,0 +BRDA:5,1182,0,0 +BRDA:5,1182,1,0 +BRDA:5,1182,2,0 +BRDA:5,1183,0,0 +BRDA:5,1183,1,0 +BRDA:5,1184,0,0 +BRDA:5,1184,1,0 +BRDA:5,1184,2,0 +BRDA:5,1185,0,0 +BRDA:5,1185,1,0 +BRDA:5,1186,0,0 +BRDA:5,1186,1,0 +BRDA:5,1187,0,0 +BRDA:5,1187,1,0 +BRDA:5,1188,0,0 +BRDA:5,1188,1,0 +BRDA:5,1189,0,0 +BRDA:5,1189,1,0 +BRDA:5,1190,0,0 +BRDA:5,1190,1,0 +BRDA:5,1191,0,0 +BRDA:5,1191,1,0 +BRDA:5,1192,0,0 +BRDA:5,1192,1,0 +BRDA:5,1192,2,0 +BRDA:5,1192,3,0 +BRDA:5,1192,4,0 +BRDA:5,1193,0,0 +BRDA:5,1193,1,0 +BRDA:5,1194,0,0 +BRDA:5,1194,1,0 +BRDA:5,1195,0,0 +BRDA:5,1195,1,0 +BRDA:5,1196,0,0 +BRDA:5,1196,1,0 +BRDA:5,1197,0,0 +BRDA:5,1197,1,0 +BRDA:5,1198,0,0 +BRDA:5,1198,1,0 +BRDA:5,1199,0,0 +BRDA:5,1199,1,0 +BRDA:5,1200,0,0 +BRDA:5,1200,1,0 +BRDA:5,1201,0,0 +BRDA:5,1201,1,0 +BRDA:5,1202,0,0 +BRDA:5,1202,1,0 +BRDA:5,1203,0,0 +BRDA:5,1203,1,0 +BRDA:5,1204,0,0 +BRDA:5,1204,1,0 +BRDA:5,1204,2,0 +BRDA:5,1204,3,0 +BRDA:5,1204,4,0 +BRDA:5,1204,5,0 +BRDA:5,1205,0,0 +BRDA:5,1205,1,0 +BRDA:5,1206,0,0 +BRDA:5,1206,1,0 +BRDA:5,1207,0,0 +BRDA:5,1207,1,0 +BRDA:5,1208,0,0 +BRDA:5,1208,1,0 +BRDA:5,1209,0,0 +BRDA:5,1209,1,0 +BRDA:5,1209,2,0 +BRDA:5,1210,0,0 +BRDA:5,1210,1,0 +BRDA:5,1211,0,0 +BRDA:5,1211,1,0 +BRDA:5,1212,0,0 +BRDA:5,1212,1,0 +BRDA:5,1213,0,0 +BRDA:5,1213,1,0 +BRDA:5,1214,0,0 +BRDA:5,1214,1,0 +BRDA:5,1215,0,0 +BRDA:5,1215,1,0 +BRDA:5,1216,0,0 +BRDA:5,1216,1,0 +BRDA:5,1217,0,0 +BRDA:5,1217,1,0 +BRDA:5,1218,0,0 +BRDA:5,1218,1,0 +BRDA:5,1219,0,0 +BRDA:5,1219,1,0 +BRDA:5,1220,0,0 +BRDA:5,1220,1,0 +BRDA:5,1221,0,0 +BRDA:5,1221,1,0 +BRDA:5,1222,0,0 +BRDA:5,1222,1,0 +BRDA:5,1223,0,0 +BRDA:5,1223,1,0 +BRDA:5,1223,2,0 +BRDA:5,1224,0,0 +BRDA:5,1224,1,0 +BRDA:5,1225,0,0 +BRDA:5,1225,1,0 +BRDA:5,1226,0,0 +BRDA:5,1226,1,0 +BRDA:5,1227,0,0 +BRDA:5,1227,1,0 +BRDA:5,1228,0,0 +BRDA:5,1228,1,0 +BRDA:5,1229,0,0 +BRDA:5,1229,1,0 +BRDA:5,1230,0,0 +BRDA:5,1230,1,0 +BRDA:5,1231,0,0 +BRDA:5,1231,1,0 +BRDA:5,1232,0,0 +BRDA:5,1232,1,0 +BRDA:5,1233,0,0 +BRDA:5,1233,1,0 +BRDA:5,1234,0,0 +BRDA:5,1234,1,0 +BRDA:5,1235,0,0 +BRDA:5,1235,1,0 +BRDA:5,1236,0,0 +BRDA:5,1236,1,0 +BRDA:5,1237,0,0 +BRDA:5,1237,1,0 +BRDA:5,1238,0,0 +BRDA:5,1238,1,0 +BRDA:5,1239,0,0 +BRDA:5,1239,1,0 +BRDA:5,1240,0,0 +BRDA:5,1240,1,0 +BRDA:5,1241,0,0 +BRDA:5,1241,1,0 +BRDA:5,1242,0,0 +BRDA:5,1242,1,0 +BRDA:5,1243,0,0 +BRDA:5,1243,1,0 +BRDA:5,1244,0,0 +BRDA:5,1244,1,0 +BRDA:5,1245,0,0 +BRDA:5,1245,1,0 +BRDA:5,1246,0,0 +BRDA:5,1246,1,0 +BRDA:5,1247,0,0 +BRDA:5,1247,1,0 +BRDA:5,1248,0,0 +BRDA:5,1248,1,0 +BRDA:5,1249,0,0 +BRDA:5,1249,1,0 +BRDA:5,1250,0,0 +BRDA:5,1250,1,0 +BRDA:5,1251,0,0 +BRDA:5,1251,1,0 +BRDA:5,1252,0,0 +BRDA:5,1252,1,0 +BRDA:5,1253,0,0 +BRDA:5,1253,1,0 +BRDA:5,1254,0,0 +BRDA:5,1254,1,0 +BRDA:5,1254,2,0 +BRDA:5,1255,0,0 +BRDA:5,1255,1,0 +BRDA:5,1255,2,0 +BRDA:5,1255,3,0 +BRDA:5,1255,4,0 +BRDA:5,1255,5,0 +BRDA:5,1256,0,0 +BRDA:5,1256,1,0 +BRDA:5,1257,0,0 +BRDA:5,1257,1,0 +BRDA:5,1258,0,0 +BRDA:5,1258,1,0 +BRDA:5,1259,0,0 +BRDA:5,1259,1,0 +BRDA:5,1260,0,0 +BRDA:5,1260,1,0 +BRDA:5,1261,0,0 +BRDA:5,1261,1,0 +BRDA:5,1262,0,0 +BRDA:5,1262,1,0 +BRDA:5,1263,0,0 +BRDA:5,1263,1,0 +BRDA:5,1264,0,0 +BRDA:5,1264,1,0 +BRDA:5,1265,0,0 +BRDA:5,1265,1,0 +BRDA:5,1266,0,0 +BRDA:5,1266,1,0 +BRDA:5,1267,0,0 +BRDA:5,1267,1,0 +BRDA:5,1268,0,0 +BRDA:5,1268,1,0 +BRDA:5,1269,0,0 +BRDA:5,1269,1,0 +BRDA:5,1270,0,0 +BRDA:5,1270,1,0 +BRDA:5,1271,0,0 +BRDA:5,1271,1,0 +BRDA:5,1272,0,0 +BRDA:5,1272,1,0 +BRDA:5,1273,0,0 +BRDA:5,1273,1,0 +BRDA:5,1274,0,0 +BRDA:5,1274,1,0 +BRDA:5,1275,0,0 +BRDA:5,1275,1,0 +BRDA:5,1276,0,0 +BRDA:5,1276,1,0 +BRDA:5,1276,2,0 +BRDA:5,1276,3,0 +BRDA:5,1276,4,0 +BRDA:5,1277,0,0 +BRDA:5,1277,1,0 +BRDA:5,1278,0,0 +BRDA:5,1278,1,0 +BRDA:5,1278,2,0 +BRDA:5,1278,3,0 +BRDA:5,1279,0,0 +BRDA:5,1279,1,0 +BRDA:5,1280,0,0 +BRDA:5,1280,1,0 +BRDA:5,1280,2,0 +BRDA:5,1280,3,0 +BRDA:5,1280,4,0 +BRDA:5,1280,5,0 +BRDA:5,1280,6,0 +BRDA:5,1280,7,0 +BRDA:5,1280,8,0 +BRDA:5,1280,9,0 +BRDA:5,1280,10,0 +BRDA:5,1280,11,0 +BRDA:5,1280,12,0 +BRDA:5,1280,13,0 +BRDA:5,1280,14,0 +BRDA:5,1280,15,0 +BRDA:5,1280,16,0 +BRDA:5,1280,17,0 +BRDA:5,1281,0,0 +BRDA:5,1281,1,0 +BRDA:5,1282,0,0 +BRDA:5,1282,1,0 +BRDA:5,1282,2,0 +BRDA:5,1282,3,0 +BRDA:5,1282,4,0 +BRDA:5,1282,5,0 +BRDA:5,1282,6,0 +BRDA:5,1282,7,0 +BRDA:5,1282,8,0 +BRDA:5,1282,9,0 +BRDA:5,1282,10,0 +BRDA:5,1282,11,0 +BRDA:5,1282,12,0 +BRDA:5,1282,13,0 +BRDA:5,1282,14,0 +BRDA:5,1282,15,0 +BRDA:5,1282,16,0 +BRDA:5,1282,17,0 +BRDA:5,1282,18,0 +BRDA:5,1282,19,0 +BRDA:5,1282,20,0 +BRDA:5,1282,21,0 +BRDA:5,1283,0,0 +BRDA:5,1283,1,0 +BRDA:5,1284,0,0 +BRDA:5,1284,1,0 +BRDA:5,1285,0,0 +BRDA:5,1285,1,0 +BRDA:5,1286,0,0 +BRDA:5,1286,1,0 +BRDA:5,1286,2,0 +BRDA:5,1286,3,0 +BRDA:5,1286,4,0 +BRDA:5,1287,0,0 +BRDA:5,1287,1,0 +BRDA:5,1288,0,0 +BRDA:5,1288,1,0 +BRDA:5,1289,0,0 +BRDA:5,1289,1,0 +BRDA:5,1290,0,0 +BRDA:5,1290,1,0 +BRDA:5,1291,0,0 +BRDA:5,1291,1,0 +BRDA:5,1292,0,0 +BRDA:5,1292,1,0 +BRDA:5,1293,0,0 +BRDA:5,1293,1,0 +BRDA:5,1294,0,0 +BRDA:5,1294,1,0 +BRDA:5,1295,0,0 +BRDA:5,1295,1,0 +BRDA:5,1296,0,0 +BRDA:5,1296,1,0 +BRDA:5,1297,0,0 +BRDA:5,1297,1,0 +BRDA:5,1298,0,0 +BRDA:5,1298,1,0 +BRDA:5,1299,0,0 +BRDA:5,1299,1,0 +BRDA:5,1300,0,0 +BRDA:5,1300,1,0 +BRDA:5,1301,0,0 +BRDA:5,1301,1,0 +BRDA:5,1302,0,0 +BRDA:5,1302,1,0 +BRDA:5,1303,0,0 +BRDA:5,1303,1,0 +BRDA:5,1304,0,0 +BRDA:5,1304,1,0 +BRDA:5,1305,0,0 +BRDA:5,1305,1,0 +BRDA:5,1306,0,0 +BRDA:5,1306,1,0 +BRDA:5,1307,0,0 +BRDA:5,1307,1,0 +BRDA:5,1308,0,0 +BRDA:5,1308,1,0 +BRDA:5,1309,0,0 +BRDA:5,1309,1,0 +BRDA:5,1310,0,0 +BRDA:5,1310,1,0 +BRDA:5,1311,0,0 +BRDA:5,1311,1,0 +BRDA:5,1312,0,0 +BRDA:5,1312,1,0 +BRDA:5,1313,0,0 +BRDA:5,1313,1,0 +BRDA:5,1314,0,0 +BRDA:5,1314,1,0 +BRDA:5,1315,0,0 +BRDA:5,1315,1,0 +BRDA:5,1315,2,0 +BRDA:5,1315,3,0 +BRDA:5,1316,0,0 +BRDA:5,1316,1,0 +BRDA:5,1317,0,0 +BRDA:5,1317,1,0 +BRDA:5,1318,0,0 +BRDA:5,1318,1,0 +BRDA:5,1319,0,0 +BRDA:5,1319,1,0 +BRDA:5,1320,0,0 +BRDA:5,1320,1,0 +BRDA:5,1321,0,0 +BRDA:5,1321,1,0 +BRDA:5,1322,0,0 +BRDA:5,1322,1,0 +BRDA:5,1323,0,0 +BRDA:5,1323,1,0 +BRDA:5,1324,0,0 +BRDA:5,1324,1,0 +BRDA:5,1325,0,0 +BRDA:5,1325,1,0 +BRDA:5,1326,0,0 +BRDA:5,1326,1,0 +BRDA:5,1327,0,0 +BRDA:5,1327,1,0 +BRDA:5,1328,0,0 +BRDA:5,1328,1,0 +BRDA:5,1329,0,0 +BRDA:5,1329,1,0 +BRDA:5,1330,0,0 +BRDA:5,1330,1,0 +BRDA:5,1331,0,0 +BRDA:5,1331,1,0 +BRDA:5,1332,0,0 +BRDA:5,1332,1,0 +BRDA:5,1333,0,0 +BRDA:5,1333,1,0 +BRDA:5,1334,0,0 +BRDA:5,1334,1,0 +BRDA:5,1335,0,0 +BRDA:5,1335,1,0 +BRDA:5,1336,0,0 +BRDA:5,1336,1,0 +BRDA:5,1337,0,0 +BRDA:5,1337,1,0 +BRDA:5,1337,2,0 +BRDA:5,1337,3,0 +BRDA:5,1337,4,0 +BRDA:5,1337,5,0 +BRDA:5,1338,0,0 +BRDA:5,1338,1,0 +BRDA:5,1339,0,0 +BRDA:5,1339,1,0 +BRDA:5,1340,0,0 +BRDA:5,1340,1,0 +BRDA:5,1340,2,0 +BRDA:5,1340,3,0 +BRDA:5,1340,4,0 +BRDA:5,1341,0,0 +BRDA:5,1341,1,0 +BRDA:5,1341,2,0 +BRDA:5,1341,3,0 +BRDA:5,1342,0,0 +BRDA:5,1342,1,0 +BRDA:5,1343,0,0 +BRDA:5,1343,1,0 +BRDA:5,1343,2,0 +BRDA:5,1343,3,0 +BRDA:5,1344,0,0 +BRDA:5,1344,1,0 +BRDA:5,1345,0,0 +BRDA:5,1345,1,0 +BRDA:5,1345,2,0 +BRDA:5,1345,3,0 +BRDA:5,1346,0,0 +BRDA:5,1346,1,0 +BRDA:5,1347,0,0 +BRDA:5,1347,1,0 +BRDA:5,1348,0,0 +BRDA:5,1348,1,0 +BRDA:5,1349,0,0 +BRDA:5,1349,1,0 +BRDA:5,1350,0,0 +BRDA:5,1350,1,0 +BRDA:5,1351,0,0 +BRDA:5,1351,1,0 +BRDA:5,1352,0,0 +BRDA:5,1352,1,0 +BRDA:5,1353,0,0 +BRDA:5,1353,1,0 +BRDA:5,1354,0,0 +BRDA:5,1354,1,0 +BRDA:5,1355,0,0 +BRDA:5,1355,1,0 +BRDA:5,1355,2,0 +BRDA:5,1355,3,0 +BRDA:5,1356,0,0 +BRDA:5,1356,1,0 +BRDA:5,1356,2,0 +BRDA:5,1357,0,0 +BRDA:5,1357,1,0 +BRDA:5,1358,0,0 +BRDA:5,1358,1,0 +BRDA:5,1359,0,0 +BRDA:5,1359,1,0 +BRDA:5,1360,0,0 +BRDA:5,1360,1,0 +BRDA:5,1361,0,0 +BRDA:5,1361,1,0 +BRDA:5,1362,0,0 +BRDA:5,1362,1,0 +BRDA:5,1363,0,0 +BRDA:5,1363,1,0 +BRDA:5,1364,0,0 +BRDA:5,1364,1,0 +BRDA:5,1365,0,0 +BRDA:5,1365,1,0 +BRDA:5,1365,2,0 +BRDA:5,1366,0,0 +BRDA:5,1366,1,0 +BRDA:5,1367,0,0 +BRDA:5,1367,1,0 +BRDA:5,1367,2,0 +BRDA:5,1367,3,0 +BRDA:5,1368,0,0 +BRDA:5,1368,1,0 +BRDA:5,1368,2,0 +BRDA:5,1369,0,0 +BRDA:5,1369,1,0 +BRDA:5,1370,0,0 +BRDA:5,1370,1,0 +BRDA:5,1370,2,0 +BRDA:5,1371,0,0 +BRDA:5,1371,1,0 +BRDA:5,1371,2,0 +BRDA:5,1371,3,0 +BRDA:5,1372,0,0 +BRDA:5,1372,1,0 +BRDA:5,1373,0,0 +BRDA:5,1373,1,0 +BRDA:5,1374,0,0 +BRDA:5,1374,1,0 +BRDA:5,1375,0,0 +BRDA:5,1375,1,0 +BRDA:5,1376,0,0 +BRDA:5,1376,1,0 +BRDA:5,1377,0,0 +BRDA:5,1377,1,0 +BRDA:5,1378,0,0 +BRDA:5,1378,1,0 +BRDA:5,1379,0,0 +BRDA:5,1379,1,0 +BRDA:5,1380,0,0 +BRDA:5,1380,1,0 +BRDA:5,1381,0,0 +BRDA:5,1381,1,0 +BRDA:5,1382,0,0 +BRDA:5,1382,1,0 +BRDA:5,1383,0,0 +BRDA:5,1383,1,0 +BRDA:5,1384,0,0 +BRDA:5,1384,1,0 +BRDA:5,1385,0,0 +BRDA:5,1385,1,0 +BRDA:5,1386,0,0 +BRDA:5,1386,1,0 +BRDA:5,1387,0,0 +BRDA:5,1387,1,0 +BRDA:5,1388,0,0 +BRDA:5,1388,1,0 +BRDA:5,1389,0,0 +BRDA:5,1389,1,0 +BRDA:5,1390,0,0 +BRDA:5,1390,1,0 +BRDA:5,1391,0,0 +BRDA:5,1391,1,0 +BRDA:5,1392,0,0 +BRDA:5,1392,1,0 +BRDA:5,1393,0,0 +BRDA:5,1393,1,0 +BRDA:5,1394,0,0 +BRDA:5,1394,1,0 +BRDA:5,1395,0,0 +BRDA:5,1395,1,0 +BRDA:5,1396,0,0 +BRDA:5,1396,1,0 +BRDA:5,1397,0,0 +BRDA:5,1397,1,0 +BRDA:5,1398,0,0 +BRDA:5,1398,1,0 +BRDA:5,1399,0,0 +BRDA:5,1399,1,0 +BRDA:5,1399,2,0 +BRDA:5,1400,0,0 +BRDA:5,1400,1,0 +BRDA:5,1401,0,0 +BRDA:5,1401,1,0 +BRDA:5,1402,0,0 +BRDA:5,1402,1,0 +BRDA:5,1403,0,0 +BRDA:5,1403,1,0 +BRDA:5,1404,0,0 +BRDA:5,1404,1,0 +BRDA:5,1405,0,0 +BRDA:5,1405,1,0 +BRDA:5,1406,0,0 +BRDA:5,1406,1,0 +BRDA:5,1406,2,0 +BRDA:5,1406,3,0 +BRDA:5,1407,0,0 +BRDA:5,1407,1,0 +BRDA:5,1407,2,0 +BRDA:5,1407,3,0 +BRDA:5,1408,0,0 +BRDA:5,1408,1,0 +BRDA:5,1408,2,0 +BRDA:5,1409,0,0 +BRDA:5,1409,1,0 +BRDA:5,1409,2,0 +BRDA:5,1409,3,0 +BRDA:5,1410,0,0 +BRDA:5,1410,1,0 +BRDA:5,1410,2,0 +BRDA:5,1410,3,0 +BRDA:5,1410,4,0 +BRDA:5,1411,0,0 +BRDA:5,1411,1,0 +BRDA:5,1412,0,0 +BRDA:5,1412,1,0 +BRDA:5,1413,0,0 +BRDA:5,1413,1,0 +BRDA:5,1413,2,0 +BRDA:5,1414,0,0 +BRDA:5,1414,1,0 +BRDA:5,1415,0,0 +BRDA:5,1415,1,0 +BRDA:5,1416,0,0 +BRDA:5,1416,1,0 +BRDA:5,1417,0,0 +BRDA:5,1417,1,0 +BRDA:5,1418,0,0 +BRDA:5,1418,1,0 +BRDA:5,1419,0,0 +BRDA:5,1419,1,0 +BRDA:5,1420,0,0 +BRDA:5,1420,1,0 +BRDA:5,1421,0,0 +BRDA:5,1421,1,0 +BRDA:5,1421,2,0 +BRDA:5,1422,0,0 +BRDA:5,1422,1,0 +BRDA:5,1423,0,0 +BRDA:5,1423,1,0 +BRDA:6,1424,0,0 +BRDA:6,1424,1,0 +BRDA:6,1425,0,0 +BRDA:6,1425,1,0 +BRDA:6,1426,0,0 +BRDA:6,1426,1,0 +BRDA:6,1427,0,0 +BRDA:6,1427,1,0 +BRDA:6,1428,0,0 +BRDA:6,1428,1,0 +BRDA:6,1428,2,0 +BRDA:6,1428,3,0 +BRDA:6,1429,0,0 +BRDA:6,1429,1,0 +BRDA:6,1430,0,0 +BRDA:6,1430,1,0 +BRDA:6,1431,0,0 +BRDA:6,1431,1,0 +BRDA:6,1432,0,0 +BRDA:6,1432,1,0 +BRDA:6,1433,0,0 +BRDA:6,1433,1,0 +BRDA:6,1434,0,0 +BRDA:6,1434,1,0 +BRDA:6,1435,0,0 +BRDA:6,1435,1,0 +BRDA:6,1436,0,0 +BRDA:6,1436,1,0 +BRDA:6,1437,0,0 +BRDA:6,1437,1,0 +BRDA:6,1438,0,0 +BRDA:6,1438,1,0 +BRDA:6,1439,0,0 +BRDA:6,1439,1,0 +BRDA:6,1440,0,0 +BRDA:6,1440,1,0 +BRDA:6,1441,0,0 +BRDA:6,1441,1,0 +BRDA:6,1442,0,0 +BRDA:6,1442,1,0 +BRDA:6,1443,0,0 +BRDA:6,1443,1,0 +BRDA:6,1444,0,0 +BRDA:6,1444,1,0 +BRDA:6,1445,0,0 +BRDA:6,1445,1,0 +BRDA:6,1446,0,0 +BRDA:6,1446,1,0 +BRDA:6,1447,0,0 +BRDA:6,1447,1,0 +BRDA:6,1448,0,0 +BRDA:6,1448,1,0 +BRDA:6,1449,0,0 +BRDA:6,1449,1,0 +BRDA:6,1450,0,0 +BRDA:6,1450,1,0 +BRDA:6,1451,0,0 +BRDA:6,1451,1,0 +BRDA:6,1452,0,0 +BRDA:6,1452,1,0 +BRDA:6,1453,0,0 +BRDA:6,1453,1,0 +BRDA:6,1454,0,0 +BRDA:6,1454,1,0 +BRDA:6,1455,0,0 +BRDA:6,1455,1,0 +BRDA:6,1456,0,0 +BRDA:6,1456,1,0 +BRDA:6,1457,0,0 +BRDA:6,1457,1,0 +BRDA:6,1458,0,0 +BRDA:6,1458,1,0 +BRDA:6,1458,2,0 +BRDA:6,1459,0,0 +BRDA:6,1459,1,0 +BRDA:6,1459,2,0 +BRDA:6,1459,3,0 +BRDA:6,1460,0,0 +BRDA:6,1460,1,0 +BRDA:6,1460,2,0 +BRDA:6,1460,3,0 +BRDA:6,1461,0,0 +BRDA:6,1461,1,0 +BRDA:6,1462,0,0 +BRDA:6,1462,1,0 +BRDA:6,1462,2,0 +BRDA:6,1462,3,0 +BRDA:6,1462,4,0 +BRDA:6,1462,5,0 +BRDA:6,1462,6,0 +BRDA:6,1462,7,0 +BRDA:6,1462,8,0 +BRDA:6,1462,9,0 +BRDA:6,1462,10,0 +BRDA:6,1462,11,0 +BRDA:6,1462,12,0 +BRDA:6,1463,0,0 +BRDA:6,1463,1,0 +BRDA:6,1464,0,0 +BRDA:6,1464,1,0 +BRDA:6,1464,2,0 +BRDA:6,1464,3,0 +BRDA:6,1464,4,0 +BRDA:6,1465,0,0 +BRDA:6,1465,1,0 +BRDA:6,1465,2,0 +BRDA:6,1465,3,0 +BRDA:6,1465,4,0 +BRDA:6,1466,0,0 +BRDA:6,1466,1,0 +BRDA:6,1467,0,0 +BRDA:6,1467,1,0 +BRDA:6,1468,0,0 +BRDA:6,1468,1,0 +BRDA:6,1469,0,0 +BRDA:6,1469,1,0 +BRDA:6,1470,0,0 +BRDA:6,1470,1,0 +BRDA:6,1471,0,0 +BRDA:6,1471,1,0 +BRDA:6,1472,0,0 +BRDA:6,1472,1,0 +BRDA:6,1473,0,0 +BRDA:6,1473,1,0 +BRDA:6,1474,0,0 +BRDA:6,1474,1,0 +BRDA:6,1475,0,0 +BRDA:6,1475,1,0 +BRDA:6,1476,0,0 +BRDA:6,1476,1,0 +BRDA:6,1477,0,0 +BRDA:6,1477,1,0 +BRDA:6,1478,0,0 +BRDA:6,1478,1,0 +BRDA:6,1479,0,0 +BRDA:6,1479,1,0 +BRDA:6,1480,0,0 +BRDA:6,1480,1,0 +BRDA:6,1481,0,0 +BRDA:6,1481,1,0 +BRDA:6,1482,0,0 +BRDA:6,1482,1,0 +BRDA:6,1483,0,0 +BRDA:6,1483,1,0 +BRDA:6,1484,0,0 +BRDA:6,1484,1,0 +BRDA:6,1485,0,0 +BRDA:6,1485,1,0 +BRDA:6,1486,0,0 +BRDA:6,1486,1,0 +BRDA:6,1486,2,0 +BRDA:6,1486,3,0 +BRDA:6,1487,0,0 +BRDA:6,1487,1,0 +BRDA:6,1488,0,0 +BRDA:6,1488,1,0 +BRDA:6,1489,0,0 +BRDA:6,1489,1,0 +BRDA:6,1490,0,0 +BRDA:6,1490,1,0 +BRDA:6,1491,0,0 +BRDA:6,1491,1,0 +BRDA:6,1492,0,0 +BRDA:6,1492,1,0 +BRDA:6,1493,0,0 +BRDA:6,1493,1,0 +BRDA:6,1494,0,0 +BRDA:6,1494,1,0 +BRDA:6,1495,0,0 +BRDA:6,1495,1,0 +BRDA:6,1496,0,0 +BRDA:6,1496,1,0 +BRDA:6,1497,0,0 +BRDA:6,1497,1,0 +BRDA:6,1498,0,0 +BRDA:6,1498,1,0 +BRDA:6,1499,0,0 +BRDA:6,1499,1,0 +BRDA:6,1500,0,0 +BRDA:6,1500,1,0 +BRDA:6,1501,0,0 +BRDA:6,1501,1,0 +BRDA:6,1502,0,0 +BRDA:6,1502,1,0 +BRDA:6,1503,0,0 +BRDA:6,1503,1,0 +BRDA:6,1503,2,0 +BRDA:6,1504,0,0 +BRDA:6,1504,1,0 +BRDA:6,1505,0,0 +BRDA:6,1505,1,0 +BRDA:6,1506,0,0 +BRDA:6,1506,1,0 +BRDA:6,1507,0,0 +BRDA:6,1507,1,0 +BRDA:6,1508,0,0 +BRDA:6,1508,1,0 +BRDA:6,1509,0,0 +BRDA:6,1509,1,0 +BRDA:6,1510,0,0 +BRDA:6,1510,1,0 +BRDA:6,1511,0,0 +BRDA:6,1511,1,0 +BRDA:6,1512,0,0 +BRDA:6,1512,1,0 +BRDA:6,1513,0,0 +BRDA:6,1513,1,0 +BRDA:6,1514,0,0 +BRDA:6,1514,1,0 +BRDA:6,1515,0,0 +BRDA:6,1515,1,0 +BRDA:6,1516,0,0 +BRDA:6,1516,1,0 +BRDA:6,1517,0,0 +BRDA:6,1517,1,0 +BRDA:6,1518,0,0 +BRDA:6,1518,1,0 +BRDA:6,1519,0,0 +BRDA:6,1519,1,0 +BRDA:6,1520,0,0 +BRDA:6,1520,1,0 +BRDA:6,1521,0,0 +BRDA:6,1521,1,0 +BRDA:6,1522,0,0 +BRDA:6,1522,1,0 +BRDA:6,1523,0,0 +BRDA:6,1523,1,0 +BRDA:6,1524,0,0 +BRDA:6,1524,1,0 +BRDA:6,1525,0,0 +BRDA:6,1525,1,0 +BRDA:6,1526,0,0 +BRDA:6,1526,1,0 +BRDA:6,1527,0,0 +BRDA:6,1527,1,0 +BRDA:6,1528,0,0 +BRDA:6,1528,1,0 +BRDA:6,1529,0,0 +BRDA:6,1529,1,0 +BRDA:6,1530,0,0 +BRDA:6,1530,1,0 +BRDA:6,1531,0,0 +BRDA:6,1531,1,0 +BRDA:6,1532,0,0 +BRDA:6,1532,1,0 +BRDA:6,1533,0,0 +BRDA:6,1533,1,0 +BRDA:6,1534,0,0 +BRDA:6,1534,1,0 +BRDA:6,1535,0,0 +BRDA:6,1535,1,0 +BRDA:6,1536,0,0 +BRDA:6,1536,1,0 +BRDA:6,1537,0,0 +BRDA:6,1537,1,0 +BRDA:6,1538,0,0 +BRDA:6,1538,1,0 +BRDA:6,1539,0,0 +BRDA:6,1539,1,0 +BRDA:6,1540,0,0 +BRDA:6,1540,1,0 +BRDA:6,1541,0,0 +BRDA:6,1541,1,0 +BRDA:6,1542,0,0 +BRDA:6,1542,1,0 +BRDA:6,1543,0,0 +BRDA:6,1543,1,0 +BRDA:6,1544,0,0 +BRDA:6,1544,1,0 +BRDA:6,1545,0,0 +BRDA:6,1545,1,0 +BRDA:6,1546,0,0 +BRDA:6,1546,1,0 +BRDA:6,1546,2,0 +BRDA:6,1547,0,0 +BRDA:6,1547,1,0 +BRDA:6,1548,0,0 +BRDA:6,1548,1,0 +BRDA:6,1548,2,0 +BRDA:6,1548,3,0 +BRDA:6,1549,0,0 +BRDA:6,1549,1,0 +BRDA:6,1550,0,0 +BRDA:6,1550,1,0 +BRDA:6,1551,0,0 +BRDA:6,1551,1,0 +BRDA:6,1552,0,0 +BRDA:6,1552,1,0 +BRDA:6,1553,0,0 +BRDA:6,1553,1,0 +BRDA:6,1554,0,0 +BRDA:6,1554,1,0 +BRDA:6,1555,0,0 +BRDA:6,1555,1,0 +BRDA:6,1556,0,0 +BRDA:6,1556,1,0 +BRDA:6,1557,0,0 +BRDA:6,1557,1,0 +BRDA:6,1558,0,0 +BRDA:6,1558,1,0 +BRDA:6,1559,0,0 +BRDA:6,1559,1,0 +BRDA:6,1560,0,0 +BRDA:6,1560,1,0 +BRDA:6,1561,0,0 +BRDA:6,1561,1,0 +BRDA:6,1562,0,0 +BRDA:6,1562,1,0 +BRDA:6,1563,0,0 +BRDA:6,1563,1,0 +BRDA:6,1564,0,0 +BRDA:6,1564,1,0 +BRDA:6,1565,0,0 +BRDA:6,1565,1,0 +BRDA:6,1566,0,0 +BRDA:6,1566,1,0 +BRDA:6,1566,2,0 +BRDA:6,1566,3,0 +BRDA:6,1567,0,0 +BRDA:6,1567,1,0 +BRDA:6,1568,0,0 +BRDA:6,1568,1,0 +BRDA:6,1569,0,0 +BRDA:6,1569,1,0 +BRDA:6,1570,0,0 +BRDA:6,1570,1,0 +BRDA:6,1571,0,0 +BRDA:6,1571,1,0 +BRDA:6,1572,0,0 +BRDA:6,1572,1,0 +BRDA:6,1573,0,0 +BRDA:6,1573,1,0 +BRDA:6,1574,0,0 +BRDA:6,1574,1,0 +BRDA:6,1575,0,0 +BRDA:6,1575,1,0 +BRDA:6,1576,0,0 +BRDA:6,1576,1,0 +BRDA:6,1577,0,0 +BRDA:6,1577,1,0 +BRDA:6,1578,0,0 +BRDA:6,1578,1,0 +BRDA:6,1579,0,0 +BRDA:6,1579,1,0 +BRDA:6,1580,0,0 +BRDA:6,1580,1,0 +BRDA:6,1581,0,0 +BRDA:6,1581,1,0 +BRDA:6,1582,0,0 +BRDA:6,1582,1,0 +BRDA:6,1583,0,0 +BRDA:6,1583,1,0 +BRDA:6,1584,0,0 +BRDA:6,1584,1,0 +BRDA:6,1585,0,0 +BRDA:6,1585,1,0 +BRDA:6,1586,0,0 +BRDA:6,1586,1,0 +BRDA:6,1587,0,0 +BRDA:6,1587,1,0 +BRDA:6,1588,0,0 +BRDA:6,1588,1,0 +BRDA:6,1589,0,0 +BRDA:6,1589,1,0 +BRDA:6,1590,0,0 +BRDA:6,1590,1,0 +BRDA:6,1591,0,0 +BRDA:6,1591,1,0 +BRDA:6,1592,0,0 +BRDA:6,1592,1,0 +BRDA:6,1593,0,0 +BRDA:6,1593,1,0 +BRDA:6,1594,0,0 +BRDA:6,1594,1,0 +BRDA:6,1595,0,0 +BRDA:6,1595,1,0 +BRDA:6,1596,0,0 +BRDA:6,1596,1,0 +BRDA:6,1597,0,0 +BRDA:6,1597,1,0 +BRDA:6,1598,0,0 +BRDA:6,1598,1,0 +BRDA:6,1599,0,0 +BRDA:6,1599,1,0 +BRDA:6,1600,0,0 +BRDA:6,1600,1,0 +BRDA:6,1601,0,0 +BRDA:6,1601,1,0 +BRDA:6,1602,0,0 +BRDA:6,1602,1,0 +BRDA:6,1603,0,0 +BRDA:6,1603,1,0 +BRDA:6,1604,0,0 +BRDA:6,1604,1,0 +BRDA:6,1605,0,0 +BRDA:6,1605,1,0 +BRDA:6,1606,0,0 +BRDA:6,1606,1,0 +BRDA:6,1607,0,0 +BRDA:6,1607,1,0 +BRDA:6,1607,2,0 +BRDA:6,1608,0,0 +BRDA:6,1608,1,0 +BRDA:6,1609,0,0 +BRDA:6,1609,1,0 +BRDA:6,1610,0,0 +BRDA:6,1610,1,0 +BRDA:6,1611,0,0 +BRDA:6,1611,1,0 +BRDA:6,1612,0,0 +BRDA:6,1612,1,0 +BRDA:6,1613,0,0 +BRDA:6,1613,1,0 +BRDA:6,1613,2,0 +BRDA:6,1614,0,0 +BRDA:6,1614,1,0 +BRDA:6,1615,0,0 +BRDA:6,1615,1,0 +BRDA:6,1615,2,0 +BRDA:6,1615,3,0 +BRDA:6,1616,0,0 +BRDA:6,1616,1,0 +BRDA:6,1617,0,0 +BRDA:6,1617,1,0 +BRDA:6,1618,0,0 +BRDA:6,1618,1,0 +BRDA:6,1619,0,0 +BRDA:6,1619,1,0 +BRDA:6,1620,0,0 +BRDA:6,1620,1,0 +BRDA:6,1621,0,0 +BRDA:6,1621,1,0 +BRDA:6,1622,0,0 +BRDA:6,1622,1,0 +BRDA:6,1623,0,0 +BRDA:6,1623,1,0 +BRDA:6,1624,0,0 +BRDA:6,1624,1,0 +BRDA:6,1625,0,0 +BRDA:6,1625,1,0 +BRDA:6,1626,0,0 +BRDA:6,1626,1,0 +BRDA:6,1627,0,0 +BRDA:6,1627,1,0 +BRDA:6,1628,0,0 +BRDA:6,1628,1,0 +BRDA:6,1629,0,0 +BRDA:6,1629,1,0 +BRDA:6,1630,0,0 +BRDA:6,1630,1,0 +BRDA:6,1631,0,0 +BRDA:6,1631,1,0 +BRDA:6,1632,0,0 +BRDA:6,1632,1,0 +BRDA:6,1633,0,0 +BRDA:6,1633,1,0 +BRDA:6,1633,2,0 +BRDA:6,1634,0,0 +BRDA:6,1634,1,0 +BRDA:6,1635,0,0 +BRDA:6,1635,1,0 +BRDA:6,1635,2,0 +BRDA:6,1636,0,0 +BRDA:6,1636,1,0 +BRDA:6,1637,0,0 +BRDA:6,1637,1,0 +BRDA:6,1638,0,0 +BRDA:6,1638,1,0 +BRDA:6,1639,0,0 +BRDA:6,1639,1,0 +BRDA:6,1640,0,0 +BRDA:6,1640,1,0 +BRDA:6,1641,0,0 +BRDA:6,1641,1,0 +BRDA:6,1642,0,0 +BRDA:6,1642,1,0 +BRDA:6,1643,0,0 +BRDA:6,1643,1,0 +BRDA:6,1643,2,0 +BRDA:6,1643,3,0 +BRDA:6,1644,0,0 +BRDA:6,1644,1,0 +BRDA:6,1645,0,0 +BRDA:6,1645,1,0 +BRDA:6,1646,0,0 +BRDA:6,1646,1,0 +BRDA:6,1647,0,0 +BRDA:6,1647,1,0 +BRDA:6,1648,0,0 +BRDA:6,1648,1,0 +BRDA:6,1649,0,0 +BRDA:6,1649,1,0 +BRDA:6,1650,0,0 +BRDA:6,1650,1,0 +BRDA:6,1651,0,0 +BRDA:6,1651,1,0 +BRDA:6,1652,0,0 +BRDA:6,1652,1,0 +BRDA:6,1653,0,0 +BRDA:6,1653,1,0 +BRDA:6,1654,0,0 +BRDA:6,1654,1,0 +BRDA:6,1655,0,0 +BRDA:6,1655,1,0 +BRDA:6,1656,0,0 +BRDA:6,1656,1,0 +BRDA:6,1657,0,0 +BRDA:6,1657,1,0 +BRDA:6,1658,0,0 +BRDA:6,1658,1,0 +BRDA:6,1659,0,0 +BRDA:6,1659,1,0 +BRDA:6,1659,2,0 +BRDA:6,1660,0,0 +BRDA:6,1660,1,0 +BRDA:6,1661,0,0 +BRDA:6,1661,1,0 +BRDA:6,1662,0,0 +BRDA:6,1662,1,0 +BRDA:6,1663,0,0 +BRDA:6,1663,1,0 +BRDA:6,1664,0,0 +BRDA:6,1664,1,0 +BRDA:6,1665,0,0 +BRDA:6,1665,1,0 +BRDA:6,1666,0,0 +BRDA:6,1666,1,0 +BRDA:6,1667,0,0 +BRDA:6,1667,1,0 +BRDA:6,1668,0,0 +BRDA:6,1668,1,0 +BRDA:6,1669,0,0 +BRDA:6,1669,1,0 +BRDA:6,1670,0,0 +BRDA:6,1670,1,0 +BRDA:6,1671,0,0 +BRDA:6,1671,1,0 +BRDA:6,1672,0,0 +BRDA:6,1672,1,0 +BRDA:6,1673,0,0 +BRDA:6,1673,1,0 +BRDA:6,1674,0,0 +BRDA:6,1674,1,0 +BRDA:6,1675,0,0 +BRDA:6,1675,1,0 +BRDA:6,1676,0,0 +BRDA:6,1676,1,0 +BRDA:6,1676,2,0 +BRDA:6,1677,0,0 +BRDA:6,1677,1,0 +BRDA:6,1678,0,0 +BRDA:6,1678,1,0 +BRDA:6,1678,2,0 +BRDA:6,1679,0,0 +BRDA:6,1679,1,0 +BRDA:6,1680,0,0 +BRDA:6,1680,1,0 +BRDA:6,1681,0,0 +BRDA:6,1681,1,0 +BRDA:6,1682,0,0 +BRDA:6,1682,1,0 +BRDA:6,1683,0,0 +BRDA:6,1683,1,0 +BRDA:6,1683,2,0 +BRDA:6,1684,0,0 +BRDA:6,1684,1,0 +BRDA:6,1685,0,0 +BRDA:6,1685,1,0 +BRDA:6,1685,2,0 +BRDA:6,1685,3,0 +BRDA:6,1686,0,0 +BRDA:6,1686,1,0 +BRDA:6,1687,0,0 +BRDA:6,1687,1,0 +BRDA:6,1687,2,0 +BRDA:6,1687,3,0 +BRDA:6,1687,4,0 +BRDA:6,1688,0,0 +BRDA:6,1688,1,0 +BRDA:6,1689,0,0 +BRDA:6,1689,1,0 +BRDA:6,1690,0,0 +BRDA:6,1690,1,0 +BRDA:6,1691,0,0 +BRDA:6,1691,1,0 +BRDA:6,1692,0,0 +BRDA:6,1692,1,0 +BRDA:6,1693,0,0 +BRDA:6,1693,1,0 +BRDA:6,1694,0,0 +BRDA:6,1694,1,0 +BRDA:6,1695,0,0 +BRDA:6,1695,1,0 +BRDA:6,1696,0,0 +BRDA:6,1696,1,0 +BRDA:6,1697,0,0 +BRDA:6,1697,1,0 +BRDA:6,1698,0,0 +BRDA:6,1698,1,0 +BRDA:6,1699,0,0 +BRDA:6,1699,1,0 +BRDA:6,1700,0,0 +BRDA:6,1700,1,0 +BRDA:6,1701,0,0 +BRDA:6,1701,1,0 +BRDA:6,1702,0,0 +BRDA:6,1702,1,0 +BRDA:6,1703,0,0 +BRDA:6,1703,1,0 +BRDA:6,1704,0,0 +BRDA:6,1704,1,0 +BRDA:6,1705,0,0 +BRDA:6,1705,1,0 +BRDA:6,1706,0,0 +BRDA:6,1706,1,0 +BRDA:6,1707,0,0 +BRDA:6,1707,1,0 +BRDA:6,1708,0,0 +BRDA:6,1708,1,0 +BRDA:6,1709,0,0 +BRDA:6,1709,1,0 +BRDA:6,1710,0,0 +BRDA:6,1710,1,0 +BRDA:6,1711,0,0 +BRDA:6,1711,1,0 +BRDA:6,1712,0,0 +BRDA:6,1712,1,0 +BRDA:6,1713,0,0 +BRDA:6,1713,1,0 +BRDA:6,1714,0,0 +BRDA:6,1714,1,0 +BRDA:6,1715,0,0 +BRDA:6,1715,1,0 +BRDA:6,1716,0,0 +BRDA:6,1716,1,0 +BRDA:6,1717,0,0 +BRDA:6,1717,1,0 +BRDA:6,1718,0,0 +BRDA:6,1718,1,0 +BRDA:6,1719,0,0 +BRDA:6,1719,1,0 +BRDA:6,1720,0,0 +BRDA:6,1720,1,0 +BRDA:6,1721,0,0 +BRDA:6,1721,1,0 +BRDA:6,1722,0,0 +BRDA:6,1722,1,0 +BRDA:6,1723,0,0 +BRDA:6,1723,1,0 +BRDA:6,1724,0,0 +BRDA:6,1724,1,0 +BRDA:6,1725,0,0 +BRDA:6,1725,1,0 +BRDA:6,1726,0,0 +BRDA:6,1726,1,0 +BRDA:6,1727,0,0 +BRDA:6,1727,1,0 +BRDA:6,1728,0,0 +BRDA:6,1728,1,0 +BRDA:6,1729,0,0 +BRDA:6,1729,1,0 +BRDA:6,1730,0,0 +BRDA:6,1730,1,0 +BRDA:6,1731,0,0 +BRDA:6,1731,1,0 +BRDA:6,1732,0,0 +BRDA:6,1732,1,0 +BRDA:6,1733,0,0 +BRDA:6,1733,1,0 +BRDA:6,1734,0,0 +BRDA:6,1734,1,0 +BRDA:6,1735,0,0 +BRDA:6,1735,1,0 +BRDA:6,1736,0,0 +BRDA:6,1736,1,0 +BRDA:6,1737,0,0 +BRDA:6,1737,1,0 +BRDA:6,1738,0,0 +BRDA:6,1738,1,0 +BRDA:6,1739,0,0 +BRDA:6,1739,1,0 +BRDA:6,1740,0,0 +BRDA:6,1740,1,0 +BRDA:6,1741,0,0 +BRDA:6,1741,1,0 +BRDA:6,1742,0,0 +BRDA:6,1742,1,0 +BRDA:6,1743,0,0 +BRDA:6,1743,1,0 +BRDA:6,1744,0,0 +BRDA:6,1744,1,0 +BRDA:6,1745,0,0 +BRDA:6,1745,1,0 +BRDA:6,1746,0,0 +BRDA:6,1746,1,0 +BRDA:6,1747,0,0 +BRDA:6,1747,1,0 +BRDA:6,1748,0,0 +BRDA:6,1748,1,0 +BRDA:6,1748,2,0 +BRDA:6,1748,3,0 +BRDA:6,1748,4,0 +BRDA:6,1748,5,0 +BRDA:6,1748,6,0 +BRDA:6,1748,7,0 +BRDA:6,1748,8,0 +BRDA:6,1748,9,0 +BRDA:6,1748,10,0 +BRDA:6,1748,11,0 +BRDA:6,1748,12,0 +BRDA:6,1748,13,0 +BRDA:6,1748,14,0 +BRDA:6,1749,0,0 +BRDA:6,1749,1,0 +BRDA:6,1750,0,0 +BRDA:6,1750,1,0 +BRDA:6,1750,2,0 +BRDA:6,1750,3,0 +BRDA:6,1750,4,0 +BRDA:6,1750,5,0 +BRDA:6,1750,6,0 +BRDA:6,1750,7,0 +BRDA:6,1750,8,0 +BRDA:6,1750,9,0 +BRDA:6,1750,10,0 +BRDA:6,1750,11,0 +BRDA:6,1750,12,0 +BRDA:6,1750,13,0 +BRDA:6,1750,14,0 +BRDA:6,1751,0,0 +BRDA:6,1751,1,0 +BRDA:6,1752,0,0 +BRDA:6,1752,1,0 +BRDA:6,1753,0,0 +BRDA:6,1753,1,0 +BRDA:6,1754,0,0 +BRDA:6,1754,1,0 +BRDA:6,1754,2,0 +BRDA:6,1755,0,0 +BRDA:6,1755,1,0 +BRDA:6,1755,2,0 +BRDA:6,1756,0,0 +BRDA:6,1756,1,0 +BRDA:6,1757,0,0 +BRDA:6,1757,1,0 +BRDA:6,1758,0,0 +BRDA:6,1758,1,0 +BRDA:6,1759,0,0 +BRDA:6,1759,1,0 +BRDA:6,1760,0,0 +BRDA:6,1760,1,0 +BRDA:6,1761,0,0 +BRDA:6,1761,1,0 +BRDA:6,1762,0,0 +BRDA:6,1762,1,0 +BRDA:6,1763,0,0 +BRDA:6,1763,1,0 +BRDA:6,1764,0,0 +BRDA:6,1764,1,0 +BRDA:6,1765,0,0 +BRDA:6,1765,1,0 +BRDA:6,1766,0,0 +BRDA:6,1766,1,0 +BRDA:6,1766,2,0 +BRDA:6,1767,0,0 +BRDA:6,1767,1,0 +BRDA:6,1768,0,0 +BRDA:6,1768,1,0 +BRDA:6,1769,0,0 +BRDA:6,1769,1,0 +BRDA:6,1770,0,0 +BRDA:6,1770,1,0 +BRDA:6,1771,0,0 +BRDA:6,1771,1,0 +BRDA:6,1772,0,0 +BRDA:6,1772,1,0 +BRDA:6,1773,0,0 +BRDA:6,1773,1,0 +BRDA:6,1774,0,0 +BRDA:6,1774,1,0 +BRDA:6,1775,0,0 +BRDA:6,1775,1,0 +BRDA:6,1776,0,0 +BRDA:6,1776,1,0 +BRDA:6,1776,2,0 +BRDA:6,1777,0,0 +BRDA:6,1777,1,0 +BRDA:6,1778,0,0 +BRDA:6,1778,1,0 +BRDA:6,1779,0,0 +BRDA:6,1779,1,0 +BRDA:6,1780,0,0 +BRDA:6,1780,1,0 +BRDA:6,1781,0,0 +BRDA:6,1781,1,0 +BRDA:6,1781,2,0 +BRDA:6,1781,3,0 +BRDA:6,1781,4,0 +BRDA:6,1781,5,0 +BRDA:6,1781,6,0 +BRDA:6,1781,7,0 +BRDA:6,1782,0,0 +BRDA:6,1782,1,0 +BRDA:6,1783,0,0 +BRDA:6,1783,1,0 +BRDA:6,1784,0,0 +BRDA:6,1784,1,0 +BRDA:6,1784,2,0 +BRDA:6,1785,0,0 +BRDA:6,1785,1,0 +BRDA:6,1786,0,0 +BRDA:6,1786,1,0 +BRDA:6,1787,0,0 +BRDA:6,1787,1,0 +BRDA:6,1787,2,0 +BRDA:6,1788,0,0 +BRDA:6,1788,1,0 +BRDA:6,1789,0,0 +BRDA:6,1789,1,0 +BRDA:6,1790,0,0 +BRDA:6,1790,1,0 +BRDA:6,1791,0,0 +BRDA:6,1791,1,0 +BRDA:6,1792,0,0 +BRDA:6,1792,1,0 +BRDA:6,1793,0,0 +BRDA:6,1793,1,0 +BRDA:6,1793,2,0 +BRDA:6,1794,0,0 +BRDA:6,1794,1,0 +BRDA:6,1795,0,0 +BRDA:6,1795,1,0 +BRDA:6,1796,0,0 +BRDA:6,1796,1,0 +BRDA:6,1797,0,0 +BRDA:6,1797,1,0 +BRDA:6,1797,2,0 +BRDA:6,1797,3,0 +BRDA:6,1797,4,0 +BRDA:6,1798,0,0 +BRDA:6,1798,1,0 +BRDA:6,1799,0,0 +BRDA:6,1799,1,0 +BRDA:6,1800,0,0 +BRDA:6,1800,1,0 +BRDA:6,1801,0,0 +BRDA:6,1801,1,0 +BRDA:6,1801,2,0 +BRDA:6,1802,0,0 +BRDA:6,1802,1,0 +BRDA:6,1803,0,0 +BRDA:6,1803,1,0 +BRDA:6,1804,0,0 +BRDA:6,1804,1,0 +BRDA:6,1805,0,0 +BRDA:6,1805,1,0 +BRDA:6,1806,0,0 +BRDA:6,1806,1,0 +BRDA:6,1807,0,0 +BRDA:6,1807,1,0 +BRDA:6,1808,0,0 +BRDA:6,1808,1,0 +BRDA:6,1809,0,0 +BRDA:6,1809,1,0 +BRDA:6,1810,0,0 +BRDA:6,1810,1,0 +BRDA:6,1810,2,0 +BRDA:6,1811,0,0 +BRDA:6,1811,1,0 +BRDA:6,1811,2,0 +BRDA:6,1812,0,0 +BRDA:6,1812,1,0 +BRDA:6,1812,2,0 +BRDA:6,1812,3,0 +BRDA:6,1813,0,0 +BRDA:6,1813,1,0 +BRDA:6,1814,0,0 +BRDA:6,1814,1,0 +BRDA:6,1815,0,0 +BRDA:6,1815,1,0 +BRDA:6,1816,0,0 +BRDA:6,1816,1,0 +BRDA:6,1817,0,0 +BRDA:6,1817,1,0 +BRDA:6,1818,0,0 +BRDA:6,1818,1,0 +BRDA:6,1819,0,0 +BRDA:6,1819,1,0 +BRDA:6,1820,0,0 +BRDA:6,1820,1,0 +BRDA:6,1821,0,0 +BRDA:6,1821,1,0 +BRDA:6,1822,0,0 +BRDA:6,1822,1,0 +BRDA:6,1823,0,0 +BRDA:6,1823,1,0 +BRDA:6,1824,0,0 +BRDA:6,1824,1,0 +BRDA:6,1825,0,0 +BRDA:6,1825,1,0 +BRDA:6,1826,0,0 +BRDA:6,1826,1,0 +BRDA:6,1827,0,0 +BRDA:6,1827,1,0 +BRDA:6,1827,2,0 +BRDA:6,1827,3,0 +BRDA:6,1828,0,0 +BRDA:6,1828,1,0 +BRDA:6,1829,0,0 +BRDA:6,1829,1,0 +BRDA:6,1830,0,0 +BRDA:6,1830,1,0 +BRDA:6,1831,0,0 +BRDA:6,1831,1,0 +BRDA:6,1831,2,0 +BRDA:6,1832,0,0 +BRDA:6,1832,1,0 +BRDA:6,1833,0,0 +BRDA:6,1833,1,0 +BRDA:6,1834,0,0 +BRDA:6,1834,1,0 +BRDA:6,1835,0,0 +BRDA:6,1835,1,0 +BRDA:6,1836,0,0 +BRDA:6,1836,1,0 +BRDA:6,1837,0,0 +BRDA:6,1837,1,0 +BRDA:6,1838,0,0 +BRDA:6,1838,1,0 +BRDA:6,1839,0,0 +BRDA:6,1839,1,0 +BRDA:6,1840,0,0 +BRDA:6,1840,1,0 +BRDA:6,1841,0,0 +BRDA:6,1841,1,0 +BRDA:6,1842,0,0 +BRDA:6,1842,1,0 +BRDA:6,1843,0,0 +BRDA:6,1843,1,0 +BRDA:6,1844,0,0 +BRDA:6,1844,1,0 +BRDA:6,1845,0,0 +BRDA:6,1845,1,0 +BRDA:6,1846,0,0 +BRDA:6,1846,1,0 +BRDA:6,1847,0,0 +BRDA:6,1847,1,0 +BRDA:6,1848,0,0 +BRDA:6,1848,1,0 +BRDA:6,1849,0,0 +BRDA:6,1849,1,0 +BRDA:6,1850,0,0 +BRDA:6,1850,1,0 +BRDA:6,1851,0,0 +BRDA:6,1851,1,0 +BRDA:6,1852,0,0 +BRDA:6,1852,1,0 +BRDA:6,1853,0,0 +BRDA:6,1853,1,0 +BRDA:6,1854,0,0 +BRDA:6,1854,1,0 +BRDA:6,1855,0,0 +BRDA:6,1855,1,0 +BRDA:6,1856,0,0 +BRDA:6,1856,1,0 +BRDA:6,1857,0,0 +BRDA:6,1857,1,0 +BRDA:6,1857,2,0 +BRDA:6,1858,0,0 +BRDA:6,1858,1,0 +BRDA:6,1859,0,0 +BRDA:6,1859,1,0 +BRDA:6,1860,0,0 +BRDA:6,1860,1,0 +BRDA:6,1861,0,0 +BRDA:6,1861,1,0 +BRDA:6,1862,0,0 +BRDA:6,1862,1,0 +BRDA:6,1862,2,0 +BRDA:6,1863,0,0 +BRDA:6,1863,1,0 +BRDA:6,1864,0,0 +BRDA:6,1864,1,0 +BRDA:6,1865,0,0 +BRDA:6,1865,1,0 +BRDA:6,1865,2,0 +BRDA:6,1866,0,0 +BRDA:6,1866,1,0 +BRDA:6,1866,2,0 +BRDA:6,1867,0,0 +BRDA:6,1867,1,0 +BRDA:6,1868,0,0 +BRDA:6,1868,1,0 +BRDA:6,1869,0,0 +BRDA:6,1869,1,0 +BRDA:6,1870,0,0 +BRDA:6,1870,1,0 +BRDA:6,1871,0,0 +BRDA:6,1871,1,0 +BRDA:6,1872,0,0 +BRDA:6,1872,1,0 +BRDA:6,1873,0,0 +BRDA:6,1873,1,0 +BRDA:6,1874,0,0 +BRDA:6,1874,1,0 +BRDA:6,1875,0,0 +BRDA:6,1875,1,0 +BRDA:6,1876,0,0 +BRDA:6,1876,1,0 +BRDA:6,1877,0,0 +BRDA:6,1877,1,0 +BRDA:6,1878,0,0 +BRDA:6,1878,1,0 +BRDA:6,1879,0,0 +BRDA:6,1879,1,0 +BRDA:6,1880,0,0 +BRDA:6,1880,1,0 +BRDA:6,1881,0,0 +BRDA:6,1881,1,0 +BRDA:6,1882,0,0 +BRDA:6,1882,1,0 +BRDA:6,1882,2,0 +BRDA:6,1883,0,0 +BRDA:6,1883,1,0 +BRDA:6,1884,0,0 +BRDA:6,1884,1,0 +BRDA:6,1885,0,0 +BRDA:6,1885,1,0 +BRDA:6,1885,2,0 +BRDA:6,1885,3,0 +BRDA:6,1885,4,0 +BRDA:6,1885,5,0 +BRDA:6,1885,6,0 +BRDA:6,1885,7,0 +BRDA:6,1885,8,0 +BRDA:6,1885,9,0 +BRDA:6,1885,10,0 +BRDA:6,1886,0,0 +BRDA:6,1886,1,0 +BRDA:6,1887,0,0 +BRDA:6,1887,1,0 +BRDA:6,1888,0,0 +BRDA:6,1888,1,0 +BRDA:6,1889,0,0 +BRDA:6,1889,1,0 +BRDA:6,1890,0,0 +BRDA:6,1890,1,0 +BRDA:6,1891,0,0 +BRDA:6,1891,1,0 +BRDA:6,1892,0,0 +BRDA:6,1892,1,0 +BRDA:6,1893,0,0 +BRDA:6,1893,1,0 +BRDA:6,1894,0,0 +BRDA:6,1894,1,0 +BRDA:6,1895,0,0 +BRDA:6,1895,1,0 +BRDA:6,1896,0,0 +BRDA:6,1896,1,0 +BRDA:6,1897,0,0 +BRDA:6,1897,1,0 +BRDA:6,1898,0,0 +BRDA:6,1898,1,0 +BRDA:6,1899,0,0 +BRDA:6,1899,1,0 +BRDA:6,1900,0,0 +BRDA:6,1900,1,0 +BRDA:6,1901,0,0 +BRDA:6,1901,1,0 +BRDA:6,1902,0,0 +BRDA:6,1902,1,0 +BRDA:6,1903,0,0 +BRDA:6,1903,1,0 +BRDA:6,1904,0,0 +BRDA:6,1904,1,0 +BRDA:6,1905,0,0 +BRDA:6,1905,1,0 +BRDA:6,1906,0,0 +BRDA:6,1906,1,0 +BRDA:6,1907,0,0 +BRDA:6,1907,1,0 +BRDA:6,1908,0,0 +BRDA:6,1908,1,0 +BRDA:6,1909,0,0 +BRDA:6,1909,1,0 +BRDA:6,1910,0,0 +BRDA:6,1910,1,0 +BRDA:6,1910,2,0 +BRDA:6,1910,3,0 +BRDA:6,1910,4,0 +BRDA:6,1911,0,0 +BRDA:6,1911,1,0 +BRDA:6,1911,2,0 +BRDA:6,1911,3,0 +BRDA:6,1912,0,0 +BRDA:6,1912,1,0 +BRDA:6,1913,0,0 +BRDA:6,1913,1,0 +BRDA:6,1914,0,0 +BRDA:6,1914,1,0 +BRDA:6,1915,0,0 +BRDA:6,1915,1,0 +BRDA:6,1916,0,0 +BRDA:6,1916,1,0 +BRDA:6,1917,0,0 +BRDA:6,1917,1,0 +BRDA:6,1918,0,0 +BRDA:6,1918,1,0 +BRDA:6,1919,0,0 +BRDA:6,1919,1,0 +BRDA:6,1920,0,0 +BRDA:6,1920,1,0 +BRDA:6,1921,0,0 +BRDA:6,1921,1,0 +BRDA:6,1922,0,0 +BRDA:6,1922,1,0 +BRDA:6,1923,0,0 +BRDA:6,1923,1,0 +BRDA:6,1923,2,0 +BRDA:6,1923,3,0 +BRDA:6,1924,0,0 +BRDA:6,1924,1,0 +BRDA:6,1925,0,0 +BRDA:6,1925,1,0 +BRDA:6,1926,0,0 +BRDA:6,1926,1,0 +BRDA:6,1927,0,0 +BRDA:6,1927,1,0 +BRDA:6,1928,0,0 +BRDA:6,1928,1,0 +BRDA:6,1929,0,0 +BRDA:6,1929,1,0 +BRDA:6,1930,0,0 +BRDA:6,1930,1,0 +BRDA:6,1930,2,0 +BRDA:6,1930,3,0 +BRDA:6,1930,4,0 +BRDA:6,1931,0,0 +BRDA:6,1931,1,0 +BRDA:6,1931,2,0 +BRDA:6,1931,3,0 +BRDA:6,1932,0,0 +BRDA:6,1932,1,0 +BRDA:6,1933,0,0 +BRDA:6,1933,1,0 +BRDA:6,1934,0,0 +BRDA:6,1934,1,0 +BRDA:6,1934,2,0 +BRDA:6,1934,3,0 +BRDA:6,1934,4,0 +BRDA:6,1934,5,0 +BRDA:6,1934,6,0 +BRDA:6,1934,7,0 +BRDA:6,1934,8,0 +BRDA:6,1934,9,0 +BRDA:6,1934,10,0 +BRDA:6,1934,11,0 +BRDA:6,1934,12,0 +BRDA:6,1934,13,0 +BRDA:6,1934,14,0 +BRDA:6,1934,15,0 +BRDA:6,1934,16,0 +BRDA:6,1934,17,0 +BRDA:6,1934,18,0 +BRDA:6,1935,0,0 +BRDA:6,1935,1,0 +BRDA:6,1936,0,0 +BRDA:6,1936,1,0 +BRDA:6,1937,0,0 +BRDA:6,1937,1,0 +BRDA:6,1938,0,0 +BRDA:6,1938,1,0 +BRDA:6,1938,2,0 +BRDA:6,1939,0,0 +BRDA:6,1939,1,0 +BRDA:6,1939,2,0 +BRDA:6,1940,0,0 +BRDA:6,1940,1,0 +BRDA:6,1941,0,0 +BRDA:6,1941,1,0 +BRDA:6,1941,2,0 +BRDA:6,1941,3,0 +BRDA:6,1941,4,0 +BRDA:6,1941,5,0 +BRDA:6,1942,0,0 +BRDA:6,1942,1,0 +BRDA:6,1943,0,0 +BRDA:6,1943,1,0 +BRDA:6,1944,0,0 +BRDA:6,1944,1,0 +BRDA:6,1945,0,0 +BRDA:6,1945,1,0 +BRDA:6,1946,0,0 +BRDA:6,1946,1,0 +BRDA:6,1947,0,0 +BRDA:6,1947,1,0 +BRDA:6,1948,0,0 +BRDA:6,1948,1,0 +BRDA:6,1949,0,0 +BRDA:6,1949,1,0 +BRDA:6,1949,2,0 +BRDA:6,1949,3,0 +BRDA:6,1949,4,0 +BRDA:6,1950,0,0 +BRDA:6,1950,1,0 +BRDA:6,1950,2,0 +BRDA:6,1950,3,0 +BRDA:6,1951,0,0 +BRDA:6,1951,1,0 +BRDA:6,1952,0,0 +BRDA:6,1952,1,0 +BRDA:6,1952,2,0 +BRDA:6,1952,3,0 +BRDA:6,1953,0,0 +BRDA:6,1953,1,0 +BRDA:6,1954,0,0 +BRDA:6,1954,1,0 +BRDA:6,1955,0,0 +BRDA:6,1955,1,0 +BRDA:6,1956,0,0 +BRDA:6,1956,1,0 +BRDA:6,1957,0,0 +BRDA:6,1957,1,0 +BRDA:6,1958,0,0 +BRDA:6,1958,1,0 +BRDA:6,1959,0,0 +BRDA:6,1959,1,0 +BRDA:6,1959,2,0 +BRDA:6,1960,0,0 +BRDA:6,1960,1,0 +BRDA:6,1961,0,0 +BRDA:6,1961,1,0 +BRDA:6,1962,0,0 +BRDA:6,1962,1,0 +BRDA:6,1962,2,0 +BRDA:6,1963,0,0 +BRDA:6,1963,1,0 +BRDA:6,1964,0,0 +BRDA:6,1964,1,0 +BRDA:6,1964,2,0 +BRDA:6,1964,3,0 +BRDA:6,1964,4,0 +BRDA:6,1964,5,0 +BRDA:6,1964,6,0 +BRDA:6,1964,7,0 +BRDA:6,1965,0,0 +BRDA:6,1965,1,0 +BRDA:6,1966,0,0 +BRDA:6,1966,1,0 +BRDA:6,1967,0,0 +BRDA:6,1967,1,0 +BRDA:6,1968,0,0 +BRDA:6,1968,1,0 +BRDA:6,1969,0,0 +BRDA:6,1969,1,0 +BRDA:6,1970,0,0 +BRDA:6,1970,1,0 +BRDA:6,1971,0,0 +BRDA:6,1971,1,0 +BRDA:6,1972,0,0 +BRDA:6,1972,1,0 +BRDA:6,1973,0,0 +BRDA:6,1973,1,0 +BRDA:6,1974,0,0 +BRDA:6,1974,1,0 +BRDA:6,1975,0,0 +BRDA:6,1975,1,0 +BRDA:6,1976,0,0 +BRDA:6,1976,1,0 +BRDA:6,1977,0,0 +BRDA:6,1977,1,0 +BRDA:6,1978,0,0 +BRDA:6,1978,1,0 +BRDA:6,1979,0,0 +BRDA:6,1979,1,0 +BRDA:6,1980,0,0 +BRDA:6,1980,1,0 +BRDA:6,1981,0,0 +BRDA:6,1981,1,0 +BRDA:6,1982,0,0 +BRDA:6,1982,1,0 +BRDA:6,1983,0,0 +BRDA:6,1983,1,0 +BRDA:6,1984,0,0 +BRDA:6,1984,1,0 +BRDA:6,1985,0,0 +BRDA:6,1985,1,0 +BRDA:6,1986,0,0 +BRDA:6,1986,1,0 +BRDA:6,1987,0,0 +BRDA:6,1987,1,0 +BRDA:6,1988,0,0 +BRDA:6,1988,1,0 +BRDA:6,1989,0,0 +BRDA:6,1989,1,0 +BRDA:6,1990,0,0 +BRDA:6,1990,1,0 +BRDA:6,1991,0,0 +BRDA:6,1991,1,0 +BRDA:6,1991,2,0 +BRDA:6,1992,0,0 +BRDA:6,1992,1,0 +BRDA:6,1993,0,0 +BRDA:6,1993,1,0 +BRDA:6,1994,0,0 +BRDA:6,1994,1,0 +BRDA:6,1995,0,0 +BRDA:6,1995,1,0 +BRDA:6,1996,0,0 +BRDA:6,1996,1,0 +BRDA:6,1997,0,0 +BRDA:6,1997,1,0 +BRDA:6,1998,0,0 +BRDA:6,1998,1,0 +BRDA:6,1999,0,0 +BRDA:6,1999,1,0 +BRDA:6,2000,0,0 +BRDA:6,2000,1,0 +BRDA:6,2001,0,0 +BRDA:6,2001,1,0 +BRDA:6,2002,0,0 +BRDA:6,2002,1,0 +BRDA:6,2003,0,0 +BRDA:6,2003,1,0 +BRDA:6,2004,0,0 +BRDA:6,2004,1,0 +BRDA:6,2005,0,0 +BRDA:6,2005,1,0 +BRDA:6,2006,0,0 +BRDA:6,2006,1,0 +BRDA:6,2007,0,0 +BRDA:6,2007,1,0 +BRDA:6,2008,0,0 +BRDA:6,2008,1,0 +BRDA:6,2009,0,0 +BRDA:6,2009,1,0 +BRDA:6,2010,0,0 +BRDA:6,2010,1,0 +BRDA:6,2011,0,0 +BRDA:6,2011,1,0 +BRDA:6,2012,0,0 +BRDA:6,2012,1,0 +BRDA:6,2013,0,0 +BRDA:6,2013,1,0 +BRDA:6,2014,0,0 +BRDA:6,2014,1,0 +BRDA:6,2015,0,0 +BRDA:6,2015,1,0 +BRDA:6,2016,0,0 +BRDA:6,2016,1,0 +BRDA:6,2017,0,0 +BRDA:6,2017,1,0 +BRDA:6,2017,2,0 +BRDA:6,2017,3,0 +BRDA:6,2018,0,0 +BRDA:6,2018,1,0 +BRDA:6,2019,0,0 +BRDA:6,2019,1,0 +BRDA:6,2020,0,0 +BRDA:6,2020,1,0 +BRDA:6,2021,0,0 +BRDA:6,2021,1,0 +BRDA:6,2022,0,0 +BRDA:6,2022,1,0 +BRDA:6,2023,0,0 +BRDA:6,2023,1,0 +BRDA:6,2024,0,0 +BRDA:6,2024,1,0 +BRDA:6,2025,0,0 +BRDA:6,2025,1,0 +BRDA:6,2026,0,0 +BRDA:6,2026,1,0 +BRDA:6,2027,0,0 +BRDA:6,2027,1,0 +BRDA:6,2028,0,0 +BRDA:6,2028,1,0 +BRDA:6,2029,0,0 +BRDA:6,2029,1,0 +BRDA:6,2030,0,0 +BRDA:6,2030,1,0 +BRDA:6,2031,0,0 +BRDA:6,2031,1,0 +BRDA:6,2032,0,0 +BRDA:6,2032,1,0 +BRDA:6,2033,0,0 +BRDA:6,2033,1,0 +BRDA:6,2034,0,0 +BRDA:6,2034,1,0 +BRDA:6,2035,0,0 +BRDA:6,2035,1,0 +BRDA:6,2036,0,0 +BRDA:6,2036,1,0 +BRDA:6,2037,0,0 +BRDA:6,2037,1,0 +BRDA:6,2038,0,0 +BRDA:6,2038,1,0 +BRDA:6,2039,0,0 +BRDA:6,2039,1,0 +BRDA:6,2040,0,0 +BRDA:6,2040,1,0 +BRDA:6,2041,0,0 +BRDA:6,2041,1,0 +BRDA:6,2042,0,0 +BRDA:6,2042,1,0 +BRDA:6,2043,0,0 +BRDA:6,2043,1,0 +BRDA:6,2044,0,0 +BRDA:6,2044,1,0 +BRDA:6,2045,0,0 +BRDA:6,2045,1,0 +BRDA:6,2046,0,0 +BRDA:6,2046,1,0 +BRDA:6,2047,0,0 +BRDA:6,2047,1,0 +BRDA:6,2048,0,0 +BRDA:6,2048,1,0 +BRDA:6,2049,0,0 +BRDA:6,2049,1,0 +BRDA:6,2050,0,0 +BRDA:6,2050,1,0 +BRDA:6,2051,0,0 +BRDA:6,2051,1,0 +BRDA:6,2052,0,0 +BRDA:6,2052,1,0 +BRDA:6,2052,2,0 +BRDA:6,2052,3,0 +BRDA:6,2053,0,0 +BRDA:6,2053,1,0 +BRDA:6,2054,0,0 +BRDA:6,2054,1,0 +BRDA:6,2054,2,0 +BRDA:6,2054,3,0 +BRDA:6,2055,0,0 +BRDA:6,2055,1,0 +BRDA:6,2056,0,0 +BRDA:6,2056,1,0 +BRDA:6,2056,2,0 +BRDA:6,2056,3,0 +BRDA:6,2057,0,0 +BRDA:6,2057,1,0 +BRDA:6,2058,0,0 +BRDA:6,2058,1,0 +BRDA:6,2059,0,0 +BRDA:6,2059,1,0 +BRDA:6,2060,0,0 +BRDA:6,2060,1,0 +BRDA:6,2061,0,0 +BRDA:6,2061,1,0 +BRDA:6,2062,0,0 +BRDA:6,2062,1,0 +BRDA:6,2063,0,0 +BRDA:6,2063,1,0 +BRDA:6,2064,0,0 +BRDA:6,2064,1,0 +BRDA:6,2064,2,0 +BRDA:6,2065,0,0 +BRDA:6,2065,1,0 +BRDA:6,2066,0,0 +BRDA:6,2066,1,0 +BRDA:6,2067,0,0 +BRDA:6,2067,1,0 +BRDA:6,2068,0,0 +BRDA:6,2068,1,0 +BRDA:6,2069,0,0 +BRDA:6,2069,1,0 +BRDA:6,2070,0,0 +BRDA:6,2070,1,0 +BRDA:6,2071,0,0 +BRDA:6,2071,1,0 +BRDA:6,2072,0,0 +BRDA:6,2072,1,0 +BRDA:6,2073,0,0 +BRDA:6,2073,1,0 +BRDA:6,2074,0,0 +BRDA:6,2074,1,0 +BRDA:6,2075,0,0 +BRDA:6,2075,1,0 +BRDA:6,2076,0,0 +BRDA:6,2076,1,0 +BRDA:6,2077,0,0 +BRDA:6,2077,1,0 +BRDA:6,2078,0,0 +BRDA:6,2078,1,0 +BRDA:6,2079,0,0 +BRDA:6,2079,1,0 +BRDA:6,2080,0,0 +BRDA:6,2080,1,0 +BRDA:6,2081,0,0 +BRDA:6,2081,1,0 +BRDA:6,2082,0,0 +BRDA:6,2082,1,0 +BRDA:6,2083,0,0 +BRDA:6,2083,1,0 +BRDA:6,2084,0,0 +BRDA:6,2084,1,0 +BRDA:6,2085,0,0 +BRDA:6,2085,1,0 +BRDA:6,2086,0,0 +BRDA:6,2086,1,0 +BRDA:6,2087,0,0 +BRDA:6,2087,1,0 +BRDA:6,2088,0,0 +BRDA:6,2088,1,0 +BRDA:6,2089,0,0 +BRDA:6,2089,1,0 +BRDA:6,2090,0,0 +BRDA:6,2090,1,0 +BRDA:6,2091,0,0 +BRDA:6,2091,1,0 +BRDA:6,2092,0,0 +BRDA:6,2092,1,0 +BRDA:6,2093,0,0 +BRDA:6,2093,1,0 +BRDA:6,2094,0,0 +BRDA:6,2094,1,0 +BRDA:6,2095,0,0 +BRDA:6,2095,1,0 +BRDA:6,2096,0,0 +BRDA:6,2096,1,0 +BRDA:6,2097,0,0 +BRDA:6,2097,1,0 +BRDA:6,2098,0,0 +BRDA:6,2098,1,0 +BRDA:6,2099,0,0 +BRDA:6,2099,1,0 +BRDA:6,2100,0,0 +BRDA:6,2100,1,0 +BRDA:6,2101,0,0 +BRDA:6,2101,1,0 +BRDA:6,2102,0,0 +BRDA:6,2102,1,0 +BRDA:6,2103,0,0 +BRDA:6,2103,1,0 +BRDA:6,2104,0,0 +BRDA:6,2104,1,0 +BRDA:6,2105,0,0 +BRDA:6,2105,1,0 +BRDA:6,2106,0,0 +BRDA:6,2106,1,0 +BRDA:6,2107,0,0 +BRDA:6,2107,1,0 +BRDA:6,2108,0,0 +BRDA:6,2108,1,0 +BRDA:6,2109,0,0 +BRDA:6,2109,1,0 +BRDA:6,2110,0,0 +BRDA:6,2110,1,0 +BRDA:6,2111,0,0 +BRDA:6,2111,1,0 +BRDA:6,2112,0,0 +BRDA:6,2112,1,0 +BRDA:6,2113,0,0 +BRDA:6,2113,1,0 +BRDA:6,2114,0,0 +BRDA:6,2114,1,0 +BRDA:6,2115,0,0 +BRDA:6,2115,1,0 +BRDA:6,2116,0,0 +BRDA:6,2116,1,0 +BRDA:6,2117,0,0 +BRDA:6,2117,1,0 +BRDA:6,2117,2,0 +BRDA:6,2118,0,0 +BRDA:6,2118,1,0 +BRDA:6,2119,0,0 +BRDA:6,2119,1,0 +BRDA:6,2120,0,0 +BRDA:6,2120,1,0 +BRDA:6,2121,0,0 +BRDA:6,2121,1,0 +BRDA:6,2122,0,0 +BRDA:6,2122,1,0 +BRDA:6,2123,0,0 +BRDA:6,2123,1,0 +BRDA:6,2124,0,0 +BRDA:6,2124,1,0 +BRDA:6,2125,0,0 +BRDA:6,2125,1,0 +BRDA:6,2126,0,0 +BRDA:6,2126,1,0 +BRDA:6,2127,0,0 +BRDA:6,2127,1,0 +BRDA:6,2128,0,0 +BRDA:6,2128,1,0 +BRDA:6,2129,0,0 +BRDA:6,2129,1,0 +BRDA:6,2130,0,0 +BRDA:6,2130,1,0 +BRDA:6,2131,0,0 +BRDA:6,2131,1,0 +BRDA:6,2132,0,0 +BRDA:6,2132,1,0 +BRDA:6,2133,0,0 +BRDA:6,2133,1,0 +BRDA:6,2134,0,0 +BRDA:6,2134,1,0 +BRDA:6,2135,0,0 +BRDA:6,2135,1,0 +BRDA:6,2136,0,0 +BRDA:6,2136,1,0 +BRDA:6,2137,0,0 +BRDA:6,2137,1,0 +BRDA:6,2138,0,0 +BRDA:6,2138,1,0 +BRDA:6,2139,0,0 +BRDA:6,2139,1,0 +BRDA:6,2140,0,0 +BRDA:6,2140,1,0 +BRDA:6,2141,0,0 +BRDA:6,2141,1,0 +BRDA:6,2142,0,0 +BRDA:6,2142,1,0 +BRDA:6,2143,0,0 +BRDA:6,2143,1,0 +BRDA:7,2144,0,0 +BRDA:7,2144,1,0 +BRDA:7,2145,0,0 +BRDA:7,2145,1,0 +BRDA:7,2146,0,0 +BRDA:7,2146,1,0 +BRDA:7,2147,0,0 +BRDA:7,2147,1,0 +BRDA:7,2148,0,0 +BRDA:7,2148,1,0 +BRDA:7,2149,0,0 +BRDA:7,2149,1,0 +BRDA:7,2150,0,0 +BRDA:7,2150,1,0 +BRDA:7,2150,2,0 +BRDA:7,2151,0,0 +BRDA:7,2151,1,0 +BRDA:7,2152,0,0 +BRDA:7,2152,1,0 +BRDA:7,2153,0,0 +BRDA:7,2153,1,0 +BRDA:7,2154,0,0 +BRDA:7,2154,1,0 +BRDA:7,2155,0,0 +BRDA:7,2155,1,0 +BRDA:7,2156,0,0 +BRDA:7,2156,1,0 +BRDA:7,2157,0,0 +BRDA:7,2157,1,0 +BRDA:7,2158,0,0 +BRDA:7,2158,1,0 +BRDA:7,2159,0,0 +BRDA:7,2159,1,0 +BRDA:7,2160,0,0 +BRDA:7,2160,1,0 +BRDA:7,2161,0,0 +BRDA:7,2161,1,0 +BRDA:7,2162,0,0 +BRDA:7,2162,1,0 +BRDA:7,2163,0,0 +BRDA:7,2163,1,0 +BRDA:7,2163,2,0 +BRDA:7,2163,3,0 +BRDA:7,2163,4,0 +BRDA:7,2164,0,0 +BRDA:7,2164,1,0 +BRDA:7,2165,0,0 +BRDA:7,2165,1,0 +BRDA:7,2166,0,0 +BRDA:7,2166,1,0 +BRDA:7,2167,0,0 +BRDA:7,2167,1,0 +BRDA:7,2168,0,0 +BRDA:7,2168,1,0 +BRDA:7,2169,0,0 +BRDA:7,2169,1,0 +BRDA:7,2170,0,0 +BRDA:7,2170,1,0 +BRDA:7,2171,0,0 +BRDA:7,2171,1,0 +BRDA:7,2172,0,0 +BRDA:7,2172,1,0 +BRDA:7,2173,0,0 +BRDA:7,2173,1,0 +BRDA:7,2174,0,0 +BRDA:7,2174,1,0 +BRDA:7,2175,0,0 +BRDA:7,2175,1,0 +BRDA:7,2176,0,0 +BRDA:7,2176,1,0 +BRDA:7,2177,0,0 +BRDA:7,2177,1,0 +BRDA:7,2178,0,0 +BRDA:7,2178,1,0 +BRDA:7,2179,0,0 +BRDA:7,2179,1,0 +BRDA:7,2180,0,0 +BRDA:7,2180,1,0 +BRDA:7,2180,2,0 +BRDA:7,2181,0,0 +BRDA:7,2181,1,0 +BRDA:7,2182,0,0 +BRDA:7,2182,1,0 +BRDA:7,2183,0,0 +BRDA:7,2183,1,0 +BRDA:7,2184,0,0 +BRDA:7,2184,1,0 +BRDA:7,2185,0,0 +BRDA:7,2185,1,0 +BRDA:7,2186,0,0 +BRDA:7,2186,1,0 +BRDA:7,2186,2,0 +BRDA:7,2186,3,0 +BRDA:7,2187,0,0 +BRDA:7,2187,1,0 +BRDA:7,2188,0,0 +BRDA:7,2188,1,0 +BRDA:7,2189,0,0 +BRDA:7,2189,1,0 +BRDA:7,2190,0,0 +BRDA:7,2190,1,0 +BRDA:7,2191,0,0 +BRDA:7,2191,1,0 +BRDA:7,2192,0,0 +BRDA:7,2192,1,0 +BRDA:7,2193,0,0 +BRDA:7,2193,1,0 +BRDA:7,2194,0,0 +BRDA:7,2194,1,0 +BRDA:7,2195,0,0 +BRDA:7,2195,1,0 +BRDA:7,2196,0,0 +BRDA:7,2196,1,0 +BRDA:7,2197,0,0 +BRDA:7,2197,1,0 +BRDA:7,2198,0,0 +BRDA:7,2198,1,0 +BRDA:7,2199,0,0 +BRDA:7,2199,1,0 +BRDA:7,2200,0,0 +BRDA:7,2200,1,0 +BRDA:7,2201,0,0 +BRDA:7,2201,1,0 +BRDA:7,2201,2,0 +BRDA:7,2202,0,0 +BRDA:7,2202,1,0 +BRDA:7,2202,2,0 +BRDA:7,2203,0,0 +BRDA:7,2203,1,0 +BRDA:7,2204,0,0 +BRDA:7,2204,1,0 +BRDA:7,2204,2,0 +BRDA:7,2204,3,0 +BRDA:7,2205,0,0 +BRDA:7,2205,1,0 +BRDA:7,2205,2,0 +BRDA:7,2206,0,0 +BRDA:7,2206,1,0 +BRDA:7,2207,0,0 +BRDA:7,2207,1,0 +BRDA:7,2208,0,0 +BRDA:7,2208,1,0 +BRDA:7,2208,2,0 +BRDA:7,2208,3,0 +BRDA:7,2208,4,0 +BRDA:7,2208,5,0 +BRDA:7,2208,6,0 +BRDA:7,2209,0,0 +BRDA:7,2209,1,0 +BRDA:7,2210,0,0 +BRDA:7,2210,1,0 +BRDA:7,2211,0,0 +BRDA:7,2211,1,0 +BRDA:7,2212,0,0 +BRDA:7,2212,1,0 +BRDA:7,2213,0,0 +BRDA:7,2213,1,0 +BRDA:7,2214,0,0 +BRDA:7,2214,1,0 +BRDA:7,2215,0,0 +BRDA:7,2215,1,0 +BRDA:7,2216,0,0 +BRDA:7,2216,1,0 +BRDA:7,2217,0,0 +BRDA:7,2217,1,0 +BRDA:7,2217,2,0 +BRDA:7,2217,3,0 +BRDA:7,2217,4,0 +BRDA:7,2218,0,0 +BRDA:7,2218,1,0 +BRDA:7,2219,0,0 +BRDA:7,2219,1,0 +BRDA:7,2220,0,0 +BRDA:7,2220,1,0 +BRDA:7,2220,2,0 +BRDA:7,2220,3,0 +BRDA:7,2221,0,0 +BRDA:7,2221,1,0 +BRDA:7,2222,0,0 +BRDA:7,2222,1,0 +BRDA:7,2222,2,0 +BRDA:7,2222,3,0 +BRDA:7,2223,0,0 +BRDA:7,2223,1,0 +BRDA:7,2223,2,0 +BRDA:7,2224,0,0 +BRDA:7,2224,1,0 +BRDA:7,2225,0,0 +BRDA:7,2225,1,0 +BRDA:7,2226,0,0 +BRDA:7,2226,1,0 +BRDA:7,2227,0,0 +BRDA:7,2227,1,0 +BRDA:7,2228,0,0 +BRDA:7,2228,1,0 +BRDA:7,2229,0,0 +BRDA:7,2229,1,0 +BRDA:7,2229,2,0 +BRDA:7,2230,0,0 +BRDA:7,2230,1,0 +BRDA:7,2231,0,0 +BRDA:7,2231,1,0 +BRDA:7,2232,0,0 +BRDA:7,2232,1,0 +BRDA:7,2233,0,0 +BRDA:7,2233,1,0 +BRDA:7,2234,0,0 +BRDA:7,2234,1,0 +BRDA:7,2234,2,0 +BRDA:7,2235,0,0 +BRDA:7,2235,1,0 +BRDA:7,2235,2,0 +BRDA:7,2236,0,0 +BRDA:7,2236,1,0 +BRDA:7,2236,2,0 +BRDA:7,2236,3,0 +BRDA:7,2237,0,0 +BRDA:7,2237,1,0 +BRDA:7,2237,2,0 +BRDA:7,2238,0,0 +BRDA:7,2238,1,0 +BRDA:7,2239,0,0 +BRDA:7,2239,1,0 +BRDA:7,2240,0,0 +BRDA:7,2240,1,0 +BRDA:7,2241,0,0 +BRDA:7,2241,1,0 +BRDA:7,2242,0,0 +BRDA:7,2242,1,0 +BRDA:7,2243,0,0 +BRDA:7,2243,1,0 +BRDA:7,2244,0,0 +BRDA:7,2244,1,0 +BRDA:7,2245,0,0 +BRDA:7,2245,1,0 +BRDA:7,2246,0,0 +BRDA:7,2246,1,0 +BRDA:7,2247,0,0 +BRDA:7,2247,1,0 +BRDA:7,2248,0,0 +BRDA:7,2248,1,0 +BRDA:7,2249,0,0 +BRDA:7,2249,1,0 +BRDA:7,2250,0,0 +BRDA:7,2250,1,0 +BRDA:7,2251,0,0 +BRDA:7,2251,1,0 +BRDA:7,2252,0,0 +BRDA:7,2252,1,0 +BRDA:7,2253,0,0 +BRDA:7,2253,1,0 +BRDA:7,2254,0,0 +BRDA:7,2254,1,0 +BRDA:7,2255,0,0 +BRDA:7,2255,1,0 +BRDA:7,2256,0,0 +BRDA:7,2256,1,0 +BRDA:7,2257,0,0 +BRDA:7,2257,1,0 +BRDA:7,2258,0,0 +BRDA:7,2258,1,0 +BRDA:7,2259,0,0 +BRDA:7,2259,1,0 +BRDA:7,2260,0,0 +BRDA:7,2260,1,0 +BRDA:7,2261,0,0 +BRDA:7,2261,1,0 +BRDA:7,2262,0,0 +BRDA:7,2262,1,0 +BRDA:7,2263,0,0 +BRDA:7,2263,1,0 +BRDA:7,2264,0,0 +BRDA:7,2264,1,0 +BRDA:7,2265,0,0 +BRDA:7,2265,1,0 +BRDA:7,2266,0,0 +BRDA:7,2266,1,0 +BRDA:7,2267,0,0 +BRDA:7,2267,1,0 +BRDA:7,2268,0,0 +BRDA:7,2268,1,0 +BRDA:7,2269,0,0 +BRDA:7,2269,1,0 +BRDA:7,2270,0,0 +BRDA:7,2270,1,0 +BRDA:7,2271,0,0 +BRDA:7,2271,1,0 +BRDA:7,2272,0,0 +BRDA:7,2272,1,0 +BRDA:7,2273,0,0 +BRDA:7,2273,1,0 +BRDA:7,2274,0,0 +BRDA:7,2274,1,0 +BRDA:7,2275,0,0 +BRDA:7,2275,1,0 +BRDA:7,2276,0,0 +BRDA:7,2276,1,0 +BRDA:7,2277,0,0 +BRDA:7,2277,1,0 +BRDA:7,2278,0,0 +BRDA:7,2278,1,0 +BRDA:7,2279,0,0 +BRDA:7,2279,1,0 +BRDA:7,2280,0,0 +BRDA:7,2280,1,0 +BRDA:7,2281,0,0 +BRDA:7,2281,1,0 +BRDA:7,2282,0,0 +BRDA:7,2282,1,0 +BRDA:7,2283,0,0 +BRDA:7,2283,1,0 +BRDA:7,2284,0,0 +BRDA:7,2284,1,0 +BRDA:7,2285,0,0 +BRDA:7,2285,1,0 +BRDA:7,2286,0,0 +BRDA:7,2286,1,0 +BRDA:7,2287,0,0 +BRDA:7,2287,1,0 +BRDA:7,2288,0,0 +BRDA:7,2288,1,0 +BRDA:7,2289,0,0 +BRDA:7,2289,1,0 +BRDA:7,2290,0,0 +BRDA:7,2290,1,0 +BRDA:7,2290,2,0 +BRDA:7,2291,0,0 +BRDA:7,2291,1,0 +BRDA:7,2292,0,0 +BRDA:7,2292,1,0 +BRDA:7,2293,0,0 +BRDA:7,2293,1,0 +BRDA:7,2294,0,0 +BRDA:7,2294,1,0 +BRDA:7,2295,0,0 +BRDA:7,2295,1,0 +BRDA:7,2296,0,0 +BRDA:7,2296,1,0 +BRDA:7,2297,0,0 +BRDA:7,2297,1,0 +BRDA:7,2298,0,0 +BRDA:7,2298,1,0 +BRDA:7,2299,0,0 +BRDA:7,2299,1,0 +BRDA:7,2300,0,0 +BRDA:7,2300,1,0 +BRDA:7,2301,0,0 +BRDA:7,2301,1,0 +BRDA:7,2302,0,0 +BRDA:7,2302,1,0 +BRDA:7,2303,0,0 +BRDA:7,2303,1,0 +BRDA:7,2304,0,0 +BRDA:7,2304,1,0 +BRDA:7,2305,0,0 +BRDA:7,2305,1,0 +BRDA:7,2306,0,0 +BRDA:7,2306,1,0 +BRDA:7,2307,0,0 +BRDA:7,2307,1,0 +BRDA:7,2308,0,0 +BRDA:7,2308,1,0 +BRDA:7,2309,0,0 +BRDA:7,2309,1,0 +BRDA:7,2310,0,0 +BRDA:7,2310,1,0 +BRDA:7,2311,0,0 +BRDA:7,2311,1,0 +BRDA:7,2311,2,0 +BRDA:7,2311,3,0 +BRDA:7,2312,0,0 +BRDA:7,2312,1,0 +BRDA:7,2313,0,0 +BRDA:7,2313,1,0 +BRDA:7,2314,0,0 +BRDA:7,2314,1,0 +BRDA:7,2315,0,0 +BRDA:7,2315,1,0 +BRDA:7,2316,0,0 +BRDA:7,2316,1,0 +BRDA:7,2317,0,0 +BRDA:7,2317,1,0 +BRDA:7,2318,0,0 +BRDA:7,2318,1,0 +BRDA:7,2319,0,0 +BRDA:7,2319,1,0 +BRDA:7,2319,2,0 +BRDA:7,2320,0,0 +BRDA:7,2320,1,0 +BRDA:7,2321,0,0 +BRDA:7,2321,1,0 +BRDA:7,2322,0,0 +BRDA:7,2322,1,0 +BRDA:7,2323,0,0 +BRDA:7,2323,1,0 +BRDA:7,2324,0,0 +BRDA:7,2324,1,0 +BRDA:7,2325,0,0 +BRDA:7,2325,1,0 +BRDA:7,2326,0,0 +BRDA:7,2326,1,0 +BRDA:7,2327,0,0 +BRDA:7,2327,1,0 +BRDA:7,2328,0,0 +BRDA:7,2328,1,0 +BRDA:7,2329,0,0 +BRDA:7,2329,1,0 +BRDA:7,2330,0,0 +BRDA:7,2330,1,0 +BRDA:7,2331,0,0 +BRDA:7,2331,1,0 +BRDA:7,2332,0,0 +BRDA:7,2332,1,0 +BRDA:7,2333,0,0 +BRDA:7,2333,1,0 +BRDA:7,2334,0,0 +BRDA:7,2334,1,0 +BRDA:7,2335,0,0 +BRDA:7,2335,1,0 +BRDA:7,2336,0,0 +BRDA:7,2336,1,0 +BRDA:7,2337,0,0 +BRDA:7,2337,1,0 +BRDA:7,2338,0,0 +BRDA:7,2338,1,0 +BRDA:7,2339,0,0 +BRDA:7,2339,1,0 +BRDA:7,2340,0,0 +BRDA:7,2340,1,0 +BRDA:7,2341,0,0 +BRDA:7,2341,1,0 +BRDA:7,2342,0,0 +BRDA:7,2342,1,0 +BRDA:7,2343,0,0 +BRDA:7,2343,1,0 +BRDA:7,2343,2,0 +BRDA:7,2343,3,0 +BRDA:7,2344,0,0 +BRDA:7,2344,1,0 +BRDA:7,2345,0,0 +BRDA:7,2345,1,0 +BRDA:7,2346,0,0 +BRDA:7,2346,1,0 +BRDA:7,2347,0,0 +BRDA:7,2347,1,0 +BRDA:7,2347,2,0 +BRDA:7,2347,3,0 +BRDA:7,2347,4,0 +BRDA:7,2348,0,0 +BRDA:7,2348,1,0 +BRDA:7,2349,0,0 +BRDA:7,2349,1,0 +BRDA:7,2350,0,0 +BRDA:7,2350,1,0 +BRDA:7,2350,2,0 +BRDA:7,2351,0,0 +BRDA:7,2351,1,0 +BRDA:7,2352,0,0 +BRDA:7,2352,1,0 +BRDA:7,2353,0,0 +BRDA:7,2353,1,0 +BRDA:7,2354,0,0 +BRDA:7,2354,1,0 +BRDA:7,2355,0,0 +BRDA:7,2355,1,0 +BRDA:7,2356,0,0 +BRDA:7,2356,1,0 +BRDA:7,2357,0,0 +BRDA:7,2357,1,0 +BRDA:7,2358,0,0 +BRDA:7,2358,1,0 +BRDA:7,2359,0,0 +BRDA:7,2359,1,0 +BRDA:7,2360,0,0 +BRDA:7,2360,1,0 +BRDA:7,2361,0,0 +BRDA:7,2361,1,0 +BRDA:7,2362,0,0 +BRDA:7,2362,1,0 +BRDA:7,2363,0,0 +BRDA:7,2363,1,0 +BRDA:7,2364,0,0 +BRDA:7,2364,1,0 +BRDA:7,2365,0,0 +BRDA:7,2365,1,0 +BRDA:7,2366,0,0 +BRDA:7,2366,1,0 +BRDA:7,2367,0,0 +BRDA:7,2367,1,0 +BRDA:7,2368,0,0 +BRDA:7,2368,1,0 +BRDA:7,2368,2,0 +BRDA:7,2369,0,0 +BRDA:7,2369,1,0 +BRDA:7,2370,0,0 +BRDA:7,2370,1,0 +BRDA:7,2371,0,0 +BRDA:7,2371,1,0 +BRDA:7,2372,0,0 +BRDA:7,2372,1,0 +BRDA:7,2372,2,0 +BRDA:7,2373,0,0 +BRDA:7,2373,1,0 +BRDA:7,2374,0,0 +BRDA:7,2374,1,0 +BRDA:7,2375,0,0 +BRDA:7,2375,1,0 +BRDA:7,2376,0,0 +BRDA:7,2376,1,0 +BRDA:7,2376,2,0 +BRDA:7,2377,0,0 +BRDA:7,2377,1,0 +BRDA:7,2378,0,0 +BRDA:7,2378,1,0 +BRDA:7,2379,0,0 +BRDA:7,2379,1,0 +BRDA:7,2380,0,0 +BRDA:7,2380,1,0 +BRDA:7,2381,0,0 +BRDA:7,2381,1,0 +BRDA:7,2382,0,0 +BRDA:7,2382,1,0 +BRDA:7,2383,0,0 +BRDA:7,2383,1,0 +BRDA:7,2384,0,0 +BRDA:7,2384,1,0 +BRDA:7,2385,0,0 +BRDA:7,2385,1,0 +BRDA:7,2386,0,0 +BRDA:7,2386,1,0 +BRDA:7,2387,0,0 +BRDA:7,2387,1,0 +BRDA:7,2388,0,0 +BRDA:7,2388,1,0 +BRDA:7,2389,0,0 +BRDA:7,2389,1,0 +BRDA:7,2390,0,0 +BRDA:7,2390,1,0 +BRDA:7,2391,0,0 +BRDA:7,2391,1,0 +BRDA:7,2392,0,0 +BRDA:7,2392,1,0 +BRDA:7,2393,0,0 +BRDA:7,2393,1,0 +BRDA:7,2394,0,0 +BRDA:7,2394,1,0 +BRDA:7,2395,0,0 +BRDA:7,2395,1,0 +BRDA:7,2396,0,0 +BRDA:7,2396,1,0 +BRDA:7,2397,0,0 +BRDA:7,2397,1,0 +BRDA:7,2398,0,0 +BRDA:7,2398,1,0 +BRDA:7,2399,0,0 +BRDA:7,2399,1,0 +BRDA:7,2400,0,0 +BRDA:7,2400,1,0 +BRDA:7,2401,0,0 +BRDA:7,2401,1,0 +BRDA:7,2402,0,0 +BRDA:7,2402,1,0 +BRDA:7,2403,0,0 +BRDA:7,2403,1,0 +BRDA:7,2404,0,0 +BRDA:7,2404,1,0 +BRDA:7,2405,0,0 +BRDA:7,2405,1,0 +BRDA:7,2406,0,0 +BRDA:7,2406,1,0 +BRDA:7,2407,0,0 +BRDA:7,2407,1,0 +BRDA:7,2408,0,0 +BRDA:7,2408,1,0 +BRDA:7,2408,2,0 +BRDA:7,2408,3,0 +BRDA:7,2408,4,0 +BRDA:7,2409,0,0 +BRDA:7,2409,1,0 +BRDA:7,2409,2,0 +BRDA:7,2410,0,0 +BRDA:7,2410,1,0 +BRDA:7,2411,0,0 +BRDA:7,2411,1,0 +BRDA:7,2412,0,0 +BRDA:7,2412,1,0 +BRDA:7,2413,0,0 +BRDA:7,2413,1,0 +BRDA:7,2414,0,0 +BRDA:7,2414,1,0 +BRDA:7,2415,0,0 +BRDA:7,2415,1,0 +BRDA:7,2416,0,0 +BRDA:7,2416,1,0 +BRDA:7,2417,0,0 +BRDA:7,2417,1,0 +BRDA:7,2418,0,0 +BRDA:7,2418,1,0 +BRDA:7,2419,0,0 +BRDA:7,2419,1,0 +BRDA:7,2420,0,0 +BRDA:7,2420,1,0 +BRDA:7,2421,0,0 +BRDA:7,2421,1,0 +BRDA:7,2422,0,0 +BRDA:7,2422,1,0 +BRDA:7,2423,0,0 +BRDA:7,2423,1,0 +BRDA:7,2424,0,0 +BRDA:7,2424,1,0 +BRDA:7,2425,0,0 +BRDA:7,2425,1,0 +BRDA:7,2426,0,0 +BRDA:7,2426,1,0 +BRDA:7,2427,0,0 +BRDA:7,2427,1,0 +BRDA:7,2428,0,0 +BRDA:7,2428,1,0 +BRDA:7,2429,0,0 +BRDA:7,2429,1,0 +BRDA:7,2430,0,0 +BRDA:7,2430,1,0 +BRDA:7,2431,0,0 +BRDA:7,2431,1,0 +BRDA:7,2432,0,0 +BRDA:7,2432,1,0 +BRDA:7,2433,0,0 +BRDA:7,2433,1,0 +BRDA:7,2433,2,0 +BRDA:7,2433,3,0 +BRDA:7,2434,0,0 +BRDA:7,2434,1,0 +BRDA:7,2435,0,0 +BRDA:7,2435,1,0 +BRDA:7,2436,0,0 +BRDA:7,2436,1,0 +BRDA:7,2437,0,0 +BRDA:7,2437,1,0 +BRDA:7,2438,0,0 +BRDA:7,2438,1,0 +BRDA:7,2439,0,0 +BRDA:7,2439,1,0 +BRDA:7,2440,0,0 +BRDA:7,2440,1,0 +BRDA:7,2441,0,0 +BRDA:7,2441,1,0 +BRDA:7,2441,2,0 +BRDA:7,2442,0,0 +BRDA:7,2442,1,0 +BRDA:7,2443,0,0 +BRDA:7,2443,1,0 +BRDA:7,2444,0,0 +BRDA:7,2444,1,0 +BRDA:7,2445,0,0 +BRDA:7,2445,1,0 +BRDA:7,2446,0,0 +BRDA:7,2446,1,0 +BRDA:7,2447,0,0 +BRDA:7,2447,1,0 +BRDA:7,2448,0,0 +BRDA:7,2448,1,0 +BRDA:7,2449,0,0 +BRDA:7,2449,1,0 +BRDA:7,2450,0,0 +BRDA:7,2450,1,0 +BRDA:7,2451,0,0 +BRDA:7,2451,1,0 +BRDA:7,2452,0,0 +BRDA:7,2452,1,0 +BRDA:7,2453,0,0 +BRDA:7,2453,1,0 +BRDA:7,2454,0,0 +BRDA:7,2454,1,0 +BRDA:7,2455,0,0 +BRDA:7,2455,1,0 +BRDA:7,2456,0,0 +BRDA:7,2456,1,0 +BRDA:7,2457,0,0 +BRDA:7,2457,1,0 +BRDA:7,2458,0,0 +BRDA:7,2458,1,0 +BRDA:7,2459,0,0 +BRDA:7,2459,1,0 +BRDA:7,2459,2,0 +BRDA:7,2459,3,0 +BRDA:7,2459,4,0 +BRDA:7,2459,5,0 +BRDA:7,2459,6,0 +BRDA:7,2459,7,0 +BRDA:7,2459,8,0 +BRDA:7,2459,9,0 +BRDA:7,2459,10,0 +BRDA:7,2460,0,0 +BRDA:7,2460,1,0 +BRDA:7,2461,0,0 +BRDA:7,2461,1,0 +BRDA:7,2462,0,0 +BRDA:7,2462,1,0 +BRDA:7,2463,0,0 +BRDA:7,2463,1,0 +BRDA:7,2463,2,0 +BRDA:7,2463,3,0 +BRDA:7,2463,4,0 +BRDA:7,2464,0,0 +BRDA:7,2464,1,0 +BRDA:7,2465,0,0 +BRDA:7,2465,1,0 +BRDA:7,2466,0,0 +BRDA:7,2466,1,0 +BRDA:7,2467,0,0 +BRDA:7,2467,1,0 +BRDA:7,2468,0,0 +BRDA:7,2468,1,0 +BRDA:7,2469,0,0 +BRDA:7,2469,1,0 +BRDA:7,2470,0,0 +BRDA:7,2470,1,0 +BRDA:7,2471,0,0 +BRDA:7,2471,1,0 +BRDA:7,2472,0,0 +BRDA:7,2472,1,0 +BRDA:7,2473,0,0 +BRDA:7,2473,1,0 +BRDA:7,2474,0,0 +BRDA:7,2474,1,0 +BRDA:7,2475,0,0 +BRDA:7,2475,1,0 +BRDA:7,2476,0,0 +BRDA:7,2476,1,0 +BRDA:7,2477,0,0 +BRDA:7,2477,1,0 +BRDA:7,2478,0,0 +BRDA:7,2478,1,0 +BRDA:7,2479,0,0 +BRDA:7,2479,1,0 +BRDA:7,2480,0,0 +BRDA:7,2480,1,0 +BRDA:7,2481,0,0 +BRDA:7,2481,1,0 +BRDA:7,2482,0,0 +BRDA:7,2482,1,0 +BRDA:7,2483,0,0 +BRDA:7,2483,1,0 +BRDA:7,2484,0,0 +BRDA:7,2484,1,0 +BRDA:7,2485,0,0 +BRDA:7,2485,1,0 +BRDA:7,2486,0,0 +BRDA:7,2486,1,0 +BRDA:7,2487,0,0 +BRDA:7,2487,1,0 +BRDA:7,2488,0,0 +BRDA:7,2488,1,0 +BRDA:7,2489,0,0 +BRDA:7,2489,1,0 +BRDA:7,2490,0,0 +BRDA:7,2490,1,0 +BRDA:7,2491,0,0 +BRDA:7,2491,1,0 +BRDA:7,2492,0,0 +BRDA:7,2492,1,0 +BRDA:7,2493,0,0 +BRDA:7,2493,1,0 +BRDA:7,2494,0,0 +BRDA:7,2494,1,0 +BRDA:7,2494,2,0 +BRDA:7,2495,0,0 +BRDA:7,2495,1,0 +BRDA:7,2496,0,0 +BRDA:7,2496,1,0 +BRDA:7,2497,0,0 +BRDA:7,2497,1,0 +BRDA:7,2497,2,0 +BRDA:7,2498,0,0 +BRDA:7,2498,1,0 +BRDA:7,2499,0,0 +BRDA:7,2499,1,0 +BRDA:7,2500,0,0 +BRDA:7,2500,1,0 +BRDA:7,2501,0,0 +BRDA:7,2501,1,0 +BRDA:7,2502,0,0 +BRDA:7,2502,1,0 +BRDA:7,2503,0,0 +BRDA:7,2503,1,0 +BRDA:7,2504,0,0 +BRDA:7,2504,1,0 +BRDA:7,2505,0,0 +BRDA:7,2505,1,0 +BRDA:7,2506,0,0 +BRDA:7,2506,1,0 +BRDA:7,2506,2,0 +BRDA:7,2507,0,0 +BRDA:7,2507,1,0 +BRDA:7,2508,0,0 +BRDA:7,2508,1,0 +BRDA:7,2509,0,0 +BRDA:7,2509,1,0 +BRDA:7,2510,0,0 +BRDA:7,2510,1,0 +BRDA:7,2511,0,0 +BRDA:7,2511,1,0 +BRDA:7,2512,0,0 +BRDA:7,2512,1,0 +BRDA:7,2513,0,0 +BRDA:7,2513,1,0 +BRDA:7,2514,0,0 +BRDA:7,2514,1,0 +BRDA:7,2514,2,0 +BRDA:7,2515,0,0 +BRDA:7,2515,1,0 +BRDA:7,2516,0,0 +BRDA:7,2516,1,0 +BRDA:7,2517,0,0 +BRDA:7,2517,1,0 +BRDA:7,2518,0,0 +BRDA:7,2518,1,0 +BRDA:7,2519,0,0 +BRDA:7,2519,1,0 +BRDA:7,2520,0,0 +BRDA:7,2520,1,0 +BRDA:7,2521,0,0 +BRDA:7,2521,1,0 +BRDA:7,2522,0,0 +BRDA:7,2522,1,0 +BRDA:7,2523,0,0 +BRDA:7,2523,1,0 +BRDA:7,2524,0,0 +BRDA:7,2524,1,0 +BRDA:7,2525,0,0 +BRDA:7,2525,1,0 +BRDA:7,2526,0,0 +BRDA:7,2526,1,0 +BRDA:7,2527,0,0 +BRDA:7,2527,1,0 +BRDA:7,2528,0,0 +BRDA:7,2528,1,0 +BRDA:7,2529,0,0 +BRDA:7,2529,1,0 +BRDA:7,2530,0,0 +BRDA:7,2530,1,0 +BRDA:7,2531,0,0 +BRDA:7,2531,1,0 +BRDA:7,2532,0,0 +BRDA:7,2532,1,0 +BRDA:7,2533,0,0 +BRDA:7,2533,1,0 +BRDA:7,2534,0,0 +BRDA:7,2534,1,0 +BRDA:7,2535,0,0 +BRDA:7,2535,1,0 +BRDA:7,2536,0,0 +BRDA:7,2536,1,0 +BRDA:7,2537,0,0 +BRDA:7,2537,1,0 +BRDA:7,2538,0,0 +BRDA:7,2538,1,0 +BRDA:7,2539,0,0 +BRDA:7,2539,1,0 +BRDA:7,2540,0,0 +BRDA:7,2540,1,0 +BRDA:7,2541,0,0 +BRDA:7,2541,1,0 +BRDA:7,2542,0,0 +BRDA:7,2542,1,0 +BRDA:7,2543,0,0 +BRDA:7,2543,1,0 +BRDA:7,2544,0,0 +BRDA:7,2544,1,0 +BRDA:7,2545,0,0 +BRDA:7,2545,1,0 +BRDA:7,2546,0,0 +BRDA:7,2546,1,0 +BRDA:7,2547,0,0 +BRDA:7,2547,1,0 +BRDA:7,2548,0,0 +BRDA:7,2548,1,0 +BRDA:7,2549,0,0 +BRDA:7,2549,1,0 +BRDA:7,2550,0,0 +BRDA:7,2550,1,0 +BRDA:7,2550,2,0 +BRDA:7,2551,0,0 +BRDA:7,2551,1,0 +BRDA:7,2552,0,0 +BRDA:7,2552,1,0 +BRDA:7,2553,0,0 +BRDA:7,2553,1,0 +BRDA:7,2554,0,0 +BRDA:7,2554,1,0 +BRDA:7,2555,0,0 +BRDA:7,2555,1,0 +BRDA:7,2556,0,0 +BRDA:7,2556,1,0 +BRDA:7,2557,0,0 +BRDA:7,2557,1,0 +BRDA:7,2558,0,0 +BRDA:7,2558,1,0 +BRDA:7,2559,0,0 +BRDA:7,2559,1,0 +BRDA:7,2560,0,0 +BRDA:7,2560,1,0 +BRDA:7,2561,0,0 +BRDA:7,2561,1,0 +BRDA:7,2562,0,0 +BRDA:7,2562,1,0 +BRDA:7,2563,0,0 +BRDA:7,2563,1,0 +BRDA:7,2563,2,0 +BRDA:7,2563,3,0 +BRDA:7,2563,4,0 +BRDA:7,2564,0,0 +BRDA:7,2564,1,0 +BRDA:7,2565,0,0 +BRDA:7,2565,1,0 +BRDA:7,2566,0,0 +BRDA:7,2566,1,0 +BRDA:7,2567,0,0 +BRDA:7,2567,1,0 +BRDA:7,2568,0,0 +BRDA:7,2568,1,0 +BRDA:7,2569,0,0 +BRDA:7,2569,1,0 +BRDA:7,2570,0,0 +BRDA:7,2570,1,0 +BRDA:7,2571,0,0 +BRDA:7,2571,1,0 +BRDA:7,2572,0,0 +BRDA:7,2572,1,0 +BRDA:7,2573,0,0 +BRDA:7,2573,1,0 +BRDA:7,2574,0,0 +BRDA:7,2574,1,0 +BRDA:7,2575,0,0 +BRDA:7,2575,1,0 +BRDA:7,2576,0,0 +BRDA:7,2576,1,0 +BRDA:7,2577,0,0 +BRDA:7,2577,1,0 +BRDA:7,2578,0,0 +BRDA:7,2578,1,0 +BRDA:7,2579,0,0 +BRDA:7,2579,1,0 +BRDA:7,2580,0,0 +BRDA:7,2580,1,0 +BRDA:7,2581,0,0 +BRDA:7,2581,1,0 +BRDA:7,2582,0,0 +BRDA:7,2582,1,0 +BRDA:7,2582,2,0 +BRDA:7,2583,0,0 +BRDA:7,2583,1,0 +BRDA:7,2584,0,0 +BRDA:7,2584,1,0 +BRDA:7,2585,0,0 +BRDA:7,2585,1,0 +BRDA:7,2586,0,0 +BRDA:7,2586,1,0 +BRDA:7,2587,0,0 +BRDA:7,2587,1,0 +BRDA:7,2588,0,0 +BRDA:7,2588,1,0 +BRDA:7,2588,2,0 +BRDA:7,2589,0,0 +BRDA:7,2589,1,0 +BRDA:7,2590,0,0 +BRDA:7,2590,1,0 +BRDA:7,2591,0,0 +BRDA:7,2591,1,0 +BRDA:7,2592,0,0 +BRDA:7,2592,1,0 +BRDA:7,2593,0,0 +BRDA:7,2593,1,0 +BRDA:7,2594,0,0 +BRDA:7,2594,1,0 +BRDA:7,2595,0,0 +BRDA:7,2595,1,0 +BRDA:7,2596,0,0 +BRDA:7,2596,1,0 +BRDA:7,2597,0,0 +BRDA:7,2597,1,0 +BRDA:7,2597,2,0 +BRDA:7,2597,3,0 +BRDA:7,2597,4,0 +BRF:5826 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/csv2json.js +FNF:0 +FNH:0 +DA:2,0 +DA:5,0 +DA:6,0 +LF:3 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/CSVError.js +FN:3,CSVError +FN:13,(anonymous_1) +FN:17,(anonymous_2) +FN:21,(anonymous_3) +FN:25,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,CSVError +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:1,0 +DA:2,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:11,0 +DA:13,0 +DA:14,0 +DA:17,0 +DA:18,0 +DA:21,0 +DA:22,0 +DA:25,0 +DA:26,0 +LF:17 +LH:0 +BRDA:8,0,0,0 +BRDA:8,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/Converter.js +FN:15,Converter +FN:49,(anonymous_1) +FN:79,emitDone +FN:80,(anonymous_3) +FN:83,(anonymous_4) +FN:91,bufFromString +FN:100,(anonymous_6) +FN:122,(anonymous_7) +FN:142,(anonymous_8) +FN:151,(anonymous_9) +FN:163,(anonymous_10) +FN:167,(anonymous_11) +FN:202,(anonymous_12) +FN:216,(anonymous_13) +FN:225,(anonymous_14) +FN:230,(anonymous_15) +FN:238,(anonymous_16) +FN:243,(anonymous_17) +FN:272,(anonymous_18) +FN:341,configIgnoreIncludeColumns +FN:354,(anonymous_20) +FN:373,(anonymous_21) +FN:384,(anonymous_22) +FN:436,(anonymous_23) +FN:441,(anonymous_24) +FN:445,(anonymous_25) +FN:447,(anonymous_26) +FN:462,(anonymous_27) +FN:471,(anonymous_28) +FN:479,(anonymous_29) +FN:487,(anonymous_30) +FN:508,(anonymous_31) +FN:515,(anonymous_32) +FN:520,(anonymous_33) +FN:531,(anonymous_34) +FN:539,(anonymous_35) +FN:544,(anonymous_36) +FN:551,(anonymous_37) +FN:556,(anonymous_38) +FN:569,(anonymous_39) +FN:571,(anonymous_40) +FN:574,(anonymous_41) +FN:580,(anonymous_42) +FNF:43 +FNH:0 +FNDA:0,Converter +FNDA:0,(anonymous_1) +FNDA:0,emitDone +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,bufFromString +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,configIgnoreIncludeColumns +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:0,(anonymous_32) +FNDA:0,(anonymous_33) +FNDA:0,(anonymous_34) +FNDA:0,(anonymous_35) +FNDA:0,(anonymous_36) +FNDA:0,(anonymous_37) +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_39) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_41) +FNDA:0,(anonymous_42) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:53,0 +DA:54,0 +DA:56,0 +DA:57,0 +DA:59,0 +DA:60,0 +DA:62,0 +DA:63,0 +DA:65,0 +DA:66,0 +DA:68,0 +DA:69,0 +DA:72,0 +DA:75,0 +DA:78,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:92,0 +DA:93,0 +DA:96,0 +DA:97,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:115,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:126,0 +DA:128,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:146,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:156,0 +DA:158,0 +DA:163,0 +DA:164,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:172,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:181,0 +DA:182,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:193,0 +DA:197,0 +DA:198,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:209,0 +DA:210,0 +DA:213,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:253,0 +DA:254,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:265,0 +DA:269,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:278,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:291,0 +DA:292,0 +DA:293,0 +DA:294,0 +DA:296,0 +DA:300,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:305,0 +DA:306,0 +DA:307,0 +DA:309,0 +DA:312,0 +DA:313,0 +DA:315,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:323,0 +DA:324,0 +DA:325,0 +DA:326,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:332,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:339,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:347,0 +DA:348,0 +DA:350,0 +DA:354,0 +DA:356,0 +DA:357,0 +DA:358,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:364,0 +DA:369,0 +DA:370,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:377,0 +DA:379,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:387,0 +DA:388,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:394,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:406,0 +DA:407,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:413,0 +DA:415,0 +DA:416,0 +DA:418,0 +DA:419,0 +DA:421,0 +DA:422,0 +DA:424,0 +DA:425,0 +DA:427,0 +DA:428,0 +DA:429,0 +DA:431,0 +DA:436,0 +DA:437,0 +DA:441,0 +DA:442,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:452,0 +DA:453,0 +DA:454,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:462,0 +DA:463,0 +DA:466,0 +DA:468,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:475,0 +DA:476,0 +DA:478,0 +DA:479,0 +DA:480,0 +DA:483,0 +DA:487,0 +DA:488,0 +DA:489,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:494,0 +DA:496,0 +DA:497,0 +DA:498,0 +DA:499,0 +DA:502,0 +DA:505,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:511,0 +DA:512,0 +DA:513,0 +DA:515,0 +DA:516,0 +DA:517,0 +DA:520,0 +DA:521,0 +DA:522,0 +DA:523,0 +DA:525,0 +DA:528,0 +DA:531,0 +DA:532,0 +DA:533,0 +DA:535,0 +DA:536,0 +DA:539,0 +DA:540,0 +DA:541,0 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:550,0 +DA:551,0 +DA:554,0 +DA:555,0 +DA:556,0 +DA:557,0 +DA:558,0 +DA:560,0 +DA:561,0 +DA:562,0 +DA:565,0 +DA:566,0 +DA:569,0 +DA:570,0 +DA:571,0 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:585,0 +DA:589,0 +LF:374 +LH:0 +BRDA:17,0,0,0 +BRDA:17,0,1,0 +BRDA:29,1,0,0 +BRDA:29,1,1,0 +BRDA:50,2,0,0 +BRDA:50,2,1,0 +BRDA:53,3,0,0 +BRDA:53,3,1,0 +BRDA:56,4,0,0 +BRDA:56,4,1,0 +BRDA:59,5,0,0 +BRDA:59,5,1,0 +BRDA:62,6,0,0 +BRDA:62,6,1,0 +BRDA:65,7,0,0 +BRDA:65,7,1,0 +BRDA:66,8,0,0 +BRDA:66,8,1,0 +BRDA:66,8,2,0 +BRDA:66,8,3,0 +BRDA:66,8,4,0 +BRDA:68,9,0,0 +BRDA:68,9,1,0 +BRDA:69,10,0,0 +BRDA:69,10,1,0 +BRDA:72,11,0,0 +BRDA:72,11,1,0 +BRDA:81,12,0,0 +BRDA:81,12,1,0 +BRDA:93,13,0,0 +BRDA:93,13,1,0 +BRDA:111,14,0,0 +BRDA:111,14,1,0 +BRDA:117,15,0,0 +BRDA:117,15,1,0 +BRDA:123,16,0,0 +BRDA:123,16,1,0 +BRDA:132,17,0,0 +BRDA:132,17,1,0 +BRDA:135,18,0,0 +BRDA:135,18,1,0 +BRDA:136,19,0,0 +BRDA:136,19,1,0 +BRDA:143,20,0,0 +BRDA:143,20,1,0 +BRDA:143,21,0,0 +BRDA:143,21,1,0 +BRDA:152,22,0,0 +BRDA:152,22,1,0 +BRDA:152,23,0,0 +BRDA:152,23,1,0 +BRDA:153,24,0,0 +BRDA:153,24,1,0 +BRDA:169,25,0,0 +BRDA:169,25,1,0 +BRDA:169,26,0,0 +BRDA:169,26,1,0 +BRDA:174,27,0,0 +BRDA:174,27,1,0 +BRDA:177,28,0,0 +BRDA:177,28,1,0 +BRDA:178,29,0,0 +BRDA:178,29,1,0 +BRDA:178,30,0,0 +BRDA:178,30,1,0 +BRDA:181,31,0,0 +BRDA:181,31,1,0 +BRDA:184,32,0,0 +BRDA:184,32,1,0 +BRDA:206,33,0,0 +BRDA:206,33,1,0 +BRDA:218,34,0,0 +BRDA:218,34,1,0 +BRDA:246,35,0,0 +BRDA:246,35,1,0 +BRDA:249,36,0,0 +BRDA:249,36,1,0 +BRDA:258,37,0,0 +BRDA:258,37,1,0 +BRDA:274,38,0,0 +BRDA:274,38,1,0 +BRDA:283,39,0,0 +BRDA:283,39,1,0 +BRDA:288,40,0,0 +BRDA:288,40,1,0 +BRDA:291,41,0,0 +BRDA:291,41,1,0 +BRDA:301,42,0,0 +BRDA:301,42,1,0 +BRDA:301,43,0,0 +BRDA:301,43,1,0 +BRDA:305,44,0,0 +BRDA:305,44,1,0 +BRDA:306,45,0,0 +BRDA:306,45,1,0 +BRDA:312,46,0,0 +BRDA:312,46,1,0 +BRDA:320,47,0,0 +BRDA:320,47,1,0 +BRDA:320,48,0,0 +BRDA:320,48,1,0 +BRDA:325,49,0,0 +BRDA:325,49,1,0 +BRDA:329,50,0,0 +BRDA:329,50,1,0 +BRDA:342,51,0,0 +BRDA:342,51,1,0 +BRDA:345,52,0,0 +BRDA:345,52,1,0 +BRDA:347,53,0,0 +BRDA:347,53,1,0 +BRDA:356,54,0,0 +BRDA:356,54,1,0 +BRDA:359,55,0,0 +BRDA:359,55,1,0 +BRDA:361,56,0,0 +BRDA:361,56,1,0 +BRDA:376,57,0,0 +BRDA:376,57,1,0 +BRDA:391,58,0,0 +BRDA:391,58,1,0 +BRDA:396,59,0,0 +BRDA:396,59,1,0 +BRDA:396,60,0,0 +BRDA:396,60,1,0 +BRDA:398,61,0,0 +BRDA:398,61,1,0 +BRDA:402,62,0,0 +BRDA:402,62,1,0 +BRDA:402,63,0,0 +BRDA:402,63,1,0 +BRDA:406,64,0,0 +BRDA:406,64,1,0 +BRDA:409,65,0,0 +BRDA:409,65,1,0 +BRDA:410,66,0,0 +BRDA:410,66,1,0 +BRDA:415,67,0,0 +BRDA:415,67,1,0 +BRDA:415,68,0,0 +BRDA:415,68,1,0 +BRDA:418,69,0,0 +BRDA:418,69,1,0 +BRDA:421,70,0,0 +BRDA:421,70,1,0 +BRDA:421,71,0,0 +BRDA:421,71,1,0 +BRDA:421,71,2,0 +BRDA:424,72,0,0 +BRDA:424,72,1,0 +BRDA:424,73,0,0 +BRDA:424,73,1,0 +BRDA:427,74,0,0 +BRDA:427,74,1,0 +BRDA:428,75,0,0 +BRDA:428,75,1,0 +BRDA:431,76,0,0 +BRDA:431,76,1,0 +BRDA:449,77,0,0 +BRDA:449,77,1,0 +BRDA:453,78,0,0 +BRDA:453,78,1,0 +BRDA:457,79,0,0 +BRDA:457,79,1,0 +BRDA:459,80,0,0 +BRDA:459,80,1,0 +BRDA:472,81,0,0 +BRDA:472,81,1,0 +BRDA:475,82,0,0 +BRDA:475,82,1,0 +BRDA:475,83,0,0 +BRDA:475,83,1,0 +BRDA:478,84,0,0 +BRDA:478,84,1,0 +BRDA:478,85,0,0 +BRDA:478,85,1,0 +BRDA:488,86,0,0 +BRDA:488,86,1,0 +BRDA:488,87,0,0 +BRDA:488,87,1,0 +BRDA:490,88,0,0 +BRDA:490,88,1,0 +BRDA:491,89,0,0 +BRDA:491,89,1,0 +BRDA:497,90,0,0 +BRDA:497,90,1,0 +BRDA:505,91,0,0 +BRDA:505,91,1,0 +BRDA:511,92,0,0 +BRDA:511,92,1,0 +BRDA:511,93,0,0 +BRDA:511,93,1,0 +BRDA:516,94,0,0 +BRDA:516,94,1,0 +BRDA:516,95,0,0 +BRDA:516,95,1,0 +BRDA:521,96,0,0 +BRDA:521,96,1,0 +BRDA:532,97,0,0 +BRDA:532,97,1,0 +BRDA:532,98,0,0 +BRDA:532,98,1,0 +BRDA:545,99,0,0 +BRDA:545,99,1,0 +BRDA:546,100,0,0 +BRDA:546,100,1,0 +BRDA:546,101,0,0 +BRDA:546,101,1,0 +BRDA:550,102,0,0 +BRDA:550,102,1,0 +BRDA:550,103,0,0 +BRDA:550,103,1,0 +BRDA:557,104,0,0 +BRDA:557,104,1,0 +BRDA:570,105,0,0 +BRDA:570,105,1,0 +BRDA:573,106,0,0 +BRDA:573,106,1,0 +BRDA:573,107,0,0 +BRDA:573,107,1,0 +BRDA:575,108,0,0 +BRDA:575,108,1,0 +BRDA:582,109,0,0 +BRDA:582,109,1,0 +BRDA:582,110,0,0 +BRDA:582,110,1,0 +BRF:226 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/csvline.js +FN:9,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,0 +DA:2,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:22,0 +LF:13 +LH:0 +BRDA:15,0,0,0 +BRDA:15,0,1,0 +BRDA:15,1,0,0 +BRDA:15,1,1,0 +BRDA:19,2,0,0 +BRDA:19,2,1,0 +BRF:6 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/dataToCSVLine.js +FN:9,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,0 +DA:2,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +LF:7 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defParam.js +FN:2,(anonymous_0) +FN:53,(anonymous_1) +FN:61,getEnv +FNF:3 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,getEnv +DA:1,0 +DA:2,0 +DA:3,0 +DA:31,0 +DA:32,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:39,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:47,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:58,0 +DA:62,0 +DA:63,0 +DA:65,0 +LF:22 +LH:0 +BRDA:31,0,0,0 +BRDA:31,0,1,0 +BRDA:35,1,0,0 +BRDA:35,1,1,0 +BRDA:36,2,0,0 +BRDA:36,2,1,0 +BRDA:43,3,0,0 +BRDA:43,3,1,0 +BRDA:43,4,0,0 +BRDA:43,4,1,0 +BRDA:46,5,0,0 +BRDA:46,5,1,0 +BRDA:46,6,0,0 +BRDA:46,6,1,0 +BRDA:50,7,0,0 +BRDA:50,7,1,0 +BRDA:50,8,0,0 +BRDA:50,8,1,0 +BRDA:52,9,0,0 +BRDA:52,9,1,0 +BRDA:62,10,0,0 +BRDA:62,10,1,0 +BRF:22 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/fileLineToCSVLine.js +FN:8,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +LF:5 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/fileline.js +FN:8,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:1,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +LF:6 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/filterRow.js +FN:1,filterRow +FNF:1 +FNH:0 +FNDA:0,filterRow +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:16,0 +DA:18,0 +LF:12 +LH:0 +BRDA:2,0,0,0 +BRDA:2,0,1,0 +BRDA:2,1,0,0 +BRDA:2,1,1,0 +BRDA:4,2,0,0 +BRDA:4,2,1,0 +BRDA:9,3,0,0 +BRDA:9,3,1,0 +BRDA:9,4,0,0 +BRDA:9,4,1,0 +BRDA:12,5,0,0 +BRDA:12,5,1,0 +BRF:12 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/getDelimiter.js +FN:3,getDelimiter +FN:14,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,getDelimiter +FNDA:0,(anonymous_1) +DA:1,0 +DA:2,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:10,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:21,0 +LF:15 +LH:0 +BRDA:5,0,0,0 +BRDA:5,0,1,0 +BRDA:7,1,0,0 +BRDA:7,1,1,0 +BRDA:16,2,0,0 +BRDA:16,2,1,0 +BRF:6 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/getEol.js +FN:3,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:19,0 +LF:14 +LH:0 +BRDA:4,0,0,0 +BRDA:4,0,1,0 +BRDA:4,1,0,0 +BRDA:4,1,1,0 +BRDA:6,2,0,0 +BRDA:6,2,1,0 +BRDA:7,3,0,0 +BRDA:7,3,1,0 +BRDA:9,4,0,0 +BRDA:9,4,1,0 +BRDA:13,5,0,0 +BRDA:13,5,1,0 +BRF:12 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/index.js +FN:4,constructor +FNF:1 +FNH:0 +FNDA:0,constructor +DA:1,0 +DA:2,0 +DA:5,0 +LF:3 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/linesToJson.js +FN:11,(anonymous_0) +FN:26,justReturnRows +FN:39,processRows +FN:50,processRow +FN:71,convertRowToJson +FN:121,(anonymous_5) +FN:123,getConvFunc +FN:146,setPath +FN:156,getFlag +FN:168,getTitle +FN:178,checkType +FN:192,numberType +FN:200,stringType +FN:204,dynamicType +FN:220,booleanType +FN:229,jsonType +FNF:16 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,justReturnRows +FNDA:0,processRows +FNDA:0,processRow +FNDA:0,convertRowToJson +FNDA:0,(anonymous_5) +FNDA:0,getConvFunc +FNDA:0,setPath +FNDA:0,getFlag +FNDA:0,getTitle +FNDA:0,checkType +FNDA:0,numberType +FNDA:0,stringType +FNDA:0,dynamicType +FNDA:0,booleanType +FNDA:0,jsonType +DA:1,0 +DA:2,0 +DA:3,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:20,0 +DA:22,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:36,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:47,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:67,0 +DA:72,0 +DA:73,0 +DA:75,0 +DA:77,0 +DA:79,0 +DA:80,0 +DA:82,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:107,0 +DA:111,0 +DA:112,0 +DA:114,0 +DA:118,0 +DA:124,0 +DA:125,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:137,0 +DA:139,0 +DA:140,0 +DA:142,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:152,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:164,0 +DA:169,0 +DA:170,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:188,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:197,0 +DA:201,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:216,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:225,0 +DA:230,0 +DA:231,0 +DA:233,0 +LF:121 +LH:0 +BRDA:12,0,0,0 +BRDA:12,0,1,0 +BRDA:13,1,0,0 +BRDA:13,1,1,0 +BRDA:13,2,0,0 +BRDA:13,2,1,0 +BRDA:16,3,0,0 +BRDA:16,3,1,0 +BRDA:43,4,0,0 +BRDA:43,4,1,0 +BRDA:52,5,0,0 +BRDA:52,5,1,0 +BRDA:52,6,0,0 +BRDA:52,6,1,0 +BRDA:60,7,0,0 +BRDA:60,7,1,0 +BRDA:79,8,0,0 +BRDA:79,8,1,0 +BRDA:79,9,0,0 +BRDA:79,9,1,0 +BRDA:85,10,0,0 +BRDA:85,10,1,0 +BRDA:85,11,0,0 +BRDA:85,11,1,0 +BRDA:89,12,0,0 +BRDA:89,12,1,0 +BRDA:91,13,0,0 +BRDA:91,13,1,0 +BRDA:96,14,0,0 +BRDA:96,14,1,0 +BRDA:99,15,0,0 +BRDA:99,15,1,0 +BRDA:104,16,0,0 +BRDA:104,16,1,0 +BRDA:104,17,0,0 +BRDA:104,17,1,0 +BRDA:111,18,0,0 +BRDA:111,18,1,0 +BRDA:124,19,0,0 +BRDA:124,19,1,0 +BRDA:128,20,0,0 +BRDA:128,20,1,0 +BRDA:131,21,0,0 +BRDA:131,21,1,0 +BRDA:134,22,0,0 +BRDA:134,22,1,0 +BRDA:139,23,0,0 +BRDA:139,23,1,0 +BRDA:149,24,0,0 +BRDA:149,24,1,0 +BRDA:157,25,0,0 +BRDA:157,25,1,0 +BRDA:159,26,0,0 +BRDA:159,26,1,0 +BRDA:161,27,0,0 +BRDA:161,27,1,0 +BRDA:169,28,0,0 +BRDA:169,28,1,0 +BRDA:179,29,0,0 +BRDA:179,29,1,0 +BRDA:181,30,0,0 +BRDA:181,30,1,0 +BRDA:183,31,0,0 +BRDA:183,31,1,0 +BRDA:185,32,0,0 +BRDA:185,32,1,0 +BRDA:194,33,0,0 +BRDA:194,33,1,0 +BRDA:206,34,0,0 +BRDA:206,34,1,0 +BRDA:209,35,0,0 +BRDA:209,35,1,0 +BRDA:211,36,0,0 +BRDA:211,36,1,0 +BRDA:211,37,0,0 +BRDA:211,37,1,0 +BRDA:211,37,2,0 +BRDA:211,37,3,0 +BRDA:213,38,0,0 +BRDA:213,38,1,0 +BRDA:213,39,0,0 +BRDA:213,39,1,0 +BRDA:213,39,2,0 +BRDA:213,39,3,0 +BRDA:222,40,0,0 +BRDA:222,40,1,0 +BRDA:222,41,0,0 +BRDA:222,41,1,0 +BRF:88 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/parser.js +FN:3,Parser +FN:20,(anonymous_1) +FN:53,(anonymous_2) +FN:57,(anonymous_3) +FN:61,(anonymous_4) +FN:65,(anonymous_5) +FN:78,(anonymous_6) +FN:82,(anonymous_7) +FN:103,(anonymous_8) +FN:112,(anonymous_9) +FNF:10 +FNH:0 +FNDA:0,Parser +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +DA:1,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:15,0 +DA:16,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:44,0 +DA:47,0 +DA:50,0 +DA:53,0 +DA:54,0 +DA:57,0 +DA:58,0 +DA:61,0 +DA:62,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:74,0 +DA:78,0 +DA:79,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:95,0 +DA:98,0 +DA:99,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:109,0 +DA:112,0 +DA:113,0 +DA:116,0 +LF:72 +LH:0 +BRDA:4,0,0,0 +BRDA:4,0,1,0 +BRDA:8,1,0,0 +BRDA:8,1,1,0 +BRDA:9,2,0,0 +BRDA:9,2,1,0 +BRDA:15,3,0,0 +BRDA:15,3,1,0 +BRDA:22,4,0,0 +BRDA:22,4,1,0 +BRDA:24,5,0,0 +BRDA:24,5,1,0 +BRDA:29,6,0,0 +BRDA:29,6,1,0 +BRDA:29,7,0,0 +BRDA:29,7,1,0 +BRDA:29,7,2,0 +BRDA:31,8,0,0 +BRDA:31,8,1,0 +BRDA:34,9,0,0 +BRDA:34,9,1,0 +BRDA:36,10,0,0 +BRDA:36,10,1,0 +BRDA:36,11,0,0 +BRDA:36,11,1,0 +BRDA:38,12,0,0 +BRDA:38,12,1,0 +BRDA:38,13,0,0 +BRDA:38,13,1,0 +BRDA:40,14,0,0 +BRDA:40,14,1,0 +BRDA:40,15,0,0 +BRDA:40,15,1,0 +BRDA:40,15,2,0 +BRDA:40,15,3,0 +BRDA:58,16,0,0 +BRDA:58,16,1,0 +BRDA:66,17,0,0 +BRDA:66,17,1,0 +BRDA:71,18,0,0 +BRDA:71,18,1,0 +BRDA:87,19,0,0 +BRDA:87,19,1,0 +BRDA:91,20,0,0 +BRDA:91,20,1,0 +BRDA:98,21,0,0 +BRDA:98,21,1,0 +BRDA:99,22,0,0 +BRDA:99,22,1,0 +BRF:49 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/parserMgr.js +FN:6,registerParser +FN:12,getParser +FN:14,getParserByName +FN:16,(anonymous_3) +FN:28,(anonymous_4) +FN:44,addParser +FN:49,addSafeParser +FN:53,initParsers +FN:55,(anonymous_8) +FN:61,(anonymous_9) +FNF:10 +FNH:0 +FNDA:0,registerParser +FNDA:0,getParser +FNDA:0,getParserByName +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,addParser +FNDA:0,addSafeParser +FNDA:0,initParsers +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +DA:2,0 +DA:3,0 +DA:4,0 +DA:7,0 +DA:8,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:45,0 +DA:46,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:58,0 +DA:61,0 +DA:63,0 +DA:67,0 +DA:68,0 +DA:69,0 +LF:34 +LH:0 +BRDA:7,0,0,0 +BRDA:7,0,1,0 +BRDA:7,1,0,0 +BRDA:7,1,1,0 +BRDA:17,2,0,0 +BRDA:17,2,1,0 +BRDA:21,3,0,0 +BRDA:21,3,1,0 +BRDA:27,4,0,0 +BRDA:27,4,1,0 +BRDA:29,5,0,0 +BRDA:29,5,1,0 +BRDA:33,6,0,0 +BRDA:33,6,1,0 +BRF:14 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/rowSplit.js +FN:10,rowSplit +FN:89,isQuoteOpen +FN:96,isQuoteClose +FN:108,twoDoubleQuote +FN:118,_escapeQuote +FNF:5 +FNH:0 +FNDA:0,rowSplit +FNDA:0,isQuoteOpen +FNDA:0,isQuoteClose +FNDA:0,twoDoubleQuote +FNDA:0,_escapeQuote +DA:1,0 +DA:2,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:48,0 +DA:49,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:60,0 +DA:61,0 +DA:63,0 +DA:68,0 +DA:69,0 +DA:72,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:105,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:114,0 +DA:117,0 +DA:120,0 +DA:121,0 +DA:126,0 +DA:128,0 +DA:130,0 +LF:70 +LH:0 +BRDA:11,0,0,0 +BRDA:11,0,1,0 +BRDA:17,1,0,0 +BRDA:17,1,1,0 +BRDA:17,2,0,0 +BRDA:17,2,1,0 +BRDA:22,3,0,0 +BRDA:22,3,1,0 +BRDA:30,4,0,0 +BRDA:30,4,1,0 +BRDA:30,5,0,0 +BRDA:30,5,1,0 +BRDA:34,6,0,0 +BRDA:34,6,1,0 +BRDA:35,7,0,0 +BRDA:35,7,1,0 +BRDA:37,8,0,0 +BRDA:37,8,1,0 +BRDA:52,9,0,0 +BRDA:52,9,1,0 +BRDA:57,10,0,0 +BRDA:57,10,1,0 +BRDA:68,11,0,0 +BRDA:68,11,1,0 +BRDA:68,12,0,0 +BRDA:68,12,1,0 +BRDA:92,13,0,0 +BRDA:92,13,1,0 +BRDA:92,13,2,0 +BRDA:92,13,3,0 +BRDA:92,13,4,0 +BRDA:101,14,0,0 +BRDA:101,14,1,0 +BRDA:121,15,0,0 +BRDA:121,15,1,0 +BRF:35 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/worker.js +FN:17,(anonymous_0) +FN:28,processMsg +FN:45,initParams +FN:54,processData +FN:75,(anonymous_4) +FN:82,sendData +FNF:6 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,processMsg +FNDA:0,initParams +FNDA:0,processData +FNDA:0,(anonymous_4) +FNDA:0,sendData +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:24,0 +DA:27,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:34,0 +DA:35,0 +DA:37,0 +DA:38,0 +DA:40,0 +DA:46,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:77,0 +DA:79,0 +DA:83,0 +LF:45 +LH:0 +BRDA:29,0,0,0 +BRDA:29,0,1,0 +BRDA:32,1,0,0 +BRDA:32,1,1,0 +BRDA:32,1,2,0 +BRDA:55,2,0,0 +BRDA:55,2,1,0 +BRDA:66,3,0,0 +BRDA:66,3,1,0 +BRDA:67,4,0,0 +BRDA:67,4,1,0 +BRDA:76,5,0,0 +BRDA:76,5,1,0 +BRF:13 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/workerMgr.js +FN:6,workerMgr +FN:12,(anonymous_1) +FN:19,initWorker +FN:28,isRunning +FN:31,destroyWorker +FN:32,(anonymous_5) +FN:37,sendWorker +FN:41,(anonymous_7) +FN:62,setParams +FN:63,(anonymous_9) +FN:70,Worker +FN:83,(anonymous_11) +FN:94,(anonymous_12) +FN:104,(anonymous_13) +FN:122,(anonymous_14) +FN:138,(anonymous_15) +FN:144,(anonymous_16) +FN:148,(anonymous_17) +FNF:18 +FNH:0 +FNDA:0,workerMgr +FNDA:0,(anonymous_1) +FNDA:0,initWorker +FNDA:0,isRunning +FNDA:0,destroyWorker +FNDA:0,(anonymous_5) +FNDA:0,sendWorker +FNDA:0,(anonymous_7) +FNDA:0,setParams +FNDA:0,(anonymous_9) +FNDA:0,Worker +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:7,0 +DA:8,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:29,0 +DA:32,0 +DA:33,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:56,0 +DA:58,0 +DA:63,0 +DA:64,0 +DA:67,0 +DA:71,0 +DA:72,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:116,0 +DA:118,0 +DA:119,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:131,0 +DA:133,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:144,0 +DA:145,0 +DA:148,0 +DA:149,0 +LF:79 +LH:0 +BRDA:38,0,0,0 +BRDA:38,0,1,0 +BRDA:49,1,0,0 +BRDA:49,1,1,0 +BRDA:49,2,0,0 +BRDA:49,2,1,0 +BRDA:51,3,0,0 +BRDA:51,3,1,0 +BRDA:105,4,0,0 +BRDA:105,4,1,0 +BRDA:108,5,0,0 +BRDA:108,5,1,0 +BRDA:110,6,0,0 +BRDA:110,6,1,0 +BRDA:118,7,0,0 +BRDA:118,7,1,0 +BRDA:127,8,0,0 +BRDA:127,8,1,0 +BRF:18 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/index.js +FNF:0 +FNH:0 +DA:1,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_array.js +FN:5,parser_array +FNF:1 +FNH:0 +FNDA:0,parser_array +DA:1,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:10,0 +LF:5 +LH:0 +BRDA:7,0,0,0 +BRDA:7,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_flat.js +FN:5,parser_flat +FNF:1 +FNH:0 +FNDA:0,parser_flat +DA:1,0 +DA:6,0 +DA:7,0 +DA:8,0 +LF:4 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_json.js +FN:4,processHead +FN:36,parser_json +FNF:2 +FNH:0 +FNDA:0,processHead +FNDA:0,parser_json +DA:1,0 +DA:6,0 +DA:7,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:30,0 +DA:32,0 +DA:37,0 +DA:38,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:55,0 +DA:57,0 +DA:60,0 +DA:63,0 +DA:64,0 +DA:66,0 +LF:39 +LH:0 +BRDA:9,0,0,0 +BRDA:9,0,1,0 +BRDA:10,1,0,0 +BRDA:10,1,1,0 +BRDA:11,2,0,0 +BRDA:11,2,1,0 +BRDA:16,3,0,0 +BRDA:16,3,1,0 +BRDA:19,4,0,0 +BRDA:19,4,1,0 +BRDA:24,5,0,0 +BRDA:24,5,1,0 +BRDA:38,6,0,0 +BRDA:38,6,1,0 +BRDA:38,7,0,0 +BRDA:38,7,1,0 +BRDA:41,8,0,0 +BRDA:41,8,1,0 +BRDA:43,9,0,0 +BRDA:43,9,1,0 +BRDA:43,10,0,0 +BRDA:43,10,1,0 +BRDA:44,11,0,0 +BRDA:44,11,1,0 +BRDA:47,12,0,0 +BRDA:47,12,1,0 +BRDA:47,13,0,0 +BRDA:47,13,1,0 +BRDA:50,14,0,0 +BRDA:50,14,1,0 +BRDA:52,15,0,0 +BRDA:52,15,1,0 +BRDA:63,16,0,0 +BRDA:63,16,1,0 +BRF:34 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_jsonarray.js +FN:5,parser_jsonarray +FNF:1 +FNH:0 +FNDA:0,parser_jsonarray +DA:1,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:14,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:20,0 +LF:13 +LH:0 +BRDA:11,0,0,0 +BRDA:11,0,1,0 +BRDA:17,1,0,0 +BRDA:17,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/core/defaultParsers/parser_omit.js +FN:5,parser_omit +FNF:1 +FNH:0 +FNDA:0,parser_omit +DA:1,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/interfaces/index.js +FNF:0 +FNH:0 +DA:1,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/interfaces/cli/index.js +FNF:0 +FNH:0 +DA:1,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/libs/interfaces/cli/main.js +FN:7,_initConverter +FN:11,(anonymous_1) +FN:22,(anonymous_2) +FN:25,(anonymous_3) +FN:31,convertFile +FN:36,convertString +FNF:6 +FNH:0 +FNDA:0,_initConverter +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,convertFile +FNDA:0,convertString +DA:6,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:29,0 +DA:32,0 +DA:33,0 +DA:37,0 +DA:38,0 +DA:41,0 +DA:42,0 +LF:23 +LH:0 +BRDA:12,0,0,0 +BRDA:12,0,1,0 +BRDA:16,1,0,0 +BRDA:16,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/CSVError.ts +FN:2,(anonymous_5) +FN:12,CSVError +FN:3,(anonymous_7) +FN:6,(anonymous_8) +FN:9,(anonymous_9) +FN:20,(anonymous_10) +FNF:6 +FNH:4 +FNDA:1,(anonymous_5) +FNDA:6,CSVError +FNDA:2,(anonymous_7) +FNDA:4,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,2 +DA:6,1 +DA:7,4 +DA:9,1 +DA:10,0 +DA:13,6 +DA:14,6 +DA:15,6 +DA:17,6 +DA:18,6 +DA:20,1 +DA:21,0 +DA:23,1 +LF:16 +LH:14 +BRDA:17,0,0,6 +BRDA:17,0,1,0 +BRDA:17,1,0,4 +BRDA:17,1,1,2 +BRF:4 +BRH:3 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/Converter.ts +FN:17,(anonymous_6) +FN:102,Converter +FN:112,(anonymous_8) +FN:115,(anonymous_9) +FN:18,(anonymous_10) +FN:21,(anonymous_11) +FN:24,(anonymous_12) +FN:35,(anonymous_13) +FN:43,(anonymous_14) +FN:53,(anonymous_15) +FN:57,(anonymous_16) +FN:61,(anonymous_17) +FN:72,(anonymous_18) +FN:73,(anonymous_19) +FN:75,(anonymous_20) +FN:82,(anonymous_21) +FN:92,(anonymous_22) +FN:95,(anonymous_23) +FN:123,(anonymous_24) +FN:125,(anonymous_25) +FN:131,(anonymous_26) +FN:133,(anonymous_27) +FN:140,(anonymous_28) +FN:145,(anonymous_29) +FN:150,(anonymous_30) +FN:158,(anonymous_31) +FN:166,(anonymous_32) +FN:171,(anonymous_33) +FNF:28 +FNH:27 +FNDA:1,(anonymous_6) +FNDA:73,Converter +FNDA:6,(anonymous_8) +FNDA:6,(anonymous_9) +FNDA:2,(anonymous_10) +FNDA:1,(anonymous_11) +FNDA:17,(anonymous_12) +FNDA:5,(anonymous_13) +FNDA:5,(anonymous_14) +FNDA:25,(anonymous_15) +FNDA:16,(anonymous_16) +FNDA:37,(anonymous_17) +FNDA:49,(anonymous_18) +FNDA:49,(anonymous_19) +FNDA:46,(anonymous_20) +FNDA:2,(anonymous_21) +FNDA:165734,(anonymous_22) +FNDA:436312,(anonymous_23) +FNDA:124,(anonymous_24) +FNDA:122,(anonymous_25) +FNDA:122,(anonymous_26) +FNDA:2,(anonymous_27) +FNDA:65,(anonymous_28) +FNDA:28,(anonymous_29) +FNDA:28,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:61,(anonymous_32) +FNDA:4,(anonymous_33) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:17,1 +DA:18,1 +DA:19,2 +DA:21,1 +DA:22,1 +DA:24,1 +DA:28,17 +DA:33,17 +DA:35,5 +DA:36,5 +DA:43,5 +DA:44,5 +DA:45,5 +DA:46,5 +DA:48,0 +DA:51,5 +DA:53,1 +DA:54,25 +DA:55,25 +DA:57,1 +DA:58,16 +DA:59,16 +DA:60,16 +DA:61,16 +DA:62,37 +DA:63,16 +DA:65,21 +DA:66,21 +DA:67,21 +DA:70,16 +DA:72,49 +DA:73,49 +DA:74,49 +DA:76,46 +DA:77,46 +DA:79,0 +DA:83,2 +DA:84,2 +DA:86,0 +DA:92,1 +DA:93,165734 +DA:95,1 +DA:96,436312 +DA:102,217 +DA:103,73 +DA:104,73 +DA:105,73 +DA:106,73 +DA:107,73 +DA:108,0 +DA:110,73 +DA:112,73 +DA:114,6 +DA:115,6 +DA:116,6 +DA:121,73 +DA:123,124 +DA:124,124 +DA:126,122 +DA:127,70 +DA:128,70 +DA:132,122 +DA:134,2 +DA:135,2 +DA:136,2 +DA:137,2 +DA:140,65 +DA:141,65 +DA:142,28 +DA:143,28 +DA:144,28 +DA:146,28 +DA:147,24 +DA:151,28 +DA:152,4 +DA:154,24 +DA:159,0 +DA:160,0 +DA:163,37 +DA:166,1 +DA:167,61 +DA:168,61 +DA:169,61 +DA:171,1 +DA:172,4 +DA:174,1 +LF:94 +LH:88 +BRDA:102,0,0,71 +BRDA:102,0,1,2 +BRDA:103,1,0,73 +BRDA:103,1,1,73 +BRDA:107,2,0,0 +BRDA:107,2,1,73 +BRDA:44,3,0,5 +BRDA:44,3,1,0 +BRDA:62,4,0,16 +BRDA:62,4,1,21 +BRDA:76,5,0,46 +BRDA:76,5,1,0 +BRDA:83,6,0,2 +BRDA:83,6,1,0 +BRDA:126,7,0,70 +BRDA:126,7,1,52 +BRDA:141,8,0,28 +BRDA:141,8,1,37 +BRDA:141,9,0,65 +BRDA:141,9,1,64 +BRDA:146,10,0,24 +BRDA:146,10,1,4 +BRDA:151,11,0,4 +BRDA:151,11,1,24 +BRDA:151,12,0,28 +BRDA:151,12,1,28 +BRF:26 +BRH:22 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/Processor.ts +FN:7,(anonymous_0) +FN:10,Processor +FNF:2 +FNH:2 +FNDA:1,(anonymous_0) +FNDA:75,Processor +DA:7,1 +DA:10,75 +DA:11,75 +DA:12,75 +DA:15,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/ProcessorLocal.test.ts +FN:9,(anonymous_13) +FN:10,(anonymous_14) +FN:20,(anonymous_17) +FNF:3 +FNH:3 +FNDA:1,(anonymous_13) +FNDA:1,(anonymous_14) +FNDA:1,(anonymous_17) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:25,1 +LF:21 +LH:21 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/ProcessorLocal.ts +FN:11,(anonymous_6) +FN:15,(anonymous_8) +FN:23,(anonymous_9) +FN:30,(anonymous_10) +FN:39,(anonymous_11) +FN:46,(anonymous_12) +FN:54,(anonymous_13) +FN:82,(anonymous_14) +FN:99,(anonymous_15) +FN:140,(anonymous_16) +FN:179,(anonymous_17) +FN:198,(anonymous_18) +FN:208,(anonymous_19) +FN:209,(anonymous_20) +FN:210,(anonymous_21) +FN:221,processLineHook +FN:232,(anonymous_23) +FNF:17 +FNH:16 +FNDA:76,(anonymous_6) +FNDA:154,(anonymous_8) +FNDA:67,(anonymous_9) +FNDA:154,(anonymous_10) +FNDA:154,(anonymous_11) +FNDA:154,(anonymous_12) +FNDA:154,(anonymous_13) +FNDA:106,(anonymous_14) +FNDA:68,(anonymous_15) +FNDA:4,(anonymous_16) +FNDA:105,(anonymous_17) +FNDA:290,(anonymous_18) +FNDA:1,(anonymous_19) +FNDA:1,(anonymous_20) +FNDA:1,(anonymous_21) +FNDA:1,processLineHook +FNDA:0,(anonymous_23) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:11,75 +DA:12,75 +DA:13,75 +DA:14,75 +DA:15,1 +DA:16,154 +DA:17,68 +DA:19,154 +DA:21,75 +DA:22,75 +DA:23,1 +DA:24,67 +DA:25,67 +DA:27,67 +DA:30,280 +DA:32,154 +DA:33,28 +DA:35,126 +DA:38,154 +DA:40,154 +DA:41,4 +DA:43,150 +DA:47,154 +DA:48,154 +DA:50,0 +DA:54,154 +DA:55,154 +DA:56,154 +DA:57,154 +DA:58,105 +DA:60,154 +DA:61,2 +DA:62,2 +DA:65,154 +DA:66,1 +DA:68,154 +DA:69,154 +DA:70,126 +DA:72,28 +DA:73,28 +DA:75,154 +DA:76,106 +DA:77,106 +DA:78,1 +DA:80,105 +DA:82,106 +DA:83,106 +DA:86,68 +DA:88,38 +DA:95,48 +DA:99,1 +DA:100,68 +DA:101,8 +DA:102,4 +DA:104,4 +DA:107,60 +DA:108,60 +DA:109,60 +DA:110,60 +DA:111,60 +DA:112,60 +DA:113,59 +DA:114,59 +DA:115,59 +DA:117,1 +DA:120,60 +DA:122,60 +DA:123,1 +DA:125,59 +DA:126,2 +DA:128,57 +DA:131,67 +DA:132,4 +DA:134,67 +DA:135,4 +DA:136,4 +DA:138,67 +DA:140,1 +DA:141,4 +DA:142,4 +DA:143,4 +DA:144,4 +DA:145,22 +DA:146,5 +DA:147,1 +DA:148,0 +DA:150,1 +DA:153,4 +DA:155,17 +DA:156,17 +DA:157,6 +DA:160,0 +DA:175,4 +DA:179,1 +DA:180,105 +DA:181,1 +DA:183,104 +DA:184,104 +DA:185,104 +DA:186,2 +DA:188,102 +DA:198,1 +DA:199,290 +DA:200,290 +DA:201,138 +DA:203,152 +DA:208,1 +DA:209,1 +DA:210,1 +DA:211,1 +DA:212,0 +DA:214,1 +DA:219,1 +DA:224,1 +DA:225,0 +DA:227,1 +DA:228,1 +DA:229,1 +DA:230,1 +DA:231,1 +DA:232,0 +DA:233,0 +DA:234,0 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:242,1 +DA:245,0 +LF:137 +LH:128 +BRDA:11,0,0,75 +BRDA:11,0,1,75 +BRDA:11,0,2,75 +BRDA:16,1,0,68 +BRDA:16,1,1,86 +BRDA:24,2,0,67 +BRDA:24,2,1,0 +BRDA:30,3,0,126 +BRDA:30,3,1,28 +BRDA:32,4,0,28 +BRDA:32,4,1,126 +BRDA:40,5,0,4 +BRDA:40,5,1,150 +BRDA:47,6,0,154 +BRDA:47,6,1,0 +BRDA:47,7,0,154 +BRDA:47,7,1,154 +BRDA:57,8,0,105 +BRDA:57,8,1,49 +BRDA:60,9,0,2 +BRDA:60,9,1,152 +BRDA:60,10,0,154 +BRDA:60,10,1,4 +BRDA:60,10,2,2 +BRDA:65,11,0,1 +BRDA:65,11,1,153 +BRDA:65,12,0,154 +BRDA:65,12,1,1 +BRDA:69,13,0,126 +BRDA:69,13,1,28 +BRDA:75,14,0,106 +BRDA:75,14,1,48 +BRDA:77,15,0,1 +BRDA:77,15,1,105 +BRDA:83,16,0,68 +BRDA:83,16,1,38 +BRDA:83,17,0,106 +BRDA:83,17,1,72 +BRDA:100,18,0,8 +BRDA:100,18,1,60 +BRDA:101,19,0,4 +BRDA:101,19,1,4 +BRDA:112,20,0,59 +BRDA:112,20,1,1 +BRDA:122,21,0,1 +BRDA:122,21,1,59 +BRDA:125,22,0,2 +BRDA:125,22,1,57 +BRDA:131,23,0,4 +BRDA:131,23,1,63 +BRDA:131,24,0,67 +BRDA:131,24,1,66 +BRDA:134,25,0,4 +BRDA:134,25,1,63 +BRDA:134,26,0,67 +BRDA:134,26,1,4 +BRDA:142,27,0,4 +BRDA:142,27,1,0 +BRDA:145,28,0,5 +BRDA:145,28,1,17 +BRDA:146,29,0,1 +BRDA:146,29,1,4 +BRDA:147,30,0,0 +BRDA:147,30,1,1 +BRDA:147,31,0,1 +BRDA:147,31,1,0 +BRDA:155,32,0,17 +BRDA:155,32,1,0 +BRDA:156,33,0,6 +BRDA:156,33,1,11 +BRDA:180,34,0,1 +BRDA:180,34,1,104 +BRDA:185,35,0,2 +BRDA:185,35,1,102 +BRDA:199,36,0,290 +BRDA:199,36,1,0 +BRDA:200,37,0,138 +BRDA:200,37,1,152 +BRDA:211,38,0,0 +BRDA:211,38,1,1 +BRDA:224,39,0,0 +BRDA:224,39,1,1 +BRDA:227,40,0,1 +BRDA:227,40,1,0 +BRDA:231,41,0,0 +BRDA:231,41,1,1 +BRDA:231,42,0,1 +BRDA:231,42,1,1 +BRF:88 +BRH:77 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/Result.ts +FN:6,(anonymous_1) +FN:21,Result +FN:7,(anonymous_3) +FN:11,(anonymous_4) +FN:17,(anonymous_5) +FN:22,(anonymous_6) +FN:25,(anonymous_7) +FN:32,(anonymous_8) +FN:47,(anonymous_9) +FN:53,(anonymous_10) +FN:61,(anonymous_11) +FN:73,processLineByLine +FN:91,(anonymous_13) +FN:130,processRecursive +FN:144,pushDownstream +FNF:15 +FNH:13 +FNDA:1,(anonymous_1) +FNDA:73,Result +FNDA:94,(anonymous_3) +FNDA:102,(anonymous_4) +FNDA:155,(anonymous_5) +FNDA:94,(anonymous_6) +FNDA:94,(anonymous_7) +FNDA:31,(anonymous_8) +FNDA:94,(anonymous_9) +FNDA:6,(anonymous_10) +FNDA:61,(anonymous_11) +FNDA:31,processLineByLine +FNDA:0,(anonymous_13) +FNDA:0,processRecursive +FNDA:10586,pushDownstream +DA:3,1 +DA:6,1 +DA:7,1 +DA:8,94 +DA:11,1 +DA:12,102 +DA:13,63 +DA:15,102 +DA:17,1 +DA:18,155 +DA:20,73 +DA:21,73 +DA:22,94 +DA:23,94 +DA:25,94 +DA:26,94 +DA:27,31 +DA:33,31 +DA:34,0 +DA:36,31 +DA:37,31 +DA:42,63 +DA:43,63 +DA:47,1 +DA:48,94 +DA:49,73 +DA:51,94 +DA:53,1 +DA:54,6 +DA:55,0 +DA:57,6 +DA:58,2 +DA:61,1 +DA:62,61 +DA:63,46 +DA:64,46 +DA:67,61 +DA:68,0 +DA:71,1 +DA:81,31 +DA:82,0 +DA:84,31 +DA:85,23 +DA:86,23 +DA:87,23 +DA:88,23 +DA:90,23 +DA:91,0 +DA:92,0 +DA:96,23 +DA:97,1 +DA:99,23 +DA:100,10592 +DA:101,10592 +DA:102,10592 +DA:103,10592 +DA:104,1 +DA:107,23 +DA:117,8 +DA:118,8 +DA:119,10584 +DA:120,10584 +DA:124,8 +DA:139,0 +DA:140,0 +DA:142,0 +DA:145,10586 +DA:146,10584 +DA:148,2 +LF:69 +LH:60 +BRDA:8,0,0,94 +BRDA:8,0,1,23 +BRDA:8,0,2,71 +BRDA:12,1,0,63 +BRDA:12,1,1,39 +BRDA:13,2,0,63 +BRDA:13,2,1,58 +BRDA:26,3,0,31 +BRDA:26,3,1,63 +BRDA:33,4,0,0 +BRDA:33,4,1,31 +BRDA:48,5,0,73 +BRDA:48,5,1,21 +BRDA:54,6,0,0 +BRDA:54,6,1,6 +BRDA:54,7,0,6 +BRDA:54,7,1,0 +BRDA:57,8,0,2 +BRDA:57,8,1,4 +BRDA:57,9,0,6 +BRDA:57,9,1,2 +BRDA:62,10,0,46 +BRDA:62,10,1,15 +BRDA:63,11,0,46 +BRDA:63,11,1,0 +BRDA:63,12,0,46 +BRDA:63,12,1,46 +BRDA:67,13,0,0 +BRDA:67,13,1,61 +BRDA:67,14,0,61 +BRDA:67,14,1,17 +BRDA:81,15,0,0 +BRDA:81,15,1,31 +BRDA:84,16,0,23 +BRDA:84,16,1,8 +BRDA:84,17,0,31 +BRDA:84,17,1,23 +BRDA:90,18,0,0 +BRDA:90,18,1,23 +BRDA:90,19,0,23 +BRDA:90,19,1,0 +BRDA:96,20,0,1 +BRDA:96,20,1,22 +BRDA:103,21,0,1 +BRDA:103,21,1,10591 +BRDA:117,22,0,8 +BRDA:117,22,1,0 +BRDA:139,23,0,0 +BRDA:139,23,1,0 +BRDA:145,24,0,10584 +BRDA:145,24,1,2 +BRDA:145,25,0,10586 +BRDA:145,25,1,10586 +BRF:53 +BRH:42 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/Worker.ts +FN:4,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/dataClean.ts +FN:17,concatLeftChunk +FNF:1 +FNH:1 +FNDA:126,concatLeftChunk +DA:8,1 +DA:9,126 +DA:10,126 +DA:12,126 +DA:18,126 +DA:26,14 +DA:41,126 +LF:7 +LH:7 +BRDA:18,0,0,0 +BRDA:18,0,1,1 +BRDA:18,1,0,1 +BRDA:18,1,1,1 +BRF:4 +BRH:3 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/fileline.test.ts +FNF:0 +FNH:0 +DA:3,1 +DA:6,1 +DA:7,1 +DA:8,1 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/fileline.ts +FNF:0 +FNH:0 +DA:9,1 +DA:10,1 +LF:2 +LH:2 +BRDA:9,0,0,1 +BRDA:9,0,1,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/getEol.ts +FNF:0 +FNH:0 +LF:0 +LH:0 +BRDA:3,0,0,282 +BRDA:3,0,1,150 +BRDA:17,1,0,83 +BRF:3 +BRH:3 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/index.ts +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:15,(anonymous_0) +DA:3,1 +DA:4,1 +DA:5,15 +DA:8,1 +DA:9,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/lineToJson.ts +FN:9,default_1 +FN:23,processRow +FN:38,convertRowToJson +FN:84,(anonymous_4) +FN:86,getConvFunc +FN:112,setPath +FN:132,flatSetter +FN:135,jsonSetter +FN:140,checkType +FN:154,numberType +FN:162,stringType +FN:166,dynamicType +FN:182,booleanType +FN:191,jsonType +FNF:14 +FNH:13 +FNDA:102,default_1 +FNDA:32101,processRow +FNDA:32099,convertRowToJson +FNDA:0,(anonymous_4) +FNDA:65781,getConvFunc +FNDA:65781,setPath +FNDA:64992,flatSetter +FNDA:789,jsonSetter +FNDA:75,checkType +FNDA:13,numberType +FNDA:60,stringType +FNDA:75,dynamicType +FNDA:2,booleanType +FNDA:5,jsonType +DA:2,1 +DA:4,1 +DA:7,1 +DA:9,1 +DA:10,102 +DA:11,102 +DA:12,32101 +DA:13,32099 +DA:14,32090 +DA:17,100 +DA:25,32101 +DA:26,2 +DA:29,32099 +DA:30,32099 +DA:31,32099 +DA:32,32090 +DA:34,9 +DA:39,32099 +DA:40,32099 +DA:42,32099 +DA:43,65788 +DA:45,65788 +DA:46,7 +DA:48,65781 +DA:50,65781 +DA:51,65781 +DA:52,50 +DA:54,65781 +DA:55,65781 +DA:56,6 +DA:57,6 +DA:58,6 +DA:65,65775 +DA:66,75 +DA:67,75 +DA:69,65775 +DA:70,65775 +DA:74,32099 +DA:75,32090 +DA:77,9 +DA:81,1 +DA:87,65781 +DA:88,65243 +DA:90,538 +DA:91,538 +DA:92,533 +DA:94,5 +DA:95,1 +DA:97,5 +DA:98,4 +DA:99,4 +DA:100,4 +DA:101,4 +DA:103,0 +DA:105,1 +DA:106,1 +DA:108,0 +DA:113,65781 +DA:114,538 +DA:115,3 +DA:117,535 +DA:118,103 +DA:119,1 +DA:121,102 +DA:124,432 +DA:128,65781 +DA:133,64992 +DA:136,789 +DA:141,75 +DA:142,9 +DA:143,66 +DA:144,0 +DA:145,66 +DA:146,0 +DA:147,66 +DA:148,66 +DA:150,0 +DA:155,13 +DA:156,13 +DA:157,0 +DA:159,13 +DA:163,60 +DA:167,75 +DA:168,75 +DA:169,13 +DA:171,62 +DA:172,13 +DA:173,49 +DA:174,2 +DA:175,47 +DA:176,5 +DA:178,42 +DA:183,2 +DA:184,2 +DA:185,0 +DA:187,2 +DA:192,5 +DA:193,5 +DA:195,0 +LF:99 +LH:91 +BRDA:13,0,0,32090 +BRDA:13,0,1,9 +BRDA:25,1,0,2 +BRDA:25,1,1,32099 +BRDA:25,2,0,32101 +BRDA:25,2,1,5 +BRDA:25,2,2,5 +BRDA:29,3,0,32099 +BRDA:29,3,1,0 +BRDA:31,4,0,32090 +BRDA:31,4,1,9 +BRDA:45,5,0,7 +BRDA:45,5,1,65781 +BRDA:45,6,0,65788 +BRDA:45,6,1,18 +BRDA:51,7,0,50 +BRDA:51,7,1,65731 +BRDA:51,8,0,65781 +BRDA:51,8,1,65731 +BRDA:55,9,0,6 +BRDA:55,9,1,65775 +BRDA:57,10,0,6 +BRDA:57,10,1,0 +BRDA:65,11,0,75 +BRDA:65,11,1,65700 +BRDA:69,12,0,65775 +BRDA:69,12,1,0 +BRDA:74,13,0,32090 +BRDA:74,13,1,9 +BRDA:87,14,0,65243 +BRDA:87,14,1,538 +BRDA:91,15,0,533 +BRDA:91,15,1,5 +BRDA:94,16,0,1 +BRDA:94,16,1,4 +BRDA:95,17,0,1 +BRDA:95,17,1,1 +BRDA:97,18,0,4 +BRDA:97,18,1,1 +BRDA:100,19,0,4 +BRDA:100,19,1,0 +BRDA:105,20,0,1 +BRDA:105,20,1,0 +BRDA:113,21,0,538 +BRDA:113,21,1,65243 +BRDA:114,22,0,3 +BRDA:114,22,1,535 +BRDA:117,23,0,103 +BRDA:117,23,1,432 +BRDA:118,24,0,1 +BRDA:118,24,1,102 +BRDA:118,25,0,103 +BRDA:118,25,1,1 +BRDA:141,26,0,9 +BRDA:141,26,1,66 +BRDA:143,27,0,0 +BRDA:143,27,1,66 +BRDA:145,28,0,0 +BRDA:145,28,1,66 +BRDA:147,29,0,66 +BRDA:147,29,1,0 +BRDA:156,30,0,0 +BRDA:156,30,1,13 +BRDA:168,31,0,13 +BRDA:168,31,1,62 +BRDA:171,32,0,13 +BRDA:171,32,1,49 +BRDA:173,33,0,2 +BRDA:173,33,1,47 +BRDA:173,34,0,49 +BRDA:173,34,1,6 +BRDA:173,34,2,49 +BRDA:173,34,3,7 +BRDA:175,35,0,5 +BRDA:175,35,1,42 +BRDA:175,36,0,47 +BRDA:175,36,1,3 +BRDA:175,36,2,44 +BRDA:175,36,3,2 +BRDA:184,37,0,0 +BRDA:184,37,1,2 +BRDA:184,38,0,2 +BRDA:184,38,1,0 +BRF:83 +BRH:72 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/rowSplit.test.ts +FNF:0 +FNH:0 +DA:1,1 +DA:17,1 +DA:18,4 +DA:19,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:32,1 +DA:33,1 +DA:35,1 +DA:39,1 +DA:40,1 +DA:42,1 +DA:47,1 +DA:52,1 +DA:58,3 +DA:70,1 +DA:71,1 +DA:73,1 +DA:80,1 +DA:86,1 +DA:87,1 +DA:93,1 +DA:95,1 +DA:99,1 +DA:100,3 +DA:101,1 +DA:103,1 +DA:107,1 +DA:108,1 +DA:110,1 +LF:31 +LH:31 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/rowSplit.ts +FN:8,(anonymous_1) +FN:21,RowSplit +FN:15,(anonymous_3) +FN:26,(anonymous_4) +FN:50,(anonymous_5) +FN:103,(anonymous_6) +FN:114,(anonymous_7) +FN:123,(anonymous_8) +FN:130,(anonymous_9) +FN:145,(anonymous_10) +FN:155,(anonymous_11) +FN:164,(anonymous_12) +FNF:12 +FNH:11 +FNDA:1,(anonymous_1) +FNDA:77,RowSplit +FNDA:32192,(anonymous_3) +FNDA:32200,(anonymous_4) +FNDA:32192,(anonymous_5) +FNDA:8,(anonymous_6) +FNDA:33,(anonymous_7) +FNDA:66643,(anonymous_8) +FNDA:272,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:133,(anonymous_11) +FNDA:107,(anonymous_12) +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:12,77 +DA:13,77 +DA:14,77 +DA:15,1 +DA:16,32192 +DA:17,70 +DA:19,32192 +DA:21,77 +DA:22,77 +DA:23,77 +DA:24,77 +DA:26,1 +DA:27,32200 +DA:28,8 +DA:30,32192 +DA:31,32192 +DA:32,32192 +DA:33,32192 +DA:34,4 +DA:37,32192 +DA:38,2 +DA:39,2 +DA:41,32192 +DA:42,32192 +DA:43,32192 +DA:44,0 +DA:46,32192 +DA:50,1 +DA:51,32192 +DA:52,32192 +DA:53,32192 +DA:54,32192 +DA:55,66757 +DA:56,66757 +DA:57,66625 +DA:59,66757 +DA:60,66757 +DA:61,66643 +DA:62,158 +DA:63,158 +DA:64,107 +DA:65,107 +DA:66,107 +DA:67,107 +DA:69,51 +DA:70,51 +DA:71,51 +DA:74,66485 +DA:75,66473 +DA:77,66485 +DA:78,66485 +DA:81,114 +DA:82,26 +DA:83,26 +DA:84,26 +DA:85,26 +DA:86,26 +DA:87,26 +DA:89,26 +DA:90,26 +DA:92,88 +DA:101,32192 +DA:103,1 +DA:105,8 +DA:106,6 +DA:107,2 +DA:108,1 +DA:110,1 +DA:112,7 +DA:113,7 +DA:114,7 +DA:115,33 +DA:116,33 +DA:117,13 +DA:118,13 +DA:121,7 +DA:123,1 +DA:124,66643 +DA:125,66643 +DA:126,66643 +DA:130,1 +DA:131,272 +DA:132,272 +DA:133,272 +DA:134,266 +DA:136,272 +DA:137,272 +DA:138,272 +DA:139,191 +DA:140,191 +DA:142,272 +DA:145,1 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:151,0 +DA:155,1 +DA:156,133 +DA:157,133 +DA:158,25 +DA:160,133 +DA:162,133 +DA:164,1 +DA:165,107 +DA:166,107 +DA:167,107 +DA:168,32137 +DA:169,32137 +DA:170,32137 +DA:171,32116 +DA:172,18 +DA:174,32098 +DA:177,32116 +DA:179,21 +DA:182,107 +DA:184,1 +LF:121 +LH:115 +BRDA:16,0,0,70 +BRDA:16,0,1,32122 +BRDA:27,1,0,8 +BRDA:27,1,1,32192 +BRDA:33,2,0,4 +BRDA:33,2,1,32188 +BRDA:33,3,0,32192 +BRDA:33,3,1,32192 +BRDA:37,4,0,2 +BRDA:37,4,1,32190 +BRDA:37,5,0,32192 +BRDA:37,5,1,10 +BRDA:43,6,0,0 +BRDA:43,6,1,32192 +BRDA:56,7,0,66625 +BRDA:56,7,1,132 +BRDA:56,8,0,66757 +BRDA:56,8,1,66643 +BRDA:60,9,0,66643 +BRDA:60,9,1,114 +BRDA:61,10,0,158 +BRDA:61,10,1,66485 +BRDA:63,11,0,107 +BRDA:63,11,1,51 +BRDA:74,12,0,66473 +BRDA:74,12,1,12 +BRDA:81,13,0,26 +BRDA:81,13,1,88 +BRDA:86,14,0,26 +BRDA:86,14,1,0 +BRDA:105,15,0,6 +BRDA:105,15,1,2 +BRDA:107,16,0,1 +BRDA:107,16,1,1 +BRDA:116,17,0,13 +BRDA:116,17,1,20 +BRDA:126,18,0,66643 +BRDA:126,18,1,167 +BRDA:126,18,2,13 +BRDA:126,18,3,13 +BRDA:126,18,4,11 +BRDA:133,19,0,266 +BRDA:133,19,1,6 +BRDA:138,20,0,463 +BRDA:138,20,1,273 +BRDA:157,21,0,25 +BRDA:157,21,1,108 +BRDA:170,22,0,32116 +BRDA:170,22,1,21 +BRDA:170,23,0,32137 +BRDA:170,23,1,23 +BRDA:171,24,0,18 +BRDA:171,24,1,32098 +BRDA:179,25,0,21 +BRDA:179,25,1,0 +BRF:55 +BRH:52 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/test.ts +FNF:0 +FNH:0 +LF:0 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/src/util.ts +FNF:0 +FNH:0 +DA:1,290 +DA:12,22 +LF:2 +LH:2 +BRDA:2,0,0,290 +BRDA:2,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter.ts +FN:4,(anonymous_1) +FN:101,(anonymous_16) +FN:283,(anonymous_41) +FN:425,(anonymous_57) +FN:447,(anonymous_60) +FNF:5 +FNH:5 +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_16) +FNDA:5290,(anonymous_41) +FNDA:1,(anonymous_57) +FNDA:1,(anonymous_60) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:9,1 +DA:15,28 +DA:16,1 +DA:26,1 +DA:28,1 +DA:29,1 +DA:43,1 +DA:61,1 +DA:62,1 +DA:73,1 +DA:74,1 +DA:84,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:107,1 +DA:116,25 +DA:117,5 +DA:118,25 +DA:125,1 +DA:131,0 +DA:132,1 +DA:133,1 +DA:136,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:157,1 +DA:158,1 +DA:160,1 +DA:170,1 +DA:171,1 +DA:172,1 +DA:186,1 +DA:187,1 +DA:188,1 +DA:197,1 +DA:198,1 +DA:199,1 +DA:201,1 +DA:214,1 +DA:215,1 +DA:229,1 +DA:231,1 +DA:245,1 +DA:246,1 +DA:255,1 +DA:257,1 +DA:275,1 +DA:279,1 +DA:288,1 +DA:293,1 +DA:294,1 +DA:303,1 +DA:308,1 +DA:309,1 +DA:310,1 +DA:312,1 +DA:316,1 +DA:318,1 +DA:326,1 +DA:327,1 +DA:328,1 +DA:330,1 +DA:333,1 +DA:335,1 +DA:340,1 +DA:341,1 +DA:347,1 +DA:348,1 +DA:350,1 +DA:358,1 +DA:359,1 +DA:365,1 +DA:367,1 +DA:369,1 +DA:376,1 +DA:377,1 +DA:384,1 +DA:397,1 +DA:398,1 +DA:405,1 +DA:417,1 +DA:418,1 +DA:426,1 +DA:438,1 +DA:439,1 +DA:441,1 +DA:449,1 +LF:95 +LH:94 +BRDA:104,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter2.ts +FN:2,(anonymous_1) +FN:78,(anonymous_13) +FN:91,(anonymous_15) +FN:176,(anonymous_29) +FN:180,(anonymous_30) +FN:208,(anonymous_32) +FN:223,(anonymous_34) +FN:243,(anonymous_37) +FN:277,(anonymous_42) +FN:300,(anonymous_45) +FN:418,(anonymous_62) +FN:463,(anonymous_69) +FN:497,(anonymous_72) +FN:564,(anonymous_81) +FN:565,(anonymous_82) +FNF:15 +FNH:15 +FNDA:1,(anonymous_1) +FNDA:1,(anonymous_13) +FNDA:1,(anonymous_15) +FNDA:1,(anonymous_29) +FNDA:1,(anonymous_30) +FNDA:1,(anonymous_32) +FNDA:1,(anonymous_34) +FNDA:1,(anonymous_37) +FNDA:1,(anonymous_42) +FNDA:1,(anonymous_45) +FNDA:1,(anonymous_62) +FNDA:1,(anonymous_69) +FNDA:1,(anonymous_72) +FNDA:1,(anonymous_81) +FNDA:1,(anonymous_82) +DA:2,1 +DA:3,1 +DA:7,1 +DA:8,1 +DA:19,1 +DA:24,1 +DA:44,1 +DA:45,1 +DA:59,1 +DA:60,1 +DA:74,1 +DA:80,1 +DA:88,1 +DA:93,1 +DA:102,1 +DA:103,0 +DA:104,1 +DA:116,1 +DA:117,1 +DA:129,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:156,1 +DA:157,1 +DA:159,1 +DA:172,1 +DA:174,1 +DA:175,1 +DA:176,1 +DA:177,1 +DA:179,1 +DA:180,1 +DA:181,1 +DA:182,1 +DA:185,1 +DA:205,1 +DA:206,1 +DA:207,1 +DA:211,1 +DA:220,1 +DA:221,1 +DA:222,1 +DA:227,1 +DA:236,1 +DA:237,1 +DA:238,1 +DA:245,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:264,1 +DA:272,1 +DA:273,1 +DA:291,1 +DA:299,1 +DA:315,1 +DA:316,1 +DA:327,1 +DA:339,1 +DA:340,1 +DA:350,1 +DA:351,1 +DA:352,1 +DA:356,1 +DA:358,1 +DA:359,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:374,1 +DA:378,1 +DA:380,1 +DA:383,1 +DA:384,1 +DA:392,2 +DA:393,2 +DA:403,1 +DA:405,1 +DA:421,1 +DA:442,1 +DA:443,1 +DA:444,1 +DA:445,2 +DA:460,1 +DA:464,1 +DA:465,1 +DA:473,1 +DA:474,1 +DA:499,1 +DA:503,1 +DA:504,0 +DA:522,1 +DA:528,1 +DA:534,1 +DA:536,1 +DA:549,1 +DA:550,6 +DA:557,6 +DA:566,1 +LF:100 +LH:98 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/testNew/testCSVConverter3.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/kxiang/work/projects/csv2json/testNew/testErrorHandle.ts +FN:33,(anonymous_5) +FN:54,(anonymous_8) +FNF:2 +FNH:2 +FNDA:1,(anonymous_5) +FNDA:1,(anonymous_8) +DA:1,1 +DA:3,1 +DA:8,1 +DA:9,1 +DA:21,1 +DA:25,1 +DA:38,1 +DA:42,1 +DA:47,1 +DA:50,1 +DA:51,1 +DA:56,1 +LF:12 +LH:12 +BRF:0 +BRH:0 +end_of_record diff --git a/node_modules/csvtojson/coverage/lineToJson.ts.html b/node_modules/csvtojson/coverage/lineToJson.ts.html new file mode 100644 index 0000000..f221773 --- /dev/null +++ b/node_modules/csvtojson/coverage/lineToJson.ts.html @@ -0,0 +1,660 @@ + + + + Code coverage report for lineToJson.ts + + + + + + + +
+
+

+ All files lineToJson.ts +

+
+
+ 93.94% + Statements + 93/99 +
+
+ 91.57% + Branches + 76/83 +
+
+ 100% + Functions + 14/14 +
+
+ 93.94% + Lines + 93/99 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198  +1x +  +1x +  +  +1x +  +1x +118x +118x +32118x +32116x +32107x +  +  +116x +  +  +  +  +  +  +  +32118x +2x +  +  +32116x +32116x +32116x +32107x +  +9x +  +  +  +  +32116x +32116x +  +32116x +65845x +  +65845x +7x +  +65838x +  +65838x +65838x +51x +  +65838x +65838x +10x +10x +8x +  +  +  +  +  +  +65828x +75x +75x +  +65828x +65828x +  +  +  +32116x +32107x +  +9x +  +  +  +1x +  +  +  +  +  +65838x +65275x +  +563x +563x +556x +  +7x +1x +  +7x +6x +6x +6x +6x +  +  +  +1x +1x +  +  +  +  +  +  +65836x +562x +3x +  +559x +103x +1x +  +102x +  +  +456x +  +  +  +65836x +  +  +  +  +65047x +  +  +789x +  +  +  +  +75x +9x +66x +  +66x +  +66x +66x +  +  +  +  +  +  +15x +15x +1x +  +14x +  +  +  +58x +  +  +  +75x +75x +13x +  +62x +13x +49x +4x +45x +5x +  +40x +  +  +  +  +4x +4x +2x +  +2x +  +  +  +  +5x +5x +  +  +  +  + 
import { Converter } from "./Converter";
+import CSVError from "./CSVError";
+import { CellParser, ColumnParam } from "./Parameters";
+import set from "lodash/set";
+import { ParseRuntime } from "./ParseRuntime";
+ 
+var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/;
+ 
+export default function (csvRows: string[][], conv: Converter): JSONResult[] {
+  const res: JSONResult[] = [];
+  for (let i = 0, len = csvRows.length; i < len; i++) {
+    const r = processRow(csvRows[i], conv, i);
+    if (r) {
+      res.push(r);
+    }
+  }
+  return res;
+};
+export type JSONResult = {
+  [key: string]: any
+}
+ 
+function processRow(row: string[], conv: Converter, index): JSONResult | null {
+ 
+  if (conv.parseParam.checkColumn && conv.parseRuntime.headers && row.length !== conv.parseRuntime.headers.length) {
+    throw (CSVError.column_mismatched(conv.parseRuntime.parsedLineNumber + index))
+  }
+ 
+  const headRow = conv.parseRuntime.headers || [];
+  const resultRow = convertRowToJson(row, headRow, conv);
+  if (resultRow) {
+    return resultRow;
+  } else {
+    return null;
+  }
+}
+ 
+function convertRowToJson(row: string[], headRow: string[], conv: Converter): { [key: string]: any } | null {
+  let hasValue = false;
+  const resultRow = {};
+  
+  for (let i = 0, len = row.length; i < len; i++) {
+    let item = row[i];
+ 
+    if (conv.parseParam.ignoreEmpty && item === '') {
+      continue;
+    }
+    hasValue = true;
+ 
+    let head = headRow[i];
+    if (!head || head === "") {
+      head = headRow[i] = "field" + (i + 1);
+    }
+    const convFunc = getConvFunc(head, i, conv);
+    if (convFunc) {
+      const convRes = convFunc(item, head, resultRow, row, i);
+      if (convRes !== undefined) {
+        setPath(resultRow, head, convRes, conv,i);
+      }
+    } else {
+      // var flag = getFlag(head, i, param);
+      // if (flag === 'omit') {
+      //   continue;
+      // }
+      if (conv.parseParam.checkType) {
+        const convertFunc = checkType(item, head, i, conv);
+        item = convertFunc(item);
+      }
+      Eif (item !== undefined) {
+        setPath(resultRow, head, item, conv,i);
+      }
+    }
+  }
+  if (hasValue) {
+    return resultRow;
+  } else {
+    return null;
+  }
+}
+ 
+const builtInConv: { [key: string]: CellParser } = {
+  "string": stringType,
+  "number": numberType,
+  "omit": function () { }
+}
+function getConvFunc(head: string, i: number, conv: Converter): CellParser | null {
+  if (conv.parseRuntime.columnConv[i] !== undefined) {
+    return conv.parseRuntime.columnConv[i];
+  } else {
+    let flag = conv.parseParam.colParser[head];
+    if (flag === undefined) {
+      return conv.parseRuntime.columnConv[i] = null;
+    }
+    if (typeof flag === "object") {
+      flag = (flag as ColumnParam).cellParser || "string";
+    }
+    if (typeof flag === "string") {
+      flag = flag.trim().toLowerCase();
+      const builtInFunc = builtInConv[flag];
+      Eif (builtInFunc) {
+        return conv.parseRuntime.columnConv[i] = builtInFunc;
+      } else {
+        return conv.parseRuntime.columnConv[i] = null;
+      }
+    } else Eif (typeof flag === "function") {
+      return conv.parseRuntime.columnConv[i] = flag;
+    } else {
+      return conv.parseRuntime.columnConv[i] = null;
+    }
+  }
+}
+function setPath(resultJson: any, head: string, value: any, conv: Converter,headIdx:number) {
+  if (!conv.parseRuntime.columnValueSetter[headIdx]) {
+    if (conv.parseParam.flatKeys) {
+      conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+    } else {
+      if (head.indexOf(".") > -1) {
+        if (conv.parseParam.colParser[head] && (conv.parseParam.colParser[head] as ColumnParam).flat) {
+          conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+        } else {
+          conv.parseRuntime.columnValueSetter[headIdx] = jsonSetter;
+        }
+      } else {
+        conv.parseRuntime.columnValueSetter[headIdx] = flatSetter;
+      }
+    }
+  }
+  conv.parseRuntime.columnValueSetter[headIdx](resultJson, head, value);
+  // flatSetter(resultJson, head, value);
+ 
+}
+function flatSetter(resultJson: any, head: string, value: any) {
+  resultJson[head] = value;
+}
+function jsonSetter(resultJson: any, head: string, value: any) {
+  set(resultJson, head, value);
+}
+ 
+ 
+function checkType(item: string, head: string, headIdx: number, conv: Converter): Function {
+  if (conv.parseRuntime.headerType[headIdx]) {
+    return conv.parseRuntime.headerType[headIdx];
+  } else Iif (head.indexOf('number#!') > -1) {
+    return conv.parseRuntime.headerType[headIdx] = numberType;
+  } else Iif (head.indexOf('string#!') > -1) {
+    return conv.parseRuntime.headerType[headIdx] = stringType;
+  } else Eif (conv.parseParam.checkType) {
+    return conv.parseRuntime.headerType[headIdx] = dynamicType;
+  } else {
+    return conv.parseRuntime.headerType[headIdx] = stringType;
+  }
+}
+ 
+function numberType(item) {
+  var rtn = parseFloat(item);
+  if (isNaN(rtn)) {
+    return item;
+  }
+  return rtn;
+}
+ 
+function stringType(item: string): string {
+  return item.toString();
+}
+ 
+function dynamicType(item) {
+  var trimed = item.trim();
+  if (trimed === "") {
+    return stringType(item);
+  }
+  if (numReg.test(trimed)) {
+    return numberType(item);
+  } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") {
+    return booleanType(item);
+  } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") {
+    return jsonType(item);
+  } else {
+    return stringType(item);
+  }
+}
+ 
+function booleanType(item) {
+  var trimed = item.trim();
+  if (trimed.length === 5 && trimed.toLowerCase() === "false") {
+    return false;
+  } else {
+    return true;
+  }
+}
+ 
+function jsonType(item) {
+  try {
+    return JSON.parse(item);
+  } catch (e) {
+    return item;
+  }
+}
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/prettify.css b/node_modules/csvtojson/coverage/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/node_modules/csvtojson/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/csvtojson/coverage/prettify.js b/node_modules/csvtojson/coverage/prettify.js new file mode 100644 index 0000000..ef51e03 --- /dev/null +++ b/node_modules/csvtojson/coverage/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/csvtojson/coverage/rowSplit.test.ts.html b/node_modules/csvtojson/coverage/rowSplit.test.ts.html new file mode 100644 index 0000000..3c8c692 --- /dev/null +++ b/node_modules/csvtojson/coverage/rowSplit.test.ts.html @@ -0,0 +1,399 @@ + + + + Code coverage report for rowSplit.test.ts + + + + + + + +
+
+

+ All files rowSplit.test.ts +

+
+
+ 100% + Statements + 31/31 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 0/0 +
+
+ 100% + Lines + 31/31 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +1111x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +  +1x +1x +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +1x +  +1x +  +  +  +1x +3x +1x +  +1x +  +  +  +1x +1x +  +1x + 
import { RowSplit, MultipleRowResult, RowSplitResult } from "./rowSplit";
+import { Converter } from "./Converter";
+const assert = require("assert");
+ 
+describe("Test delimiters", function () {
+  const getDelimiter = (str, opt: { delimiter: string | string[] }): string => {
+    return RowSplit.prototype["getDelimiter"].call({
+      conv: {
+        parseParam: {
+          delimiter: opt.delimiter
+        }
+      }
+    }, str);
+  }
+ 
+  it("should return the explicitly specified delimiter", function () {
+    var delimiter = ";";
+    var rowStr = "a;b;c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: ";" });
+    assert.equal(returnedDelimiter, delimiter);
+  });
+ 
+  it("should return the autodetected delimiter if 'auto' specified", function () {
+    var rowStr = "a;b;c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
+    assert(returnedDelimiter === ";");
+  });
+ 
+  it("should return the ',' delimiter if delimiter cannot be specified, in case of 'auto'", function () {
+    var rowStr = "abc";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" });
+    assert(returnedDelimiter === ",");
+  });
+ 
+  it("should accetp an array with potential delimiters", function () {
+    var rowStr = "a$b$c";
+    var returnedDelimiter = getDelimiter(rowStr, { delimiter: [",", ";", "$"] });
+    assert(returnedDelimiter === '$');
+  });
+});
+ 
+describe("ParseMultiLine function", function () {
+  const rowSplit = new RowSplit(new Converter());
+  const func = (lines: string[]): MultipleRowResult => {
+    return rowSplit.parseMultiLines(lines);
+  }
+  it("should convert lines to csv lines", function () {
+    var lines = [
+      "a,b,c,d",
+      "hello,world,csvtojson,abc",
+      "1,2,3,4"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 3);
+    assert.equal(res.partial, "");
+  });
+ 
+  it("should process line breaks", function () {
+    var lines = [
+      "a,b,c",
+      '15",hello,"ab',
+      "cde\"",
+      "\"b\"\"b\",cc,dd"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 3);
+    assert.equal(res.rowsCells[1][0], "15\"");
+    assert.equal(res.rowsCells[1][2], "ab\ncde");
+    assert.equal(res.rowsCells[2][0], "b\"b");
+    assert.equal(res.partial, "");
+  });
+ 
+  it("should return partial if line not closed", function () {
+    var lines = [
+      "a,b,c",
+      '15",hello,"ab',
+      "d,e,f"
+    ];
+    var res = func(lines);
+    assert.equal(res.rowsCells.length, 1);
+    assert.equal(res.partial, "15\",hello,\"ab\nd,e,f\n");
+  });
+});
+ 
+describe("RowSplit.parse function", function () {
+  const rowSplit = new RowSplit(new Converter());
+  const func = (str): RowSplitResult => {
+    return rowSplit.parse(str);
+  }
+  it("should split complete csv line", function () {
+    var str = "hello,world,csvtojson,awesome";
+    var res = func(str);
+    assert.equal(res.cells.length, 4);
+    assert.equal(res.closed, true);
+  });
+ 
+  it("should split incomplete csv line", function () {
+    var str = "hello,world,\"csvtojson,awesome";
+    var res = func(str);
+    assert.equal(res.closed, false);
+  });
+ 
+  it("should allow multiple line", function () {
+    var str = "\"he\"llo\",world,\"csvtojson,a\"\nwesome\"";
+    var res = func(str);
+    assert.equal(res.closed, true);
+    assert.equal(res.cells[2], 'csvtojson,a"\nwesome');
+  });
+ 
+});
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/rowSplit.ts.html b/node_modules/csvtojson/coverage/rowSplit.ts.html new file mode 100644 index 0000000..8649604 --- /dev/null +++ b/node_modules/csvtojson/coverage/rowSplit.ts.html @@ -0,0 +1,681 @@ + + + + Code coverage report for rowSplit.ts + + + + + + + +
+
+

+ All files rowSplit.ts +

+
+
+ 100% + Statements + 119/119 +
+
+ 94.74% + Branches + 54/57 +
+
+ 100% + Functions + 11/11 +
+
+ 100% + Lines + 118/118 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205  +  +  +1x +1x +  +1x +1x +  +  +  +88x +88x +88x +1x +32226x +78x +  +32226x +  +88x +88x +88x +88x +  +1x +32234x +8x +  +32226x +32226x +32226x +32226x +4x +  +  +32226x +2x +2x +  +32226x +32226x +32226x +3x +3x +9x +  +  +3x +  +32223x +  +  +  +1x +32223x +32223x +32223x +32223x +66882x +66882x +66715x +  +66882x +66882x +66733x +173x +173x +113x +113x +113x +113x +  +60x +60x +60x +  +  +66560x +66548x +  +66560x +66560x +  +  +149x +26x +26x +26x +26x +26x +26x +  +26x +26x +  +123x +  +  +  +  +  +  +  +  +32223x +  +1x +  +8x +6x +2x +1x +  +1x +  +7x +7x +7x +33x +33x +13x +13x +  +  +7x +  +1x +66733x +66733x +66733x +  +  +  +1x +322x +322x +322x +316x +  +322x +322x +322x +223x +223x +  +322x +  +  +  +  +  +  +  +  +  +  +  +  +1x +139x +139x +26x +  +139x +  +139x +  +1x +123x +123x +123x +32163x +32163x +32163x +32134x +20x +  +32114x +  +  +32134x +  +29x +  +  +123x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { CSVParseParam } from "./Parameters";
+import { Converter } from "./Converter";
+import { Fileline } from "./fileline";
+import getEol from "./getEol";
+import { filterArray } from "./util";
+ 
+const defaulDelimiters = [",", "|", "\t", ";", ":"];
+export class RowSplit {
+  private quote: string;
+  private trim: boolean;
+  private escape: string;
+  private cachedRegExp: { [key: string]: RegExp } = {};
+  private delimiterEmitted = false;
+  private _needEmitDelimiter?: boolean = undefined;
+  private get needEmitDelimiter() {
+    if (this._needEmitDelimiter === undefined) {
+      this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0;
+    }
+    return this._needEmitDelimiter;
+  }
+  constructor(private conv: Converter) {
+    this.quote = conv.parseParam.quote;
+    this.trim = conv.parseParam.trim;
+    this.escape = conv.parseParam.escape;
+  }
+  parse(fileline: Fileline): RowSplitResult {
+    if (fileline === "") {
+      return { cells: [], closed: true };
+    }
+    const quote = this.quote;
+    const trim = this.trim;
+    const escape = this.escape;
+    if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") {
+      this.conv.parseRuntime.delimiter = this.getDelimiter(fileline);
+ 
+    }
+    if (this.needEmitDelimiter && !this.delimiterEmitted) {
+      this.conv.emit("delimiter", this.conv.parseRuntime.delimiter);
+      this.delimiterEmitted = true;
+    }
+    const delimiter = this.conv.parseRuntime.delimiter;
+    const rowArr = fileline.split(delimiter);
+    if (quote === "off") {
+      Eif (trim){
+        for (let i =0;i<rowArr.length;i++){
+          rowArr[i]=rowArr[i].trim();
+        }
+      }
+      return { cells: rowArr, closed: true };
+    } else {
+      return this.toCSVRow(rowArr, trim, quote, delimiter);
+    }
+ 
+  }
+  private toCSVRow(rowArr: string[], trim: boolean, quote: string, delimiter: string): RowSplitResult {
+    const row: string[] = [];
+    let inquote = false;
+    let quoteBuff = '';
+    for (let i = 0, rowLen = rowArr.length; i < rowLen; i++) {
+      let e = rowArr[i];
+      if (!inquote && trim) {
+        e = e.trimLeft();
+      }
+      const len = e.length;
+      if (!inquote) {
+        if (this.isQuoteOpen(e)) { //quote open
+          e = e.substr(1);
+          if (this.isQuoteClose(e)) { //quote close
+            e = e.substring(0, e.lastIndexOf(quote));
+            e = this.escapeQuote(e);
+            row.push(e);
+            continue;
+          } else {
+            inquote = true;
+            quoteBuff += e;
+            continue;
+          }
+        } else {
+          if (trim) {
+            e = e.trimRight();
+          }
+          row.push(e);
+          continue;
+        }
+      } else { //previous quote not closed
+        if (this.isQuoteClose(e)) { //close double quote
+          inquote = false;
+          e = e.substr(0, len - 1);
+          quoteBuff += delimiter + e;
+          quoteBuff = this.escapeQuote(quoteBuff);
+          Eif (trim) {
+            quoteBuff = quoteBuff.trimRight();
+          }
+          row.push(quoteBuff);
+          quoteBuff = "";
+        } else {
+          quoteBuff += delimiter + e;
+        }
+      }
+    }
+ 
+    // if (!inquote && param._needFilterRow) {
+    //   row = filterRow(row, param);
+    // }
+ 
+    return { cells: row, closed: !inquote };
+  }
+  private getDelimiter(fileline: Fileline): string {
+    let checker;
+    if (this.conv.parseParam.delimiter === "auto") {
+      checker = defaulDelimiters;
+    } else if (this.conv.parseParam.delimiter instanceof Array) {
+      checker = this.conv.parseParam.delimiter;
+    } else {
+      return this.conv.parseParam.delimiter;
+    }
+    let count = 0;
+    let rtn = ",";
+    checker.forEach(function (delim) {
+      const delimCount = fileline.split(delim).length;
+      if (delimCount > count) {
+        rtn = delim;
+        count = delimCount;
+      }
+    });
+    return rtn;
+  }
+  private isQuoteOpen(str: string): boolean {
+    const quote = this.quote;
+    const escape = this.escape;
+    return str[0] === quote && (
+      str[1] !== quote ||
+      str[1] === escape && (str[2] === quote || str.length === 2));
+  }
+  private isQuoteClose(str: string): boolean {
+    const quote = this.quote;
+    const escape = this.escape;
+    if (this.conv.parseParam.trim) {
+      str = str.trimRight();
+    }
+    let count = 0;
+    let idx = str.length - 1;
+    while (str[idx] === quote || str[idx] === escape) {
+      idx--;
+      count++;
+    }
+    return count % 2 !== 0;
+  }
+ 
+  // private twoDoubleQuote(str: string): string {
+  //   var twoQuote = this.quote + this.quote;
+  //   var curIndex = -1;
+  //   while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) {
+  //     str = str.substring(0, curIndex) + str.substring(++curIndex);
+  //   }
+  //   return str;
+  // }
+ 
+ 
+  private escapeQuote(segment: string): string {
+    const key = "es|" + this.quote + "|" + this.escape;
+    if (this.cachedRegExp[key] === undefined) {
+      this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g');
+    }
+    const regExp = this.cachedRegExp[key];
+    // console.log(regExp,segment);
+    return segment.replace(regExp, this.quote);
+  }
+  parseMultiLines(lines: Fileline[]): MultipleRowResult {
+    const csvLines: string[][] = [];
+    let left = "";
+    while (lines.length) {
+      const line = left + lines.shift();
+      const row = this.parse(line);
+      if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) {
+        if (this.conv.parseRuntime.selectedColumns) {
+          csvLines.push(filterArray(row.cells, this.conv.parseRuntime.selectedColumns));
+        } else {
+          csvLines.push(row.cells);
+        }
+ 
+        left = "";
+      } else {
+        left = line + (getEol(line, this.conv.parseRuntime) || "\n");
+      }
+    }
+    return { rowsCells: csvLines, partial: left };
+  }
+}
+export interface MultipleRowResult {
+  rowsCells: string[][];
+  partial: string;
+}
+export interface RowSplitResult {
+  /**
+   * csv row array. ["a","b","c"]
+   */
+  cells: string[],
+  /**
+   * if the passed fileline is a complete row
+   */
+  closed: boolean
+}
+ 
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/sort-arrow-sprite.png b/node_modules/csvtojson/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000..03f704a Binary files /dev/null and b/node_modules/csvtojson/coverage/sort-arrow-sprite.png differ diff --git a/node_modules/csvtojson/coverage/sorter.js b/node_modules/csvtojson/coverage/sorter.js new file mode 100644 index 0000000..6c5034e --- /dev/null +++ b/node_modules/csvtojson/coverage/sorter.js @@ -0,0 +1,158 @@ +var addSorting = (function () { + "use strict"; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { return document.querySelector('.coverage-summary'); } + // returns the thead element of the summary table + function getTableHeader() { return getTable().querySelector('thead tr'); } + // returns the tbody element of the summary table + function getTableBody() { return getTable().querySelector('tbody'); } + // returns the th element for nth column + function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/node_modules/csvtojson/coverage/test.ts.html b/node_modules/csvtojson/coverage/test.ts.html new file mode 100644 index 0000000..84aa2ed --- /dev/null +++ b/node_modules/csvtojson/coverage/test.ts.html @@ -0,0 +1,81 @@ + + + + Code coverage report for test.ts + + + + + + + +
+
+

+ All files test.ts +

+
+
+ 0% + Statements + 0/0 +
+
+ 0% + Branches + 0/0 +
+
+ 0% + Functions + 0/0 +
+
+ 0% + Lines + 0/0 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5  +  +  +  + 
import a from "./index";
+ 
+ 
+// a("sss","CCc");
+ 
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/coverage/util.ts.html b/node_modules/csvtojson/coverage/util.ts.html new file mode 100644 index 0000000..d173301 --- /dev/null +++ b/node_modules/csvtojson/coverage/util.ts.html @@ -0,0 +1,141 @@ + + + + Code coverage report for util.ts + + + + + + + +
+
+

+ All files util.ts +

+
+
+ 75% + Statements + 3/4 +
+
+ 25% + Branches + 1/4 +
+
+ 100% + Functions + 0/0 +
+
+ 66.67% + Lines + 2/3 +
+
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25322x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +25x +  +  +  +  +  + 
export function bufFromString(str: string): Buffer {
+  const length = Buffer.byteLength(str);
+  const buffer = Buffer.allocUnsafe
+    ? Buffer.allocUnsafe(length)
+    : new Buffer(length);
+  buffer.write(str);
+  return buffer;
+}
+ 
+export function emptyBuffer(): Buffer{
+  const buffer = Buffer.allocUnsafe
+    ? Buffer.allocUnsafe(0)
+    : new Buffer(0);
+  return buffer;
+}
+ 
+export function filterArray(arr: any[], filter: number[]): any[] {
+  const rtn: any[] = [];
+  for (let i = 0; i < arr.length; i++) {
+    if (filter.indexOf(i) > -1) {
+      rtn.push(arr[i]);
+    }
+  }
+  return rtn;
+}
+
+
+ + + + + + + + diff --git a/node_modules/csvtojson/index.d.ts b/node_modules/csvtojson/index.d.ts new file mode 100644 index 0000000..0107e38 --- /dev/null +++ b/node_modules/csvtojson/index.d.ts @@ -0,0 +1,4 @@ +import csv=require("./v2"); + +export=csv; + diff --git a/node_modules/csvtojson/index.js b/node_modules/csvtojson/index.js new file mode 100644 index 0000000..6a9e64c --- /dev/null +++ b/node_modules/csvtojson/index.js @@ -0,0 +1 @@ +module.exports=require("./v2"); \ No newline at end of file diff --git a/node_modules/csvtojson/package.json b/node_modules/csvtojson/package.json new file mode 100644 index 0000000..93e53a3 --- /dev/null +++ b/node_modules/csvtojson/package.json @@ -0,0 +1,315 @@ +{ + "name": "csvtojson", + "description": "A tool concentrating on converting csv data to JSON with customised parser supporting", + "author": "Keyang Xiang ", + "homepage": "https://github.com/Keyang/node-csvtojson", + "bugs": "https://github.com/Keyang/node-csvtojson/issues", + "repository": { + "type": "git", + "url": "https://github.com/Keyang/node-csvtojson.git" + }, + "contributors": [ + { + "name": "Dane Petersen", + "email": null, + "url": "https://github.com/thegreatsunra", + "contributions": 1, + "additions": 18920, + "deletions": 8429, + "hireable": null + }, + { + "name": "Jessica Good", + "email": null, + "url": "https://github.com/jessicagood", + "contributions": 1, + "additions": 8, + "deletions": 5, + "hireable": null + }, + { + "name": null, + "email": null, + "url": "https://github.com/nbelakovski", + "contributions": 2, + "additions": 2, + "deletions": 2, + "hireable": null + }, + { + "name": "Robert Porter", + "email": null, + "url": "https://github.com/colarob", + "contributions": 1, + "additions": 64, + "deletions": 21, + "hireable": null + }, + { + "name": "Dimitri Kennedy", + "email": null, + "url": "https://github.com/roodboi", + "contributions": 2, + "additions": 3, + "deletions": 3, + "hireable": null + }, + { + "name": "José Expósito", + "email": null, + "url": "https://github.com/JoseExposito", + "contributions": 1, + "additions": 9, + "deletions": 3, + "hireable": null + }, + { + "name": "Daniel Cohen", + "email": null, + "url": "https://github.com/dcohenb", + "contributions": 1, + "additions": 1, + "deletions": 6, + "hireable": true + }, + { + "name": "Richard Pringle", + "email": null, + "url": "https://github.com/richardpringle", + "contributions": 1, + "additions": 1, + "deletions": 1, + "hireable": null + }, + { + "name": "Bert Verhelst", + "email": null, + "url": "https://github.com/bertyhell", + "contributions": 1, + "additions": 17, + "deletions": 0, + "hireable": null + }, + { + "name": null, + "email": null, + "url": "https://github.com/jondayft", + "contributions": 1, + "additions": 18, + "deletions": 0, + "hireable": null + }, + { + "name": "Bruce Johnson", + "email": null, + "url": "https://github.com/brucejo75", + "contributions": 1, + "additions": 36, + "deletions": 1, + "hireable": null + }, + { + "name": "Jimi Ford", + "email": null, + "url": "https://github.com/JimiHFord", + "contributions": 1, + "additions": 5, + "deletions": 5, + "hireable": true + }, + { + "name": "Alec Fenichel", + "email": null, + "url": "https://github.com/fenichelar", + "contributions": 1, + "additions": 1, + "deletions": 1, + "hireable": true + }, + { + "name": "Hocine Moukaideche", + "email": null, + "url": "https://github.com/Off76", + "contributions": 1, + "additions": 1, + "deletions": 1, + "hireable": true + }, + { + "name": "Blake Blackshear", + "email": null, + "url": "https://github.com/blakeblackshear", + "contributions": 2, + "additions": 8, + "deletions": 8, + "hireable": null + }, + { + "name": "Amila Welihinda", + "email": null, + "url": "https://github.com/amilajack", + "contributions": 1, + "additions": 2, + "deletions": 1, + "hireable": true + }, + { + "name": "Zsolt R. Molnar", + "email": null, + "url": "https://github.com/molnarzs", + "contributions": 1, + "additions": 40, + "deletions": 2, + "hireable": true + }, + { + "name": "Ionică Bizău (Johnny B.)", + "email": null, + "url": "https://github.com/IonicaBizau", + "contributions": 1, + "additions": 98, + "deletions": 86, + "hireable": null + }, + { + "name": "Keita Akutsu", + "email": null, + "url": "https://github.com/kakts", + "contributions": 4, + "additions": 821, + "deletions": 784, + "hireable": true + }, + { + "name": null, + "email": null, + "url": "https://github.com/markwithers", + "contributions": 1, + "additions": 1, + "deletions": 1, + "hireable": null + }, + { + "name": "Trang", + "email": null, + "url": "https://github.com/trangtungn", + "contributions": 1, + "additions": 6, + "deletions": 1, + "hireable": true + }, + { + "name": "Keyang Xiang", + "email": null, + "url": "https://github.com/Keyang", + "contributions": 141, + "additions": 70357, + "deletions": 66412, + "hireable": null + }, + { + "name": "Jeff Johnson", + "email": null, + "url": "https://github.com/jeffcjohnson", + "contributions": 1, + "additions": 1, + "deletions": 1, + "hireable": null + }, + { + "name": "Sean Lang", + "email": null, + "url": "https://github.com/slang800", + "contributions": 2, + "additions": 2, + "deletions": 1, + "hireable": true + }, + { + "name": "Matthias Lienau", + "email": null, + "url": "https://github.com/atufkas", + "contributions": 9, + "additions": 74, + "deletions": 45, + "hireable": null + }, + { + "name": "Ron Korving", + "email": null, + "url": "https://github.com/ronkorving", + "contributions": 3, + "additions": 3, + "deletions": 3, + "hireable": null + } + ], + "version": "2.0.10", + "keywords": [ + "csv", + "csv parser", + "parse csv", + "csvtojson", + "json", + "csv to json", + "csv convert", + "tojson", + "convert csv to json", + "csv-json" + ], + "bin": { + "csvtojson": "./bin/csvtojson" + }, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + }, + "devDependencies": { + "@types/bluebird": "^3.5.20", + "@types/mocha": "^5.2.0", + "@types/node": "^10.0.1", + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "coveralls": "^3.0.1", + "minimist": "^1.2.0", + "mocha": "^5.1.1", + "nyc": "^11.7.3", + "sinon": "^3.2.3", + "ts-node": "^6.0.3", + "typescript": "^2.8.3", + "uglifyjs-webpack-plugin": "^1.2.7", + "webpack": "^4.16.4", + "webpack-cli": "^3.1.0" + }, + "dependencies": { + "bluebird": "^3.5.1", + "lodash": "^4.17.3", + "strip-bom": "^2.0.0" + }, + "nyc": { + "extension": [ + ".ts", + ".tsx" + ], + "include": [ + "./src/**/*.ts" + ], + "all": true + }, + "scripts": { + "dev": "tsc -w", + "build": "rm -Rf ./v2 && tsc && npm run build:browser && npm run build:browser:window", + "build:browser": "webpack --config ./webpack.config.js", + "build:browser:window": "webpack --config ./webpack.config.js --output-library-target=window --output-library=csv --output-filename=csvtojson.min.js", + "test": "rm -Rf .ts-node && TS_NODE_CACHE_DIRECTORY=.ts-node mocha -r ts-node/register src/**/*.test.ts ./test/*.ts -R spec", + "travis": "nyc --reporter lcov mocha -r ts-node/register src/**/*.test.ts ./test/*.ts -R spec", + "test:debug": "mocha debug -r ts-node/register src/**/*.test.ts ./test/*.ts -R spec", + "test:function": "mocha -r ts-node/register test/**/*.ts", + "test-all": "mocha ./test -R spec && CSV_WORKER=3 mocha ./test -R spec ", + "test:unit": "mocha -r ts-node/register src/**/*.ts", + "test:all:debug": "mocha debug ./testNew -R spec", + "coverage": "nyc --reporter html mocha -r ts-node/register src/**/*.test.ts ./test/*.ts -R spec", + "coveralls": "cat ./coverage/lcov.info | ./node_modules/.bin/coveralls" + }, + "browser": "./browser/browser.js", + "main": "./v2/index.js" +} diff --git a/node_modules/csvtojson/readme-old.md b/node_modules/csvtojson/readme-old.md new file mode 100644 index 0000000..6f7a009 --- /dev/null +++ b/node_modules/csvtojson/readme-old.md @@ -0,0 +1,914 @@ +[![Build Status](https://travis-ci.org/Keyang/node-csvtojson.svg?branch=master)](https://travis-ci.org/Keyang/node-csvtojson) + +# CSVTOJSON +All you need nodejs csv to json converter. +* Large CSV data +* Command Line Tool and Node.JS Lib +* Complex/nested JSON +* Easy Customised Parser +* Stream based +* multi CPU core support +* Easy Usage +* more! + +# Demo + +[Here](http://keyangxiang.com/csvtojson/) is a free online csv to json service ultilising latest csvtojson module. + +## Menu +* [Installation](#installation) +* [Usage](#usage) + * [Library](#library) + * [Convert from a file](#from-file) + * [Convert from a web resource / Readable stream](#from-web) + * [Convert from CSV string](#from-string) +* [Parameters](#params) +* [Result Transform](#result-transform) + * [Synchronouse Transformer](#synchronouse-transformer) + * [Asynchronouse Transformer](#asynchronouse-transformer) + * [Convert to other data type](#convert-to-other-data-type) +* [Hooks](#hooks) +* [Events](#events) +* [Flags](#flags) +* [Big CSV File Streaming](#big-csv-file) +* [Process Big CSV File in CLI](#convert-big-csv-file-with-command-line-tool) +* [Parse String](#parse-string) +* [Empowered JSON Parser](#empowered-json-parser) +* [Field Type](#field-type) +* [Multi-Core / Fork Process](#multi-cpu-core) +* [Header Configuration](#header-configuration) +* [Error Handling](#error-handling) +* [Customised Parser](#parser) +* [Stream Options](#stream-options) +* [Change Log](#change-log) + +GitHub: https://github.com/Keyang/node-csvtojson + +## Installation + +>npm install -g csvtojson + +>npm install csvtojson --save + +## Usage + +### library + +#### From File + +You can use File stream + +```js +//Converter Class +var Converter = require("csvtojson").Converter; +var converter = new Converter({}); + +//end_parsed will be emitted once parsing finished +converter.on("end_parsed", function (jsonArray) { + console.log(jsonArray); //here is your result jsonarray +}); + +//read from file +require("fs").createReadStream("./file.csv").pipe(converter); +``` + +Or use fromFile convenient function + +```js +//Converter Class +var Converter = require("csvtojson").Converter; +var converter = new Converter({}); +converter.fromFile("./file.csv",function(err,result){ + +}); +``` + +#### From Web + +To convert any CSV data from readable stream just simply pipe in the data. + +```js +//Converter Class +var Converter = require("csvtojson").Converter; +var converter = new Converter({constructResult:false}); //for big csv data + +//record_parsed will be emitted each csv row being processed +converter.on("record_parsed", function (jsonObj) { + console.log(jsonObj); //here is your result json object +}); + +require("request").get("http://csvwebserver").pipe(converter); + +``` + +#### From String + +```js +var Converter = require("csvtojson").Converter; +var converter = new Converter({}); +converter.fromString(csvString, function(err,result){ + //your code here +}); +``` + +### Command Line Tools + +>csvtojson + +Example + +>csvtojson ./myCSVFile + +Or use pipe: + +>cat myCSVFile | csvtojson + +Check current version: + +>csvtojson version + +Advanced usage with parameters support, check help: + +>csvtojson --help + +# Params + +The constructor of csv Converter allows parameters: + +```js +var converter=new require("csvtojson").Converter({ + constructResult:false, + workerNum:4, + noheader:true +}); +``` + +Following parameters are supported: + +* **constructResult**: true/false. Whether to construct final json object in memory which will be populated in "end_parsed" event. Set to false if deal with huge csv data. default: true. +* **delimiter**: delimiter used for seperating columns. Use "auto" if delimiter is unknown in advance, in this case, delimiter will be auto-detected (by best attempt). Use an array to give a list of potential delimiters e.g. [",","|","$"]. default: "," +* **quote**: If a column contains delimiter, it is able to use quote character to surround the column content. e.g. "hello, world" wont be split into two columns while parsing. Set to "off" will ignore all quotes. default: " (double quote) +* **trim**: Indicate if parser trim off spaces surrounding column content. e.g. " content " will be trimmed to "content". Default: true +* **checkType**: This parameter turns on and off weather check field type. default is true. See [Field type](#field-type) +* **toArrayString**: Stringify the stream output to JSON array. This is useful when pipe output to a file which expects stringified JSON array. default is false and only stringified JSON (without []) will be pushed to downstream. +* **ignoreEmpty**: Ignore the empty value in CSV columns. If a column value is not giving, set this to true to skip them. Defalut: false. +* **workerNum**: Number of worker processes. The worker process will use multi-cores to help process CSV data. Set to number of Core to improve the performance of processing large csv file. Keep 1 for small csv files. Default 1. +* **fork(Deprecated, same as workerNum=2)**: Use another CPU core to process the CSV stream. +* **noheader**:Indicating csv data has no header row and first row is data row. Default is false. See [header configuration](#header-configuration) +* **headers**: An array to specify the headers of CSV data. If --noheader is false, this value will override CSV header row. Default: null. Example: ["my field","name"]. See [header configuration](#header-configuration) +* **flatKeys**: Don't interpret dots (.) and square brackets in header fields as nested object or array identifiers at all (treat them like regular characters for JSON field identifiers). Default: false. +* **maxRowLength**: the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0 +* **checkColumn**: whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false +* **eol**: End of line character. If omitted, parser will attempt retrieve it from first chunk of CSV data. If no valid eol found, then operation system eol will be used. +* **escape**: escape character used in quoted column. Default is double quote (") according to RFC4108. Change to back slash (\) or other chars for your own case. + +All parameters can be used in Command Line tool. see + +``` +csvtojson --help +``` + +# Result Transform + +To transform JSON result, (e.g. change value of one column), just simply add 'transform handler'. + +## Synchronouse transformer + +```js +var Converter=require("csvtojson").Converter; +var csvConverter=new Converter({}); +csvConverter.transform=function(json,row,index){ + json["rowIndex"]=index; + /* some other examples: + delete json["myfield"]; //remove a field + json["dateOfBirth"]=new Date(json["dateOfBirth"]); // convert a field type + */ +}; +csvConverter.fromString(csvString,function(err,result){ + //all result rows will add a field 'rowIndex' indicating the row number of the csv data: + /* + [{ + field1:value1, + rowIndex: 0 + }] + */ +}); +``` + +As shown in example above, it is able to apply any changes to the result json which will be pushed to down stream and "record_parsed" event. + +## Asynchronouse Transformer + +Asynchronouse transformation can be achieve either through "record_parsed" event or creating a Writable stream. + +### Use record_parsed + +To transform data asynchronously, it is suggested to use csvtojson with [Async Queue](https://github.com/caolan/async#queue). + +This mainly is used when transformation of each csv row needs be mashed with data retrieved from external such as database / server / file system. + +However this approach will **not** change the json result pushed to downstream. + +Here is an example: + +```js +var Conv=require("csvtojson").Converter; +var async=require("async"); +var rs=require("fs").createReadStream("path/to/csv"); // or any readable stream to csv data. +var q=async.queue(function(json,callback){ + //process the json asynchronously. + require("request").get("http://myserver/user/"+json.userId,function(err,user){ + //do the data mash here + json.user=user; + callback(); + }); +},10);//10 concurrent worker same time +q.saturated=function(){ + rs.pause(); //if queue is full, it is suggested to pause the readstream so csvtojson will suspend populating json data. It is ok to not to do so if CSV data is not very large. +} +q.empty=function(){ + rs.resume();//Resume the paused readable stream. you may need check if the readable stream isPaused() (this is since node 0.12) or finished. +} +var conv=new Conv({construct:false}); +conv.transform=function(json){ + q.push(json); +}; +conv.on("end_parsed",function(){ + q.drain=function(){ + //code when Queue process finished. + } +}) +rs.pipe(conv); +``` + +In example above, the transformation will happen if one csv rown being processed. The related user info will be pulled from a web server and mashed into json result. + +There will be at most 10 data transformation woker working concurrently with the help of Async Queue. + +### Use Stream + +It is able to create a Writable stream (or Transform) which process data asynchronously. See [Here](https://nodejs.org/dist/latest-v4.x/docs/api/stream.html#stream_class_stream_transform) for more details. + +## Convert to other data type + +Below is an example of result tranformation which converts csv data to a column array rather than a JSON. + +```js +var Converter=require("csvtojson").Converter; +var columArrData=__dirname+"/data/columnArray"; +var rs=fs.createReadStream(columArrData); +var result = {} +var csvConverter=new Converter(); +//end_parsed will be emitted once parsing finished +csvConverter.on("end_parsed", function(jsonObj) { + console.log(result); + console.log("Finished parsing"); + done(); +}); + +//record_parsed will be emitted each time a row has been parsed. +csvConverter.on("record_parsed", function(resultRow, rawRow, rowIndex) { + + for (var key in resultRow) { + if (!result[key] || !result[key] instanceof Array) { + result[key] = []; + } + result[key][rowIndex] = resultRow[key]; + } + +}); +rs.pipe(csvConverter); +``` + +Here is an example: + +```csv + TIMESTAMP,UPDATE,UID,BYTES SENT,BYTES RCVED + 1395426422,n,10028,1213,5461 + 1395426422,n,10013,9954,13560 + 1395426422,n,10109,221391500,141836 + 1395426422,n,10007,53448,308549 + 1395426422,n,10022,15506,72125 +``` + +It will be converted to: + +```json +{ + "TIMESTAMP": ["1395426422", "1395426422", "1395426422", "1395426422", "1395426422"], + "UPDATE": ["n", "n", "n", "n", "n"], + "UID": ["10028", "10013", "10109", "10007", "10022"], + "BYTES SENT": ["1213", "9954", "221391500", "53448", "15506"], + "BYTES RCVED": ["5461", "13560", "141836", "308549", "72125"] +} +``` + +# Hooks +## preProcessRaw +This hook is called when parser received any data from upper stream and allow developers to change it. e.g. +```js +/* +CSV data: +a,b,c,d,e +12,e3,fb,w2,dd +*/ + +var conv=new Converter(); +conv.preProcessRaw=function(data,cb){ + //change all 12 to 23 + cb(data.replace("12","23")); +} +conv.fromString(csv,function(err,json){ + //json:{a:23 ....} +}) +``` +By default, the preProcessRaw just returns the data from the source +```js +Converter.prototype.preProcessRaw=function(data,cb){ + cb(data); +} +``` +It is also very good to sanitise/prepare the CSV data stream. +```js +var headWhiteSpaceRemoved=false; +conv.preProcessRaw=function(data,cb){ + if (!headWhiteSpaceRemoved){ + data=data.replace(/^\s+/,""); + cb(data); + }else{ + cb(data); + } +} +``` +## preProcessLine +this hook is called when a file line is emitted. It is called with two parameters `fileLineData,lineNumber`. The `lineNumber` is starting from 1. +```js +/* +CSV data: +a,b,c,d,e +12,e3,fb,w2,dd +*/ + +var conv=new Converter(); +conv.preProcessLine=function(line,lineNumber){ + //only change 12 to 23 for line 2 + if (lineNumber === 2){ + line=line.replace("12","23"); + } + return line; +} +conv.fromString(csv,function(err,json){ + //json:{a:23 ....} +}) +``` +Notice that preProcessLine does not support async changes not like preProcessRaw hook. + + +# Events + +Following events are used for Converter class: + +* end_parsed: It is emitted when parsing finished. the callback function will contain the JSON object if constructResult is set to true. +* record_parsed: it is emitted each time a row has been parsed. The callback function has following parameters: result row JSON object reference, Original row array object reference, row index of current row in csv (header row does not count, first row content will start from 0) + +To subscribe the event: + +```js +//Converter Class +var Converter=require("csvtojson").Converter; + +//end_parsed will be emitted once parsing finished +csvConverter.on("end_parsed",function(jsonObj){ + console.log(jsonObj); //here is your result json object +}); + +//record_parsed will be emitted each time a row has been parsed. +csvConverter.on("record_parsed",function(resultRow,rawRow,rowIndex){ + console.log(resultRow); //here is your result json object +}); +``` + +# Flags + +There are flags in the library: + +\*omit\*: Omit a column. The values in the column will not be built into JSON result. + +\*flat\*: Mark a head column as is the key of its JSON result. + +Example: + +```csv +*flat*user.name, user.age, *omit*user.gender +Joe , 40, Male +``` + +It will be converted to: + +```js +[{ + "user.name":"Joe", + "user":{ + "age":40 + } +}] +``` + +# Big CSV File +csvtojson library was designed to accept big csv file converting. To avoid memory consumption, it is recommending to use read stream and write stream. + +```js +var Converter=require("csvtojson").Converter; +var csvConverter=new Converter({constructResult:false}); // The parameter false will turn off final result construction. It can avoid huge memory consumption while parsing. The trade off is final result will not be populated to end_parsed event. + +var readStream=require("fs").createReadStream("inputData.csv"); + +var writeStream=require("fs").createWriteStream("outpuData.json"); + +readStream.pipe(csvConverter).pipe(writeStream); +``` + +The constructResult:false will tell the constructor not to combine the final result which would drain the memory as progressing. The output is piped directly to writeStream. + +# Convert Big CSV File with Command line tool +csvtojson command line tool supports streaming in big csv file and stream out json file. + +It is very convenient to process any kind of big csv file. It's proved having no issue to proceed csv files over 3,000,000 lines (over 500MB) with memory usage under 30MB. + +Once you have installed [csvtojson](#installation), you could use the tool with command: + +``` +csvtojson [path to bigcsvdata] > converted.json +``` + +Or if you prefer streaming data in from another application: + +``` +cat [path to bigcsvdata] | csvtojson > converted.json +``` + +They will do the same job. + + + +# Parse String +To parse a string, simply call fromString(csvString,callback) method. The callback parameter is optional. + +For example: + +```js +var testData=__dirname+"/data/testData"; +var data=fs.readFileSync(testData).toString(); +var csvConverter=new CSVConverter(); + +//end_parsed will be emitted once parsing finished +csvConverter.on("end_parsed", function(jsonObj) { + //final result poped here as normal. +}); +csvConverter.fromString(data,function(err,jsonObj){ + if (err){ + //err handle + } + console.log(jsonObj); +}); + +``` + +# Empowered JSON Parser + +*Note: If you want to maintain the original CSV data header values as JSON keys "as is" without being +interpreted as (complex) JSON structures you can set the option `--flatKeys=true`.* + +Since version 0.3.8, csvtojson now can replicate any complex JSON structure. +As we know, JSON object represents a graph while CSV is only 2-dimension data structure (table). +To make JSON and CSV containing same amount information, we need "flatten" some information in JSON. + +Here is an example. Original CSV: + +```csv +fieldA.title, fieldA.children[0].name, fieldA.children[0].id,fieldA.children[1].name, fieldA.children[1].employee[].name,fieldA.children[1].employee[].name, fieldA.address[],fieldA.address[], description +Food Factory, Oscar, 0023, Tikka, Tim, Joe, 3 Lame Road, Grantstown, A fresh new food factory +Kindom Garden, Ceil, 54, Pillow, Amst, Tom, 24 Shaker Street, HelloTown, Awesome castle + +``` +The data above contains nested JSON including nested array of JSON objects and plain texts. + +Using csvtojson to convert, the result would be like: + +```json +[{ + "fieldA": { + "title": "Food Factory", + "children": [{ + "name": "Oscar", + "id": "0023" + }, { + "name": "Tikka", + "employee": [{ + "name": "Tim" + }, { + "name": "Joe" + }] + }], + "address": ["3 Lame Road", "Grantstown"] + }, + "description": "A fresh new food factory" +}, { + "fieldA": { + "title": "Kindom Garden", + "children": [{ + "name": "Ceil", + "id": "54" + }, { + "name": "Pillow", + "employee": [{ + "name": "Amst" + }, { + "name": "Tom" + }] + }], + "address": ["24 Shaker Street", "HelloTown"] + }, + "description": "Awesome castle" +}] +``` + +Here is the rule for CSV data headers: + +* Use dot(.) to represent nested JSON. e.g. field1.field2.field3 will be converted to {field1:{field2:{field3:< value >}}} +* Use square brackets([]) to represent an Array. e.g. field1.field2[< index >] will be converted to {field1:{field2:[< values >]}}. Different column with same header name will be added to same array. +* Array could contain nested JSON object. e.g. field1.field2[< index >].name will be converted to {field1:{field2:[{name:< value >}]}} +* The index could be omitted in some situation. However it causes information lost. Therefore Index should **NOT** be omitted if array contains JSON objects with more than 1 field (See example above fieldA.children[1].employee field, it is still ok if child JSON contains only 1 field). + +Since 0.3.8, JSON parser is the default parser. It does not need to add "\*json\*" to column titles. Theoretically, the JSON parser now should have functionality of "Array" parser, "JSONArray" parser, and old "JSON" parser. + +This mainly purposes on the next few versions where csvtojson could convert a JSON object back to CSV format without losing information. +It can be used to process JSON data exported from no-sql database like MongoDB. + +# Field Type + +From version 0.3.14, type of fields are supported by csvtojson. +The parameter checkType is used to whether to check and convert the field type. +See [here](#params) for the parameter usage. + +Thank all who have contributed to ticket [#20](https://github.com/Keyang/node-csvtojson/issues/20). + +## Implict Type + +When checkType is turned on, parser will try to convert value to its implicit type if it is not explicitly specified. + +For example, csv data: +```csv +name, age, married, msg +Tom, 12, false, {"hello":"world","total":23} + +``` +Will be converted into: + +```json +{ + "name":"Tom", + "age":12, + "married":false, + "msg":{ + "hello":"world", + "total":"23" + } +} +``` +If checkType is turned **OFF**, it will be converted to: + +```json +{ + "name":"Tom", + "age":"12", + "married":"false", + "msg":"{\"hello\":\"world\",\"total\":23}" +} +``` + + +## Explicit Type +CSV header column can explicitly define the type of the field. +Simply add type before column name with a hash and exclaimation (#!). + +### Supported types: +* string +* number + +### Define Type +To define the field type, see following example + +```csv +string#!appNumber, string#!finished, *flat*string#!user.msg, unknown#!msg +201401010002, true, {"hello":"world","total":23},a message +``` +The data will be converted to: + +```json +{ + "appNumber":"201401010002", + "finished":"true", + "user.msg":"{\"hello\":\"world\",\"total\":23}" +} +``` + +## Multi-CPU (Core) +Since version 0.4.0, csvtojson supports multiple CPU cores to process large csv files. +The implementation and benchmark result can be found [here](http://keyangxiang.com/2015/06/11/node-js-multi-core-programming-pracitse/). + +To enable multi-core, just pass the worker number as parameter of constructor: + +```js + var Converter=require("csvtojson").Converter; + var converter=new Converter({ + workerNum:2 //use two cores + }); +``` +The minimum worker number is 1. When worker number is larger than 1, the parser will balance the job load among workers. + +For command line, to use worker just use ```--workerNum``` argument: + +``` +csvtojson --workerNum=3 ./myfile.csv +``` + +It is worth to mention that for small size of CSV file it actually costs more time to create processes and keep the communication between them. Therefore, use less workers for small CSV files. + +### Fork Process (Deprecated since 0.5.0) +*Node.JS is running on single thread. You will not want to convert a large csv file on the same process where your node.js webserver is running. csvtojson gives an option to fork the whole conversion process to a new system process while the origin process will only pipe the input and result in and out. It very simple to enable this feature: + +```js +var Converter=require("csvtojson").Converter; + var converter=new Converter({ + fork:true //use child process to convert + }); +``` +Same as multi-workers, fork a new process will cause extra cost on process communication and life cycle management. Use it wisely.* + +Since 0.5.0, fork=true is the same as workerNum=2. + +### Header configuration + +CSV header row can be configured programmatically. + +the *noheader* parameter indicate if first row of csv is header row or not. e.g. CSV data: + +``` +CC102-PDMI-001,eClass_5.1.3,10/3/2014,12,40,green,40 +CC200-009-001,eClass_5.1.3,11/3/2014,5,3,blue,38,extra field! +``` + +With noheader=true + +``` +csvtojson ./test/data/noheadercsv --noheader=true +``` + +we can get following result: + +```json +[ +{"field1":"CC102-PDMI-001","field2":"eClass_5.1.3","field3":"10/3/2014","field4":"12","field5":"40","field6":"green","field7":"40"}, +{"field1":"CC200-009-001","field2":"eClass_5.1.3","field3":"11/3/2014","field4":"5","field5":"3","field6":"blue","field7":"38","field8":"extra field!"} +] +``` + +or we can use it in code: + +```js +var converter=new require("csvtojson").Converter({noheader:true}); +``` + +the *headers* parameter specify the header row in an array. If *noheader* is false, this value will override csv header row. With csv data above, run command: + +``` +csvtojson ./test/data/noheadercsv --noheader=true --headers='["hell","csv"]' +``` + +we get following results: + +```json +[ + {"hell":"CC102-PDMI-001","csv":"eClass_5.1.3","field3":"10/3/2014","field4":"12","field5":"40","field6":"green","field7":"40"}, + {"hell":"CC200-009-001","csv":"eClass_5.1.3","field3":"11/3/2014","field4":"5","field5":"3","field6":"blue","field7":"38","field8":"extra field!"} +] +``` + +If length of headers array is smaller than the column of csv, converter will automatically fill the column with "field*". where * is current column index starting from 1. + +Also we can use it in code: + +```js +var converter=new require("csvtojson").Converter({headers:["my header1","hello world"]}); +``` + +# Error handling + +Since version 0.4.4, parser detects CSV data corruption. It is important to catch those erros if CSV data is not guranteed correct. Just simply register a listener to error event: + +```js + var converter=new require("csvtojson").Converter(); + converter.on("error",function(errMsg,errData){ + //do error handling here + }); +``` + +Once an error is emitted, the parser will continously parse csv data if up stream is still populating data. Therefore, a general practise is to close / destroy up stream once error is captured. + +Here are built-in error messages and corresponding error data: + +* unclosed_quote: If quote in csv is not closed, this error will be populated. The error data is a string which contains un-closed csv row. +* row_exceed: If maxRowLength is given a number larger than 0 and a row is longer than the value, this error will be populated. The error data is a string which contains the csv row exceeding the length. +* row_process: Any error happened while parser processing a csv row will populate this error message. The error data is detailed error message (e.g. checkColumn is true and column size of a row does not match that of header). + + +# Parser + +** Parser will be replaced by [Result Transform](#result-transform) and [Flags](#flags) ** + +This feature will be disabled in future. + +CSVTOJSON allows adding customised parsers which concentrating on what to parse and how to parse. +It is the main power of the tool that developer only needs to concentrate on how to deal with the data and other concerns like streaming, memory, web, cli etc are done automatically. + +How to add a customised parser: + +```js +//Parser Manager +var parserMgr=require("csvtojson").parserMgr; + +parserMgr.addParser("myParserName",/^\*parserRegExp\*/,function (params){ + var columnTitle=params.head; //params.head be like: *parserRegExp*ColumnName; + var fieldName=columnTitle.replace(this.regExp, ""); //this.regExp is the regular expression above. + params.resultRow[fieldName]="Hello my parser"+params.item; +}); +``` + +parserMgr's addParser function take three parameters: + +1. parser name: the name of your parser. It should be unique. + +2. Regular Expression: It is used to test if a column of CSV data is using this parser. In the example above any column's first row starting with *parserRegExp* will be using it. + +3. Parse function call back: It is where the parse happens. The converter works row by row and therefore the function will be called each time needs to parse a cell in CSV data. + +The parameter of Parse function is a JSON object. It contains following fields: + +**head**: The column's first row's data. It generally contains field information. e.g. *array*items + +**item**: The data inside current cell. e.g. item1 + +**itemIndex**: the index of current cell of a row. e.g. 0 + +**rawRow**: the reference of current row in array format. e.g. ["item1", 23 ,"hello"] + +**resultRow**: the reference of result row in JSON format. e.g. {"name":"Joe"} + +**rowIndex**: the index of current row in CSV data. start from 1 since 0 is the head. e.g. 1 + +**resultObject**: the reference of result object in JSON format. It always has a field called csvRows which is in Array format. It changes as parsing going on. e.g. + +```json +{ + "csvRows":[ + { + "itemName":"item1", + "number":10 + }, + { + "itemName":"item2", + "number":4 + } + ] +} +``` +#Stream Options +Since version 1.0.0, the Converter constructor takes stream options as second parameter. + +```js +const conv=new Converter(params,{ + objectMode:true, // stream down JSON object instead of JSON array + highWaterMark:65535 //Buffer level +}) + +``` + +See more detailed information [here](https://nodejs.org/api/stream.html#stream_class_stream_transform). + + +#Change Log + +## 1.1.0 + +* Remove support of `new Converter(true)` + +## 1.0.2 +* supported ndjson format as per #113 and #87 +* issue: #120 + +## 1.0.0 +* Add [Stream Options](#stream-options) +* Change version syntax to follow x.y.z + +## 0.5.12 +* Added support for scientific notation number support (#100) +* Added "off" option to quote parameter + +## 0.5.4 +* Added new feature: accept special delimiter "auto" and array + +## 0.5.2 + +* Changed type separator from # to #! +* Fixed bugs + +## 0.5.0 + +* Fixed some bugs +* Performance improvement +* **Implicity type for numbers now use RegExp:/^[-+]?[0-9]*\.?[0-9]+$/. Previously 00131 is a string now will be recognised as number type** +* **If a column has no head, now it will use current column index as column name: 'field*'. previously parser uses a fixed index starting from 1. e.g. csv data: 'aa,bb,cc' with head 'a,b'. previously it will convert to {'a':'aa','b':'bb','field1':'cc'} and now it is {'a':'aa','b':'bb','field3':'cc'}** + +## 0.4.7 +* ignoreEmpty now ignores empty rows as well +* optimised performance +* added fromFile method + +## 0.4.4 +* Add error handling for corrupted CSV data +* Exposed "eol" param + +## 0.4.3 +* Added header configuration +* Refactored worker code +* **Number type field now returns 0 if parseFloat returns NaN with the value of the field. Previously it returns original value in string.** + +## 0.4.0 +* Added Multi-core CPU support to increase performance +* Added "fork" option to delegate csv converting work to another process. +* Refactoring general flow + +## 0.3.21 +* Refactored Command Line Tool. +* Added ignoreEmpty parameter. + +## 0.3.18 +* Fixed double qoute parse as per CSV standard. + +## 0.3.14 +* Added field type support +* Fixed some minor bugs + +## 0.3.8 +* Empowered built-in JSON parser. +* Change: Use JSON parser as default parser. +* Added parameter trim in constructor. default: true. trim will trim content spaces. + +## 0.3.5 +* Added fromString method to support direct string input + +## 0.3.4 +* Added more parameters to command line tool. + +## 0.3.2 +* Added quote in parameter to support quoted column content containing delimiters +* Changed row index starting from 0 instead of 1 when populated from record_parsed event + +## 0.3 +* Removed all dependencies +* Deprecated applyWebServer +* Added construct parameter for Converter Class +* Converter Class now works as a proper stream object + +# IMPORTANT!! +Since version 0.3, the core class of csvtojson has been inheriting from stream.Transform class. Therefore, it will behave like a normal Stream object and CSV features will not be available any more. Now the usage is like: +```js +//Converter Class +var fs = require("fs"); +var Converter = require("csvtojson").Converter; +var fileStream = fs.createReadStream("./file.csv"); +//new converter instance +var converter = new Converter({constructResult:true}); +//end_parsed will be emitted once parsing finished +converter.on("end_parsed", function (jsonObj) { + console.log(jsonObj); //here is your result json object +}); +//read from file +fileStream.pipe(converter); +``` + +To convert from a string, previously the code was: +```js +csvConverter.from(csvString); +``` + +Now it is: +```js +csvConverter.fromString(csvString, callback); +``` + +The callback function above is optional. see [Parse String](#parse-string). + +After version 0.3, csvtojson requires node 0.10 and above. + diff --git a/node_modules/csvtojson/readme.md b/node_modules/csvtojson/readme.md new file mode 100644 index 0000000..8fff914 --- /dev/null +++ b/node_modules/csvtojson/readme.md @@ -0,0 +1,680 @@ +[![Build Status](https://travis-ci.org/Keyang/node-csvtojson.svg?branch=master)](https://travis-ci.org/Keyang/node-csvtojson) +[![Coverage Status](https://coveralls.io/repos/github/Keyang/node-csvtojson/badge.svg?branch=master)](https://coveralls.io/github/Keyang/node-csvtojson?branch=master) +[![OpenCollective](https://opencollective.com/csvtojson/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/csvtojson/sponsors/badge.svg)](#sponsors) + +# CSVTOJSON + +`csvtojson` module is a comprehensive nodejs csv parser to convert csv to json or column arrays. It can be used as node.js library / command line tool / or in browser. Below are some features: + +* Strictly follow CSV definition [RF4180](https://www.loc.gov/preservation/digital/formats/fdd/fdd000323.shtml) +* Work with millions of lines of CSV data +* Provide comprehensive parsing parameters +* Provide out of box CSV parsing tool for Command Line +* Blazing fast -- [Focus on performance](https://github.com/Keyang/csvbench) +* Give flexibility to developer with 'pre-defined' helpers +* Allow async / streaming parsing +* Provide a csv parser for both Node.JS and browsers +* Easy to use API + + +# csvtojson online + +[Here](http://keyangxiang.com/csvtojson/) is a free online csv to json convert service utilizing latest `csvtojson` module. + +# Upgrade to V2 + +`csvtojson` has released version `2.0.0`. +* To upgrade to v2, please follow [upgrading guide](https://github.com/Keyang/node-csvtojson/blob/master/docs/csvtojson-v2.md) +* If you are looking for documentation for `v1`, open [this page](https://github.com/Keyang/node-csvtojson/blob/master/docs/readme.v1.md) + +It is still able to use v1 with `csvtojson@2.0.0` + +```js +// v1 +const csvtojsonV1=require("csvtojson/v1"); +// v2 +const csvtojsonV2=require("csvtojson"); +const csvtojsonV2=require("csvtojson/v2"); + +``` + +# Menu + +* [Quick Start](#quick-start) +* [API](#api) +* [Browser Usage](#browser-usage) +* [Contribution](#contribution) + +# Quick Start + +* [As Library](#library) +* [As Command Line Tool](#command-line-usage) + +## Library + +### Installation + +``` +npm i --save csvtojson +``` + +### From CSV File to JSON Array + +```js +/** csv file +a,b,c +1,2,3 +4,5,6 +*/ +const csvFilePath='' +const csv=require('csvtojson') +csv() +.fromFile(csvFilePath) +.then((jsonObj)=>{ + console.log(jsonObj); + /** + * [ + * {a:"1", b:"2", c:"3"}, + * {a:"4", b:"5". c:"6"} + * ] + */ +}) + +// Async / await usage +const jsonArray=await csv().fromFile(csvFilePath); + +``` + +### From CSV String to CSV Row + +```js +/** +csvStr: +1,2,3 +4,5,6 +7,8,9 +*/ +const csv=require('csvtojson') +csv({ + noheader:true, + output: "csv" +}) +.fromString(csvStr) +.then((csvRow)=>{ + console.log(csvRow) // => [["1","2","3"], ["4","5","6"], ["7","8","9"]] +}) + +``` + + +### Asynchronously process each line from csv url + +```js +const request=require('request') +const csv=require('csvtojson') + +csv() +.fromStream(request.get('http://mywebsite.com/mycsvfile.csv')) +.subscribe((json)=>{ + return new Promise((resolve,reject)=>{ + // long operation for each json e.g. transform / write into database. + }) +},onError,onComplete); + +``` + +### Convert to CSV lines + +```js +/** +csvStr: +a,b,c +1,2,3 +4,5,6 +*/ + +const csv=require('csvtojson') +csv({output:"line"}) +.fromString(csvStr) +.subscribe((csvLine)=>{ + // csvLine => "1,2,3" and "4,5,6" +}) +``` + +### Use Stream + +```js +const csv=require('csvtojson'); + +const readStream=require('fs').createReadStream(csvFilePath); + +const writeStream=request.put('http://mysite.com/obj.json'); + +readStream.pipe(csv()).pipe(writeStream); + +``` + +To find more detailed usage, please see [API](#api) section + +## Command Line Usage + +### Installation + +``` +$ npm i -g csvtojson +``` + +### Usage + + +``` +$ csvtojson [options] +``` + +### Example + +Convert csv file and save result to json file: + +``` +$ csvtojson source.csv > converted.json +``` + +Pipe in csv data: + +``` +$ cat ./source.csv | csvtojson > converted.json +``` + +Print Help: + +``` +$ csvtojson +``` + +# API + +* [Parameters](#parameters) +* [Asynchronous Result Process](#asynchronous-result-process) +* [Events](#events) +* [Hook / Transform](#hook--transform) +* [Nested JSON Structure](#nested-json-structure) +* [Header Row](#header-row) +* [Column Parser](#column-parser) + + +## Parameters + +`require('csvtojson')` returns a constructor function which takes 2 arguments: + +1. Parser parameters +2. Stream options + +```js +const csv=require('csvtojson') +const converter=csv(parserParameters, streamOptions) +``` +Both arguments are optional. + +For `Stream Options` please read [Stream Option](https://nodejs.org/api/stream.html#stream_new_stream_transform_options) from Node.JS + +`parserParameters` is a JSON object like: + +```js +const converter=csv({ + noheader:true, + trim:true, +}) +``` +Following parameters are supported: + +* **output**: The format to be converted to. "json" (default) -- convert csv to json. "csv" -- convert csv to csv row array. "line" -- convert csv to csv line string +* **delimiter**: delimiter used for separating columns. Use "auto" if delimiter is unknown in advance, in this case, delimiter will be auto-detected (by best attempt). Use an array to give a list of potential delimiters e.g. [",","|","$"]. default: "," +* **quote**: If a column contains delimiter, it is able to use quote character to surround the column content. e.g. "hello, world" won't be split into two columns while parsing. Set to "off" will ignore all quotes. default: " (double quote) +* **trim**: Indicate if parser trim off spaces surrounding column content. e.g. " content " will be trimmed to "content". Default: true +* **checkType**: This parameter turns on and off whether check field type. Default is false. (The default is `true` if version < 1.1.4) +* **ignoreEmpty**: Ignore the empty value in CSV columns. If a column value is not given, set this to true to skip them. Default: false. +* **fork (experimental)**: Fork another process to parse the CSV stream. It is effective if many concurrent parsing sessions for large csv files. Default: false +* **noheader**:Indicating csv data has no header row and first row is data row. Default is false. See [header row](#header-row) +* **headers**: An array to specify the headers of CSV data. If --noheader is false, this value will override CSV header row. Default: null. Example: ["my field","name"]. See [header row](#header-row) +* **flatKeys**: Don't interpret dots (.) and square brackets in header fields as nested object or array identifiers at all (treat them like regular characters for JSON field identifiers). Default: false. +* **maxRowLength**: the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser won't consume memory. default: 0 +* **checkColumn**: whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false +* **eol**: End of line character. If omitted, parser will attempt to retrieve it from the first chunks of CSV data. +* **escape**: escape character used in quoted column. Default is double quote (") according to RFC4108. Change to back slash (\\) or other chars for your own case. +* **includeColumns**: This parameter instructs the parser to include only those columns as specified by the regular expression. Example: /(name|age)/ will parse and include columns whose header contains "name" or "age" +* **ignoreColumns**: This parameter instructs the parser to ignore columns as specified by the regular expression. Example: /(name|age)/ will ignore columns whose header contains "name" or "age" +* **colParser**: Allows override parsing logic for a specific column. It accepts a JSON object with fields like: `headName: ` . e.g. {field1:'number'} will use built-in number parser to convert value of the `field1` column to number. For more information See [details below](#column-parser) +* **alwaysSplitAtEOL**: Always interpret each line (as defined by `eol` like `\n`) as a row. This will prevent `eol` characters from being used within a row (even inside a quoted field). Default is false. Change to true if you are confident no inline line breaks (like line break in a cell which has multi line text). +* **nullObject**: How to parse if a csv cell contains "null". Default false will keep "null" as string. Change to true if a null object is needed. +* **downstreamFormat**: Option to set what JSON array format is needed by downstream. "line" is also called ndjson format. This format will write lines of JSON (without square brackets and commas) to downstream. "array" will write complete JSON array string to downstream (suitable for file writable stream etc). Default "line" +* **needEmitAll**: Parser will build JSON result is `.then` is called (or await is used). If this is not desired, set this to false. Default is true. +All parameters can be used in Command Line tool. + +## Asynchronous Result Process + +Since `v2.0.0`, asynchronous processing has been fully supported. + +e.g. Process each JSON result asynchronously. + +```js +csv().fromFile(csvFile) +.subscribe((json)=>{ + return new Promise((resolve,reject)=>{ + // Async operation on the json + // don't forget to call resolve and reject + }) +}) +``` +For more details please read: + +* [Add Promise and Async / Await support](https://github.com/Keyang/node-csvtojson/blob/master/docs/csvtojson-v2.md#add-promise-and-async--await-support) +* [Add asynchronous line by line processing support](https://github.com/Keyang/node-csvtojson/blob/master/docs/csvtojson-v2.md#add-asynchronous-line-by-line-processing-support) +* [Async Hooks Support](https://github.com/Keyang/node-csvtojson/blob/master/docs/csvtojson-v2.md#async-hooks-support) + + +## Events + +`Converter` class defined a series of events. + +### header + +`header` event is emitted for each CSV file once. It passes an array object which contains the names of the header row. + +```js +const csv=require('csvtojson') +csv() +.on('header',(header)=>{ + //header=> [header1, header2, header3] +}) +``` + +`header` is always an array of strings without types. + +### data + +`data` event is emitted for each parsed CSV line. It passes buffer of stringified JSON in [ndjson format](http://ndjson.org/) unless `objectMode` is set true in stream option. + +```js +const csv=require('csvtojson') +csv() +.on('data',(data)=>{ + //data is a buffer object + const jsonStr= data.toString('utf8') +}) +``` + +### error +`error` event is emitted if any errors happened during parsing. + +```js +const csv=require('csvtojson') +csv() +.on('error',(err)=>{ + console.log(err) +}) +``` + +Note that if `error` being emitted, the process will stop as node.js will automatically `unpipe()` upper-stream and chained down-stream1. This will cause `end` event never being emitted because `end` event is only emitted when all data being consumed 2. If need to know when parsing finished, use `done` event instead of `end`. + +1. [Node.JS Readable Stream](https://github.com/nodejs/node/blob/master/lib/_stream_readable.js#L572-L583) +2. [Writable end Event](https://nodejs.org/api/stream.html#stream_event_end) + +### done + +`done` event is emitted either after parsing successfully finished or any error happens. This indicates the processor has stopped. + +```js +const csv=require('csvtojson') +csv() +.on('done',(error)=>{ + //do some stuff +}) +``` + +if any error during parsing, it will be passed in callback. + +## Hook & Transform + +### Raw CSV Data Hook + +the hook -- `preRawData` will be called with csv string passed to parser. + +```js +const csv=require('csvtojson') +// synchronouse +csv() +.preRawData((csvRawData)=>{ + var newData=csvRawData.replace('some value','another value'); + return newData; +}) + +// asynchronous +csv() +.preRawData((csvRawData)=>{ + return new Promise((resolve,reject)=>{ + var newData=csvRawData.replace('some value','another value'); + resolve(newData); + }) + +}) +``` + +### CSV File Line Hook + +The function is called each time a file line has been parsed in csv stream. The `lineIdx` is the file line number in the file starting with 0. + +```js +const csv=require('csvtojson') +// synchronouse +csv() +.preFileLine((fileLineString, lineIdx)=>{ + if (lineIdx === 2){ + return fileLineString.replace('some value','another value') + } + return fileLineString +}) + +// asynchronous +csv() +.preFileLine((fileLineString, lineIdx)=>{ + return new Promise((resolve,reject)=>{ + // async function processing the data. + }) + + +}) +``` + + + +### Result transform + +To transform result that is sent to downstream, use `.subscribe` method for each json populated. + +```js +const csv=require('csvtojson') +csv() +.subscribe((jsonObj,index)=>{ + jsonObj.myNewKey='some value' + // OR asynchronously + return new Promise((resolve,reject)=>{ + jsonObj.myNewKey='some value'; + resolve(); + }) +}) +.on('data',(jsonObj)=>{ + console.log(jsonObj.myNewKey) // some value +}); +``` + + +## Nested JSON Structure + +`csvtojson` is able to convert csv line to a nested JSON by correctly defining its csv header row. This is default out-of-box feature. + +Here is an example. Original CSV: + +```csv +fieldA.title, fieldA.children.0.name, fieldA.children.0.id,fieldA.children.1.name, fieldA.children.1.employee.0.name,fieldA.children.1.employee.1.name, fieldA.address.0,fieldA.address.1, description +Food Factory, Oscar, 0023, Tikka, Tim, Joe, 3 Lame Road, Grantstown, A fresh new food factory +Kindom Garden, Ceil, 54, Pillow, Amst, Tom, 24 Shaker Street, HelloTown, Awesome castle + +``` +The data above contains nested JSON including nested array of JSON objects and plain texts. + +Using csvtojson to convert, the result would be like: + +```json +[{ + "fieldA": { + "title": "Food Factory", + "children": [{ + "name": "Oscar", + "id": "0023" + }, { + "name": "Tikka", + "employee": [{ + "name": "Tim" + }, { + "name": "Joe" + }] + }], + "address": ["3 Lame Road", "Grantstown"] + }, + "description": "A fresh new food factory" +}, { + "fieldA": { + "title": "Kindom Garden", + "children": [{ + "name": "Ceil", + "id": "54" + }, { + "name": "Pillow", + "employee": [{ + "name": "Amst" + }, { + "name": "Tom" + }] + }], + "address": ["24 Shaker Street", "HelloTown"] + }, + "description": "Awesome castle" +}] +``` + +### Flat Keys + +In order to not produce nested JSON, simply set `flatKeys:true` in parameters. + +```js +/** +csvStr: +a.b,a.c +1,2 +*/ +csv({flatKeys:true}) +.fromString(csvStr) +.subscribe((jsonObj)=>{ + //{"a.b":1,"a.c":2} rather than {"a":{"b":1,"c":2}} +}); + +``` + +## Header Row + +`csvtojson` uses csv header row as generator of JSON keys. However, it does not require the csv source containing a header row. There are 4 ways to define header rows: + +1. First row of csv source. Use first row of csv source as header row. This is default. +2. If first row of csv source is header row but it is incorrect and need to be replaced. Use `headers:[]` and `noheader:false` parameters. +3. If original csv source has no header row but the header definition can be defined. Use `headers:[]` and `noheader:true` parameters. +4. If original csv source has no header row and the header definition is unknown. Use `noheader:true`. This will automatically add `fieldN` header to csv cells + + +### Example + +```js +// replace header row (first row) from original source with 'header1, header2' +csv({ + noheader: false, + headers: ['header1','header2'] +}) + +// original source has no header row. add 'field1' 'field2' ... 'fieldN' as csv header +csv({ + noheader: true +}) + +// original source has no header row. use 'header1' 'header2' as its header row +csv({ + noheader: true, + headers: ['header1','header2'] +}) + +``` + +## Column Parser + +`Column Parser` allows writing a custom parser for a column in CSV data. + +**What is Column Parser** + +When `csvtojson` walks through csv data, it converts value in a cell to something else. For example, if `checkType` is `true`, `csvtojson` will attempt to find a proper type parser according to the cell value. That is, if cell value is "5", a `numberParser` will be used and all value under that column will use the `numberParser` to transform data. + +### Built-in parsers + +There are currently following built-in parser: + +* string: Convert value to string +* number: Convert value to number +* omit: omit the whole column + +This will override types infered from `checkType:true` parameter. More built-in parsers will be added as requested in [issues page](https://github.com/Keyang/node-csvtojson/issues). + +Example: + +```js +/*csv string +column1,column2 +hello,1234 +*/ +csv({ + colParser:{ + "column1":"omit", + "column2":"string", + }, + checkType:true +}) +.fromString(csvString) +.subscribe((jsonObj)=>{ + //jsonObj: {column2:"1234"} +}) +``` + +### Custom parsers function + +Sometimes, developers want to define custom parser. It is able to pass a function to specific column in `colParser`. + +Example: + +```js +/*csv data +name, birthday +Joe, 1970-01-01 +*/ +csv({ + colParser:{ + "birthday":function(item, head, resultRow, row , colIdx){ + /* + item - "1970-01-01" + head - "birthday" + resultRow - {name:"Joe"} + row - ["Joe","1970-01-01"] + colIdx - 1 + */ + return new Date(item); + } + } +}) +``` + +Above example will convert `birthday` column into a js `Date` object. + +The returned value will be used in result JSON object. Returning `undefined` will not change result JSON object. + +### Flat key column + +It is also able to mark a column as `flat`: + +```js + +/*csv string +person.comment,person.number +hello,1234 +*/ +csv({ + colParser:{ + "person.number":{ + flat:true, + cellParser: "number" // string or a function + } + } +}) +.fromString(csvString) +.subscribe((jsonObj)=>{ + //jsonObj: {"person.number":1234,"person":{"comment":"hello"}} +}) +``` + +# Contribution + +Very much appreciate any types of donation and support. + +## Code + +`csvtojson` follows github convention for contributions. Here are some steps: + +1. Fork the repo to your github account +2. Checkout code from your github repo to your local machine. +3. Make code changes and don't forget add related tests. +4. Run `npm test` locally before pushing code back. +5. Create a [Pull Request](https://help.github.com/articles/creating-a-pull-request/) on github. +6. Code review and merge +7. Changes will be published to NPM within next version. + +Thanks all the [contributors](https://github.com/Keyang/node-csvtojson/graphs/contributors) + +## Backers + +Thank you to all our backers! [[Become a backer](https://opencollective.com/csvtojson#backer)] + +[![OpenCollective](https://opencollective.com/csvtojson/backers.svg?width=890)](https://opencollective.com/csvtojson#backer) + +## Sponsors + +Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/csvtojson#sponsor)) + +## Paypal + +[![donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DUBQLRPJADJFQ) + +# Browser Usage + +To use `csvtojson` in browser is quite simple. There are two ways: + +**1. Embed script directly into script tag** + +There is a pre-built script located in `browser/csvtojson.min.js`. Simply include that file in a `script` tag in `index.html` page: + +```html + + + +``` +then use a global `csv` function +```html + +``` + + + +**2. Use webpack or browserify** + +If a module packager is preferred, just simply `require("csvtojson")`: + +```js +var csv=require("csvtojson"); + +// or with import +import * as csv from "csvtojson"; + +//then use csv as normal +``` diff --git a/node_modules/csvtojson/src/CSVError.test.ts b/node_modules/csvtojson/src/CSVError.test.ts new file mode 100644 index 0000000..3c908b6 --- /dev/null +++ b/node_modules/csvtojson/src/CSVError.test.ts @@ -0,0 +1,6 @@ +import CSVError from "./CSVError"; +import assert from "assert"; +describe("CSVError",()=>{ + it ("should toString()",()=>{ + }) +}) \ No newline at end of file diff --git a/node_modules/csvtojson/src/CSVError.ts b/node_modules/csvtojson/src/CSVError.ts new file mode 100644 index 0000000..220ca20 --- /dev/null +++ b/node_modules/csvtojson/src/CSVError.ts @@ -0,0 +1,27 @@ +export default class CSVError extends Error { + static column_mismatched(index: number, extra?: string) { + return new CSVError("column_mismatched", index, extra); + } + static unclosed_quote(index: number, extra?: string) { + return new CSVError("unclosed_quote", index, extra); + } + static fromJSON(obj) { + return new CSVError(obj.err, obj.line, obj.extra); + } + constructor( + public err: string, + public line: number, + public extra?: string + ) { + super("Error: " + err + ". JSON Line number: " + line + (extra ? " near: " + extra : "")); + this.name = "CSV Parse Error"; + } + toJSON() { + return { + err: this.err, + line: this.line, + extra: this.extra + } + } + +} diff --git a/node_modules/csvtojson/src/Converter.ts b/node_modules/csvtojson/src/Converter.ts new file mode 100644 index 0000000..83f076e --- /dev/null +++ b/node_modules/csvtojson/src/Converter.ts @@ -0,0 +1,189 @@ +import { Transform, TransformOptions, Readable } from "stream"; +import { CSVParseParam, mergeParams } from "./Parameters"; +import { ParseRuntime, initParseRuntime } from "./ParseRuntime"; +import P from "bluebird"; +import { stringToLines } from "./fileline"; +import { map } from "lodash/map"; +import { RowSplit, RowSplitResult } from "./rowSplit"; +import getEol from "./getEol"; +import lineToJson, { JSONResult } from "./lineToJson"; +import { Processor, ProcessLineResult } from "./Processor"; +// import { ProcessorFork } from "./ProcessFork"; +import { ProcessorLocal } from "./ProcessorLocal"; +import { Result } from "./Result"; +import CSVError from "./CSVError"; +import { bufFromString } from "./util"; + + + +export class Converter extends Transform implements PromiseLike { + preRawData(onRawData: PreRawDataCallback): Converter { + this.runtime.preRawDataHook = onRawData; + return this; + } + preFileLine(onFileLine: PreFileLineCallback): Converter { + this.runtime.preFileLineHook = onFileLine; + return this; + } + subscribe( + onNext?: (data: any, lineNumber: number) => void | PromiseLike, + onError?: (err: CSVError) => void, + onCompleted?: () => void): Converter { + this.parseRuntime.subscribe = { + onNext, + onError, + onCompleted + } + return this; + } + fromFile(filePath: string, options?: string | CreateReadStreamOption | undefined): Converter { + const fs = require("fs"); + // var rs = null; + // this.wrapCallback(cb, function () { + // if (rs && rs.destroy) { + // rs.destroy(); + // } + // }); + fs.exists(filePath, (exist) => { + if (exist) { + const rs = fs.createReadStream(filePath, options); + rs.pipe(this); + } else { + this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct.")); + } + }); + return this; + } + fromStream(readStream: Readable): Converter { + readStream.pipe(this); + return this; + } + fromString(csvString: string): Converter { + const csv = csvString.toString(); + const read = new Readable(); + let idx = 0; + read._read = function (size) { + if (idx >= csvString.length) { + this.push(null); + } else { + const str = csvString.substr(idx, size); + this.push(str); + idx += size; + } + } + return this.fromStream(read); + } + then(onfulfilled?: (value: any[]) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): PromiseLike { + return new P((resolve, reject) => { + this.parseRuntime.then = { + onfulfilled: (value: any[]) => { + if (onfulfilled) { + resolve(onfulfilled(value)); + } else { + resolve(value as any); + } + }, + onrejected: (err: Error) => { + if (onrejected) { + resolve(onrejected(err)); + } else { + reject(err); + } + } + } + }); + } + public get parseParam(): CSVParseParam { + return this.params; + } + public get parseRuntime(): ParseRuntime { + return this.runtime; + } + private params: CSVParseParam; + private runtime: ParseRuntime; + private processor: Processor; + private result: Result; + constructor(param?: Partial, public options: TransformOptions = {}) { + super(options); + this.params = mergeParams(param); + this.runtime = initParseRuntime(this); + this.result = new Result(this); + // if (this.params.fork) { + // this.processor = new ProcessorFork(this); + // } else { + this.processor = new ProcessorLocal(this); + // } + this.once("error", (err: any) => { + // console.log("BBB"); + //wait for next cycle to emit the errors. + setImmediate(() => { + this.result.processError(err); + this.emit("done", err); + }); + + }); + this.once("done", () => { + this.processor.destroy(); + }) + + return this; + } + _transform(chunk: any, encoding: string, cb: Function) { + this.processor.process(chunk) + .then((result) => { + // console.log(result); + if (result.length > 0) { + this.runtime.started = true; + + return this.result.processResult(result); + } + }) + .then(() => { + this.emit("drained"); + cb(); + }, (error) => { + this.runtime.hasError = true; + this.runtime.error = error; + this.emit("error", error); + cb(); + }); + } + _flush(cb: Function) { + this.processor.flush() + .then((data) => { + if (data.length > 0) { + + return this.result.processResult(data); + } + }) + .then(() => { + this.processEnd(cb); + }, (err) => { + this.emit("error", err); + cb(); + }) + } + private processEnd(cb) { + this.result.endProcess(); + this.emit("done"); + cb(); + } + get parsedLineNumber(): number { + return this.runtime.parsedLineNumber; + } +} +export interface CreateReadStreamOption { + flags?: string; + encoding?: string; + fd?: number; + mode?: number; + autoClose?: boolean; + start?: number; + end?: number; + highWaterMark?: number; +} +export type CallBack = (err: Error, data: Array) => void; + + +export type PreFileLineCallback = (line: string, lineNumber: number) => string | PromiseLike; +export type PreRawDataCallback = (csvString: string) => string | PromiseLike; diff --git a/node_modules/csvtojson/src/Parameters.ts b/node_modules/csvtojson/src/Parameters.ts new file mode 100644 index 0000000..0c42cbb --- /dev/null +++ b/node_modules/csvtojson/src/Parameters.ts @@ -0,0 +1,136 @@ +export interface CSVParseParam { + /** + * delimiter used for seperating columns. Use "auto" if delimiter is unknown in advance, in this case, delimiter will be auto-detected (by best attempt). Use an array to give a list of potential delimiters e.g. [",","|","$"]. default: "," + */ + delimiter: string | string[]; + /** + * This parameter instructs the parser to ignore columns as specified by the regular expression. Example: /(name|age)/ will ignore columns whose header contains "name" or "age" + */ + ignoreColumns?: RegExp; + /** + * This parameter instructs the parser to include only those columns as specified by the regular expression. Example: /(name|age)/ will parse and include columns whose header contains "name" or "age" + */ + includeColumns?: RegExp; + /** + * If a column contains delimiter, it is able to use quote character to surround the column content. e.g. "hello, world" wont be split into two columns while parsing. Set to "off" will ignore all quotes. default: " (double quote) + */ + quote: string; + /** + * Indicate if parser trim off spaces surrounding column content. e.g. " content " will be trimmed to "content". Default: true + */ + trim: boolean; + /** + * This parameter turns on and off whether check field type. Default is false. + */ + checkType: boolean; + /** + * Ignore the empty value in CSV columns. If a column value is not given, set this to true to skip them. Default: false. + */ + ignoreEmpty: boolean; + /** + * Delegate parsing work to another process. + */ + // fork: boolean; + /** + * Indicating csv data has no header row and first row is data row. Default is false. + */ + noheader: boolean; + /** + * An array to specify the headers of CSV data. If --noheader is false, this value will override CSV header row. Default: null. Example: ["my field","name"]. + */ + headers?: string[]; + /** + * Don't interpret dots (.) and square brackets in header fields as nested object or array identifiers at all (treat them like regular characters for JSON field identifiers). Default: false. + */ + flatKeys: boolean; + /** + * the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0 + */ + maxRowLength: number; + /** + * whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false + */ + checkColumn: boolean; + /** + * escape character used in quoted column. Default is double quote (") according to RFC4108. Change to back slash (\) or other chars for your own case. + */ + escape: string; + /** + * Allows override parsing logic for a specific column. It accepts a JSON object with fields like: headName: . e.g. {field1:'number'} will use built-in number parser to convert value of the field1 column to number. Another example {"name":nameProcessFunc} will use specified function to parse the value. + */ + colParser: { + [key: string]: string | CellParser | ColumnParam + }; + /** + * End of line character. If omitted, parser will attempt to retrieve it from the first chunks of CSV data + */ + eol?: string; + /** + * Always interpret each line (as defined by eol) as a row. This will prevent eol characters from being used within a row (even inside a quoted field). Default is false. Change to true if you are confident no inline line breaks (like line break in a cell which has multi line text) + */ + alwaysSplitAtEOL: boolean; + /** + * The format to be converted to. "json" (default) -- convert csv to json. "csv" -- convert csv to csv row array. "line" -- convert csv to csv line string + */ + output: "json" | "csv" | "line"; + + /** + * Convert string "null" to null object in JSON outputs. Default is false. + */ + nullObject:boolean; + /** + * Define the format required by downstream (this parameter does not work if objectMode is on). `line` -- json is emitted in a single line separated by a line breake like "json1\njson2" . `array` -- downstream requires array format like "[json1,json2]". Default is line. + */ + downstreamFormat: "line" | "array"; + /** + * Define whether .then(callback) returns all JSON data in its callback. Default is true. Change to false to save memory if subscribing json lines. + */ + needEmitAll: boolean; +} + +export type CellParser = (item: string, head: string, resultRow: any, row: string[], columnIndex: number) => any; + +export interface ColumnParam { + flat?: boolean; + cellParser?: string | CellParser; +} + +export function mergeParams(params?: Partial): CSVParseParam { + const defaultParam: CSVParseParam = { + delimiter: ',', + ignoreColumns: undefined, + includeColumns: undefined, + quote: '"', + trim: true, + checkType: false, + ignoreEmpty: false, + // fork: false, + noheader: false, + headers: undefined, + flatKeys: false, + maxRowLength: 0, + checkColumn: false, + escape: '"', + colParser: {}, + eol: undefined, + alwaysSplitAtEOL: false, + output: "json", + nullObject: false, + downstreamFormat:"line", + needEmitAll:true + } + if (!params) { + params = {}; + } + for (let key in params) { + if (params.hasOwnProperty(key)) { + if (Array.isArray(params[key])) { + defaultParam[key] = [].concat(params[key]); + } else { + defaultParam[key] = params[key]; + } + } + } + return defaultParam; +} + diff --git a/node_modules/csvtojson/src/ParseRuntime.ts b/node_modules/csvtojson/src/ParseRuntime.ts new file mode 100644 index 0000000..2601ea2 --- /dev/null +++ b/node_modules/csvtojson/src/ParseRuntime.ts @@ -0,0 +1,90 @@ +import { CSVParseParam, CellParser } from "./Parameters"; +import { Converter, PreRawDataCallback, PreFileLineCallback } from "./Converter"; +import { ChildProcess } from "child_process"; +import CSVError from "./CSVError"; + +export interface ParseRuntime { + /** + * If need convert ignoreColumn from column name(string) to column index (number). Parser needs column index. + */ + needProcessIgnoreColumn: boolean; + /** + * If need convert includeColumn from column name(string) to column index (number). Parser needs column index. + */ + needProcessIncludeColumn: boolean; + /** + * the indexes of columns to reserve, undefined means reserve all, [] means hide all + */ + selectedColumns?: number[]; + ended: boolean; + hasError: boolean; + error?: Error; + /** + * Inferred delimiter + */ + delimiter: string | string[]; + /** + * Inferred eol + */ + eol?: string; + /** + * Converter function for a column. Populated at runtime. + */ + columnConv: (CellParser | null)[], + headerType: any[], + headerTitle: string[], + headerFlag: any[], + /** + * Inferred headers + */ + headers?: any[], + csvLineBuffer?: Buffer, + + /** + * after first chunk of data being processed and emitted, started will become true. + */ + started: boolean, + preRawDataHook?: PreRawDataCallback, + preFileLineHook?: PreFileLineCallback, + parsedLineNumber: number, + + columnValueSetter: Function[]; + subscribe?: { + onNext?: (data: any, lineNumber:number) => void | PromiseLike; + onError?: (err: CSVError) => void; + onCompleted?: () => void; + }; + then?: { + onfulfilled: (value: any[]) => any; + onrejected: (err: Error) => any; + } + +} +export function initParseRuntime(converter: Converter): ParseRuntime { + const params = converter.parseParam; + const rtn: ParseRuntime = { + needProcessIgnoreColumn: false, + needProcessIncludeColumn: false, + selectedColumns: undefined, + ended: false, + hasError: false, + error: undefined, + delimiter: converter.parseParam.delimiter, + eol: converter.parseParam.eol, + columnConv: [], + headerType: [], + headerTitle: [], + headerFlag: [], + headers: undefined, + started: false, + parsedLineNumber: 0, + columnValueSetter: [], + } + if (params.ignoreColumns) { + rtn.needProcessIgnoreColumn = true; + } + if (params.includeColumns) { + rtn.needProcessIncludeColumn = true; + } + return rtn; +} \ No newline at end of file diff --git a/node_modules/csvtojson/src/ProcessFork.ts b/node_modules/csvtojson/src/ProcessFork.ts new file mode 100644 index 0000000..346d894 --- /dev/null +++ b/node_modules/csvtojson/src/ProcessFork.ts @@ -0,0 +1,150 @@ +import { Processor, ProcessLineResult } from "./Processor"; +import P from "bluebird" +import { Converter } from "./Converter"; +import { ChildProcess } from "child_process"; +import { CSVParseParam, mergeParams } from "./Parameters"; +import { ParseRuntime } from "./ParseRuntime"; +import { Readable, Writable } from "stream"; +import { bufFromString, emptyBuffer } from "./util"; +import CSVError from "./CSVError"; + +export class ProcessorFork extends Processor { + flush(): P { + return new P((resolve, reject) => { + // console.log("flush"); + this.finalChunk = true; + this.next = resolve; + this.childProcess.stdin.end(); + // this.childProcess.stdout.on("end",()=>{ + // // console.log("!!!!"); + // this.flushResult(); + // }) + }); + } + destroy(): P { + this.childProcess.kill(); + return P.resolve(); + } + childProcess: ChildProcess; + inited: boolean = false; + private resultBuf: ProcessLineResult[] = []; + private leftChunk: string = ""; + private finalChunk: boolean = false; + private next?: (result: ProcessLineResult[]) => any; + constructor(protected converter: Converter) { + super(converter); + this.childProcess = require("child_process").spawn(process.execPath, [__dirname + "/../v2/worker.js"], { + stdio: ["pipe", "pipe", "pipe", "ipc"] + }); + this.initWorker(); + } + private prepareParam(param:CSVParseParam):any{ + const clone:any=mergeParams(param); + if (clone.ignoreColumns){ + clone.ignoreColumns={ + source:clone.ignoreColumns.source, + flags:clone.ignoreColumns.flags + } + } + if (clone.includeColumns){ + clone.includeColumns={ + source:clone.includeColumns.source, + flags:clone.includeColumns.flags + } + } + return clone; + } + private initWorker() { + this.childProcess.on("exit",()=>{ + this.flushResult(); + }) + this.childProcess.send({ + cmd: "init", + params: this.prepareParam(this.converter.parseParam) + } as InitMessage); + this.childProcess.on("message", (msg: Message) => { + if (msg.cmd === "inited") { + this.inited = true; + } else if (msg.cmd === "eol") { + if (this.converter.listeners("eol").length > 0){ + this.converter.emit("eol",(msg as StringMessage).value); + } + }else if (msg.cmd === "header") { + if (this.converter.listeners("header").length > 0){ + this.converter.emit("header",(msg as StringMessage).value); + } + }else if (msg.cmd === "done"){ + + // this.flushResult(); + } + + }); + this.childProcess.stdout.on("data", (data) => { + // console.log("stdout", data.toString()); + const res = data.toString(); + // console.log(res); + this.appendBuf(res); + + }); + this.childProcess.stderr.on("data", (data) => { + // console.log("stderr", data.toString()); + this.converter.emit("error", CSVError.fromJSON(JSON.parse(data.toString()))); + }); + + } + private flushResult() { + // console.log("flush result", this.resultBuf.length); + if (this.next) { + this.next(this.resultBuf); + } + this.resultBuf = []; + } + private appendBuf(data: string) { + const res = this.leftChunk + data; + const list = res.split("\n"); + let counter = 0; + const lastBit = list[list.length - 1]; + if (lastBit !== "") { + this.leftChunk = list.pop() || ""; + } else { + this.leftChunk = ""; + } + this.resultBuf=this.resultBuf.concat(list); + // while (list.length) { + // let item = list.shift() || ""; + // if (item.length === 0 ) { + // continue; + // } + // // if (this.params.output !== "line") { + // // item = JSON.parse(item); + // // } + // this.resultBuf.push(item); + // counter++; + // } + // console.log("buf length",this.resultBuf.length); + } + + process(chunk: Buffer): P { + return new P((resolve, reject) => { + // console.log("chunk", chunk.length); + this.next = resolve; + // this.appendReadBuf(chunk); + this.childProcess.stdin.write(chunk, () => { + // console.log("chunk callback"); + this.flushResult(); + }); + }); + } +} + +export interface Message { + cmd: string +} + +export interface InitMessage extends Message { + params: any; +} +export interface StringMessage extends Message { + value: string +} +export const EOM = "\x03"; \ No newline at end of file diff --git a/node_modules/csvtojson/src/Processor.ts b/node_modules/csvtojson/src/Processor.ts new file mode 100644 index 0000000..97d1b17 --- /dev/null +++ b/node_modules/csvtojson/src/Processor.ts @@ -0,0 +1,18 @@ +import { Converter } from "./Converter"; +import P from "bluebird"; +import { JSONResult } from "./lineToJson"; +import { CSVParseParam } from "./Parameters"; +import { ParseRuntime } from "./ParseRuntime"; + +export abstract class Processor { + protected params: CSVParseParam; + protected runtime: ParseRuntime; + constructor(protected converter: Converter) { + this.params = converter.parseParam; + this.runtime = converter.parseRuntime; + } + abstract process(chunk: Buffer,finalChunk?:boolean): P + abstract destroy():P; + abstract flush(): P; +} +export type ProcessLineResult = string | string[] | JSONResult; diff --git a/node_modules/csvtojson/src/ProcessorLocal.test.ts b/node_modules/csvtojson/src/ProcessorLocal.test.ts new file mode 100644 index 0000000..f4d66ab --- /dev/null +++ b/node_modules/csvtojson/src/ProcessorLocal.test.ts @@ -0,0 +1,40 @@ +import {ProcessorLocal} from "./ProcessorLocal"; +import { Converter } from "./Converter"; +import P from "bluebird"; +import {readFileSync} from "fs"; +import path from "path"; +import assert from "assert"; +import { JSONResult } from "./lineToJson"; +const dataDir=path.join(__dirname,"../test/data/"); +describe("ProcessLocal",()=>{ + it ("should process csv chunks and output json",async function (){ + const processor=new ProcessorLocal(new Converter()); + const data=readFileSync(dataDir+"/complexJSONCSV"); + const lines=await processor.process(data); + assert(lines.length === 2); + const line0=lines[0] as JSONResult; + assert.equal(line0.fieldA.title,"Food Factory"); + assert.equal(line0.fieldA.children.length,2); + assert.equal(line0.fieldA.children[1].employee[0].name,"Tim"); + }) + it ("should process csv chunks and output csv rows",async function (){ + const processor=new ProcessorLocal(new Converter({output:"line"})); + const data=readFileSync(dataDir+"/complexJSONCSV"); + const lines=await processor.process(data); + + assert(lines.length === 2); + }) + it ("should return empty array if preRawHook removed the data",()=>{ + const conv=new Converter(); + conv.preRawData((str)=>{ + return ""; + }); + const processor=new ProcessorLocal(conv); + const data=readFileSync(dataDir+"/complexJSONCSV"); + return processor.process(data) + .then((list)=>{ + assert.equal(list.length,0); + }) + }) +}) + diff --git a/node_modules/csvtojson/src/ProcessorLocal.ts b/node_modules/csvtojson/src/ProcessorLocal.ts new file mode 100644 index 0000000..01ba50c --- /dev/null +++ b/node_modules/csvtojson/src/ProcessorLocal.ts @@ -0,0 +1,270 @@ +import { Processor, ProcessLineResult } from "./Processor"; +import P from "bluebird"; +import { prepareData } from "./dataClean"; +import getEol from "./getEol"; +import { stringToLines } from "./fileline"; +import { bufFromString, filterArray,trimLeft } from "./util"; +import { RowSplit } from "./rowSplit"; +import lineToJson from "./lineToJson"; +import { ParseRuntime } from "./ParseRuntime"; +import CSVError from "./CSVError"; + + + +export class ProcessorLocal extends Processor { + flush(): P { + if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) { + const buf = this.runtime.csvLineBuffer; + this.runtime.csvLineBuffer = undefined; + return this.process(buf, true) + .then((res) => { + if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) { + return P.reject(CSVError.unclosed_quote(this.runtime.parsedLineNumber, this.runtime.csvLineBuffer.toString())) + } else { + return P.resolve(res); + } + }) + } else { + return P.resolve([]); + } + } + destroy(): P { + return P.resolve(); + } + private rowSplit: RowSplit = new RowSplit(this.converter); + private eolEmitted = false; + private _needEmitEol?: boolean = undefined; + private get needEmitEol() { + if (this._needEmitEol === undefined) { + this._needEmitEol = this.converter.listeners("eol").length > 0; + } + return this._needEmitEol; + } + private headEmitted = false; + private _needEmitHead?: boolean = undefined; + private get needEmitHead() { + if (this._needEmitHead === undefined) { + this._needEmitHead = this.converter.listeners("header").length > 0; + } + return this._needEmitHead; + + } + process(chunk: Buffer, finalChunk = false): P { + let csvString: string; + if (finalChunk) { + csvString = chunk.toString(); + } else { + csvString = prepareData(chunk, this.converter.parseRuntime); + + } + return P.resolve() + .then(() => { + if (this.runtime.preRawDataHook) { + return this.runtime.preRawDataHook(csvString); + } else { + return csvString; + } + }) + .then((csv) => { + if (csv && csv.length > 0) { + return this.processCSV(csv, finalChunk); + } else { + return P.resolve([]); + } + }) + } + private processCSV(csv: string, finalChunk: boolean): P { + const params = this.params; + const runtime = this.runtime; + if (!runtime.eol) { + getEol(csv, runtime); + } + if (this.needEmitEol && !this.eolEmitted && runtime.eol) { + this.converter.emit("eol", runtime.eol); + this.eolEmitted = true; + } + // trim csv file has initial blank lines. + if (params.ignoreEmpty && !runtime.started) { + csv = trimLeft(csv); + } + const stringToLineResult = stringToLines(csv, runtime); + if (!finalChunk) { + this.prependLeftBuf(bufFromString(stringToLineResult.partial)); + } else { + stringToLineResult.lines.push(stringToLineResult.partial); + stringToLineResult.partial = ""; + } + if (stringToLineResult.lines.length > 0) { + let prom: P; + if (runtime.preFileLineHook) { + prom = this.runPreLineHook(stringToLineResult.lines); + } else { + prom = P.resolve(stringToLineResult.lines); + } + return prom.then((lines) => { + if (!runtime.started + && !this.runtime.headers + ) { + return this.processDataWithHead(lines); + } else { + return this.processCSVBody(lines); + } + + }) + + } else { + + return P.resolve([]); + } + + } + private processDataWithHead(lines: string[]): ProcessLineResult[] { + if (this.params.noheader) { + if (this.params.headers) { + this.runtime.headers = this.params.headers; + } else { + this.runtime.headers = []; + } + } else { + let left = ""; + let headerRow: string[] = []; + while (lines.length) { + const line = left + lines.shift(); + const row = this.rowSplit.parse(line); + if (row.closed) { + headerRow = row.cells; + left = ""; + break; + } else { + left = line + getEol(line, this.runtime); + } + } + this.prependLeftBuf(bufFromString(left)); + + if (headerRow.length === 0) { + return []; + } + if (this.params.headers) { + this.runtime.headers = this.params.headers; + } else { + this.runtime.headers = headerRow; + } + } + if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) { + this.filterHeader(); + } + if (this.needEmitHead && !this.headEmitted) { + this.converter.emit("header", this.runtime.headers); + this.headEmitted = true; + } + return this.processCSVBody(lines); + } + private filterHeader() { + this.runtime.selectedColumns = []; + if (this.runtime.headers) { + const headers = this.runtime.headers; + for (let i = 0; i < headers.length; i++) { + if (this.params.ignoreColumns) { + if (this.params.ignoreColumns.test(headers[i])) { + if (this.params.includeColumns && this.params.includeColumns.test(headers[i])) { + this.runtime.selectedColumns.push(i); + } else { + continue; + } + } else { + this.runtime.selectedColumns.push(i); + } + } else if (this.params.includeColumns) { + if (this.params.includeColumns.test(headers[i])) { + this.runtime.selectedColumns.push(i); + } + } else { + this.runtime.selectedColumns.push(i); + } + // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){ + // this.runtime.selectedColumns.push(i); + // }else{ + // if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){ + // continue; + // }else{ + // if (this.params.ignoreColumns && !this.params.includeColumns){ + // this.runtime.selectedColumns.push(i); + // } + + // } + // } + } + this.runtime.headers = filterArray(this.runtime.headers, this.runtime.selectedColumns); + } + + } + private processCSVBody(lines: string[]): ProcessLineResult[] { + if (this.params.output === "line") { + return lines; + } else { + const result = this.rowSplit.parseMultiLines(lines); + this.prependLeftBuf(bufFromString(result.partial)); + if (this.params.output === "csv") { + return result.rowsCells; + } else { + return lineToJson(result.rowsCells, this.converter); + } + } + + // var jsonArr = linesToJson(lines.lines, params, this.recordNum); + // this.processResult(jsonArr); + // this.lastIndex += jsonArr.length; + // this.recordNum += jsonArr.length; + } + + private prependLeftBuf(buf: Buffer) { + if (buf) { + if (this.runtime.csvLineBuffer) { + this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]); + } else { + this.runtime.csvLineBuffer = buf; + } + } + + } + private runPreLineHook(lines: string[]): P { + return new P((resolve, reject) => { + processLineHook(lines, this.runtime, 0, (err) => { + if (err) { + reject(err); + } else { + resolve(lines); + } + }) + }); + } +} + +function processLineHook(lines: string[], runtime: ParseRuntime, offset: number, + cb: (err?) => void +) { + if (offset >= lines.length) { + cb(); + } else { + if (runtime.preFileLineHook) { + const line = lines[offset]; + const res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset); + offset++; + if (res && (res as PromiseLike).then) { + (res as PromiseLike).then((value) => { + lines[offset - 1] = value; + processLineHook(lines, runtime, offset, cb); + }); + } else { + lines[offset - 1] = res as string; + while (offset < lines.length) { + lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset) as string; + offset++; + } + cb(); + } + } else { + cb(); + } + } +} \ No newline at end of file diff --git a/node_modules/csvtojson/src/Result.test.ts b/node_modules/csvtojson/src/Result.test.ts new file mode 100644 index 0000000..9797c07 --- /dev/null +++ b/node_modules/csvtojson/src/Result.test.ts @@ -0,0 +1,22 @@ +import {Result} from "./Result"; +import { Converter } from "./Converter"; +import P from "bluebird"; +import {readFileSync} from "fs"; +import path from "path"; +import assert from "assert"; +import { JSONResult } from "./lineToJson"; +const dataDir=path.join(__dirname,"../test/data/"); + +describe("Result",()=>{ + it ("should return need push downstream based on needEmitAll parameter",function (){ + const conv=new Converter(); + const res=new Result(conv); + assert.equal(res["needEmitAll"],false); + conv.then(); + assert.equal(res["needEmitAll"],true); + conv.parseParam.needEmitAll=false; + assert.equal(res["needEmitAll"],false); + }); + +}) + diff --git a/node_modules/csvtojson/src/Result.ts b/node_modules/csvtojson/src/Result.ts new file mode 100644 index 0000000..7c376ab --- /dev/null +++ b/node_modules/csvtojson/src/Result.ts @@ -0,0 +1,164 @@ +import { Converter } from "./Converter"; +import { ProcessLineResult } from "./Processor"; +import P from "bluebird"; +import CSVError from "./CSVError"; +import { EOL } from "os"; +export class Result { + private get needEmitLine(): boolean { + return !!this.converter.parseRuntime.subscribe && !!this.converter.parseRuntime.subscribe.onNext || this.needPushDownstream + } + private _needPushDownstream?: boolean; + private get needPushDownstream(): boolean { + if (this._needPushDownstream === undefined) { + this._needPushDownstream = this.converter.listeners("data").length > 0 || this.converter.listeners("readable").length > 0; + } + return this._needPushDownstream; + } + private get needEmitAll(): boolean { + return !!this.converter.parseRuntime.then && this.converter.parseParam.needEmitAll; + // return !!this.converter.parseRuntime.then; + } + private finalResult: any[] = []; + constructor(private converter: Converter) { } + processResult(resultLines: ProcessLineResult[]): P { + const startPos = this.converter.parseRuntime.parsedLineNumber; + if (this.needPushDownstream && this.converter.parseParam.downstreamFormat === "array") { + if (startPos === 0) { + pushDownstream(this.converter, "[" + EOL); + } + } + // let prom: P; + return new P((resolve, reject) => { + if (this.needEmitLine) { + processLineByLine( + resultLines, + this.converter, + 0, + this.needPushDownstream, + (err) => { + if (err) { + reject(err); + } else { + this.appendFinalResult(resultLines); + resolve(); + } + }, + ) + // resolve(); + } else { + this.appendFinalResult(resultLines); + resolve(); + } + }) + } + appendFinalResult(lines: any[]) { + if (this.needEmitAll) { + this.finalResult = this.finalResult.concat(lines); + } + this.converter.parseRuntime.parsedLineNumber += lines.length; + } + processError(err: CSVError) { + if (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onError) { + this.converter.parseRuntime.subscribe.onError(err); + } + if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onrejected) { + this.converter.parseRuntime.then.onrejected(err); + } + } + endProcess() { + + if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onfulfilled) { + if (this.needEmitAll) { + this.converter.parseRuntime.then.onfulfilled(this.finalResult); + }else{ + this.converter.parseRuntime.then.onfulfilled([]); + } + } + if (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onCompleted) { + this.converter.parseRuntime.subscribe.onCompleted(); + } + if (this.needPushDownstream && this.converter.parseParam.downstreamFormat === "array") { + pushDownstream(this.converter, "]" + EOL); + } + } +} + +function processLineByLine( + lines: ProcessLineResult[], + + conv: Converter, + offset: number, + needPushDownstream: boolean, + cb: (err?) => void, +) { + if (offset >= lines.length) { + cb(); + } else { + if (conv.parseRuntime.subscribe && conv.parseRuntime.subscribe.onNext) { + const hook = conv.parseRuntime.subscribe.onNext; + const nextLine = lines[offset]; + const res = hook(nextLine, conv.parseRuntime.parsedLineNumber + offset); + offset++; + // if (isAsync === undefined) { + if (res && res.then) { + res.then(function () { + processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine); + }, cb); + } else { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false); + if (needPushDownstream) { + pushDownstream(conv, nextLine); + } + while (offset < lines.length) { + const line = lines[offset]; + hook(line, conv.parseRuntime.parsedLineNumber + offset); + offset++; + if (needPushDownstream) { + pushDownstream(conv, line); + } + } + cb(); + } + // } else if (isAsync === true) { + // (res as PromiseLike).then(function () { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, true); + // }, cb); + // } else if (isAsync === false) { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false); + // } + } else { + if (needPushDownstream) { + while (offset < lines.length) { + const line = lines[offset++]; + pushDownstream(conv, line); + } + + } + cb(); + } + + } +} + +function processRecursive( + lines: ProcessLineResult[], + hook: (data: any, lineNumber: number) => void | PromiseLike, + conv: Converter, + offset: number, + needPushDownstream: boolean, + cb: (err?) => void, + res: ProcessLineResult, +) { + if (needPushDownstream) { + pushDownstream(conv, res); + } + processLineByLine(lines, conv, offset, needPushDownstream, cb); +} +function pushDownstream(conv: Converter, res: ProcessLineResult) { + if (typeof res === "object" && !conv.options.objectMode) { + const data = JSON.stringify(res); + conv.push(data + (conv.parseParam.downstreamFormat === "array" ? "," + EOL : EOL), "utf8"); + } else { + conv.push(res); + } +} \ No newline at end of file diff --git a/node_modules/csvtojson/src/dataClean.ts b/node_modules/csvtojson/src/dataClean.ts new file mode 100644 index 0000000..7014202 --- /dev/null +++ b/node_modules/csvtojson/src/dataClean.ts @@ -0,0 +1,63 @@ +import { ParseRuntime } from "./ParseRuntime"; +import stripBom from "strip-bom"; +/** + * For each data chunk coming to parser: + * 1. append the data to the buffer that is left from last chunk + * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + * 3. stripBom + */ +export function prepareData(chunk: Buffer, runtime: ParseRuntime): string { + const workChunk = concatLeftChunk(chunk, runtime); + runtime.csvLineBuffer = undefined; + const cleanCSVString = cleanUtf8Split(workChunk, runtime).toString("utf8"); + if (runtime.started === false) { + return stripBom(cleanCSVString); + } else { + return cleanCSVString; + } +} +/** + * append data to buffer that is left form last chunk + */ +function concatLeftChunk(chunk: Buffer, runtime: ParseRuntime): Buffer { + if (runtime.csvLineBuffer && runtime.csvLineBuffer.length > 0) { + return Buffer.concat([runtime.csvLineBuffer, chunk]); + } else { + return chunk; + } +} +/** + * check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + */ +function cleanUtf8Split(chunk: Buffer, runtime: ParseRuntime): Buffer { + let idx = chunk.length - 1; + /** + * From Keyang: + * The code below is to check if a single utf8 char (which could be multiple bytes) being split. + * If the char being split, the buffer from two chunk needs to be concat + * check how utf8 being encoded to understand the code below. + * If anyone has any better way to do this, please let me know. + */ + if ((chunk[idx] & 1 << 7) != 0) { + while ((chunk[idx] & 3 << 6) === 128) { + idx--; + } + idx--; + } + if (idx != chunk.length - 1) { + runtime.csvLineBuffer = chunk.slice(idx + 1); + return chunk.slice(0, idx + 1) + // var _cb=cb; + // var self=this; + // cb=function(){ + // if (self._csvLineBuffer){ + // self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]); + // }else{ + // self._csvLineBuffer=left; + // } + // _cb(); + // } + } else { + return chunk; + } +} \ No newline at end of file diff --git a/node_modules/csvtojson/src/fileline.test.ts b/node_modules/csvtojson/src/fileline.test.ts new file mode 100644 index 0000000..1f2bbc8 --- /dev/null +++ b/node_modules/csvtojson/src/fileline.test.ts @@ -0,0 +1,14 @@ +import {stringToLines} from "./fileline"; +import { mergeParams } from "./Parameters"; +import { Converter } from "./Converter"; +var assert = require("assert"); +describe("fileline function", function() { + it ("should convert data to multiple lines ", function() { + const conv=new Converter(); + var data = "abcde\nefef"; + var result = stringToLines(data, conv.parseRuntime); + assert.equal(result.lines.length, 1); + assert.equal(result.partial, "efef"); + assert.equal(result.lines[0], "abcde"); + }); +}); diff --git a/node_modules/csvtojson/src/fileline.ts b/node_modules/csvtojson/src/fileline.ts new file mode 100644 index 0000000..9b6ed49 --- /dev/null +++ b/node_modules/csvtojson/src/fileline.ts @@ -0,0 +1,25 @@ +import { ParseRuntime } from "./ParseRuntime"; +import getEol from "./getEol"; +// const getEol = require("./getEol"); +/** + * convert data chunk to file lines array + * @param {string} data data chunk as utf8 string + * @param {object} param Converter param object + * @return {Object} {lines:[line1,line2...],partial:String} + */ +export function stringToLines(data: string, param: ParseRuntime): StringToLinesResult { + const eol = getEol(data, param); + const lines = data.split(eol); + const partial = lines.pop() || ""; + return { lines: lines, partial: partial }; +}; + + +export interface StringToLinesResult { + lines: Fileline[], + /** + * last line which could be incomplete line. + */ + partial: string +} +export type Fileline = string; \ No newline at end of file diff --git a/node_modules/csvtojson/src/getEol.ts b/node_modules/csvtojson/src/getEol.ts new file mode 100644 index 0000000..cb10f9b --- /dev/null +++ b/node_modules/csvtojson/src/getEol.ts @@ -0,0 +1,21 @@ +import { ParseRuntime } from "./ParseRuntime"; +//return first eol found from a data chunk. +export default function (data: string, param: ParseRuntime): string { + if (!param.eol && data) { + for (var i = 0, len = data.length; i < len; i++) { + if (data[i] === "\r") { + if (data[i + 1] === "\n") { + param.eol = "\r\n"; + break; + } else if (data[i + 1]) { + param.eol = "\r"; + break; + } + } else if (data[i] === "\n") { + param.eol = "\n"; + break; + } + } + } + return param.eol || "\n"; +}; diff --git a/node_modules/csvtojson/src/index.ts b/node_modules/csvtojson/src/index.ts new file mode 100644 index 0000000..82a8e6c --- /dev/null +++ b/node_modules/csvtojson/src/index.ts @@ -0,0 +1,10 @@ +import { TransformOptions } from "stream"; +import { CSVParseParam } from "./Parameters"; +import { Converter } from "./Converter"; + +const helper = function (param?: Partial, options?: TransformOptions): Converter { + return new Converter(param, options); +} +helper["csv"] = helper; +helper["Converter"] = Converter; +export =helper; diff --git a/node_modules/csvtojson/src/lineToJson.ts b/node_modules/csvtojson/src/lineToJson.ts new file mode 100644 index 0000000..b89ee81 --- /dev/null +++ b/node_modules/csvtojson/src/lineToJson.ts @@ -0,0 +1,210 @@ +import { Converter } from "./Converter"; +import CSVError from "./CSVError"; +import { CellParser, ColumnParam } from "./Parameters"; +import set from "lodash/set"; +import { ParseRuntime } from "./ParseRuntime"; + +var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/; + +export default function (csvRows: string[][], conv: Converter): JSONResult[] { + const res: JSONResult[] = []; + for (let i = 0, len = csvRows.length; i < len; i++) { + const r = processRow(csvRows[i], conv, i); + if (r) { + res.push(r); + } + } + return res; +}; +export type JSONResult = { + [key: string]: any +} + +function processRow(row: string[], conv: Converter, index): JSONResult | null { + + if (conv.parseParam.checkColumn && conv.parseRuntime.headers && row.length !== conv.parseRuntime.headers.length) { + throw (CSVError.column_mismatched(conv.parseRuntime.parsedLineNumber + index)) + } + + const headRow = conv.parseRuntime.headers || []; + const resultRow = convertRowToJson(row, headRow, conv); + if (resultRow) { + return resultRow; + } else { + return null; + } +} + +function convertRowToJson(row: string[], headRow: string[], conv: Converter): { [key: string]: any } | null { + let hasValue = false; + const resultRow = {}; + + for (let i = 0, len = row.length; i < len; i++) { + let item = row[i]; + + if (conv.parseParam.ignoreEmpty && item === '') { + continue; + } + hasValue = true; + + let head = headRow[i]; + if (!head || head === "") { + head = headRow[i] = "field" + (i + 1); + } + const convFunc = getConvFunc(head, i, conv); + if (convFunc) { + const convRes = convFunc(item, head, resultRow, row, i); + if (convRes !== undefined) { + setPath(resultRow, head, convRes, conv,i); + } + } else { + // var flag = getFlag(head, i, param); + // if (flag === 'omit') { + // continue; + // } + if (conv.parseParam.checkType) { + const convertFunc = checkType(item, head, i, conv); + item = convertFunc(item); + } + if (item !== undefined) { + setPath(resultRow, head, item, conv,i); + } + } + } + if (hasValue) { + return resultRow; + } else { + return null; + } +} + +const builtInConv: { [key: string]: CellParser } = { + "string": stringType, + "number": numberType, + "omit": function () { } +} +function getConvFunc(head: string, i: number, conv: Converter): CellParser | null { + if (conv.parseRuntime.columnConv[i] !== undefined) { + return conv.parseRuntime.columnConv[i]; + } else { + let flag = conv.parseParam.colParser[head]; + if (flag === undefined) { + return conv.parseRuntime.columnConv[i] = null; + } + if (typeof flag === "object") { + flag = (flag as ColumnParam).cellParser || "string"; + } + if (typeof flag === "string") { + flag = flag.trim().toLowerCase(); + const builtInFunc = builtInConv[flag]; + if (builtInFunc) { + return conv.parseRuntime.columnConv[i] = builtInFunc; + } else { + return conv.parseRuntime.columnConv[i] = null; + } + } else if (typeof flag === "function") { + return conv.parseRuntime.columnConv[i] = flag; + } else { + return conv.parseRuntime.columnConv[i] = null; + } + } +} +function setPath(resultJson: any, head: string, value: any, conv: Converter,headIdx:number) { + if (!conv.parseRuntime.columnValueSetter[headIdx]) { + if (conv.parseParam.flatKeys) { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } else { + + if (head.indexOf(".") > -1) { + const headArr=head.split("."); + let jsonHead=true; + while(headArr.length>0){ + const headCom=headArr.shift(); + if (headCom!.length===0){ + jsonHead=false; + break; + } + } + if (!jsonHead || conv.parseParam.colParser[head] && (conv.parseParam.colParser[head] as ColumnParam).flat) { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } else { + conv.parseRuntime.columnValueSetter[headIdx] = jsonSetter; + } + } else { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + } + } + if (conv.parseParam.nullObject ===true && value ==="null"){ + value=null; + } + conv.parseRuntime.columnValueSetter[headIdx](resultJson, head, value); + // flatSetter(resultJson, head, value); + +} +function flatSetter(resultJson: any, head: string, value: any) { + resultJson[head] = value; +} +function jsonSetter(resultJson: any, head: string, value: any) { + set(resultJson, head, value); +} + + +function checkType(item: string, head: string, headIdx: number, conv: Converter): Function { + if (conv.parseRuntime.headerType[headIdx]) { + return conv.parseRuntime.headerType[headIdx]; + } else if (head.indexOf('number#!') > -1) { + return conv.parseRuntime.headerType[headIdx] = numberType; + } else if (head.indexOf('string#!') > -1) { + return conv.parseRuntime.headerType[headIdx] = stringType; + } else if (conv.parseParam.checkType) { + return conv.parseRuntime.headerType[headIdx] = dynamicType; + } else { + return conv.parseRuntime.headerType[headIdx] = stringType; + } +} + +function numberType(item) { + var rtn = parseFloat(item); + if (isNaN(rtn)) { + return item; + } + return rtn; +} + +function stringType(item: string): string { + return item.toString(); +} + +function dynamicType(item) { + var trimed = item.trim(); + if (trimed === "") { + return stringType(item); + } + if (numReg.test(trimed)) { + return numberType(item); + } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") { + return booleanType(item); + } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") { + return jsonType(item); + } else { + return stringType(item); + } +} + +function booleanType(item) { + var trimed = item.trim(); + if (trimed.length === 5 && trimed.toLowerCase() === "false") { + return false; + } else { + return true; + } +} + +function jsonType(item) { + try { + return JSON.parse(item); + } catch (e) { + return item; + } +} diff --git a/node_modules/csvtojson/src/rowSplit.test.ts b/node_modules/csvtojson/src/rowSplit.test.ts new file mode 100644 index 0000000..3598a62 --- /dev/null +++ b/node_modules/csvtojson/src/rowSplit.test.ts @@ -0,0 +1,142 @@ +import { RowSplit, MultipleRowResult, RowSplitResult } from "./rowSplit"; +import { Converter } from "./Converter"; +const assert = require("assert"); + +describe("Test delimiters", function () { + const getDelimiter = (str, opt: { delimiter: string | string[] }): string => { + return RowSplit.prototype["getDelimiter"].call({ + conv: { + parseParam: { + delimiter: opt.delimiter + } + } + }, str); + } + + it("should return the explicitly specified delimiter", function () { + var delimiter = ";"; + var rowStr = "a;b;c"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: ";" }); + assert.equal(returnedDelimiter, delimiter); + }); + + it("should return the autodetected delimiter if 'auto' specified", function () { + var rowStr = "a;b;c"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" }); + assert(returnedDelimiter === ";"); + }); + + it("should return the ',' delimiter if delimiter cannot be specified, in case of 'auto'", function () { + var rowStr = "abc"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: "auto" }); + assert(returnedDelimiter === ","); + }); + + it("should accetp an array with potential delimiters", function () { + var rowStr = "a$b$c"; + var returnedDelimiter = getDelimiter(rowStr, { delimiter: [",", ";", "$"] }); + assert(returnedDelimiter === '$'); + }); +}); + +describe("ParseMultiLine function", function () { + const rowSplit = new RowSplit(new Converter()); + const func = (lines: string[]): MultipleRowResult => { + return rowSplit.parseMultiLines(lines); + } + it("should convert lines to csv lines", function () { + var lines = [ + "a,b,c,d", + "hello,world,csvtojson,abc", + "1,2,3,4" + ]; + var res = func(lines); + assert.equal(res.rowsCells.length, 3); + assert.equal(res.partial, ""); + }); + + it("should process line breaks", function () { + var lines = [ + "a,b,c", + '15",hello,"ab', + "cde\"", + "\"b\"\"b\",cc,dd" + ]; + var res = func(lines); + assert.equal(res.rowsCells.length, 3); + assert.equal(res.rowsCells[1][0], "15\""); + assert.equal(res.rowsCells[1][2], "ab\ncde"); + assert.equal(res.rowsCells[2][0], "b\"b"); + assert.equal(res.partial, ""); + }); + + it("should return partial if line not closed", function () { + var lines = [ + "a,b,c", + '15",hello,"ab', + "d,e,f" + ]; + var res = func(lines); + assert.equal(res.rowsCells.length, 1); + assert.equal(res.partial, "15\",hello,\"ab\nd,e,f\n"); + }); +}); + +describe("RowSplit.parse function", function () { + const rowSplit = new RowSplit(new Converter()); + const func = (str): RowSplitResult => { + return rowSplit.parse(str); + } + it("should split complete csv line", function () { + var str = "hello,world,csvtojson,awesome"; + var res = func(str); + assert.equal(res.cells.length, 4); + assert.equal(res.closed, true); + }); + + it("should split incomplete csv line", function () { + var str = "hello,world,\"csvtojson,awesome"; + var res = func(str); + assert.equal(res.closed, false); + }); + + it("should allow multiple line", function () { + var str = "\"he\"llo\",world,\"csvtojson,a\"\nwesome\""; + var res = func(str); + assert.equal(res.closed, true); + assert.equal(res.cells[2], 'csvtojson,a"\nwesome'); + }); + it("should allow blank quotes", () => { + const data = "a|^^|^b^"; + + const rowSplit = new RowSplit(new Converter({ + delimiter: '|', + quote: '^', + noheader: true + })); + const res = rowSplit.parse(data); + assert.equal(res.cells[1], ""); + }) + it("should allow blank quotes in quotes", () => { + const data = 'a,"hello,this,"", test"'; + + const rowSplit = new RowSplit(new Converter({ + noheader: true + })); + const res = rowSplit.parse(data); + assert.equal(res.cells[1], 'hello,this,", test'); + }) + it("should smart detect if an initial quote is only part of value ", () => { + const data = '"Weight" (kg),Error code,"Height" (m)'; + const rowSplit = new RowSplit(new Converter({ + noheader: true + })); + const res = rowSplit.parse(data); + assert.equal(res.cells.length, 3); + assert(res.closed); + assert.equal(res.cells[0],'"Weight" (kg)'); + assert.equal(res.cells[1],'Error code'); + assert.equal(res.cells[2],'"Height" (m)'); + + }) +}); diff --git a/node_modules/csvtojson/src/rowSplit.ts b/node_modules/csvtojson/src/rowSplit.ts new file mode 100644 index 0000000..e4b268e --- /dev/null +++ b/node_modules/csvtojson/src/rowSplit.ts @@ -0,0 +1,235 @@ +import { CSVParseParam } from "./Parameters"; +import { Converter } from "./Converter"; +import { Fileline } from "./fileline"; +import getEol from "./getEol"; +import { filterArray, trimLeft, trimRight } from "./util"; + +const defaulDelimiters = [",", "|", "\t", ";", ":"]; +export class RowSplit { + private quote: string; + private trim: boolean; + private escape: string; + private cachedRegExp: { [key: string]: RegExp } = {}; + private delimiterEmitted = false; + private _needEmitDelimiter?: boolean = undefined; + private get needEmitDelimiter() { + if (this._needEmitDelimiter === undefined) { + this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0; + } + return this._needEmitDelimiter; + } + constructor(private conv: Converter) { + this.quote = conv.parseParam.quote; + this.trim = conv.parseParam.trim; + this.escape = conv.parseParam.escape; + } + parse(fileline: Fileline): RowSplitResult { + if (fileline.length === 0 || (this.conv.parseParam.ignoreEmpty && fileline.trim().length === 0)) { + return { cells: [], closed: true }; + } + const quote = this.quote; + const trim = this.trim; + const escape = this.escape; + if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") { + this.conv.parseRuntime.delimiter = this.getDelimiter(fileline); + + } + if (this.needEmitDelimiter && !this.delimiterEmitted) { + this.conv.emit("delimiter", this.conv.parseRuntime.delimiter); + this.delimiterEmitted = true; + } + const delimiter = this.conv.parseRuntime.delimiter; + const rowArr = fileline.split(delimiter); + if (quote === "off") { + if (trim) { + for (let i = 0; i < rowArr.length; i++) { + rowArr[i] = rowArr[i].trim(); + } + } + return { cells: rowArr, closed: true }; + } else { + return this.toCSVRow(rowArr, trim, quote, delimiter); + } + + } + private toCSVRow(rowArr: string[], trim: boolean, quote: string, delimiter: string): RowSplitResult { + const row: string[] = []; + let inquote = false; + let quoteBuff = ''; + for (let i = 0, rowLen = rowArr.length; i < rowLen; i++) { + let e = rowArr[i]; + if (!inquote && trim) { + e = trimLeft(e); + } + const len = e.length; + if (!inquote) { + if (len === 2 && e === this.quote + this.quote) { + row.push(""); + continue; + } else if (this.isQuoteOpen(e)) { //quote open + e = e.substr(1); + if (this.isQuoteClose(e)) { //quote close + e = e.substring(0, e.lastIndexOf(quote)); + e = this.escapeQuote(e); + row.push(e); + continue; + } else if (e.indexOf(quote) !== -1) { + let count = 0; + let prev = ""; + for (const c of e) { + // count quotes only if previous character is not escape char + if (c === quote && prev !== this.escape) { + count++; + prev = ""; + } else { + // save previous char to temp variable + prev = c; + } + } + if (count % 2 === 1) { + if (trim) { + e = trimRight(e); + } + row.push(quote + e); + continue; + }else{ + inquote = true; + quoteBuff += e; + continue; + } + } + else { + inquote = true; + quoteBuff += e; + continue; + } + } else { + if (trim) { + e = trimRight(e); + } + row.push(e); + continue; + } + } else { //previous quote not closed + if (this.isQuoteClose(e)) { //close double quote + inquote = false; + e = e.substr(0, len - 1); + quoteBuff += delimiter + e; + quoteBuff = this.escapeQuote(quoteBuff); + if (trim) { + quoteBuff = trimRight(quoteBuff); + } + row.push(quoteBuff); + quoteBuff = ""; + } else { + quoteBuff += delimiter + e; + } + } + } + + // if (!inquote && param._needFilterRow) { + // row = filterRow(row, param); + // } + + return { cells: row, closed: !inquote }; + } + private getDelimiter(fileline: Fileline): string { + let checker; + if (this.conv.parseParam.delimiter === "auto") { + checker = defaulDelimiters; + } else if (this.conv.parseParam.delimiter instanceof Array) { + checker = this.conv.parseParam.delimiter; + } else { + return this.conv.parseParam.delimiter; + } + let count = 0; + let rtn = ","; + checker.forEach(function (delim) { + const delimCount = fileline.split(delim).length; + if (delimCount > count) { + rtn = delim; + count = delimCount; + } + }); + return rtn; + } + private isQuoteOpen(str: string): boolean { + const quote = this.quote; + const escape = this.escape; + return str[0] === quote && ( + str[1] !== quote || + str[1] === escape && (str[2] === quote || str.length === 2)); + } + private isQuoteClose(str: string): boolean { + const quote = this.quote; + const escape = this.escape; + if (this.conv.parseParam.trim) { + str = trimRight(str); + } + let count = 0; + let idx = str.length - 1; + while (str[idx] === quote || str[idx] === escape) { + idx--; + count++; + } + return count % 2 !== 0; + } + + // private twoDoubleQuote(str: string): string { + // var twoQuote = this.quote + this.quote; + // var curIndex = -1; + // while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) { + // str = str.substring(0, curIndex) + str.substring(++curIndex); + // } + // return str; + // } + + + private escapeQuote(segment: string): string { + const key = "es|" + this.quote + "|" + this.escape; + if (this.cachedRegExp[key] === undefined) { + this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g'); + } + const regExp = this.cachedRegExp[key]; + // console.log(regExp,segment); + return segment.replace(regExp, this.quote); + } + parseMultiLines(lines: Fileline[]): MultipleRowResult { + const csvLines: string[][] = []; + let left = ""; + while (lines.length) { + const line = left + lines.shift(); + const row = this.parse(line); + if (row.cells.length === 0 && this.conv.parseParam.ignoreEmpty) { + continue; + } + if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) { + if (this.conv.parseRuntime.selectedColumns) { + csvLines.push(filterArray(row.cells, this.conv.parseRuntime.selectedColumns)); + } else { + csvLines.push(row.cells); + } + + left = ""; + } else { + left = line + (getEol(line, this.conv.parseRuntime) || "\n"); + } + } + return { rowsCells: csvLines, partial: left }; + } +} +export interface MultipleRowResult { + rowsCells: string[][]; + partial: string; +} +export interface RowSplitResult { + /** + * csv row array. ["a","b","c"] + */ + cells: string[], + /** + * if the passed fileline is a complete row + */ + closed: boolean +} + diff --git a/node_modules/csvtojson/src/util.ts b/node_modules/csvtojson/src/util.ts new file mode 100644 index 0000000..d68bf96 --- /dev/null +++ b/node_modules/csvtojson/src/util.ts @@ -0,0 +1,37 @@ +export function bufFromString(str: string): Buffer { + const length = Buffer.byteLength(str); + const buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(length) + : new Buffer(length); + buffer.write(str); + return buffer; +} + +export function emptyBuffer(): Buffer{ + const buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(0) + : new Buffer(0); + return buffer; +} + +export function filterArray(arr: any[], filter: number[]): any[] { + const rtn: any[] = []; + for (let i = 0; i < arr.length; i++) { + if (filter.indexOf(i) > -1) { + rtn.push(arr[i]); + } + } + return rtn; +} + +export const trimLeft=String.prototype.trimLeft?function trimLeftNative(str:string){ + return str.trimLeft(); +}:function trimLeftRegExp(str:string){ + return str.replace(/^\s+/, ""); +} + +export const trimRight=String.prototype.trimRight?function trimRightNative(str:string){ + return str.trimRight(); +}:function trimRightRegExp(str:string){ + return str.replace(/\s+$/, ""); +} diff --git a/node_modules/csvtojson/src/worker.ts b/node_modules/csvtojson/src/worker.ts new file mode 100644 index 0000000..2c78509 --- /dev/null +++ b/node_modules/csvtojson/src/worker.ts @@ -0,0 +1,76 @@ +// import { Converter } from "./Converter"; +// import { Message, InitMessage, EOM } from "./ProcessFork"; +// import CSVError from "./CSVError"; +// import { CSVParseParam } from "./Parameters"; +// process.on("message", processMsg); +// let conv: Converter; +// function processMsg(msg: Message) { +// if (msg.cmd === "init") { +// const param = prepareParams((msg as InitMessage).params); +// param.fork = false; +// conv = new Converter(param); +// process.stdin.pipe(conv).pipe(process.stdout); +// conv.on("error", (err) => { +// if ((err as CSVError).line) { +// process.stderr.write(JSON.stringify({ +// err: (err as CSVError).err, +// line: (err as CSVError).line, +// extra: (err as CSVError).extra +// })) +// } else { +// process.stderr.write(JSON.stringify({ +// err: err.message, +// line: -1, +// extra: "Unknown error" +// })); +// } + +// }); +// conv.on("eol", (eol) => { +// // console.log("eol!!!",eol); +// if (process.send) +// process.send({ cmd: "eol", "value": eol }); +// }) +// conv.on("header", (header) => { +// if (process.send) +// process.send({ cmd: "header", "value": header }); +// }) +// conv.on("done", () => { +// const drained = process.stdout.write("", () => { +// if (drained) { +// gracelyExit(); +// } +// }); +// if (!drained) { +// process.stdout.on("drain", gracelyExit) +// } + + +// // process.stdout.write(EOM); +// }) +// if (process.send) { +// process.send({ cmd: "inited" }); +// } + + +// } +// } +// function gracelyExit(){ +// setTimeout(()=>{ +// conv.removeAllListeners(); +// process.removeAllListeners(); +// },50); +// } +// function prepareParams(p: any): CSVParseParam { +// if (p.ignoreColumns) { +// p.ignoreColumns = new RegExp(p.ignoreColumns.source, p.ignoreColumns.flags) +// } +// if (p.includeColumns) { +// p.includeColumns = new RegExp(p.includeColumns.source, p.includeColumns.flags) +// } +// return p; +// } + +// process.on("disconnect", () => { +// process.exit(-1); +// }); \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/columnArray b/node_modules/csvtojson/test/data/columnArray new file mode 100644 index 0000000..33020f3 --- /dev/null +++ b/node_modules/csvtojson/test/data/columnArray @@ -0,0 +1,6 @@ +TIMESTAMP,UPDATE,UID,BYTES SENT,BYTES RCVED +1395426422,n,10028,1213,5461 +1395426422,n,10013,9954,13560 +1395426422,n,10109,221391500,141836 +1395426422,n,10007,53448,308549 +1395426422,n,10022,15506,72125 \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/complexJSONCSV b/node_modules/csvtojson/test/data/complexJSONCSV new file mode 100644 index 0000000..8feeb1a --- /dev/null +++ b/node_modules/csvtojson/test/data/complexJSONCSV @@ -0,0 +1,3 @@ +fieldA.title, fieldA.children.0.name, fieldA.children.0.id,fieldA.children.1.name, fieldA.children.1.employee.0.name,fieldA.children.1.employee.1.name, fieldA.address.0,fieldA.address.1, description +Food Factory, Oscar, 0023, Tikka, Tim, Joe, 3 Lame Road, Grantstown, A fresh new food factory +Kindom Garden, Ceil, 54, Pillow, Amst, Tom, 24 Shaker Street, HelloTown, Awesome castle diff --git a/node_modules/csvtojson/test/data/csvWithUnclosedHeader b/node_modules/csvtojson/test/data/csvWithUnclosedHeader new file mode 100644 index 0000000..8cc1233 --- /dev/null +++ b/node_modules/csvtojson/test/data/csvWithUnclosedHeader @@ -0,0 +1,3 @@ +Date and time,Sample no.,Status,Sample type,Patient ID,Last name,First name,Sex of patient,Patient birth date,Patient note,Patient department,Accession number,Sample site,Physician,Operator,Department,Note,Test order code,Draw time,Approval status,Approval time,Report layout,Patient account number,,Errors detected during measurement,"Age" (years),Error code,"Weight" (kg),Error code,"Height" (m),Error code,"HCG_Beta(P)" (mIU/mL),Error code,"Troponin_I(P)" (ng/mL),Error code,"CK_MB(P)" (ng/mL),Error code,"D-Dimer(P)" (ng/mL),Error code,"hsCRP(P)" (mg/L),Error code,"Myoglobin(P)" (ng/mL),Error code,"NT-proBNP" (pg/mL),Error code,"CRP" (mg/dL),Error code,"BNP" (ng/L),Error code,"TnT" (ng/mL),Error code,"Demo(P)" (AQT),Error code,"PCT" (ng/mL),Error code, +"06/14/2018 10:34 AM","12669","OK","","4206454447","","","Unknown","","","","4206454447","","","Anonymous","","","400",,"Not reviewed","","New","",,"",,,,,,,,,,,,,,,,,,,168,"",,,,,,,,,, +"06/14/2018 10:19 AM","12668","OK","","4206454403","","","Unknown","","","","4206454403","","","Anonymous","","","101",,"Not reviewed","","New","",,"",,,,,,,,,<0.010,"",4.2,"",,,,,,,,,,,,,,,,,, diff --git a/node_modules/csvtojson/test/data/data#139 b/node_modules/csvtojson/test/data/data#139 new file mode 100644 index 0000000..07ba477 --- /dev/null +++ b/node_modules/csvtojson/test/data/data#139 @@ -0,0 +1,4 @@ +field1, field2, field3, field4, +2005088801,A1,9001009395, +2005088806,A6,9001009395 9001009990, +2005088807,A7,9001009989, diff --git a/node_modules/csvtojson/test/data/dataDiffDelimiter b/node_modules/csvtojson/test/data/dataDiffDelimiter new file mode 100644 index 0000000..f35be22 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataDiffDelimiter @@ -0,0 +1,3 @@ +annee;jour;date;b_1;b_2;devise; +2015029;LUNDI ;09/03/2015;35;31;eur; +2015028;SAMEDI ;07/03/2015;48;9;eur; diff --git a/node_modules/csvtojson/test/data/dataIgnoreEmpty b/node_modules/csvtojson/test/data/dataIgnoreEmpty new file mode 100644 index 0000000..396e43b --- /dev/null +++ b/node_modules/csvtojson/test/data/dataIgnoreEmpty @@ -0,0 +1,13 @@ + + + +col1, col2.0, col2.1,col4.col3,col4.col5 +d1,,d3,,world + +d2,d,d,d,d +,,,, +d4,d2,d3 + + + + diff --git a/node_modules/csvtojson/test/data/dataNoTrimBOM b/node_modules/csvtojson/test/data/dataNoTrimBOM new file mode 100644 index 0000000..3d1e8ca --- /dev/null +++ b/node_modules/csvtojson/test/data/dataNoTrimBOM @@ -0,0 +1,3 @@ +"name","age" +"joe","20" +"sam","30" diff --git a/node_modules/csvtojson/test/data/dataNoTrimCRLF b/node_modules/csvtojson/test/data/dataNoTrimCRLF new file mode 100644 index 0000000..e248aa6 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataNoTrimCRLF @@ -0,0 +1,3 @@ +name,age +joe,20 +sam,30 \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataTsv b/node_modules/csvtojson/test/data/dataTsv new file mode 100644 index 0000000..14e0cb5 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataTsv @@ -0,0 +1,201 @@ +name dob address.street address.city address.country guid +Edward 09-26-15 155-5699 Lobortis, Street Sauveni�re Guinea 7DEC987B-CD15-2967-BB88-98A9DE869AC2 +Jason 12-24-14 Ap #394-4852 Lorem, Rd. Barchi Niger F8A268A9-70F9-8298-CADA-22E29CC973E9 +Colin 04-15-15 Ap #738-1831 Pretium Avenue Lafayette Tuvalu 99C2A67A-82FD-4FD2-B13D-41021A93CD34 +Ulric 07-13-15 335-3099 Cum St. Aix-en-Provence Mozambique 59844D4F-FB53-E903-67C4-7B0DCA451420 +Vance 11-08-15 Ap #805-4137 Nulla Road Ligney South Sudan CB3B9B77-12C0-1D8D-96AF-982CFBDC04D8 +Mason 06-06-15 Ap #750-6911 Aliquam St. Maisi�res Benin D5E21534-EF42-0C7C-5761-8D55A418F78C +Jesse 08-04-15 P.O. Box 371, 2374 Malesuada Ave Aschersleben Pitcairn Islands FFB87D4C-C25B-8B2A-C65D-0C0CF04ECD19 +Xenos 01-08-15 P.O. Box 302, 9020 Sed Avenue Ancaster Town Guam 5ACC0483-30D0-194F-8E0A-F2BB9CB7E41C +Dalton 04-10-15 Ap #987-4193 Suspendisse Street Bromyard United States E0DE1186-15BD-025A-425E-5A551CB66FCA +Maxwell 01-03-15 P.O. Box 297, 2759 Per Avenue Rae-Edzo Namibia 5E880371-EB39-D705-B6BA-B1C47A0FB20F +Josiah 12-29-15 481-4517 Justo. Rd. Vreren Ethiopia 6146E324-1713-031D-4A05-00DA9A6E0A72 +Dillon 01-15-15 903-2925 Sed Rd. Bath Solomon Islands B6784798-C745-6B8B-EFC3-DDB456766B3A +Lucas 04-07-16 Ap #212-4291 Non Ave Mount Isa Bermuda 4BF02F00-6543-E955-2CB3-147DB5ACC996 +Kane 10-27-15 Ap #855-8041 Aliquam Road Bloomington Isle of Man 7D5F7EF0-1DA1-2956-913E-9DD0232FE82B +Jermaine 02-08-16 6536 Sollicitudin Rd. Lens-Saint-Servais Laos 98480101-570D-3989-8607-DF037CE2C04D +Scott 05-11-16 982-7468 Aliquam Avenue Eckville Wallis and Futuna F9E86E1B-C940-93BC-F269-90120A50A828 +Ronan 07-02-15 P.O. Box 351, 6427 Sociis St. R�dermark Kenya 13E31F6C-A4BE-3B63-C208-0F9EDC33231C +Paul 09-17-16 4613 Tortor, Av. Riksingen Central African Republic 2830470E-9126-E1F0-EFE7-75E16F47E605 +Fulton 04-16-16 4351 Elit, Road Sint-Gillis Cape Verde 5B8782C1-12C1-0EE0-5229-5AB14D06BD57 +Lamar 05-18-16 9263 Mollis. Road Veerle Nepal 4ED58B8B-35D8-732C-C232-4228154A009A +Charles 12-27-14 Ap #239-2452 Nec Avenue Saskatoon New Caledonia E7C99399-87EA-F908-59E9-CCB1B40AF168 +Kaseem 09-28-16 Ap #958-9657 Cursus Road Sunset Point Ukraine 5BAA6A09-9E8C-8AEA-962D-B7371368DB8C +Baxter 09-14-15 P.O. Box 566, 4372 Feugiat Av. LaSalle Serbia 8190712E-A2AD-3CC9-89B4-2301F9570595 +Lionel 05-12-16 3005 Suspendisse St. Zuienkerke Mali 2CD8B4BB-6CD5-2D4C-9074-FBBF5462E471 +Quinn 12-20-15 P.O. Box 799, 2708 Augue Ave Chapadinha Mongolia 9BDB232A-24B6-4020-CF05-2195FCC7A683 +Channing 10-12-15 P.O. Box 263, 6647 Eleifend Road Ajaccio Botswana 88C7710E-4B0A-739A-CCFA-68656D352511 +Evan 10-12-15 877-3353 In St. Torella del Sannio Togo 936FDD4C-7489-285F-B391-28F15291FA15 +Deacon 01-01-15 P.O. Box 896, 2131 Mollis. Rd. San Pietro al Tanagro Niue D0489775-4C8B-B6A4-B13F-69F1EFE6A2BB +Hyatt 08-09-15 Ap #628-8427 Semper Street Northallerton Ireland 1645C905-04E6-3187-05FD-FF3EF3B1909C +Mason 03-08-15 1919 Rhoncus. Road La Matap�dia Latvia 948764BD-0D67-8193-7F71-DB8B75405BB8 +Aquila 07-16-16 Ap #367-5036 Lobortis Street Wasseiges Christmas Island 9D78ECF4-D785-16F6-1506-EFEC7A2E680C +Jesse 12-09-14 Ap #524-1274 Nec Rd. Elgin Faroe Islands 4A4F0E32-EFF6-B1C7-7FE6-8701C4849DAD +Norman 06-08-16 365-7493 Proin Ave Pitlochry Norfolk Island C4002F4B-703A-356B-3B52-EF349E11BBD2 +Dale 05-07-16 P.O. Box 149, 7946 Bibendum. St. Narbonne Cayman Islands DCAFA688-BDF2-DFC9-F545-B6191F3AABBA +Fletcher 10-08-16 Ap #984-4339 Id Avenue Appelterre-Eichem Nauru C870B22E-A1DC-A376-0589-63A6E97F4459 +Murphy 07-02-16 P.O. Box 736, 2911 Ut Rd. Dorval Pitcairn Islands D2F75F2B-2CC8-9BD3-2DF1-6F6C1537F228 +Carson 10-11-16 4270 Nulla Rd. Halen Israel A3EC0D50-A0C9-9625-28AD-B3933A81C5F1 +Brennan 12-11-14 P.O. Box 142, 9526 Ante, Avenue Cochin Bonaire, Sint Eustatius and Saba BB02EC4A-C57C-1F61-9298-45C7C3EB55B5 +Dennis 09-14-16 Ap #292-9945 Iaculis Street Santander Mayotte 93ACD6FF-E620-D8A4-985F-2DB67BE630B7 +Amir 10-10-15 P.O. Box 369, 979 Senectus Av. Wardin Armenia 79FF5F4E-03F8-7DAC-09B4-A8076E3F39A9 +Palmer 10-09-16 3086 Eu Road Sossano Cameroon 66ABAEF0-2A60-27C5-2B4D-6C1D08F0148F +Dorian 06-27-16 483-7380 Etiam Av. Zierikzee Ireland FCC92CC2-C59B-07A4-034D-7AC1F56FF893 +Donovan 10-19-16 P.O. Box 282, 1555 Molestie Avenue Kırıkhan Equatorial Guinea 6E1C773F-7579-01A6-2C2F-50CD28E99AC5 +Wesley 08-26-15 P.O. Box 557, 4171 Eget St. Banchory Jersey D889335F-815F-B91A-7C92-814CF8491944 +Damon 08-13-15 Ap #724-7527 Lobortis, Avenue Juneau Mauritius 65336375-864D-DA66-043D-C4461F3B3A21 +Cooper 08-25-16 832-3247 In Road Pike Creek Somalia 57CAFF15-A497-D20D-9D36-E3AE78C77F2B +Flynn 10-12-15 401 Congue, Street Rouvroy Paraguay 81FE1E24-7843-25EA-BE5B-C2598C4453BF +Declan 03-12-15 686-1101 Dignissim. Rd. Bad Oldesloe Trinidad and Tobago 124E4702-21AA-3617-D6EF-0A680BF287F9 +Ryder 10-21-16 1151 Eu Ave Orsara di Puglia Chad 6947FFF6-F8F2-637D-4DB2-EF746659E965 +Allen 06-30-15 Ap #756-3480 Accumsan Street Carnoustie Taiwan 5631AE3E-6E47-53BD-8891-817B4CC3512D +Charles 01-02-15 P.O. Box 940, 6735 Sed, Street Mandi Burewala Nauru 876E1717-ECCC-6359-47B5-97BA80A2B29C +Travis 10-07-15 P.O. Box 162, 8293 Duis St. Geesthacht Samoa BB3CEE82-1B41-F4B9-8045-08F1C9B7A17F +Beck 06-01-16 2021 Maecenas St. Hugli-Chinsurah Pakistan F7ABADF7-9EC5-F5C6-FF32-ADAE093ACA10 +Chadwick 02-24-15 286-4943 Sodales St. Stockport Mauritania C04926C6-A52C-B7EF-1569-F9A5B5EDD8B7 +Eric 03-22-16 Ap #443-2598 Malesuada Rd. Sutton Jersey 70152CA1-69C1-F88E-E19F-D0DFB191072C +Jarrod 02-28-16 P.O. Box 573, 5483 Mattis. Street Treglio Djibouti 4477A21E-68A0-BB81-C78B-009276AC2309 +Sebastian 08-10-16 P.O. Box 486, 5119 Dis Av. Weesp Singapore C4396AD3-9AA0-423B-A372-DE21B5AE757F +Robert 10-20-15 9597 Morbi Ave Haren Micronesia DAE70851-B015-A9FC-0222-57DF9EE41EDE +Garrison 01-29-16 112-727 Sed St. Pickering Dominican Republic FD8F4927-407A-F57C-A668-732631AEE69F +Dominic 10-22-16 P.O. Box 379, 6763 Neque St. Colwood Cocos (Keeling) Islands BAB8741F-A3FA-C1DF-77CE-4E05C483CA6C +Adrian 01-30-15 P.O. Box 993, 5994 Tempus, Av. Kelowna Korea, North 35627FC0-8C04-45EE-52C0-DA52EFA4331C +Cullen 01-15-15 Ap #119-8754 Parturient St. Mazy Haiti 008EE5DE-9370-1F99-9F53-3E27D088D1FD +Gray 05-02-16 P.O. Box 694, 9954 Posuere Av. Magdeburg Korea, North C2C7C509-8D31-FE4C-8B1F-D4798D03CC27 +Rogan 02-03-15 203 Diam St. Rimbey Trinidad and Tobago 775A58E6-3F69-DE34-2795-10A4FA610E59 +Plato 12-11-15 Ap #973-9650 Primis St. Colwood Tokelau E89C96FA-D021-A966-D8B7-4012C2B7D08A +Jarrod 12-21-14 741-959 Pede Av. Bad Vilbel Honduras 2833D3A2-A195-90CC-5344-DCD810C95ABD +Forrest 03-19-15 8901 Magna Avenue Esterzili United Kingdom (Great Britain) 75F9D959-8A54-E131-628A-13AE6B5A470E +Erich 01-05-15 P.O. Box 527, 4985 Luctus Street Ponte nelle Alpi Iran 1552F559-B952-06C7-5192-BD07E359AE35 +Dalton 06-18-16 576-7919 Ut St. Merzig Holy See (Vatican City State) 8583B5E6-2403-FD3E-C565-462B8FD7612F +Hasad 02-15-16 P.O. Box 208, 7841 Conubia Street Rothesay Marshall Islands 79B9F905-C923-552D-EDAD-1BA121782459 +Tate 06-18-15 P.O. Box 724, 3627 Magna. St. Iowa City Peru 6F0D2D02-10CD-B4E2-052D-96F7583D2BFE +Amos 05-05-15 644-6779 Nascetur Ave Brixton Tunisia 8684D7A8-5EAF-6437-E11F-627463B1F18A +Todd 01-19-15 7501 Metus. Street Galbiate Yemen 6EF8DEBF-367C-EDA3-0095-4CE84EEE0B5F +Magee 02-28-15 840-3378 Porttitor Avenue Rocky View Benin 0E78AEB3-5837-C394-0F74-521A5197D00C +Amal 12-10-14 P.O. Box 985, 561 Risus. Street Mirzapur-cum-Vindhyachal Congo, the Democratic Republic of the 24BF71D4-1656-A0AA-4297-B981FE305195 +Ahmed 09-05-15 P.O. Box 973, 9430 Neque. Rd. Oromocto Belgium 1F254A19-2447-39BD-DF00-CEDBC8D54356 +Jackson 01-02-16 P.O. Box 756, 8760 Ultricies Avenue Chartres Dominica CE19C68C-FCF8-D069-0B97-D4547CE34851 +Mannix 10-04-16 P.O. Box 381, 2207 Cum Rd. Hartford Korea, South 5B6F4C08-92DE-53CD-92BD-B0ACB55DB9AD +Adrian 08-14-15 P.O. Box 214, 2410 Amet Street Ipatinga Côte D'Ivoire (Ivory Coast) 70F29ED9-D666-B24B-2266-C9556148D161 +Flynn 08-10-16 P.O. Box 149, 5993 Mollis Road Siracusa Belarus FA5AE1AE-E808-1DBC-4C94-4532BBC7F71B +Armand 12-13-15 Ap #175-342 Vitae, Avenue Saint-Rhémy-en-Bosses Togo CCBA04A7-8D9A-0811-06E8-83167FDCB56A +Warren 01-07-15 130-3775 Massa. Road Brixton Papua New Guinea F294CBEE-CC10-8F2E-7C1F-82B2E9DD70AF +David 10-17-16 245-1747 Blandit Rd. Bastia Umbra Cocos (Keeling) Islands B6579554-4C36-6452-1495-9E01D652436C +Hu 09-11-16 453-2346 Ante Ave Whitehaven Bouvet Island 188370B5-9285-24B8-9E03-D5B4F9BCA3E2 +James 03-08-15 2669 Nam Av. Cambridge Guinea 71D87ECA-94CD-CBA7-A557-9CD119C8C752 +Dexter 02-26-16 653-3752 Nunc Street Hearst Austria 84429BD8-70A3-0A9D-5619-33F749C0858F +Theodore 09-09-16 Ap #645-9999 Nam Rd. Maidenhead Gabon 7F801674-E786-AB3A-A822-202776D33212 +Yasir 11-09-15 283-2518 Accumsan Road Kempten Heard Island and Mcdonald Islands 3D46A729-E760-CA01-4C90-32938AE5E952 +Marvin 04-24-16 P.O. Box 467, 2421 Gravida Rd. Siena Slovakia 0027CB01-3982-D9A8-C8D8-024F5DBAF0CC +Travis 04-20-16 Ap #669-4818 Nisl Rd. Mosciano Sant'Angelo Armenia EF3BB505-4054-E7DF-3212-B6BA09FB6FE2 +Cullen 02-14-15 P.O. Box 902, 5025 Aliquam Street Tintange Colombia E0242050-CDAF-1EEF-6BCC-CE1B1D4BEF7C +Griffin 03-28-15 Ap #990-3013 Aliquet. Rd. Wepion Brunei 5E282F96-ED09-D0EE-5B23-AB496871DDBC +Keegan 06-02-16 Ap #390-8084 Elementum Street Idaho Falls Nauru 0EEB2712-4DBC-CA61-5DC2-7D8E2519E831 +Gavin 03-31-15 P.O. Box 635, 4723 Hendrerit Rd. Torrevieja Macao 19D3F50A-951A-17B0-242F-1013E8EAC8F9 +Paki 12-17-15 P.O. Box 512, 277 Augue St. Horsham Cape Verde C1AB7BEF-7DCA-5A79-D4D0-42C70D212677 +Oleg 05-22-15 P.O. Box 398, 6647 Quis Rd. Eisden Ethiopia DA124388-152B-EB65-669A-34927AF30596 +Orlando 07-20-15 Ap #575-4637 Non St. Cerreto di Spoleto Solomon Islands CC8A6504-0489-A622-8AEA-CE2FF0CE001F +Xander 02-26-15 Ap #977-190 Eu Rd. Vespolate Guyana D98E0C02-55C1-C5A4-0723-D637099CA8CE +Ishmael 08-19-16 151-6314 Varius St. Sulzano Syria 8DBB274F-1417-6B03-7907-24FF5E2A1761 +Isaiah 09-27-15 Ap #584-7955 Ut Street H�villers Indonesia 8AE27E32-0759-EDAD-1AC2-F2664B4D2CA0 +Edward 09-26-15 155-5699 Lobortis, Street Sauveni�re Guinea 7DEC987B-CD15-2967-BB88-98A9DE869AC2 +Jason 12-24-14 Ap #394-4852 Lorem, Rd. Barchi Niger F8A268A9-70F9-8298-CADA-22E29CC973E9 +Colin 04-15-15 Ap #738-1831 Pretium Avenue Lafayette Tuvalu 99C2A67A-82FD-4FD2-B13D-41021A93CD34 +Ulric 07-13-15 335-3099 Cum St. Aix-en-Provence Mozambique 59844D4F-FB53-E903-67C4-7B0DCA451420 +Vance 11-08-15 Ap #805-4137 Nulla Road Ligney South Sudan CB3B9B77-12C0-1D8D-96AF-982CFBDC04D8 +Mason 06-06-15 Ap #750-6911 Aliquam St. Maisi�res Benin D5E21534-EF42-0C7C-5761-8D55A418F78C +Jesse 08-04-15 P.O. Box 371, 2374 Malesuada Ave Aschersleben Pitcairn Islands FFB87D4C-C25B-8B2A-C65D-0C0CF04ECD19 +Xenos 01-08-15 P.O. Box 302, 9020 Sed Avenue Ancaster Town Guam 5ACC0483-30D0-194F-8E0A-F2BB9CB7E41C +Dalton 04-10-15 Ap #987-4193 Suspendisse Street Bromyard United States E0DE1186-15BD-025A-425E-5A551CB66FCA +Maxwell 01-03-15 P.O. Box 297, 2759 Per Avenue Rae-Edzo Namibia 5E880371-EB39-D705-B6BA-B1C47A0FB20F +Josiah 12-29-15 481-4517 Justo. Rd. Vreren Ethiopia 6146E324-1713-031D-4A05-00DA9A6E0A72 +Dillon 01-15-15 903-2925 Sed Rd. Bath Solomon Islands B6784798-C745-6B8B-EFC3-DDB456766B3A +Lucas 04-07-16 Ap #212-4291 Non Ave Mount Isa Bermuda 4BF02F00-6543-E955-2CB3-147DB5ACC996 +Kane 10-27-15 Ap #855-8041 Aliquam Road Bloomington Isle of Man 7D5F7EF0-1DA1-2956-913E-9DD0232FE82B +Jermaine 02-08-16 6536 Sollicitudin Rd. Lens-Saint-Servais Laos 98480101-570D-3989-8607-DF037CE2C04D +Scott 05-11-16 982-7468 Aliquam Avenue Eckville Wallis and Futuna F9E86E1B-C940-93BC-F269-90120A50A828 +Ronan 07-02-15 P.O. Box 351, 6427 Sociis St. R�dermark Kenya 13E31F6C-A4BE-3B63-C208-0F9EDC33231C +Paul 09-17-16 4613 Tortor, Av. Riksingen Central African Republic 2830470E-9126-E1F0-EFE7-75E16F47E605 +Fulton 04-16-16 4351 Elit, Road Sint-Gillis Cape Verde 5B8782C1-12C1-0EE0-5229-5AB14D06BD57 +Lamar 05-18-16 9263 Mollis. Road Veerle Nepal 4ED58B8B-35D8-732C-C232-4228154A009A +Charles 12-27-14 Ap #239-2452 Nec Avenue Saskatoon New Caledonia E7C99399-87EA-F908-59E9-CCB1B40AF168 +Kaseem 09-28-16 Ap #958-9657 Cursus Road Sunset Point Ukraine 5BAA6A09-9E8C-8AEA-962D-B7371368DB8C +Baxter 09-14-15 P.O. Box 566, 4372 Feugiat Av. LaSalle Serbia 8190712E-A2AD-3CC9-89B4-2301F9570595 +Lionel 05-12-16 3005 Suspendisse St. Zuienkerke Mali 2CD8B4BB-6CD5-2D4C-9074-FBBF5462E471 +Quinn 12-20-15 P.O. Box 799, 2708 Augue Ave Chapadinha Mongolia 9BDB232A-24B6-4020-CF05-2195FCC7A683 +Channing 10-12-15 P.O. Box 263, 6647 Eleifend Road Ajaccio Botswana 88C7710E-4B0A-739A-CCFA-68656D352511 +Evan 10-12-15 877-3353 In St. Torella del Sannio Togo 936FDD4C-7489-285F-B391-28F15291FA15 +Deacon 01-01-15 P.O. Box 896, 2131 Mollis. Rd. San Pietro al Tanagro Niue D0489775-4C8B-B6A4-B13F-69F1EFE6A2BB +Hyatt 08-09-15 Ap #628-8427 Semper Street Northallerton Ireland 1645C905-04E6-3187-05FD-FF3EF3B1909C +Mason 03-08-15 1919 Rhoncus. Road La Matap�dia Latvia 948764BD-0D67-8193-7F71-DB8B75405BB8 +Aquila 07-16-16 Ap #367-5036 Lobortis Street Wasseiges Christmas Island 9D78ECF4-D785-16F6-1506-EFEC7A2E680C +Jesse 12-09-14 Ap #524-1274 Nec Rd. Elgin Faroe Islands 4A4F0E32-EFF6-B1C7-7FE6-8701C4849DAD +Norman 06-08-16 365-7493 Proin Ave Pitlochry Norfolk Island C4002F4B-703A-356B-3B52-EF349E11BBD2 +Dale 05-07-16 P.O. Box 149, 7946 Bibendum. St. Narbonne Cayman Islands DCAFA688-BDF2-DFC9-F545-B6191F3AABBA +Fletcher 10-08-16 Ap #984-4339 Id Avenue Appelterre-Eichem Nauru C870B22E-A1DC-A376-0589-63A6E97F4459 +Murphy 07-02-16 P.O. Box 736, 2911 Ut Rd. Dorval Pitcairn Islands D2F75F2B-2CC8-9BD3-2DF1-6F6C1537F228 +Carson 10-11-16 4270 Nulla Rd. Halen Israel A3EC0D50-A0C9-9625-28AD-B3933A81C5F1 +Brennan 12-11-14 P.O. Box 142, 9526 Ante, Avenue Cochin Bonaire, Sint Eustatius and Saba BB02EC4A-C57C-1F61-9298-45C7C3EB55B5 +Dennis 09-14-16 Ap #292-9945 Iaculis Street Santander Mayotte 93ACD6FF-E620-D8A4-985F-2DB67BE630B7 +Amir 10-10-15 P.O. Box 369, 979 Senectus Av. Wardin Armenia 79FF5F4E-03F8-7DAC-09B4-A8076E3F39A9 +Palmer 10-09-16 3086 Eu Road Sossano Cameroon 66ABAEF0-2A60-27C5-2B4D-6C1D08F0148F +Dorian 06-27-16 483-7380 Etiam Av. Zierikzee Ireland FCC92CC2-C59B-07A4-034D-7AC1F56FF893 +Donovan 10-19-16 P.O. Box 282, 1555 Molestie Avenue Kırıkhan Equatorial Guinea 6E1C773F-7579-01A6-2C2F-50CD28E99AC5 +Wesley 08-26-15 P.O. Box 557, 4171 Eget St. Banchory Jersey D889335F-815F-B91A-7C92-814CF8491944 +Damon 08-13-15 Ap #724-7527 Lobortis, Avenue Juneau Mauritius 65336375-864D-DA66-043D-C4461F3B3A21 +Cooper 08-25-16 832-3247 In Road Pike Creek Somalia 57CAFF15-A497-D20D-9D36-E3AE78C77F2B +Flynn 10-12-15 401 Congue, Street Rouvroy Paraguay 81FE1E24-7843-25EA-BE5B-C2598C4453BF +Declan 03-12-15 686-1101 Dignissim. Rd. Bad Oldesloe Trinidad and Tobago 124E4702-21AA-3617-D6EF-0A680BF287F9 +Ryder 10-21-16 1151 Eu Ave Orsara di Puglia Chad 6947FFF6-F8F2-637D-4DB2-EF746659E965 +Allen 06-30-15 Ap #756-3480 Accumsan Street Carnoustie Taiwan 5631AE3E-6E47-53BD-8891-817B4CC3512D +Charles 01-02-15 P.O. Box 940, 6735 Sed, Street Mandi Burewala Nauru 876E1717-ECCC-6359-47B5-97BA80A2B29C +Travis 10-07-15 P.O. Box 162, 8293 Duis St. Geesthacht Samoa BB3CEE82-1B41-F4B9-8045-08F1C9B7A17F +Beck 06-01-16 2021 Maecenas St. Hugli-Chinsurah Pakistan F7ABADF7-9EC5-F5C6-FF32-ADAE093ACA10 +Chadwick 02-24-15 286-4943 Sodales St. Stockport Mauritania C04926C6-A52C-B7EF-1569-F9A5B5EDD8B7 +Eric 03-22-16 Ap #443-2598 Malesuada Rd. Sutton Jersey 70152CA1-69C1-F88E-E19F-D0DFB191072C +Jarrod 02-28-16 P.O. Box 573, 5483 Mattis. Street Treglio Djibouti 4477A21E-68A0-BB81-C78B-009276AC2309 +Sebastian 08-10-16 P.O. Box 486, 5119 Dis Av. Weesp Singapore C4396AD3-9AA0-423B-A372-DE21B5AE757F +Robert 10-20-15 9597 Morbi Ave Haren Micronesia DAE70851-B015-A9FC-0222-57DF9EE41EDE +Garrison 01-29-16 112-727 Sed St. Pickering Dominican Republic FD8F4927-407A-F57C-A668-732631AEE69F +Dominic 10-22-16 P.O. Box 379, 6763 Neque St. Colwood Cocos (Keeling) Islands BAB8741F-A3FA-C1DF-77CE-4E05C483CA6C +Adrian 01-30-15 P.O. Box 993, 5994 Tempus, Av. Kelowna Korea, North 35627FC0-8C04-45EE-52C0-DA52EFA4331C +Cullen 01-15-15 Ap #119-8754 Parturient St. Mazy Haiti 008EE5DE-9370-1F99-9F53-3E27D088D1FD +Gray 05-02-16 P.O. Box 694, 9954 Posuere Av. Magdeburg Korea, North C2C7C509-8D31-FE4C-8B1F-D4798D03CC27 +Rogan 02-03-15 203 Diam St. Rimbey Trinidad and Tobago 775A58E6-3F69-DE34-2795-10A4FA610E59 +Plato 12-11-15 Ap #973-9650 Primis St. Colwood Tokelau E89C96FA-D021-A966-D8B7-4012C2B7D08A +Jarrod 12-21-14 741-959 Pede Av. Bad Vilbel Honduras 2833D3A2-A195-90CC-5344-DCD810C95ABD +Forrest 03-19-15 8901 Magna Avenue Esterzili United Kingdom (Great Britain) 75F9D959-8A54-E131-628A-13AE6B5A470E +Erich 01-05-15 P.O. Box 527, 4985 Luctus Street Ponte nelle Alpi Iran 1552F559-B952-06C7-5192-BD07E359AE35 +Dalton 06-18-16 576-7919 Ut St. Merzig Holy See (Vatican City State) 8583B5E6-2403-FD3E-C565-462B8FD7612F +Hasad 02-15-16 P.O. Box 208, 7841 Conubia Street Rothesay Marshall Islands 79B9F905-C923-552D-EDAD-1BA121782459 +Tate 06-18-15 P.O. Box 724, 3627 Magna. St. Iowa City Peru 6F0D2D02-10CD-B4E2-052D-96F7583D2BFE +Amos 05-05-15 644-6779 Nascetur Ave Brixton Tunisia 8684D7A8-5EAF-6437-E11F-627463B1F18A +Todd 01-19-15 7501 Metus. Street Galbiate Yemen 6EF8DEBF-367C-EDA3-0095-4CE84EEE0B5F +Magee 02-28-15 840-3378 Porttitor Avenue Rocky View Benin 0E78AEB3-5837-C394-0F74-521A5197D00C +Amal 12-10-14 P.O. Box 985, 561 Risus. Street Mirzapur-cum-Vindhyachal Congo, the Democratic Republic of the 24BF71D4-1656-A0AA-4297-B981FE305195 +Ahmed 09-05-15 P.O. Box 973, 9430 Neque. Rd. Oromocto Belgium 1F254A19-2447-39BD-DF00-CEDBC8D54356 +Jackson 01-02-16 P.O. Box 756, 8760 Ultricies Avenue Chartres Dominica CE19C68C-FCF8-D069-0B97-D4547CE34851 +Mannix 10-04-16 P.O. Box 381, 2207 Cum Rd. Hartford Korea, South 5B6F4C08-92DE-53CD-92BD-B0ACB55DB9AD +Adrian 08-14-15 P.O. Box 214, 2410 Amet Street Ipatinga Côte D'Ivoire (Ivory Coast) 70F29ED9-D666-B24B-2266-C9556148D161 +Flynn 08-10-16 P.O. Box 149, 5993 Mollis Road Siracusa Belarus FA5AE1AE-E808-1DBC-4C94-4532BBC7F71B +Armand 12-13-15 Ap #175-342 Vitae, Avenue Saint-Rhémy-en-Bosses Togo CCBA04A7-8D9A-0811-06E8-83167FDCB56A +Warren 01-07-15 130-3775 Massa. Road Brixton Papua New Guinea F294CBEE-CC10-8F2E-7C1F-82B2E9DD70AF +David 10-17-16 245-1747 Blandit Rd. Bastia Umbra Cocos (Keeling) Islands B6579554-4C36-6452-1495-9E01D652436C +Hu 09-11-16 453-2346 Ante Ave Whitehaven Bouvet Island 188370B5-9285-24B8-9E03-D5B4F9BCA3E2 +James 03-08-15 2669 Nam Av. Cambridge Guinea 71D87ECA-94CD-CBA7-A557-9CD119C8C752 +Dexter 02-26-16 653-3752 Nunc Street Hearst Austria 84429BD8-70A3-0A9D-5619-33F749C0858F +Theodore 09-09-16 Ap #645-9999 Nam Rd. Maidenhead Gabon 7F801674-E786-AB3A-A822-202776D33212 +Yasir 11-09-15 283-2518 Accumsan Road Kempten Heard Island and Mcdonald Islands 3D46A729-E760-CA01-4C90-32938AE5E952 +Marvin 04-24-16 P.O. Box 467, 2421 Gravida Rd. Siena Slovakia 0027CB01-3982-D9A8-C8D8-024F5DBAF0CC +Travis 04-20-16 Ap #669-4818 Nisl Rd. Mosciano Sant'Angelo Armenia EF3BB505-4054-E7DF-3212-B6BA09FB6FE2 +Cullen 02-14-15 P.O. Box 902, 5025 Aliquam Street Tintange Colombia E0242050-CDAF-1EEF-6BCC-CE1B1D4BEF7C +Griffin 03-28-15 Ap #990-3013 Aliquet. Rd. Wepion Brunei 5E282F96-ED09-D0EE-5B23-AB496871DDBC +Keegan 06-02-16 Ap #390-8084 Elementum Street Idaho Falls Nauru 0EEB2712-4DBC-CA61-5DC2-7D8E2519E831 +Gavin 03-31-15 P.O. Box 635, 4723 Hendrerit Rd. Torrevieja Macao 19D3F50A-951A-17B0-242F-1013E8EAC8F9 +Paki 12-17-15 P.O. Box 512, 277 Augue St. Horsham Cape Verde C1AB7BEF-7DCA-5A79-D4D0-42C70D212677 +Oleg 05-22-15 P.O. Box 398, 6647 Quis Rd. Eisden Ethiopia DA124388-152B-EB65-669A-34927AF30596 +Orlando 07-20-15 Ap #575-4637 Non St. Cerreto di Spoleto Solomon Islands CC8A6504-0489-A622-8AEA-CE2FF0CE001F +Xander 02-26-15 Ap #977-190 Eu Rd. Vespolate Guyana D98E0C02-55C1-C5A4-0723-D637099CA8CE +Ishmael 08-19-16 151-6314 Varius St. Sulzano Syria 8DBB274F-1417-6B03-7907-24FF5E2A1761 +Isaiah 09-27-15 Ap #584-7955 Ut Street H�villers Indonesia 8AE27E32-0759-EDAD-1AC2-F2664B4D2CA0 diff --git a/node_modules/csvtojson/test/data/dataWithAutoDelimiter b/node_modules/csvtojson/test/data/dataWithAutoDelimiter new file mode 100644 index 0000000..7b47fbb --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithAutoDelimiter @@ -0,0 +1,5 @@ +col1:col2:col3:col4:col5:col6:col7:col8:col9:col10 +"Mini. Sectt:hisar S.O":125001:S.O:Non-Delivery:Hissar:Ambala HQ:Haryana:Hisar:Hisar:HARYANA +#Mini. Sectt:hisar S.O#:125001:S.O:Non-Delivery:Hissar:Ambala HQ:Haryana:Hisar:Hisar:HARYANA +#Mini. Sectt:hisar S.O#:125001:S.O:Non-Delivery:Hissar:Ambala HQ:Haryana:Hisar:Hisar:HARYANA +#Mini. Sectt:hisar S.O#:#125001:fenvkdsf#:S.O:Non-Delivery:Hissar:Ambala HQ:Haryana:Hisar:Hisar:HARYANA \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataWithComma b/node_modules/csvtojson/test/data/dataWithComma new file mode 100644 index 0000000..b905672 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithComma @@ -0,0 +1,5 @@ +col1,col2,col3,col4,col5,col6,col7,col8,col9,col10 +"Mini. Sectt,hisar S.O",125001,S.O,Non-Delivery,Hissar,Ambala HQ,Haryana,Hisar,Hisar,HARYANA +#Mini. Sectt,hisar S.O#,125001,S.O,Non-Delivery,Hissar,Ambala HQ,Haryana,Hisar,Hisar,HARYANA +#Mini. Sectt,hisar S.O#,125001,S.O,Non-Delivery,Hissar,Ambala HQ,Haryana,Hisar,Hisar,HARYANA +#Mini. Sectt,hisar S.O#,#125001,fenvkdsf#,S.O,Non-Delivery,Hissar,Ambala HQ,Haryana,Hisar,Hisar,HARYANA \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataWithEmptyString b/node_modules/csvtojson/test/data/dataWithEmptyString new file mode 100644 index 0000000..6f01ca5 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithEmptyString @@ -0,0 +1 @@ +green,40, "" diff --git a/node_modules/csvtojson/test/data/dataWithLongRow b/node_modules/csvtojson/test/data/dataWithLongRow new file mode 100644 index 0000000..b72ec5e --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithLongRow @@ -0,0 +1,2 @@ +fieldA.title, fieldA.children[0].name, fieldA.children[0].id,fieldA.children[1].name, fieldA.children[1].employee[].name,fieldA.children[1].employee[].name, fieldA.address[],fieldA.address[], description +Food Factory, Oscar, 0023, Tikka, Tim, Joe, 3 Lame Road, Grantstown, AAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factoryAA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factoryA fresh new food factory fresh new food factory diff --git a/node_modules/csvtojson/test/data/dataWithMismatchedColumn b/node_modules/csvtojson/test/data/dataWithMismatchedColumn new file mode 100644 index 0000000..4d2ebb2 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithMismatchedColumn @@ -0,0 +1,5 @@ +fieldA.title, fieldA.children[0].name, fieldA.children[0].id,fieldA.children[1].name, fieldA.children[1].employee[].name,fieldA.children[1].employee[].name, fieldA.address[],fieldA.address[], description +Food Factory, Oscar, 0023, Tikka, Tim, Joe, 3 Lame Road, Grantstown, A fresh new food factory +Kindom Garden, Ceil, 54, Pillow, Amst, Tom, 24 Shaker Street, HelloTown, Awesome castle +Kindom Garden, Ceil, +Kindom Garden, Ceil, 54, Pillow, Amst, Tom, 24 Shaker Street, HelloTown, Awesome castle \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataWithMultipleLineRow b/node_modules/csvtojson/test/data/dataWithMultipleLineRow new file mode 100644 index 0000000..1e21b16 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithMultipleLineRow @@ -0,0 +1,4 @@ +aa,bb +ss,"12345 +6789,abcde"" +ddee" diff --git a/node_modules/csvtojson/test/data/dataWithPipeAsDelimiter b/node_modules/csvtojson/test/data/dataWithPipeAsDelimiter new file mode 100644 index 0000000..a3a782c --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithPipeAsDelimiter @@ -0,0 +1,3 @@ +date|*json*employee.name|*json*employee.age|*json*employee.number|*array*address|*array*address|*jsonarray*employee.key|*jsonarray*employee.key|*omit*id +2012-02-12|Eric|31|51234|Dunno Street|Kilkeny Road|key1|key2|2 +2012-03-06|Ted|28|51289|O FUTEBOL.¿|Tormore|key3|key4|4 diff --git a/node_modules/csvtojson/test/data/dataWithQoutes b/node_modules/csvtojson/test/data/dataWithQoutes new file mode 100644 index 0000000..fd7d1c9 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithQoutes @@ -0,0 +1,8 @@ +TIMESTAMP,UPDATE,UID,BYTES SENT,BYTES RCVED +"13954264""22","n",""10028"",""1213"",""5461"" +"abc, def, ccc", n,10013,9954,13560 +1395426422,n,10013,9954,13560 +1395426422,n,10109,221391500,141836 +1395426422,n,10007,53448,308549 +1395426422,n,10022,15506,72125 + diff --git a/node_modules/csvtojson/test/data/dataWithSlashEscape b/node_modules/csvtojson/test/data/dataWithSlashEscape new file mode 100644 index 0000000..fa6bc6b --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithSlashEscape @@ -0,0 +1,2 @@ +id,raw +0,"{\"hello\":\"world\",\"test\":true}" \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataWithSlashEscapeAndDelimiterBetweenQuotes b/node_modules/csvtojson/test/data/dataWithSlashEscapeAndDelimiterBetweenQuotes new file mode 100644 index 0000000..21f9f1d --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithSlashEscapeAndDelimiterBetweenQuotes @@ -0,0 +1,2 @@ +id,raw +0,"\"hello,\"world\"" \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataWithTabAsDelimiter b/node_modules/csvtojson/test/data/dataWithTabAsDelimiter new file mode 100644 index 0000000..ae5f986 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithTabAsDelimiter @@ -0,0 +1,3 @@ +date *json*employee.name *json*employee.age *json*employee.number *array*address *array*address *jsonarray*employee.key *jsonarray*employee.key *omit*id +2012-02-12 Eric 31 51234 Dunno Street Kilkeny Road key1 key2 2 +2012-03-06 Ted 28 51289 O FUTEBOL.¿ Tormore key3 key4 4 diff --git a/node_modules/csvtojson/test/data/dataWithTripleQoutes b/node_modules/csvtojson/test/data/dataWithTripleQoutes new file mode 100644 index 0000000..3f21edb --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithTripleQoutes @@ -0,0 +1,5 @@ +Year,Make,Model,Description,Price +1997,Ford,E350,"ac, abs, moon",3000.00 +1999,Chevy,"Venture ""Extended Edition""","",4900.00 +1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00 +1996,Jeep,Grand Cherokee,"MUST SELL!air, moon roof, loaded",4799.00 \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/dataWithType b/node_modules/csvtojson/test/data/dataWithType new file mode 100644 index 0000000..241fb44 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithType @@ -0,0 +1,2 @@ +column1,user.name,column2,column3, colume4, column5, column6 , column7, column8, column9,column10.0,column10.1,name#!,column11 +1234,hello world,a1234,2012-01-01,someinvaliddate, {"hello":"world"}, {"hello":"world"}, 1234,abcd, true,23,31,false,[{"hello":"world"}] diff --git a/node_modules/csvtojson/test/data/dataWithUnclosedQuotes b/node_modules/csvtojson/test/data/dataWithUnclosedQuotes new file mode 100644 index 0000000..8e3f0c6 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithUnclosedQuotes @@ -0,0 +1,8 @@ +TIMESTAMP,UPDATE,UID,BYTES SENT,BYTES RCVED +"13954264""22","n,""10028"",""1213"",""5461"" +"abc, +def, ccc", n,10013,9954,13560 +1395426422,n,10013,9954,13560 +1395426422,n,10109,221391500,141836 +1395426422,n,10007,53448,308549 +"1395426422,n,10022,15506,72125 diff --git a/node_modules/csvtojson/test/data/dataWithWhiteSpace b/node_modules/csvtojson/test/data/dataWithWhiteSpace new file mode 100644 index 0000000..358dca7 --- /dev/null +++ b/node_modules/csvtojson/test/data/dataWithWhiteSpace @@ -0,0 +1,2 @@ +"Column 1" , "Column 2", "Column 3" ,"Email" +Column1Row1,Column2Row1,Column3Row1,Row1@example.com \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/emptyFile b/node_modules/csvtojson/test/data/emptyFile new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/csvtojson/test/data/invalidHeader b/node_modules/csvtojson/test/data/invalidHeader new file mode 100644 index 0000000..a353646 --- /dev/null +++ b/node_modules/csvtojson/test/data/invalidHeader @@ -0,0 +1,6 @@ +header1,header1.filed1,header1.file2,header2,header2.field1.0,header2.field1.1,header2.filed2 +5OlFPc,q7,ejpJdw,DIgNVqB7h9jI,f8ayrzv,undefinedzvTY3Qd3pSkKOk,S7cVvW7m50t9U +0TaUGQVPqPkOr,lT,GA,UPUuORnuaDjXdl,V6G4QFddmPH8b,65NxWPl,Lclhl0fy +,ex4,1gjT4YPJ,QtJ8S5TQ,M4zO4OppCAR4,Pg7VipESqZmHwY5,mPzz +FEEa,,B1B,U9,kjxHGy,McW,6FWKBP0JoCiWn +0,,Fj0o9IPB,jwFuChbeqZdVVR,hGqs3Ps7dMEo6,Zundefined00Xqvw,hT7lN6iVUHDx diff --git a/node_modules/csvtojson/test/data/large-csv-sample.csv b/node_modules/csvtojson/test/data/large-csv-sample.csv new file mode 100644 index 0000000..55eece5 --- /dev/null +++ b/node_modules/csvtojson/test/data/large-csv-sample.csv @@ -0,0 +1,5291 @@ +ID,Number +0157181,8002 +0157741,6523 +0158106,11339 +0158685,1246589927 +0159044,10240 +0159470,6320 +0161143,1246588356 +0161144,1246589434 +0162198,9277 +0163115,1246589222 +0164058,6387 +0164113,9740 +0164594,6400 +0164595,7069 +0164610,10274 +0165440,8355 +0165487,7476 +0165558,7370 +0165595,5385 +0165708,6792 +0166697,662 +0168640,7339 +0169031,6793 +0169034,6901 +0169675,5417 +0170304,1246588372 +0171512,9833 +0172140,10304 +0172289,1246589196 +0172290,29 +0172385,6518 +0172720,7916 +0172721,9667 +0173283,6728 +0174026,10321 +0174395,10328 +0175160,7056 +0175226,1246589672 +0175599,90 +0175857,6999 +0175921,1659 +0175922,10419 +0176047,1246589629 +0176305,10336 +017631,7492 +0176603,1246588044 +0177068,10454 +0178263,4238 +0178317,2026 +0178721,10884 +0178880,10291 +0179073,9362 +0179344,9371 +0179421,10531 +0179477,7247 +0179784,10446 +0179921,7271 +0181559,8301 +0000004,9920 +00000042,7567 +00000048,7698 +0000009,1246589130 +0000022,8207 +0000025,9928 +0000028,6778 +0000030,7921 +0000033,9726 +0000036,9931 +0000037,28 +0000038,9932 +0000040,7653 +0000046,2082 +0000049,5267 +0000054,4574 +0000070,6994 +0000086,1246589135 +0000089,1995 +0000235,2087 +0000778,10107 +000090,11063 +0000910,8848 +0001175,7202 +0001192,2032 +0001193,7505 +0001199,3119 +0001201,3168 +0001210,2126 +0001211,9953 +0001216,9955 +0001222,9959 +0001232,4569 +0001247,10077 +0001250,7483 +0001251,1246588777 +0001253,9969 +0001257,9971 +0001259,3897 +0001272,55 +0001277,5039 +0001288,6986 +0001290,9979 +0001297,2590 +0001300,10036 +0001310,9990 +0001314,1246586920 +0001320,7481 +0001322,9995 +0001323,3097 +0001325,10076 +0001326,7348 +0001328,9997 +0001329,7313 +0001333,7489 +0001339,8174 +0001343,774 +0001351,7662 +0001370,7910 +0001372,7739 +0001373,3153 +0001377,10016 +0001380,10017 +0001381,10018 +0001382,7318 +0001383,87 +0001393,7817 +0001394,7345 +0001397,93 +0001398,10025 +0001400,2356 +0001402,4157 +0001403,4750 +0001404,7943 +0001408,10029 +0001410,4237 +0001411,1721 +0001425,1246590167 +0001428,10039 +0001431,9771 +0001433,8001 +0001480,7649 +0001580,7171 +0001588,8051 +0001748,7541 +0002338,1246589514 +0002462,3266 +0002802,1246589463 +0003252,10011 +0003288,3581 +0004078,8985 +0004288,3229 +0004354,6785 +0004639,3166 +0004696,7667 +0005353,10174 +0005571,7812 +0005975,1246585847 +0008079,6212 +0008635,9830 +0008748,8189 +0008785,9949 +0008861,1246589691 +0008874,8191 +0009404,8598 +0009530,9772 +0010344,7637 +0010974,7703 +0011169,9832 +0011187,4628 +0012259,9882 +0012463,7797 +0012486,7203 +001285,8216 +0012995,2483 +001405,1246590174 +0014411,8341 +0014450,8979 +0014628,6159 +0015392,1246588600 +0015397,9885 +0015408,7588 +0017053,7479 +0017952,7868 +0018594,6826 +0020280,1246589529 +0021597,7469 +0022928,7837 +0024571,59 +0024632,101 +0024640,7707 +0024832,8105 +0025206,7627 +0025391,2030 +0025666,10225 +0026120,3164 +0026452,4568 +0026501,1704 +0026711,7961 +0026803,7668 +0028100,6974 +0030309,9944 +0034584,1246586917 +0037075,10021 +0037156,1246589617 +0037872,3185 +0040096,49 +0040300,3318 +00410329,6688 +0045356,5413 +0045938,2088 +0048536,9988 +0048605,7655 +0048821,9941 +0051423,7847 +0056880,11045 +0058672,7568 +0058772,8192 +0059348,7529 +0062578,868 +0063313,7740 +0063567,6096 +0067208,9825 +0068308,1246588716 +0068892,5278 +0069272,9974 +0069422,7829 +0069441,8977 +0069466,7572 +0070129,135 +0070827,9994 +0070990,9769 +0071225,9749 +0078774,7702 +0078790,3280 +0080303,8057 +0086049,10042 +0087027,10867 +0087203,8011 +0088852,10750 +0090077,6329 +0090299,4239 +0090860,6736 +0091969,3893 +0092244,6995 +0092425,1246589528 +0092592,7465 +0094320,10955 +0094809,6207 +0096907,1246589612 +0097388,6735 +0097827,99 +0098695,9002 +0098758,7537 +0099508,1246589540 +0099910,8177 +0101045,1094 +0103122,7709 +0103355,83 +0105061,7530 +0105179,5305 +0106867,4582 +0110092,7335 +0111439,1246588816 +0111484,7639 +0111714,3879 +01135,7341 +0116396,10904 +0119897,5062 +0122935,5404 +0123242,9896 +0123456,1246588884 +0129025,780 +0132760,4573 +0134573,9908 +0141701,7070 +0142181,10156 +0142517,1246589394 +0142565,7495 +0142588,6372 +0142733,9415 +0142745,5847 +0142842,9208 +0143022,8132 +0143023,10361 +0143077,6361 +0143093,1246589105 +0143489,6907 +0143491,1246589051 +0143503,4853 +0143536,6430 +0143708,1246589098 +0144290,1246588421 +0144309,6364 +0144353,9554 +0144558,4846 +0144570,7858 +0144941,7728 +0144946,6589 +0145039,7103 +0145104,8469 +0145343,1246589083 +0145460,9266 +0145849,11233 +0146090,8783 +0146196,1246589069 +0146358,9070 +0146617,7117 +0146618,10360 +0146715,9269 +0146934,4777 +0146961,7493 +0147011,7290 +0147122,10264 +0147198,1246589853 +0147286,1246589092 +0147640,4867 +0147835,5645 +0147837,10230 +0147838,1246589176 +0148212,1246588649 +0148294,6375 +0148369,10259 +0149046,10294 +0149101,10041 +0149350,7694 +0149516,1246589384 +0149527,11065 +0149529,10733 +0150602,7865 +0150675,6865 +0150911,144 +0150920,8015 +0150962,8049 +0151001,7958 +0151140,1246589688 +0151775,7532 +0153283,4576 +0153668,3935 +0153671,11206 +0154551,9877 +0156946,9122 +0181560,10378 +0181659,6918 +0182503,10788 +0186475,1246588773 +0186476,10739 +0186530,6593 +0194315,7670 +0206219,7800 +0212449,10402 +0219479,1246588444 +0219482,8793 +0219548,4703 +0219550,7135 +0219655,10559 +0219810,6353 +0219826,8307 +0219887,8786 +0220605,1221 +0221248,392 +0221494,8903 +0221961,7081 +0222416,9206 +0222417,1246589339 +0222419,7738 +0222506,140 +0222524,10130 +0222759,1246588652 +0223058,9461 +0223059,1246589112 +0223337,7587 +0223568,6781 +0224454,8537 +0224564,6678 +0224987,7393 +0225187,7666 +0225604,3886 +0225778,1246589070 +0226196,3118 +0226587,3885 +0226597,2007 +0227566,10747 +0227831,7749 +0229119,778 +0229613,6625 +0231951,7811 +0233835,10212 +0234475,7874 +0234527,2486 +0234810,10517 +0235437,8173 +0235791,4773 +0235792,5812 +0235818,6841 +0236450,7523 +0236451,7462 +0236452,10568 +0236453,1246589423 +0239251,6566 +0240518,9096 +0243731,7705 +0243734,1246589197 +0243738,6499 +0243739,10775 +0243799,10737 +0246093,1246588997 +0247790,1987 +0247981,1246589208 +0249433,9898 +0249722,7711 +0249769,7843 +0249799,6083 +0249802,9853 +0253391,10712 +0256876,775 +0257464,2153 +0258304,8340 +0258406,76 +0260321,1246590175 +0261866,7562 +0262288,7715 +0262507,7769 +0263630,11095 +0263846,9042 +0263887,150 +0264116,7937 +0264256,6160 +0264561,36 +0264799,8284 +0265236,10199 +0265390,9789 +0266438,7209 +0267386,8468 +0267494,5639 +0267516,7970 +0270429,1246588050 +0271963,4240 +0271965,10925 +0272103,1254 +0272914,41 +0273285,5592 +0273458,1246589076 +0273546,10544 +0273631,1246590114 +0275117,10584 +0282588,9998 +0282593,477 +0283902,6288 +0284062,7654 +0284222,6484 +0284540,1986 +0284696,6318 +0285207,9850 +0285611,4817 +0285756,1246589118 +0285788,10885 +0285794,9207 +0285915,1999 +0286026,2029 +0287047,6473 +0287898,7480 +0288025,4836 +0288391,8316 +0288405,1246589288 +0288499,7600 +0288932,10191 +0289130,1246588700 +0290252,9222 +0291060,7880 +0291310,776 +0292547,1246589507 +0292683,4024 +0294078,7791 +0295361,2597 +0295736,7331 +0295738,7539 +0297619,663 +0297947,11194 +0297949,1246589590 +0298365,6989 +0298611,10095 +0299464,9899 +0299886,6604 +0300659,767 +0302393,9884 +0302533,1246590285 +0303205,7052 +0303277,10359 +0303724,8953 +0303902,7737 +0304078,10510 +0304157,7657 +0304178,7310 +0304194,7358 +0304408,6847 +0304890,11166 +0306562,1246589391 +0306563,10741 +0307021,7835 +0307290,9721 +0307461,6208 +0308427,7642 +0308817,7918 +0308887,6439 +0309197,1641 +0309426,1246589994 +0309670,1246588813 +0310085,4831 +0310267,9887 +0310352,7882 +0310580,5808 +0310663,1246588374 +0311294,10792 +0311886,7827 +0311911,7558 +0312418,4651 +0312740,4649 +0312880,4397 +0312899,8012 +0312997,9831 +0313214,7774 +0313260,7914 +0313428,7586 +0313543,7795 +0314881,7954 +0315469,7962 +0315471,10475 +0315472,9263 +0315658,1246588780 +0315809,4783 +0315857,10922 +0318229,6860 +0318584,7664 +0318602,7388 +0318693,9905 +0318928,11090 +0320286,1246589941 +0321717,1246590368 +0321870,7912 +0321984,5851 +0322201,10869 +0322564,6797 +0322868,4761 +0323011,7474 +0323025,7836 +0323518,4676 +0323612,9036 +0323670,7710 +0323989,10932 +0324177,6135 +0324748,9782 +03250301,9157 +0326363,6752 +0326462,7496 +0326520,6187 +0326563,7356 +0327753,7367 +0328600,6977 +0328773,1246589676 +0328882,6313 +0328965,7549 +0329054,5604 +0329733,6521 +0329980,7674 +0329986,5881 +0330421,9736 +0330574,5744 +0330630,7771 +0330972,3218 +0331756,5965 +0331885,4197 +0332232,8166 +0332455,7878 +0332604,7806 +0332607,8133 +0332610,7798 +0332966,7807 +0332968,3411 +0333038,6771 +0333339,5655 +0334111,5957 +0334155,6996 +0334222,1246588800 +0334626,5999 +0334641,7992 +0334956,7526 +0335220,7328 +0335354,4712 +0336297,4354 +0336522,3303 +0337149,4341 +0337472,4666 +0337772,7852 +0337831,1246589489 +0337948,3314 +0338145,8044 +0338152,8063 +0338247,7820 +0338385,6180 +0338386,7638 +0338439,4306 +0338476,8129 +0338642,7960 +0338756,7928 +0338774,4760 +0338780,7885 +0339192,7923 +0339246,7325 +0339376,5601 +0339392,9660 +0339941,7862 +0340242,7777 +0340277,7652 +0340292,7503 +0340300,7782 +0340398,7770 +0340414,6834 +0340431,7336 +0340438,7671 +0340533,1246590373 +0340734,7003 +0340740,7004 +0340950,7533 +0341100,7968 +0341124,5469 +0341248,7816 +0341957,5353 +0342085,8095 +0342266,8955 +0342304,7635 +0342613,4788 +0343070,6767 +0343558,4842 +0343600,7839 +0343821,5210 +0344025,4787 +0344040,7993 +0344054,4723 +0344161,6305 +0344208,1246588695 +0344231,7746 +0344245,7487 +0344565,7814 +0344674,8188 +0344768,7804 +0344784,5786 +0344901,7498 +0344950,6538 +0345411,3920 +0345483,5259 +0345553,7754 +0345571,6109 +0345662,7902 +0345787,1246589517 +0345822,5015 +0346290,7499 +0346292,6414 +0346533,4881 +0348895,5886 +0348982,7550 +0349142,4667 +0349311,7582 +0349402,7849 +0349502,7634 +0349516,7641 +0349899,7949 +0350028,7904 +0350328,8043 +0350428,10865 +0350489,5789 +0350734,10154 +0350925,7504 +0351128,6757 +0351381,4821 +0351422,5648 +0351631,6800 +0351668,9055 +0351745,6633 +0351747,1246588154 +0351784,4816 +0351840,9804 +0351863,6386 +0352084,8038 +0352203,7557 +0352693,7927 +0352801,1246588724 +0353013,4713 +0353025,7824 +0353057,7846 +0353497,7911 +0353528,4877 +0353536,8106 +0353845,4872 +0353863,7786 +0354031,7873 +0354036,4858 +0354153,9761 +0354406,5234 +0354455,1246589506 +0354511,5241 +0354643,4657 +0354839,7352 +0354949,10183 +0355226,7792 +0355228,6677 +0355358,7945 +0355381,4744 +0355394,5451 +0355562,7860 +0355563,7788 +0355602,8983 +0355618,7350 +0355767,4174 +0355792,5779 +0355863,9880 +0355946,9132 +0355949,7905 +0356189,7311 +0356243,6776 +0356466,7741 +0356742,11175 +0356774,6647 +0356869,7908 +0357035,7944 +0357194,9466 +0357279,8948 +0357375,7805 +0357499,4844 +0357558,9107 +0357565,8037 +0357570,7870 +0357707,7875 +0357712,9398 +0357877,7689 +0357924,4745 +0358034,5008 +0358038,6978 +0358117,4808 +0358131,7243 +0358145,4740 +0358167,4695 +0358176,7764 +0358182,5004 +0358201,7834 +0358208,4798 +0358212,7830 +0358228,7934 +0358248,8833 +0358364,7809 +0358368,7545 +0358377,7440 +0358564,6717 +0358584,5843 +0358586,7621 +0358713,4811 +0358786,4779 +0358864,8134 +0359125,7636 +0359154,4826 +0359287,7889 +0359568,7473 +0359670,4849 +0359691,4880 +0359693,4711 +0359694,7826 +0359711,7864 +0359776,6076 +0359779,7819 +0359946,5200 +0359960,6822 +0360011,5890 +0360162,5923 +0360280,7953 +0360568,7421 +0360669,7658 +0360712,4741 +0360929,8169 +0361005,9390 +0361046,7984 +0361191,7776 +0361249,7915 +0361329,10333 +0361335,6537 +0361519,7432 +0361649,8167 +0361700,4176 +0361745,5215 +0361770,7845 +0361867,5980 +0361935,4458 +0361936,4658 +0361956,7831 +0361965,7879 +0361977,5963 +0362438,7956 +0362478,1246589166 +0366488,4818 +0366526,4545 +0366564,6449 +0366753,5769 +0366770,6704 +0366779,4672 +0366819,5191 +0366839,7607 +0366869,5701 +0367249,7971 +0367411,5799 +0367501,8087 +0367717,7887 +0367726,7673 +0367770,4876 +0367783,7810 +0367797,7907 +0367864,4552 +0367919,5213 +0367931,4555 +0368114,5845 +0368276,5941 +0368329,7609 +0368369,6813 +0368574,7574 +0368897,7783 +0369270,4690 +0369285,7801 +0369332,5775 +0369342,7695 +0369353,7890 +0369416,6511 +0369451,4700 +0369472,6661 +0369473,7947 +0369479,7899 +0369540,5935 +0369558,8949 +0369584,8077 +0369594,5997 +0369633,6026 +0369639,4807 +0369708,4786 +0369781,5977 +0369824,9568 +0369884,7997 +0370075,7808 +0370110,5790 +0370159,5017 +0370272,5933 +0370279,6070 +0370303,7109 +0370308,6101 +0370330,6084 +0370499,7153 +0370536,7744 +0370541,6846 +0370542,7008 +0370611,7765 +0370612,6941 +0370661,6660 +0370734,7082 +0370750,8010 +0370838,7704 +0370969,5892 +0371112,6060 +0371128,6905 +0371133,9561 +0371185,5855 +0371202,6976 +0371206,4827 +0371222,5938 +0371358,1246589789 +0371375,6046 +0371387,5805 +0371410,5212 +0371457,6012 +0371524,5955 +0371575,7900 +0371602,7554 +0371662,7611 +0371710,4675 +0371826,4847 +0371829,7536 +0371858,7946 +0371916,5981 +0372020,6429 +0372079,7756 +0372124,6684 +0372125,8091 +0372158,7772 +0372162,7828 +0372176,5781 +0372225,7089 +0372242,5688 +0372280,5820 +0372281,7455 +0372314,7861 +0372392,7303 +0372451,7524 +0372547,7939 +0372548,8107 +0372633,6019 +0372654,4814 +0372683,7886 +0372755,7840 +0372777,7361 +0372784,5995 +0372801,5618 +0372814,6024 +0372853,5803 +0372868,7552 +0372877,7138 +0372924,7936 +0372939,7917 +0372945,6681 +0372974,6953 +0373019,5912 +0373069,7071 +0373079,5642 +0373083,5982 +0373129,6772 +0373256,6588 +0373298,7853 +0373302,6334 +0373339,5010 +0373352,9838 +0373447,7502 +0373465,7564 +0373496,6418 +0373499,7632 +0373546,4663 +0373597,7838 +0373602,5726 +0373666,7565 +0373677,5668 +0373713,8056 +0373760,5322 +0373776,6605 +0373798,4739 +0373837,7266 +0373865,1246590318 +0373869,5678 +0373878,4698 +0373952,7392 +0373958,4749 +0373964,7583 +0374023,7497 +0374059,7573 +0374082,7713 +0374102,5871 +0374162,7821 +0374194,7232 +0374203,4624 +0374205,5301 +0374239,4623 +0374391,6178 +0374440,7515 +0374698,6992 +0374730,5983 +0374742,6014 +0374779,5972 +0374792,5244 +0374837,5314 +0481055,10365 +0481063,10375 +0481068,10380 +0481071,10450 +0481078,10513 +0481093,10227 +0481098,9906 +0481112,10233 +0481133,10279 +0481142,10462 +0481149,10290 +0481157,10441 +0481159,10298 +0481168,1246588258 +0481189,10342 +0481190,10349 +0481191,10236 +0481207,10410 +0481209,9841 +0481212,10265 +0481219,10773 +0481239,10536 +0481240,10826 +0481252,10411 +0481292,1246588281 +0481323,10500 +0481327,10326 +0481337,10293 +0481344,10434 +0481360,9242 +0481403,10447 +0481440,10426 +0481450,9802 +0481471,10453 +0481480,10386 +0481482,10282 +0481488,10827 +0481489,10400 +0481506,1246587872 +0481539,10271 +0481552,9744 +0481563,10137 +0481580,9651 +0481595,9855 +0481597,9655 +0481610,9814 +0481615,9834 +0481616,9806 +0481622,9867 +0481623,10873 +0481642,10543 +0481644,10395 +0481674,10504 +0481678,10723 +0481689,10520 +0481692,10555 +0481720,11221 +0481723,9784 +0481757,9658 +0481772,10414 +0481776,10348 +0481781,10355 +0481783,10535 +0481788,10339 +0481796,10292 +0481801,10496 +0481805,10340 +0481823,10244 +0481888,10757 +0481893,10377 +0481923,1246588142 +0481944,10358 +0481956,10556 +0481993,11246 +0482043,10473 +0482099,10162 +0482102,11199 +0482175,1246588842 +0482177,9760 +0482287,10281 +0482311,10428 +0482322,10408 +0482327,9775 +0482328,10280 +0482329,10503 +0482338,1246588069 +0482361,10404 +0482363,10552 +0482364,10297 +0482386,1246589446 +0482409,10549 +0482414,10831 +0482418,10427 +0482440,1246589621 +0482443,10759 +0482448,1246588349 +0482454,10113 +0482456,1246589781 +0482457,10519 +0482481,10758 +0482512,10422 +0482513,11289 +0482586,10529 +0482694,10296 +0482731,9851 +0482737,10522 +0482754,10541 +0482764,10320 +0482779,10420 +0482794,10791 +0482799,9799 +0482800,9881 +0482802,10553 +0482805,10033 +0482846,10724 +0482875,10309 +0482876,10308 +0482882,10562 +0482883,10392 +0482884,10514 +0482887,9836 +0482890,10779 +0482892,10055 +0482899,11019 +0482922,9890 +0482924,1246588388 +0482941,10393 +0482945,10774 +0482959,1246588715 +0482968,10611 +0482983,9860 +0482985,10493 +0482991,10270 +0482995,10540 +0483038,10539 +0483046,10470 +0483070,10736 +0483072,10780 +0483095,10564 +0483099,10383 +0483123,10257 +0483127,1246588130 +0483148,10839 +0483149,10315 +0483193,9894 +0483201,9897 +0483247,1246589526 +0483292,10313 +0483298,10725 +0483310,1246589811 +0483313,10346 +0483354,10764 +0483379,10840 +0483392,1246588068 +0483426,10357 +0483429,10261 +0483433,1246588085 +0483459,10222 +0483469,10505 +0483482,10416 +0483483,10399 +0483550,9907 +0483555,10727 +0483563,10790 +0483583,10828 +0483586,1246589440 +0483618,1246588111 +0483718,10516 +0483776,10558 +0483810,10567 +0483817,10461 +0483818,10262 +0483819,10305 +0483843,10467 +0483844,1246589397 +0483846,10772 +0483873,9917 +0483901,10263 +0484011,10310 +0484015,10518 +0484027,10239 +0484028,10344 +0484043,10152 +0484048,1246588105 +0484140,10067 +0484148,10468 +0484155,10135 +0484160,10269 +0484171,10301 +0484173,11212 +0484226,10268 +0484239,10258 +0484243,10316 +0484251,1246588141 +0484286,1246589289 +0484299,10387 +0484327,10155 +0484350,10153 +0484367,10388 +0484372,1246589442 +0484373,10413 +0484393,10351 +0484407,10132 +0484410,10766 +0484412,10995 +0485904,1246588362 +0485918,10149 +0485925,1246588072 +0485927,10561 +0485969,10587 +0485971,10275 +0485980,10300 +0485991,10253 +0486005,10133 +0486013,10412 +0486019,10528 +0486026,1246588633 +0486045,10369 +0486046,10286 +0486047,10532 +0486056,10403 +0486062,10487 +0486122,1246588389 +0486146,10551 +0486184,10323 +0486194,10554 +0486221,1246589132 +0486226,10722 +0486266,10721 +0486281,1246588137 +0486300,1246588353 +0486303,10056 +0486322,10234 +0486331,1246588143 +0486343,10719 +0486358,10147 +0486360,10530 +0486365,10439 +0486371,10384 +0486432,10247 +0486446,1246588402 +0486461,10415 +0486485,10488 +0486548,10266 +0486555,10527 +0486562,10537 +0486581,10755 +0486589,10431 +0486592,10816 +0486643,10444 +0486697,10381 +0486698,10566 +0486700,10440 +0486709,10159 +0486779,10732 +0486819,10718 +0486830,10334 +0486847,10738 +0486860,10391 +0486862,10078 +0486996,1246588460 +0487026,1246588343 +0487043,10735 +0487062,10188 +0487068,10356 +0487099,10565 +0487110,10485 +0487131,10499 +0487149,10350 +0487155,10479 +0487161,11154 +0487181,10726 +0487182,10232 +0487190,10484 +0487199,10398 +0487201,11311 +0487211,10091 +0487266,10731 +0487272,11159 +0487285,10347 +0487409,10163 +0487446,1246590125 +0487490,1246589457 +0487496,11031 +0487501,10177 +0487522,10734 +0487528,10277 +0487533,10708 +0487568,1246589221 +0487570,1246588153 +0487627,10343 +0487637,1246588431 +0487664,10459 +0487669,1246589555 +0487670,10248 +0487703,10229 +0487712,10495 +0487725,11072 +0487729,10242 +0487754,10246 +0487757,1246589716 +0487791,10238 +0487808,10795 +0487897,10458 +0487934,1246588457 +0487948,1246588184 +0487967,10396 +0487986,1246588320 +0487993,10094 +0487998,1246589662 +0488039,10469 +0488042,10249 +0488058,10742 +0488167,1246588803 +0488207,10345 +0488224,10097 +0488235,10430 +0488258,10186 +0488300,10119 +0488309,10252 +0488316,10182 +0488318,11021 +0488321,11083 +0488357,10109 +0488368,10720 +0488380,10776 +0488413,10124 +0488415,10524 +0488464,10548 +0488494,1246589023 +0488541,1246588437 +0488604,1246588783 +0488672,10489 +0488806,1246588679 +0488843,11245 +0488851,1246588404 +0488852,1246588443 +0488879,10201 +0488881,10751 +0488909,11135 +0488923,11272 +0488950,1246588426 +0489013,1246589306 +0489034,1246588123 +0489062,10560 +0489122,1246588789 +0489267,10550 +0489275,10374 +0489349,1246589017 +0489351,10914 +0489366,10538 +0489373,10783 +0489425,10194 +0489438,10717 +0489448,10480 +0489451,10449 +0489452,10492 +0489462,10506 +0489483,10189 +0489497,10472 +0489519,1246588096 +0489545,1246588429 +0489547,11270 +0489552,1246589319 +0489563,10542 +0489622,1246590121 +0489625,1246588175 +0489758,1246589673 +0489759,10198 +0489760,10210 +0489825,11300 +0489873,10793 +0489929,10206 +0489963,10207 +0490038,10762 +0490099,10284 +0490139,10752 +0490143,10754 +0490161,10707 +0490168,1246588892 +0490196,10777 +0490248,1246588413 +0490346,1246588450 +0490347,1246588387 +0490376,10771 +0490381,10729 +0490893,1246588342 +0490908,1246588097 +0490919,1246588164 +0490921,10769 +0374858,8178 +0374919,8947 +0374930,7948 +0374932,7850 +0374951,6064 +0375276,8078 +0375332,8553 +0375407,7692 +0375439,5910 +0375466,5707 +0375590,7544 +0375898,5734 +0375997,6066 +0376048,6108 +0376162,5724 +0376691,5765 +0376792,7883 +0376797,6796 +0376828,5776 +0376894,9717 +0376905,7991 +0377023,7757 +0377103,7534 +0377106,8124 +0377108,6078 +0377228,5206 +0377278,6571 +0377295,10478 +0377297,4638 +0377312,6010 +0377313,6673 +0377318,6015 +0377326,5836 +0377345,6025 +0377423,8014 +0377476,5905 +0377489,6080 +0377508,10090 +0377617,6041 +0377621,5662 +0377623,6043 +0377627,5766 +0377629,5898 +0377689,7818 +0377692,6332 +0377760,5932 +0377788,7580 +0377792,5954 +0377890,5870 +0377903,5913 +0377938,6115 +0377939,5877 +0377955,7922 +0378005,8981 +0378012,5826 +0378067,7833 +0378071,5934 +0378096,7803 +0378111,6054 +0378242,5958 +0378355,5657 +0378373,6033 +0378377,8950 +0378404,6050 +0378419,4796 +0378499,8097 +0378502,5951 +0378562,5968 +0378604,5703 +0378701,7906 +0378712,6044 +0378750,6001 +0378817,7416 +0378834,6068 +0378850,5696 +0378889,5317 +0378913,7779 +0378923,6699 +0378935,6188 +0378964,10081 +0378978,6749 +0379011,7596 +0379071,5617 +0379096,5764 +0379100,5866 +0379102,5950 +0379126,7999 +0379139,5961 +0379145,5807 +0379159,6821 +0379177,6983 +0379201,7866 +0379212,5825 +0379215,5943 +0379242,6727 +0379300,5797 +0379318,7901 +0379319,5915 +0379321,7559 +0379329,5792 +0379331,6095 +0379363,5737 +0379492,5729 +0379498,6984 +0379519,5917 +0379560,5993 +0379602,6039 +0379643,5942 +0379676,5853 +0379686,5974 +0379695,7863 +0379696,5887 +0379730,5759 +0379739,5930 +0379767,9259 +0379791,6021 +0379808,5835 +0379820,7995 +0379943,5831 +0379946,7842 +0379952,5921 +0379980,5647 +0379982,5956 +0379983,8018 +0380007,5894 +0380053,5745 +0380114,5640 +0380140,7708 +0380168,7761 +0380170,1246589782 +0380218,5715 +0380238,5612 +0380242,7780 +0380285,1246588923 +0380347,6005 +0380433,8821 +0380457,6435 +0380505,8128 +0381521,3999 +0381524,5405 +0386538,7696 +0386604,5865 +0386607,5419 +0386635,6378 +0386670,5699 +0386708,8172 +0386710,6516 +0386725,5967 +0386792,5830 +0386842,5939 +0386865,6052 +0387014,7871 +0387019,5988 +0387042,8040 +0387052,5753 +0387091,8588 +0387092,5953 +0387153,6018 +0387194,6864 +0387244,5901 +0387252,5732 +0387306,6031 +0387398,6349 +0387423,5667 +0387492,8513 +0387495,7234 +0387582,6455 +0387583,6815 +0387758,10141 +0387791,6531 +0387869,1246589627 +0387873,5969 +0387905,8917 +0388067,5952 +0388072,5992 +0388107,6889 +0388139,6035 +0388213,5760 +0388291,5714 +0388303,7622 +0388313,10311 +0388460,5908 +0388473,10999 +0388499,5434 +0388560,7612 +0388614,5879 +0388690,5731 +0388771,6357 +0388790,5704 +0388832,6540 +0388909,7790 +0389096,6500 +0389156,6585 +0389158,5811 +0389159,6638 +0389182,6316 +0389220,6715 +0389223,5928 +0389311,5798 +0389423,6515 +0389456,7903 +0389718,9555 +0389770,6833 +0389777,7075 +0389841,8090 +0389860,6621 +0389903,7732 +0389979,5750 +0390008,7548 +0390091,5842 +0390094,5406 +0390231,1246589626 +0390235,6480 +0390283,7522 +0390333,6067 +0390363,8647 +0390430,6896 +0390431,6897 +0390503,6037 +0390544,5697 +0390552,6003 +0390563,6979 +0390608,5918 +0390612,7141 +0390727,5802 +0390804,5421 +0390811,6510 +0390840,5973 +0390866,7136 +0390883,6468 +0390934,5761 +0391015,5987 +0391042,7990 +0391060,6034 +0391150,6011 +0391170,8702 +0391178,6027 +0391187,6327 +0391194,6117 +0391273,5874 +0391369,6428 +0391382,6463 +0391394,5452 +0391711,5675 +0391719,7854 +0391746,1246589538 +0391875,5730 +0392028,5664 +0392086,7616 +0392205,5821 +0392213,5880 +0392222,5742 +0392227,8656 +0392249,5736 +0392268,5777 +0392325,5702 +0392337,5686 +0392533,6062 +0392762,5684 +0393049,7781 +0393055,5780 +0393100,6723 +0393151,9549 +0393162,5683 +0393223,7477 +0393264,7867 +0393312,6754 +0393334,6359 +0393343,5681 +0393434,6705 +0393590,5651 +0393623,7768 +0393627,5903 +0393680,7755 +0393703,5816 +0393756,5788 +0393834,5975 +0393839,8000 +0393928,5672 +0393930,9049 +0393986,5649 +0394078,6051 +0394100,1246589665 +0394114,6311 +0394116,1246589848 +0394181,5857 +0394235,6304 +0394246,6059 +0394249,7097 +0394255,5869 +0394400,6857 +0394404,8019 +0394454,7823 +0394474,10998 +0394537,6032 +0394540,7242 +0394607,6295 +0394705,1246589577 +0394734,5666 +0394791,5740 +0394801,6520 +0394821,6314 +0395025,8225 +0395028,7090 +0395036,7149 +0395045,6370 +0395047,6497 +0395181,6360 +0395184,7556 +0395458,10438 +0395478,6351 +0395492,9106 +0395495,6766 +0395757,6624 +0395823,6651 +0395907,5614 +0395910,7789 +0395960,6478 +0396070,6377 +0396095,5725 +0396120,6574 +0396175,1246589509 +0396200,6535 +0396215,7661 +0396280,6546 +0396346,6409 +0396491,6665 +0396509,7663 +0396559,6599 +0396605,6548 +0396645,8194 +0396657,6643 +0396664,6587 +0396674,6343 +0396687,6710 +0396705,6539 +0396715,8515 +0396784,6310 +0396793,6619 +0396805,5810 +0396852,7543 +0396854,5620 +0396875,6399 +0396876,6401 +0396885,8218 +0396893,6603 +0396896,6447 +0396908,6481 +0397006,7398 +0397026,6517 +0397095,6659 +0397212,8357 +0397213,6827 +0397251,6336 +0397252,6817 +0397261,6645 +0397282,6565 +0397288,6682 +0397303,6583 +0397318,6590 +0397347,6607 +0397356,5721 +0397632,7579 +0397657,6617 +0397678,6416 +0397680,6493 +0397739,6441 +0397825,6544 +0397842,6492 +0397867,6657 +0397874,6561 +0397891,7012 +0397900,7759 +0397913,6486 +0397943,7625 +0397956,6770 +0397985,6306 +0398144,6532 +0398247,6888 +0398291,6553 +0398292,6156 +0398326,6908 +0398328,6915 +0398339,6942 +0398363,7478 +0398365,6394 +0398371,6397 +0398372,6454 +0398382,6557 +0398394,6580 +0398395,6608 +0398413,6509 +0398439,6554 +0398468,6450 +0398501,7546 +0398643,5632 +0398656,6422 +0398678,6508 +0398764,6496 +0398767,6552 +0399044,8034 +0399087,5919 +0399090,6402 +0399164,5832 +0399333,6086 +0399337,6081 +0399341,6309 +0399377,6536 +0399395,6968 +0399490,6475 +0399521,8837 +0399529,10910 +0399534,6502 +0399549,8062 +0399609,7604 +0399634,6457 +0399848,6358 +0399858,6307 +0399937,7126 +0399944,7618 +0400028,6579 +0400059,6149 +0400069,6181 +0400501,6501 +0400509,6584 +0400561,6413 +0400585,6346 +0400615,6875 +0400616,6384 +0400618,7086 +0400622,6325 +0400630,6708 +0400649,6634 +0400664,6658 +0400675,6642 +0400689,10366 +0400819,7371 +0400864,9345 +0400873,7125 +0405635,7631 +0405651,8114 +0405653,6382 +0405657,6606 +0409683,6542 +0409684,6543 +0409687,6367 +0409697,6572 +0409707,1246589827 +0409709,6512 +0409795,8176 +0409821,6720 +0409865,8725 +0409895,7055 +0410096,6461 +0410197,6592 +0410236,6182 +0410238,8027 +0410242,6545 +0410270,7106 +0410292,6491 +0410308,6319 +0410337,6524 +0410354,7897 +0410399,6460 +0410408,6620 +0410423,1246588685 +0410439,6878 +0410444,6556 +0410445,6459 +0410486,7825 +0410574,7434 +0410613,7063 +0410658,7417 +0410666,6373 +0410668,6558 +0410705,6356 +0410717,9059 +0410718,9739 +0410827,6452 +0410911,6341 +0410960,7369 +0410964,7832 +0410984,6324 +0410994,9811 +0410998,8876 +0411071,6597 +041111,6350 +0411118,6466 +0411135,9728 +0411184,6308 +0411187,6691 +0411206,6602 +0411252,6337 +0411280,7143 +0411363,7872 +0411365,6966 +0411420,8564 +0411472,6899 +0411536,6629 +0411542,8119 +0411593,7299 +0411630,6470 +0411636,6186 +0411649,6514 +0411665,6437 +0411666,6794 +0411684,6616 +0411721,6522 +0412165,1246588647 +0412184,6713 +0412297,6667 +0412754,6697 +0413740,6488 +0413746,6887 +0413763,6453 +0413779,7869 +0413798,7463 +0413890,8117 +0413895,7603 +0413927,6601 +0413944,6436 +0413950,7470 +0414006,8283 +0415029,6596 +0415153,6944 +0415157,6879 +0415210,6174 +0415331,6850 +0415346,6534 +0415416,6656 +0415437,6626 +0415463,6426 +0415551,8140 +0415556,6339 +0415605,6456 +0415618,6471 +0415760,7431 +0415823,6936 +0415842,7251 +0415856,9198 +0415860,6393 +0415861,1246589687 +0415865,6965 +0415887,6442 +0415896,6408 +0415947,6612 +0415955,6672 +0415971,6270 +0415974,6391 +0415991,6389 +0415997,6595 +0416005,7248 +0416011,7424 +0416013,6317 +0416014,6668 +0416087,6628 +0416110,6876 +0416158,7148 +0416184,6586 +0416198,6529 +0416202,9737 +0416203,7660 +0416212,8068 +0416283,6679 +0416331,6951 +0416332,6954 +0416347,9170 +0416354,6390 +0416410,6707 +0416411,6671 +0416413,8463 +0416417,8462 +0416470,10891 +0416483,6424 +0416488,6622 +0416496,8110 +0416497,6926 +0416507,6498 +0416509,7758 +0416510,8165 +0416587,6519 +041661,6323 +0416625,6820 +0416627,7096 +0416658,6443 +0416665,8236 +0416694,7606 +0416736,6906 +0416780,7295 +0416787,7105 +0416796,7302 +0416808,7087 +0416812,7263 +0416944,8662 +0416946,6967 +0417009,6411 +0417165,6547 +0417183,7633 +0417238,6331 +0417326,6859 +0417338,8121 +0417397,6623 +0417404,6687 +0417406,8232 +0417419,8125 +0417434,6376 +0417435,6695 +0417463,7225 +0417528,7365 +0417529,6945 +0417533,8815 +0417614,6991 +0417628,6832 +0417630,7785 +0417637,7773 +0417657,7384 +0417658,8646 +0417659,7851 +0417716,6868 +0417765,6894 +0417780,8265 +0417782,8555 +0417796,6886 +0417818,6503 +0417826,6928 +0417850,7093 +0417862,7129 +0417866,7373 +0417867,7506 +0417869,6998 +0417997,7254 +0418012,6476 +0418023,7267 +0418032,6923 +0418034,7286 +0418037,6504 +0418050,6396 +0418123,6479 +0418127,7408 +0418184,7108 +0418203,6395 +0418218,6433 +0418219,7677 +0418252,6970 +0418308,6882 +0418359,7235 +0418406,6694 +0418543,7378 +0418549,6962 +0418552,7265 +0418588,7244 +0418634,11053 +0418668,8657 +0418731,6526 +0418773,7091 +0418788,6690 +0418789,7684 +0418802,6937 +0418864,6379 +0418885,9904 +0418915,7472 +0418980,6869 +0419025,7466 +0419042,7877 +0419072,7144 +0419086,7134 +0419098,6425 +0419104,7151 +0419221,6206 +0419236,7297 +0419263,7379 +0419324,1246590316 +0419330,6403 +0419372,8582 +0419426,9062 +0419489,6273 +0419490,7796 +0419528,6287 +0419597,8271 +0419598,10312 +0419599,1246589767 +0419633,7061 +0419684,7046 +0419714,6676 +0419735,8541 +0419807,7228 +0419871,7064 +0419875,7128 +0419891,7066 +0420004,7050 +0420006,6871 +0420011,7221 +0420014,7223 +0420034,7491 +0420043,7237 +0420050,6922 +0420051,7123 +0420091,6326 +0420133,6663 +0420135,6567 +0420168,6980 +0420197,7457 +0420204,1246588817 +0420254,9565 +0420308,8256 +0420343,7700 +0420359,7570 +0420371,7216 +0420376,6874 +0420394,7403 +0420401,6292 +0420421,7276 +0420425,7511 +0420426,7512 +0420430,7293 +0420441,7084 +0420463,6929 +0420471,7111 +0420487,6903 +0420571,7273 +0420581,7280 +0420606,6919 +0420621,7288 +0420627,7291 +0420695,9570 +0420721,10157 +0420733,6955 +0420745,6956 +0420790,6861 +0420798,7147 +0420801,9576 +0420822,7092 +0420824,6914 +0420892,7279 +0420896,7624 +0420902,8558 +0420919,6893 +0420954,7107 +0420957,7256 +0420966,7213 +0420967,7215 +0420972,9065 +0420975,6885 +0420986,7072 +0420987,7390 +0421002,8495 +0421006,6910 +0421013,8229 +0421015,7270 +0421026,7102 +0421033,7374 +0421082,6291 +0421203,7289 +0421214,8228 +0421236,8276 +0421335,6210 +0421371,6290 +0421407,7475 +0421423,9805 +0421466,7095 +0421479,7743 +0421491,6958 +0421505,7452 +0421543,9563 +0421544,7119 +0421595,11035 +0421608,8761 +0421610,6352 +0421616,7441 +0421620,8565 +0421654,6898 +0421673,7509 +0421678,6884 +0421716,6912 +0421752,6891 +0421788,7745 +0421800,7101 +0421815,7252 +0421837,7701 +0421859,7429 +0421861,6933 +0421864,7253 +0421873,7121 +0421893,9105 +0421913,6803 +0421946,7762 +0421947,6700 +0421954,8258 +0421979,7287 +0421981,7110 +0421982,8298 +0421995,10859 +0422130,7255 +0422132,7753 +0422133,7000 +0422146,9826 +0422172,8320 +0422191,7088 +0422203,7053 +0422209,10810 +0422237,6902 +0422260,6964 +0422271,1246589686 +0422272,7240 +0422314,7742 +0422356,8004 +0422365,7258 +0422366,6988 +0422375,7383 +0422396,6809 +0422419,7438 +0422466,8552 +0422476,8261 +0422510,9235 +0422517,7058 +0422548,7813 +0422640,9557 +0422694,7127 +0422727,6938 +0422780,8053 +0422823,6920 +0422825,7051 +0422844,7422 +0422865,8520 +0422882,8275 +0422927,8730 +0427332,7227 +0427886,1246588693 +0427892,7399 +0429712,6930 +0429718,7282 +0429742,7219 +0429757,6946 +0429825,7985 +0429834,8767 +0429855,7514 +0429950,6917 +0429982,7799 +0429991,7517 +0429992,10525 +0430029,6931 +0430048,1246588871 +0430087,9871 +0430132,7137 +0430137,8288 +0430169,7233 +0430205,6921 +0430207,1246588879 +0430238,8507 +0430243,6935 +0430257,7372 +0430300,8643 +0430327,9061 +0430362,7401 +0430363,6961 +0430364,1246588894 +0430376,7246 +0430407,7060 +0430414,8058 +0430418,7433 +0430457,7407 +0430479,7250 +0430576,7068 +0430617,6806 +0430624,6808 +0430627,7083 +0430629,7131 +0430688,7067 +0430730,7716 +0430758,10814 +0430777,8544 +0430827,7104 +0430835,7080 +0430837,7077 +0430845,7306 +0430862,7453 +0430907,8570 +0430964,8645 +0430965,8267 +0430993,6883 +0430998,6934 +0431006,7054 +0431068,7217 +0431106,7285 +0431174,8509 +0431175,7074 +0431176,8503 +0431226,7510 +0431237,7386 +0431302,8260 +0431379,6940 +0431400,8581 +0431418,9064 +0431441,10044 +0431470,7078 +0431516,8500 +0431517,7269 +0431542,10161 +0431569,7343 +0431596,7414 +0431603,7454 +0431659,7794 +0431669,6963 +0431702,7130 +0431726,6880 +0431754,7264 +0431764,7059 +0431786,7406 +0431789,7437 +0431795,6909 +0431840,7132 +0431847,7292 +0431987,8586 +0432039,8239 +0432049,8576 +0432077,8680 +0432278,6993 +0432285,7114 +0432305,8514 +0432354,9159 +0432372,7226 +0432402,8332 +0432443,7450 +0432450,7049 +0432468,7220 +0432498,8771 +0432509,7448 +0432581,7411 +0432583,6870 +0432673,8560 +0432722,10185 +0432731,7380 +0432767,7112 +0432771,11110 +0432885,6881 +0432894,7456 +0432971,7305 +0432973,7300 +0432987,6843 +0433049,7079 +0433224,8127 +0433454,7894 +0433485,7391 +0433489,7516 +0433503,7272 +0433556,7094 +0433562,7099 +0433576,7298 +0433769,8359 +0433812,7396 +0433815,9865 +0433870,7412 +0433895,7447 +0433897,7400 +0433900,7249 +0434157,10812 +0434250,7218 +0434446,1246589624 +0435860,7443 +0435871,7521 +0435877,10546 +0435888,7294 +0436166,10166 +0436187,7085 +0436236,6957 +0436355,6810 +0436371,6943 +0436381,9803 +0436382,6877 +0436383,6947 +0436423,7098 +0436424,7304 +0436432,7360 +0436489,7342 +0436501,7513 +0436503,7262 +0436509,10615 +0436532,7375 +0436636,8118 +0436650,8302 +0436668,6950 +0436701,7224 +0436721,8681 +0436733,7402 +0436737,7277 +0436747,7377 +0436765,7547 +0436766,8361 +0436769,7608 +0436774,7154 +0436789,6195 +0436791,8744 +0436800,7278 +0436819,7413 +0436847,7260 +0436858,6890 +0436970,7686 +0436984,7471 +0437004,7460 +0437005,7236 +0437049,8665 +0437069,7451 +0437111,7231 +0437128,9060 +0437147,8575 +0437286,7427 +0437322,8538 +0437331,7362 +0437382,8712 +0437383,7615 +0437390,11073 +0437391,7047 +0437411,9179 +0437428,8719 +0437493,8277 +0437498,1246589171 +0437502,8217 +0437540,7446 +0437549,8477 +0437559,1246589818 +0437567,7394 +0437628,7241 +0437643,7229 +0437644,7425 +0437651,8550 +0437660,7275 +0437666,10165 +0437683,9673 +0437693,9052 +0437699,7239 +0437724,9816 +0437727,8512 +0437748,8526 +0437777,7748 +0437799,7665 +0437805,8563 +0437808,7676 +0437834,7520 +0437844,8756 +0437911,7610 +0437938,8573 +0437965,7420 +0437975,7359 +0437995,8519 +0438068,7073 +0438070,7519 +0438109,7542 +0438131,7418 +0438145,8363 +0438197,6698 +0438207,8545 +0438306,8660 +0438344,8696 +0438370,7133 +0438373,7116 +0438391,7620 +0438412,7490 +0438416,7613 +0438419,7449 +0438451,10120 +0438454,6855 +0438492,7363 +0438495,8654 +0438503,7445 +0438505,7415 +0438507,1246588949 +0438591,8716 +0438621,8510 +0438622,8803 +0438652,8499 +0438660,8326 +0438692,7385 +0438714,7428 +0438715,7725 +0438726,8290 +0438730,7626 +0438731,7284 +0438790,8289 +0438801,6932 +0438807,7410 +0438876,7120 +0438878,7605 +0438896,7581 +0438900,7405 +0438904,7409 +0438910,9194 +0438911,1246589314 +0438934,8250 +0439052,8752 +0439114,9303 +0439125,7623 +0439126,7364 +0439164,8230 +0439165,8081 +0439166,8248 +0439185,7444 +0439193,8571 +0439214,7507 +0439221,7459 +0439237,8249 +0439238,8292 +0439253,9735 +0439254,7439 +0439260,8739 +0439272,8770 +0439298,7599 +0439398,8322 +0439431,7001 +0439435,8506 +0439471,10069 +0439512,7619 +0439534,10146 +0439549,7602 +0439592,8536 +0439608,8502 +0439615,8743 +0439665,8528 +0439671,7458 +0439692,8524 +0439701,7344 +0439702,8314 +0439726,8710 +0439756,7685 +0439774,7419 +0439801,7353 +0439863,8501 +0439868,8243 +0439873,8242 +0439876,1246589143 +0439881,8769 +0439902,8533 +0439903,8490 +0439921,8795 +0439933,8281 +0439936,8669 +0439941,8807 +0439942,8691 +0439945,8779 +0439955,8577 +0439979,8683 +0439980,8768 +0439988,8542 +0439989,10545 +0440008,8291 +0440012,8334 +0440020,8525 +0440059,8486 +0440102,8492 +0440109,8670 +0440118,7002 +0440142,7687 +0440153,8676 +0440174,8723 +0440175,8478 +0440184,8285 +0440208,9293 +0440218,7601 +0440267,7767 +0440291,8016 +0440296,11009 +0440313,8296 +0440317,7656 +0440319,7747 +0440366,8130 +0440399,7640 +0440403,8306 +0440436,1246588335 +0440439,9189 +0440462,9573 +0440487,7617 +0440489,8274 +0440493,7724 +0440494,7717 +0440498,7718 +0440536,8303 +0440537,1246588872 +0440557,8753 +0440563,8273 +0440566,9318 +0440576,8649 +0440607,9794 +0440611,8531 +0440615,8309 +0440618,8574 +0440634,8325 +0440646,8496 +0440664,8686 +0440668,8474 +0440691,8299 +0440695,1246588857 +0440704,8264 +0440708,8672 +0440711,8632 +0440719,8257 +0440726,9434 +0440737,8279 +0440742,8317 +0440763,7680 +0440794,8518 +0440857,8112 +0440923,7723 +0440931,8823 +0440932,8817 +0440937,9168 +0440939,8484 +0440986,8784 +0440990,8572 +0441005,8699 +0441026,8323 +0441032,8790 +0441069,7691 +0441070,7714 +0441071,7938 +0441094,8480 +0441119,8304 +0441120,10958 +0441142,8485 +0441151,8688 +0441158,8293 +0441163,9044 +0441165,8713 +0441221,1246589822 +0441234,8651 +0441253,8693 +0441316,7892 +0441326,8244 +0441327,1246588979 +0441336,8270 +0441363,8701 +0441376,8652 +0441382,7891 +0441388,8111 +0441434,7848 +0441435,10617 +0441437,7802 +0441440,8642 +0441544,8187 +0441579,8548 +0441580,8255 +0441629,8747 +0441642,9733 +0441649,8738 +0441690,8237 +0441695,8321 +0441792,8664 +0441796,10145 +0441798,8539 +0441820,8687 +0441832,8294 +0441877,8319 +0441905,8482 +0442052,8650 +0442072,8559 +0442101,9795 +0442126,8534 +0442127,8535 +0442185,8706 +0442209,11013 +0442320,8940 +0442431,8297 +0442439,8707 +0442448,8797 +0442453,8801 +0442455,8324 +0442460,8522 +0442472,7969 +0442511,8758 +0442521,8781 +0442525,8305 +0442529,8812 +0442535,8330 +0442553,8511 +0442584,8822 +0442593,8631 +0442625,1246589474 +0442639,8523 +0442640,9800 +0442641,8263 +0442644,8658 +0442696,8308 +0442733,8628 +0442736,8498 +0442768,8827 +0442771,9490 +0442786,8638 +0442803,8655 +0442810,8530 +0442811,8667 +0442816,8547 +0442838,8488 +0442853,8241 +0442854,8491 +0442855,8551 +0442858,8082 +0442861,8084 +0442870,8731 +0442878,8516 +0442900,8796 +0442916,8737 +0442918,8789 +0442928,8116 +0442952,8521 +0442954,8268 +0442961,8568 +0444312,9662 +0450807,8311 +0450835,7976 +0450885,8835 +0450895,8508 +0450904,8282 +0450909,8689 +0450910,9305 +0450953,8663 +0450992,8800 +0450999,9443 +0451015,8247 +0451018,8825 +0451050,8794 +0451146,8483 +0451152,8083 +0451170,8714 +0451211,8684 +0451232,9426 +0451258,9072 +0451264,8543 +0451279,8312 +0451283,8315 +0451306,8580 +0451323,8668 +0451325,8766 +0451344,8763 +0451352,9900 +0451397,8639 +0451429,1246589145 +0451457,8259 +0451463,8703 +0451465,8566 +0451466,8287 +0451476,1246585674 +0451488,8113 +0451522,8745 +0451531,9310 +0451544,8335 +0451554,8556 +0451591,8764 +0451617,9256 +0451622,8155 +0451628,8808 +0451657,8331 +0451677,1246588988 +0451686,8733 +0451717,9145 +0451726,8286 +0451747,8549 +0451798,8489 +0451807,9090 +0451809,8318 +0451827,8685 +0451838,8329 +0451852,8640 +0451878,10526 +0451890,8557 +0451902,8017 +0451926,8157 +0451938,8877 +0451941,8629 +0451954,8013 +0451956,8115 +0451976,8159 +0452018,8666 +0452024,8700 +0452058,8234 +0452071,8585 +0452182,8333 +0452192,8587 +0452213,8773 +0452223,8697 +0452245,8235 +0452262,8673 +0452266,8788 +0452275,8245 +0452287,8262 +0452312,8742 +0452342,8497 +0452366,8705 +0452441,9153 +0452491,8728 +0452532,8266 +0452663,8123 +0452690,8238 +0452729,8160 +0452730,8035 +0452744,8254 +0452766,9224 +0452770,8924 +0452836,8648 +0452849,8694 +0452908,8671 +0452909,8682 +0452942,8240 +0452946,8678 +0452988,8772 +0453045,8310 +0453058,8561 +0453104,8085 +0453204,9405 +0453222,8774 +0453232,8704 +0453237,8481 +0453369,9221 +0453371,8754 +0453377,8246 +0453381,8505 +0453457,8179 +0453460,8778 +0453516,8759 +0453541,8108 +0453543,8637 +0453615,9738 +0453650,8360 +0453651,9436 +0453729,9547 +0453837,8695 +0453893,8802 +0453965,8540 +0454004,8554 +0454010,8757 +0454028,8740 +0454050,8927 +0454103,8251 +0454135,8916 +0454225,10710 +0454265,8233 +0454286,8633 +0454288,9457 +0454292,8579 +0454337,8741 +0454338,8722 +0454339,8726 +0454344,8493 +0454347,8776 +0454356,8567 +0454364,8358 +0454367,8820 +0454374,10905 +0454375,8532 +0454392,8076 +0454414,8600 +0454428,8569 +0454441,9455 +0454449,8644 +0454472,9158 +0454477,9341 +0454498,8755 +0454518,9261 +0454522,8589 +045454,7693 +0454546,9475 +0454559,9366 +0454583,8729 +0454591,1246588334 +0454713,8487 +0454716,8736 +0454717,8735 +0454865,8792 +0454908,8470 +0454913,10140 +0454918,8882 +0454921,8749 +0454953,8727 +0454979,8690 +0455017,10899 +0455031,9451 +0455042,9418 +0455046,8634 +0455048,8879 +0455061,8596 +0455783,8636 +0456421,10709 +0456832,8811 +0457012,8630 +0457049,8720 +0457285,1246589614 +0458330,9283 +0458336,9401 +0458410,9481 +0458412,9169 +0458423,9353 +0458433,9552 +0458434,8751 +0458435,8798 +0458457,8750 +0458477,8709 +0458528,8674 +0458530,8529 +0458541,10425 +0458557,9349 +0458563,9182 +0458582,8777 +0458614,9372 +0458636,8641 +0458652,9199 +0458672,9200 +0458711,9411 +0458719,8818 +0458720,8782 +0458736,8734 +0458737,8476 +0458756,8816 +0458788,9239 +0458802,9321 +0458835,9697 +0458837,8475 +0458862,9350 +0458906,8362 +0458917,8878 +0458920,1246588238 +0458949,8870 +0458950,8904 +0458987,8839 +0459031,9163 +0459151,9505 +0459153,9212 +0459204,8732 +0459214,8775 +0459239,8344 +0459240,8841 +0459250,9447 +0459298,9497 +0459300,8653 +0459303,9419 +0459406,8935 +0459431,9139 +0459468,9180 +0459494,9453 +0459515,8219 +0459551,1246588325 +0459597,9360 +0459646,9485 +0459647,10809 +0459658,8212 +0459701,9437 +0459747,9176 +0459750,1246589502 +0459751,9140 +0459775,8834 +0459777,8931 +0459794,9706 +0459832,9693 +0459861,11263 +0459867,9265 +0459888,8787 +0459925,9291 +0459928,8765 +0459933,9227 +0459943,8659 +0459955,9183 +0459987,7527 +0460013,10423 +0460015,10371 +0460051,9331 +0460064,8799 +0460140,8367 +0460142,8721 +0460143,8887 +0460148,9325 +0460153,9471 +0460161,8838 +0460167,10906 +0460196,1246588855 +0460242,8824 +0460278,8711 +0460283,8826 +0460286,9085 +0460288,9368 +0460289,8814 +0460303,9201 +0460304,9209 +0460409,9039 +0460412,8527 +0460416,8466 +0460422,8748 +0460429,9149 +0460432,8338 +0460436,9164 +0460486,9569 +0460511,9252 +0460526,9258 +0460532,8909 +0460536,9286 +0460547,9308 +0460565,9807 +0460591,8836 +0460597,9307 +0460612,9385 +0460613,8597 +0460620,9057 +0460621,1246589648 +0460645,9420 +0460652,8901 +0460662,9454 +0460670,8760 +0460718,9144 +0460725,9700 +0460740,9469 +0460744,9448 +0460759,9162 +0460768,9273 +0460773,9312 +0460776,9173 +0460778,9333 +0460783,9338 +0460819,9361 +0460860,9278 +0460875,9247 +0460877,8346 +0460883,10616 +0460891,8810 +0460905,9408 +0460911,9228 +0460913,10813 +0460939,9233 +0461010,9456 +0461077,1246588798 +0461136,1246589808 +0461144,9692 +0461156,9354 +0461158,1246588456 +0461163,9494 +0461183,9315 +0461210,9181 +0461222,8930 +0461233,8831 +0461260,9236 +0461266,8900 +0461267,8898 +0461268,8627 +0461272,9282 +0461279,8348 +0461306,9210 +0461344,9161 +0461394,10329 +0461425,1246588321 +0461529,9369 +0461549,8967 +0461560,9342 +0461608,9452 +0461626,9271 +0461632,9244 +0461634,9304 +0461650,10363 +0461691,10278 +0461758,10916 +0461763,9393 +0461834,9429 +0461842,10933 +0461848,10327 +0461850,10228 +0461894,10471 +0461895,9698 +0461908,8914 +0461921,9715 +0461930,9226 +0461946,8923 +0461949,8884 +0461955,9193 +0461974,9267 +0461976,9151 +0461983,9319 +0461985,9240 +0461995,9474 +0461996,10811 +0461999,9473 +0462000,1246586248 +0462010,8845 +0462011,9893 +0462022,9395 +0462045,9192 +0462052,9257 +0462053,9487 +0462078,8961 +0462079,10283 +0462084,9156 +0462094,9689 +0462099,10319 +0462100,10318 +0462107,9186 +0462109,9148 +0462117,8859 +0462123,9231 +0462125,9355 +0462126,9213 +0462136,9690 +0462137,9407 +0462151,9143 +0462165,9374 +0462225,9384 +0462244,8943 +0462332,9204 +0462336,9188 +0462338,9155 +0462339,9377 +0462372,10760 +0462378,9472 +0462384,9464 +0462394,1246589824 +0462398,9314 +0462403,10367 +0462406,9396 +0462434,9459 +0462446,10226 +0462450,9379 +0462463,1246589819 +0462469,10364 +0462500,9275 +0462559,9504 +0462580,8938 +0462582,9708 +0462598,8934 +0462600,8944 +0462601,9255 +0462602,9666 +0462608,10782 +0462620,10763 +0462625,10789 +0462633,9356 +0462653,9571 +0462663,8936 +0462666,8937 +0462680,1246590439 +0462685,8946 +0462700,9465 +0462719,9146 +0462743,9359 +0462769,9400 +0462770,9220 +0462783,9701 +0462793,9389 +0462804,9334 +0462805,9069 +0462812,10448 +0462826,9223 +0462852,9268 +0462872,9870 +0462879,9214 +0462947,9323 +0462953,9248 +0462954,9404 +0462986,8962 +0462989,9367 +0462990,9298 +0463011,9150 +0463109,9165 +0463137,9688 +0463167,9175 +0463174,9327 +0463175,9177 +0463182,9178 +0463220,9184 +0463276,9357 +0463313,9364 +0463314,9365 +0463317,9202 +0463338,9375 +0463341,9376 +0463347,9562 +0463362,9382 +0463393,9253 +0463523,9675 +0463815,9410 +0463880,9489 +0463884,9087 +0463912,10429 +0463915,9486 +0463929,9713 +0463934,9340 +0463942,9684 +0464053,1246590338 +0464091,9339 +0464101,9358 +0464129,9217 +0464140,9810 +0464153,9234 +0464157,9680 +0464174,9363 +0464203,9462 +0464204,9716 +0464218,9665 +0464242,9695 +0464259,9669 +0464268,9704 +0464269,1246588324 +0464277,9413 +0464288,9441 +0464295,9147 +0464342,9295 +0464414,9480 +0464426,1246588683 +0464428,9654 +0464464,9311 +0464478,9185 +0464504,9387 +0464506,9211 +0464513,9421 +0464522,9292 +0464530,9433 +0464532,9470 +0464534,9270 +0464543,9691 +0464566,9703 +0464590,9249 +0464619,9154 +0464637,9187 +0464830,9431 +0464831,9439 +0464850,9656 +0464871,9399 +0464936,9294 +0464949,9215 +0465035,9445 +0465041,9332 +0465050,9381 +0465057,9792 +0465127,9670 +0465174,10989 +0465180,9383 +0465199,9699 +0465202,9391 +0465261,8980 +0465289,9301 +0465328,9337 +0465340,9300 +0465362,10534 +0465379,9442 +0465403,10276 +0465427,10432 +0465452,10368 +0465471,10325 +0465507,10491 +0465508,10324 +0465514,10379 +0465517,9422 +0465522,9709 +0465537,9225 +0466577,9089 +0466583,9324 +0466605,9229 +0467584,9142 +0467587,9296 +0467588,9297 +0467597,9351 +0469492,6981 +0470671,10508 +0470696,9425 +0470769,9218 +0470776,9205 +0470804,9195 +0470827,10476 +0470840,9288 +0470843,9335 +0470880,9677 +0470922,9378 +0470931,9352 +0471018,9262 +0471041,9545 +0471071,9702 +0471076,10331 +0471282,9254 +0471607,9274 +0471683,9279 +0471875,9174 +0471957,9718 +0472420,9348 +0472547,11066 +0472553,9488 +0472923,10151 +0473187,9671 +0473254,9216 +0473377,9417 +0473537,9500 +0473877,9468 +0474021,9506 +0474061,9336 +0474132,9759 +0474135,9344 +0474148,9250 +0474187,9309 +0474252,10486 +0474254,10498 +0474267,9317 +0474275,9284 +0474295,11007 +0474310,10512 +0474317,9289 +0474321,9276 +0474335,9287 +0474376,9370 +0474450,10372 +0474457,9446 +0474501,9280 +0474506,9245 +0474511,9460 +0474512,9403 +0474526,9160 +0474562,9328 +0474572,10341 +0474631,10289 +0474658,9427 +0474668,10287 +0474689,9479 +0474691,1246589601 +0474708,9409 +0474759,9219 +0474908,9503 +0474994,11343 +0475007,9435 +0475020,10424 +0475027,10267 +0475050,11189 +0475069,10501 +0475099,9412 +0475102,9306 +0475130,9197 +0475174,9299 +0475243,9084 +0475250,9347 +0475270,10187 +0475292,9322 +0475295,10307 +0475329,9043 +0475343,10385 +0475349,10563 +0475355,9373 +0475398,9313 +0475414,9566 +0475462,9444 +0475464,9264 +0475494,10332 +0475510,9329 +0475517,10158 +0475522,1246589139 +0475528,10231 +0475603,1246588240 +0475616,9316 +0475646,9285 +0475703,1246590378 +0475739,1246589649 +0475821,9272 +0475856,9191 +0475857,9251 +0475894,9326 +0475924,9501 +0475953,10382 +0475988,9394 +0475989,10861 +0476165,9663 +0476201,9141 +0476235,10254 +0476240,9575 +0476288,9440 +0476301,9491 +0476380,9392 +0476398,9230 +0476452,9058 +0476467,9056 +0476472,9707 +0476473,1246587995 +0476480,9705 +0476496,9719 +0476566,9246 +0476648,9038 +0476679,9743 +0476767,10421 +0476772,9071 +0476793,11008 +0476794,9028 +0476824,10101 +0476883,9676 +0476889,9438 +0476893,9430 +0476899,9668 +0477025,9463 +0477136,9406 +0477137,10401 +0477174,10618 +0477177,1246588915 +0477179,9476 +0477180,9843 +0477181,9281 +0477246,10926 +0477273,9450 +0477274,9694 +0477348,10352 +0477420,9432 +0477428,9035 +0477499,9203 +0477537,9560 +0477548,9495 +0477555,9232 +0477608,9712 +0477615,10260 +0477618,10443 +0477624,10299 +0477644,10306 +0477664,9685 +0477679,10370 +0477688,9734 +0477695,10406 +0477713,9553 +0477717,1246588294 +0477930,10362 +0477934,9054 +0477938,9548 +0477942,9302 +0477990,9166 +0478003,1246589100 +0478010,10767 +0478040,9745 +0478116,9710 +0478154,9260 +0478156,10142 +0478200,1246588895 +0478238,9720 +0478253,9696 +0478274,9731 +0478291,1246588315 +0478298,1246588319 +0478364,9546 +0478371,9742 +0478393,1246588386 +0478515,10595 +0478631,9402 +0478634,9683 +0478644,1246588156 +0478665,9558 +0478673,9346 +0478682,9290 +0478695,10389 +0478814,9449 +0478817,9110 +0478819,10846 +0478996,10445 +0479056,9725 +0479079,9796 +0479128,9729 +0479213,9686 +0479279,10302 +0479308,9746 +0479335,10397 +0479344,9386 +0479347,9572 +0479420,10373 +0479466,9815 +0479542,9482 +0479600,9130 +0479668,9679 +0479674,10418 +0479734,9467 +0479736,9747 +0479743,9559 +0479783,9808 +0479789,9682 +0479848,10482 +0479864,10778 +0479865,11068 +0479882,9809 +0479895,9152 +0479909,10481 +0479919,10237 +0479925,10765 +0480023,10337 +0480024,10417 +0480061,9496 +0480066,10740 +0480105,9492 +0480108,9138 +0480138,10250 +0480148,10451 +0480162,10494 +0480169,9919 +0480173,10335 +0480217,1246589678 +0480221,11180 +0480232,1246588189 +0480246,9741 +0480248,9681 +0480288,9732 +0480308,10835 +0480501,9730 +0480503,9414 +0480535,10515 +0480574,10509 +0480608,10129 +0480629,9493 +0480650,1246586786 +0480664,9564 +0480671,10251 +0480676,9847 +0480687,1246589127 +0480688,10273 +0480700,10338 +0480733,9812 +0480734,1246588750 +0480743,9657 +0480744,9388 +0480768,10288 +0480813,1246588645 +0480843,9674 +0480846,9672 +0480853,9556 +0480856,10460 +0480897,9550 +0480925,10452 +0480928,9664 +0480949,10272 +0480984,10353 +0481015,9845 +0481033,10255 +0481036,10317 +0481037,10477 +0481040,10322 +0481051,10483 +0490954,11235 +0490972,1246588458 +0491120,1246589558 +0491204,11184 +0491271,10756 +0491277,10761 +0491359,1246576928 +0491404,10730 +0491497,10619 +0491500,1246590071 +0491584,1246589926 +0491600,1246588606 +0491605,10223 +0491606,1246588075 +0491608,10808 +0491638,1246588371 +0491684,1246588081 +0491718,1246588113 +0491729,1246588434 +0491746,1246588120 +0491952,1246589403 +0491957,1246588597 +0491963,10521 +0491969,10570 +0491978,1246589468 +0492104,10497 +0492198,1246588136 +0492206,11271 +0492227,11264 +0492264,1246588169 +0492392,10842 +0492396,10843 +0492413,10557 +0492425,10728 +0492450,10533 +0492513,1246588653 +0492522,10784 +0492582,10860 +0492585,1246588914 +0492619,1246588678 +0492630,1246588419 +0492636,1246588447 +0492657,1246588065 +0492660,1246588354 +0492671,11211 +0492695,11204 +0492710,1246588162 +0492712,11217 +0492713,1246588415 +0492741,1246588423 +0492752,1246588752 +0492758,10463 +0492767,1246589080 +0492773,1246589901 +0492787,11188 +0492790,10830 +0492801,10845 +0492803,10844 +0492845,1246590289 +0492861,1246588148 +0492864,11278 +0492866,1246588178 +0492887,11293 +0492900,10848 +0492930,10711 +0492963,10579 +0492969,10881 +0492975,11327 +0492982,11164 +0492984,11186 +0492990,1246588866 +0493001,1246589211 +0493028,11149 +0493031,1246588209 +0493057,1246588455 +0493072,1246588088 +0493073,1246588326 +0493092,10586 +0493098,1246588403 +0493104,11176 +0493108,11179 +0493121,1246588759 +0493153,1246588357 +0493170,1246588219 +0493223,1246588441 +0493329,11273 +0493353,11230 +0493422,1246588230 +0493436,10744 +0493497,1246588674 +0493538,10748 +0493564,1246588197 +0493586,11254 +0493609,10753 +0493620,1246588232 +0493621,1246588999 +0493631,1246588229 +0493672,1246588346 +0493689,10915 +0493710,1246588440 +0493730,1246588459 +0493732,10794 +0493736,1246588064 +0493796,1246588786 +0493807,1246588668 +0493832,10847 +0493842,1246588602 +0493870,1246588363 +0493873,1246589014 +0493876,10909 +0493901,1246589183 +0493927,1246590009 +0493944,1246588405 +0493952,10878 +0493974,1246588348 +0494002,1246588373 +0494004,1246588430 +0494007,10868 +0494023,1246588436 +0494027,1246588345 +0494028,1246588622 +0494049,1246588083 +0494073,1246588211 +0494087,1246588395 +0494089,1246588185 +0494134,1246588058 +0494143,1246588742 +0494185,1246588424 +0494197,1246588629 +0494208,11229 +0494219,1246589018 +0494220,1246588180 +0494227,1246589675 +0494245,1246588463 +0494274,1246588370 +0494275,1246589393 +0494281,1246588091 +0494305,10866 +0494319,1246589447 +0494394,1246589064 +0494416,1246588608 +0494441,10901 +0494444,1246588384 +0494445,11210 +0494449,1246588383 +0494455,11151 +0494480,10902 +0494481,1246588804 +0494488,10917 +0494491,11268 +0494493,10908 +0494496,1246588391 +0494502,11150 +0494518,11303 +0494520,1246588313 +0494535,10940 +0494541,1246588367 +0494542,1246588214 +0494559,1246588877 +0494563,1246588599 +0494564,10996 +0494566,11265 +0494567,11329 +0494569,10978 +0494589,1246588376 +0494591,10935 +0494593,1246588427 +0494594,1246588385 +0494598,1246588155 +0494612,11171 +0494618,11249 +0494619,1246588183 +0494627,1246588159 +0494633,1246588336 +0494636,1246588076 +0494643,1246588623 +0494651,1246588259 +0494657,1246588151 +0494675,1246588095 +0494706,1246588144 +0494743,1246588392 +0494753,1246588234 +0494762,1246588195 +0494928,1246588382 +0495312,1246588453 +0495421,1246588190 +0495425,1246588428 +0495444,11024 +0495469,10937 +0495529,1246588171 +0495531,1246588213 +0495586,1246588394 +0495605,11178 +0495606,1246588393 +0495610,11146 +0495619,11145 +0495625,1246588381 +0495725,1246588237 +0495730,11038 +0495748,11290 +0495758,11297 +0495759,11173 +0495764,1246588203 +0495778,11305 +0495785,1246588226 +0496043,1246588098 +0496145,1246588110 +0496182,1246588380 +0496402,11232 +0496545,1246588433 +0496795,1246589364 +0496909,1246588057 +0496910,10966 +0496939,1246589554 +0496951,1246589607 +0496953,1246588621 +0496975,11200 +0497004,1246588347 +0497006,1246588298 +0497007,10943 +0497008,1246588390 +0497011,11197 +0497101,1246588864 +0497114,1246588378 +0497139,1246588350 +0497144,11162 +0497151,1246588167 +0497153,11172 +0497163,1246588124 +0497189,1246588397 +0497269,10954 +0497295,1246589102 +0497362,1246588432 +0497371,11296 +0497379,1246589148 +0497380,1246589227 +0497383,1246588409 +0497391,1246590034 +0497393,1246588396 +0497399,1246588188 +0497430,1246588379 +0497438,1246590266 +0497439,1246588222 +0497443,1246588416 +0497457,1246588212 +0499382,1246588129 +0499543,1246588168 +0499546,1246588408 +0499548,1246588227 +0499554,11139 +0499571,1246589085 +0499582,1246588399 +0499593,1246588748 +0499623,1246588603 +0499636,1246588435 +0499742,1246588461 +0499757,1246588452 +0499779,11032 +0499848,1246588368 +0499893,1246589342 +0499899,11277 +0499938,1246588609 +0499982,1246588283 +0499998,11023 +0500000,11046 +0500006,1246588598 +0500014,1246589193 +0500026,1246590044 +0500054,1246589040 +0500100,11248 +0500105,1246588760 +0500154,1246588360 +0500192,1246588361 +0500363,11324 +0500740,1246588438 +0501094,1246588235 +0501226,1246588412 +0501231,1246589505 +0501271,11238 +0501280,1246588670 +0501327,1246588172 +0501664,1246588150 +0501669,1246588407 +0501754,1246589530 +0502076,1246588401 +0502229,1246588059 +0502284,1246589046 +0502293,1246588414 +0502297,11165 +0502338,1246588119 +0502346,11039 +0502350,11203 +0502351,1246589010 +0502356,1246588147 +0502365,1246588208 +0502372,1246589041 +0502387,1246589115 +0502468,1246588449 +0502498,11143 +0502499,1246588331 +0502505,1246588355 +0502506,1246588194 +0502515,11198 +0502536,1246589328 +0502567,1246588650 +0502579,1246588865 +0502666,11237 +0502729,1246589268 +0502774,1246588422 +0502775,1246588352 +0502781,1246587948 +0502795,1246589334 +0502796,1246589060 +0502824,11282 +0502830,1246589318 +0502834,1246589107 +0502835,1246589236 +0502837,1246589016 +0502869,11093 +0502880,1246588070 +0502886,1246588643 +0502887,1246588223 +0502890,11242 +0502891,1246588638 +0502936,1246589305 +0502969,1246589367 +0502978,1246589220 +0502980,1246589415 +0503008,1246588322 +0503026,1246589072 +0503028,1246589799 +0503089,1246590302 +0503124,1246589121 +0503139,1246589204 +0503141,11156 +0503179,1246589405 +0503187,1246589407 +0503203,11003 +0503226,1246589065 +0503280,1246588640 +0503296,1246590144 +0503328,1246589330 +0503329,1246589536 +0503330,1246588339 +0503338,11181 +0503340,1246588317 +0503345,1246588375 +0503370,11132 +0503371,1246588338 +0503447,1246589286 +0503454,1246588451 +0503469,11276 +0503476,1246588666 +0503490,1246588689 +0503495,1246588448 +0503776,1246590402 +0503827,1246588377 +0503914,1246588411 +0503926,1246583555 +0503959,11328 +0504071,1246589937 +0504074,1246588425 +0504086,1246588332 +0504250,1246588676 +0504251,1246588454 +0504278,11042 +0504280,11134 +0504282,11043 +0504287,11050 +0504305,1246588446 +0504321,1246588442 +0504330,1246588671 +0504331,11086 +0504340,1246588340 +0504346,1246588314 +0504347,1246588358 +0504355,1246588364 +0504372,1246589124 +0504376,1246588328 +0504402,1246589283 +0504415,1246589346 +0504497,1246589077 +0504509,1246588146 +0504561,1246589254 +0504562,1246588236 +0504565,1246589036 +0504566,1246588297 +0504572,1246588860 +0504576,1246589259 +0504594,1246589056 +0504595,1246588661 +0504619,1246588624 +0504620,1246588641 +0504621,1246588417 +0504625,1246588445 +0504628,11075 +0504676,1246589126 +0504677,1246588351 +0504679,11078 +0504683,1246588359 +0504696,11161 +0504703,1246588658 +0504710,1246588648 +0504728,1246588667 +0504758,11133 +0504766,1246588179 +0504771,1246588016 +0504778,1246589088 +0504779,1246589969 +0504802,1246588135 +0504803,11205 +0504823,1246589042 +0504839,1246588323 +0504864,11098 +0504879,1246589007 +0504896,1246589963 +0504897,1246588682 +0504907,11099 +0504921,11224 +0504956,1246589943 +0504968,1246588186 +0505000,11097 +0505011,1246588439 +0505016,1246589114 +0505088,1246589068 +0505094,1246589263 +0505095,1246588808 +0505098,1246589344 +0505099,1246588462 +0505129,1246588118 +0505136,1246589400 +0505142,11193 +0505146,1246589296 +0505147,1246588626 +0505148,11158 +0505155,1246588398 +0505159,1246588418 +0505161,1246588327 +0505177,1246588220 +0505178,11274 +0505189,1246588644 +0505200,1246589186 +0505213,1246588310 +0505229,1246589123 +0505238,1246589375 +0505260,1246589053 +0505290,1246589863 +0505305,1246589022 +0505325,1246588636 +0505338,1246588601 +0505355,1246588669 +0505363,1246588420 +0505369,1246589206 +0505370,1246589357 +0505380,1246588675 +0505436,1246588710 +0505440,1246588316 +0505442,1246589049 +0505461,1246589292 +0505464,1246589213 +0505479,1246588677 +0505488,1246589178 +0505500,1246588732 +0505501,1246588040 +0505507,1246588043 +0505510,1246588042 +0505511,1246588041 +0505521,1246589421 +0505522,1246588045 +0505537,1246588312 +0505549,11119 +0505564,1246589119 +0505582,1246588607 +0505590,1246588400 +0505593,1246588366 +0505608,1246589350 +0505648,11120 +0505675,1246589011 +0505683,1246588651 +0505734,1246588705 +0505746,1246589066 +0505782,1246588329 +0505799,1246589307 +0505815,1246588365 +0505831,1246589483 +0505842,1246589055 +0505858,1246589469 +0505860,1246589301 +0505874,1246589291 +0505890,1246589269 +0505909,1246589224 +0505950,11121 +0505956,1246589244 +0505972,1246590200 +0506026,1246589349 +0506107,1246589117 +0506137,1246589043 +0506187,1246589032 +0506242,1246588686 +0506296,1246588410 +0506309,1246588634 +0506324,1246589287 +0506329,1246589682 +0506334,1246588369 +0506365,1246588794 +0506393,1246588659 +0506428,1246589191 +0506448,1246589448 +0506488,1246588627 +0506506,1246588660 +0506532,1246588657 +0506537,1246588654 +0506567,1246589245 +0506575,1246588054 +0506576,1246589433 +0506582,1246588776 +0506585,1246588690 +0506603,1246589343 +0506605,1246588646 +0506667,1246589231 +0506697,1246589059 +0506741,1246588672 +0506744,1246588886 +0506790,1246589370 +0506820,1246590216 +0506850,1246588604 +0506856,1246588788 +0506904,1246588681 +0506958,1246589215 +0506967,1246589262 +0507013,1246589048 +0507018,1246589275 +0507045,1246589027 +0507051,1246589303 +0507052,1246589304 +0507053,1246589320 +0507059,11340 +0507078,1246588665 +0507079,1246588673 +0507081,1246588635 +0507099,1246588707 +0507106,1246589353 +0507111,11342 +0507121,1246588688 +0507166,1246588273 +0507175,1246588709 +0507202,1246589090 +0507229,1246590141 +0507231,1246588720 +0507241,1246589031 +0507248,1246589000 +0507251,1246589341 +0507254,11349 +0507259,11348 +0507272,1246588625 +0507287,1246588275 +0507291,1246588642 +0507297,1246588684 +0507314,1246589294 +0507315,1246589485 +0507348,1246589432 +0507359,1246589054 +0507373,1246589325 +0507378,1246589087 +0507384,1246589473 +0507405,1246589109 +0507421,1246589321 +0507431,1246589282 +0507436,1246588637 +0507438,1246588611 +0507454,1246590068 +0507477,1246589249 +0507485,1246588610 +0507492,1246589408 +0507495,1246589074 +0507503,1246588735 +0507507,1246588749 +0507513,1246589313 +0507528,1246589953 +0507534,1246588614 +0507539,1246588893 +0507543,1246588727 +0507571,1246589354 +0507578,1246589347 +0507601,1246589246 +0507639,1246589005 +0507664,1246589309 +0507687,1246589428 +0507777,1246589226 +0507780,1246588663 +0507786,1246589061 +0507788,1246588664 +0507798,1246589004 +0507802,1246589372 +0507810,1246588737 +0507830,1246589012 +0507831,1246589013 +0507833,1246589443 +0507840,1246589333 +0507865,1246589327 +0507867,1246588691 +0507870,1246589331 +0507873,1246589295 +0507896,1246588692 +0507898,1246590277 +0507904,1246588736 +0507920,1246588708 +0507934,1246589930 +0507953,1246589089 +0507971,1246588699 +0508021,1246588697 +0508025,1246589934 +0508033,1246590026 +0508049,1246590249 +0508055,1246589413 +0508066,1246589081 +0508075,1246589071 +0508076,1246589047 +0508114,1246589212 +0508116,1246589409 +0508121,1246589234 +0508126,1246589214 +0508136,1246589267 +0508138,1246589035 +0508147,1246589487 +0508154,1246590224 +0508189,1246589111 +0508198,1246589272 +0508201,1246589075 +0508204,1246589125 +0508210,1246589082 +0508217,1246589187 +0508222,1246589020 +0508234,1246589398 +0508237,1246589238 +0508251,1246588725 +0508269,1246589280 +0508277,1246589029 +0508280,1246589034 +0508291,1246589396 +0508305,1246588880 +0508321,1246588802 +0508322,1246588801 +0508323,1246588746 +0508351,1246588774 +0508352,1246588782 +0508363,1246588790 +0508376,1246588797 +0508377,1246588793 +0508385,1246588856 +0508386,1246588799 +0508535,1246588898 +0508539,1246588819 +0508580,1246589001 +0508597,1246588878 +0508607,1246588859 +0508644,1246589033 +0508678,1246589025 +0508694,1246589079 +0508742,1246589411 +0508749,1246588869 +0508797,1246589638 +0510811,1246589899 +0512093,1246589368 +0512102,1246589019 +0512145,1246589122 +0512153,1246589302 +0512175,1246589373 +0512188,1246589078 +0512209,1246589315 +0512210,1246589039 +0512220,1246589129 +0512227,1246588831 +0512276,1246589037 +0512329,1246589250 +0512380,1246589625 +0512394,1246589534 +0512404,1246589310 +0512411,1246589329 +0512437,1246589273 +0512456,1246589755 +0512474,1246589230 +0512477,1246589128 +0512498,1246589006 +0512518,1246589044 +0512540,1246589264 +0512547,1246589252 +0512558,1246589104 +0512810,1246589057 +0512825,1246588838 +0512826,1246588839 +0512849,1246589255 +0512851,1246589189 +0512899,1246589228 +0512915,1246589919 +0512917,1246589422 +0512920,1246589471 +0512935,1246589416 +0512937,1246589002 +0512941,1246589449 +0513005,1246589265 +0513038,1246589388 +0513051,1246589406 +0513055,1246589335 +0513057,1246589360 +0513109,1246589390 +0513116,1246589184 +0513120,1246589095 +0513123,1246589096 +0513127,1246588887 +0513142,1246589279 +0513175,1246589026 +0513289,1246590019 +0513298,1246589293 +0513301,1246589374 +0513332,1246589052 +0513338,1246589138 +0513359,1246589365 +0513409,1246589476 +0513447,1246589382 +0513493,1246589180 +0513510,1246589202 +0513547,1246589389 +0513618,1246589179 +0513691,1246589355 +0513706,1246589581 +0513728,1246589021 +0513737,1246589299 +0513803,1246589247 +0513936,1246589371 +0513950,1246589233 +0513978,1246589192 +0514112,1246589008 +0514133,1246589486 +0514138,1246589084 +0514141,1246589201 +0514144,1246589856 +0514165,1246589426 +0514178,1246589450 +0514183,1246589547 +0514209,1246589028 +0514214,1246589203 +0514248,1246589404 +0514253,1246588862 +0514277,1246588917 +0514286,1246589477 +0514310,1246588910 +0514318,1246589058 +0514326,1246589103 +0514348,1246589217 +0514351,1246589684 +0514357,1246589093 +0514369,1246589276 +0514378,1246589435 +0514434,1246589317 +0514444,1246589188 +0514457,1246589024 +0514484,1246589248 +0514500,1246589073 +0514506,1246589062 +0514529,1246589281 +0514553,1246589101 +0514598,1246588888 +0514600,1246589618 +0514611,1246589419 +0514626,1246589345 +0514631,1246589067 +0514632,1246589270 +0514646,1246589232 +0514649,1246589439 +0514654,1246589116 +0514678,1246589257 +0514683,1246589337 +0514691,1246589241 +0514701,1246589312 +0514722,1246589424 +0514761,1246588867 +0514767,1246589160 +0514773,1246589298 +0514780,1246589015 +0514797,1246589198 +0514813,1246589210 +0514819,1246589300 +0514827,1246589383 +0514850,1246589438 +0514863,1246589030 +0514913,1246589260 +0514918,1246589003 +0514929,1246589235 +0514932,1246589223 +0514944,1246589242 +0514959,1246589324 +0514973,1246588868 +0514986,1246589256 +0515009,1246589376 +0515028,1246590349 +0515054,1246589361 +0515059,1246589050 +0515063,1246589322 +0515103,1246589097 +0515108,1246589229 +0515112,1246589359 +0515119,1246589348 +0515139,1246589243 +0515158,1246589207 +0515164,1246589549 +0515172,1246588882 +0515173,1246588883 +0515181,1246589163 +0515213,1246588950 +0515216,1246589205 +0515221,1246589377 +0515252,1246589484 +0515269,1246589063 +0515291,1246589395 +0515293,1246589610 +0515310,1246589560 +0515311,1246589086 +0515330,1246589472 +0515348,1246589149 +0515369,1246589271 +0515382,1246589009 +0515407,1246589038 +0515445,1246589402 +0515458,1246589110 +0515492,1246590214 +0515525,1246589336 +0515527,1246589378 +0515561,1246589218 +0515564,1246589182 +0515566,1246588918 +0515592,1246589190 +0515599,1246589362 +0515608,1246589418 +0515631,1246589140 +0515634,1246589533 +0515637,1246589113 +0515672,1246588926 +0515679,1246589351 +0515687,1246589323 +0515693,1246589592 +0515724,1246589786 +0515745,1246589308 +0515755,1246589340 +0515760,1246589452 +0515762,1246589455 +0515764,1246589194 +0515773,1246589164 +0515776,1246588929 +0515784,1246589161 +0515786,1246589290 +0515809,1246589498 +0515820,1246589181 +0515821,1246589523 +0515855,1246589358 +0515862,1246589266 +0515875,1246588964 +0515876,1246589108 +0515888,1246589284 +0515890,1246589366 +0515901,1246588965 +0515914,1246589520 +0515917,1246589338 +0515945,1246589459 +0515946,1246589401 +0515949,1246589106 +0515967,1246589561 +0516045,1246589091 +0516062,1246589274 +0516069,1246589199 +0516071,1246589399 +0516086,1246589441 +0516096,1246589277 +0516102,1246589458 +0516104,1246589379 +0516107,1246589420 +0516115,1246589832 +0516145,1246589200 +0516250,1246589045 +0516274,1246590399 +0516281,1246589410 +0516299,1246589137 +0516304,1246589174 +0516328,1246589316 +0516343,1246589175 +0516359,1246589094 +0516380,1246589251 +0516392,1246589142 +0516455,1246590387 +0516484,1246589099 +0516496,1246589151 +0516499,1246589414 +0516510,1246589387 +0516521,1246589427 +0516553,1246589381 +0516569,1246589436 +0516582,1246589219 +0516614,1246589454 +0516622,1246589285 +0516627,1246589467 +0516636,1246589616 +0516659,1246589646 +0516667,1246589278 +0516671,1246589504 +0516684,1246589356 +0516687,1246589481 +0516697,1246589503 +0516703,1246589591 +0516704,1246589165 +0516718,1246589596 +0516748,1246589451 +0516757,1246589760 +0516779,1246589162 +0516785,1246589490 +0516815,1246589177 +0516826,1246589636 +0516827,1246589453 +0516830,1246589603 +0516838,1246589444 +0516882,1246589326 +0516890,1246589609 +0516896,1246589369 +0516936,1246589525 +0516938,1246589134 +0516942,1246589153 +0516955,1246589479 +0516966,1246589657 +0516984,1246589548 +0516993,1246589150 +0516997,1246589654 +0517005,1246589928 +0517008,1246589152 +0517011,1246589445 +0517017,1246589482 +0517018,1246589154 +0517081,1246589542 +0517085,1246589635 +0517116,1246589589 +0517121,1246590095 +0517168,1246590020 +0517177,1246589508 +0517181,1246590182 +0517184,1246589510 +0517185,1246589511 +0517191,1246589971 +0517196,1246589949 +0517200,1246589515 +0517209,1246589634 +0517211,1246589518 +0517212,1246589516 +0517213,1246590112 +0517220,1246589622 +0517242,1246589965 +0517261,1246589579 +0517264,1246589981 +0517265,1246589598 +0517272,1246589604 +0517284,1246590084 +0517302,1246589605 +0517308,1246590181 +0517317,1246589582 +0517342,1246590048 +0517354,1246590123 +0517382,1246589961 +0517399,1246589667 +0517400,1246589976 +0517418,1246589608 +0517421,1246590243 +0517422,1246590030 +0517453,1246590295 +0517457,1246589942 +0517458,1246589931 +0517465,1246589987 +0517474,1246590276 +0517480,1246589995 +0517487,1246590017 +0517490,1246589628 +0517495,1246590024 +0517497,1246590083 +0517516,1246589929 +0517523,1246590050 +0517533,1246590094 +0517537,1246589613 +0517545,1246590075 +0517570,1246590000 +0517571,1246590062 +0517580,1246590191 +0517588,1246590194 +0517592,1246590025 +0517608,1246589623 +0517625,1246590128 +0517629,1246589620 +0517632,1246589619 +0517642,1246590066 +0517649,1246590060 +0517652,1246589658 +0517653,1246590049 +0517656,1246590058 +0517666,1246590013 +0517669,1246589637 +0517673,1246590043 +0517681,1246590242 +0517718,1246589653 +0517719,1246590262 +0517724,1246589652 +0517729,1246589936 +0517737,1246590021 +0517742,1246590334 +0517759,1246589661 +0517760,1246589659 +0517761,1246589666 +0517768,1246589944 +0517771,1246589923 +0517772,1246590006 +0517781,1246590032 +0517795,1246590040 +0517807,1246590218 +0517822,1246589918 +0517856,1246589957 +0517864,1246590073 +0517866,1246589989 +0517869,1246589765 +0517887,1246589991 +0517893,1246590111 +0517895,1246589920 +0517897,1246589996 +0517900,1246590189 +0517906,1246590233 +0517912,1246590016 +0517920,1246589895 +0517922,1246590064 +0517925,1246590225 +0517932,1246589914 +0517963,1246589984 +0517968,1246590193 +0517973,1246590093 +0517980,1246589998 +0517999,1246590288 +0518005,1246589911 +0518019,1246589967 +0518036,1246590007 +0518045,1246589980 +0518056,1246590133 +0518059,1246590265 +0518066,1246589916 +0518067,1246590055 +0518075,1246590105 +0518100,1246590015 +0518109,1246589900 +0518124,1246589990 +0518131,1246590086 +0518140,1246589956 +0518143,1246589939 +0518148,1246590079 +0518166,1246589907 +0518167,1246589985 +0518196,1246590283 +0518199,1246590035 +0518200,1246590208 +0518247,1246590011 +0518258,1246589993 +0518264,1246590056 +0518301,1246589999 +0518318,1246590010 +0518325,1246590029 +0518334,1246590294 +0518349,1246590045 +0518400,1246589951 +0518406,1246590098 +0518421,1246590082 +0518422,1246590198 +0518427,1246590051 +0518456,1246590001 +0518506,1246589913 +0518509,1246590143 +0518517,1246590096 +0518527,1246589791 +0518531,1246590036 +0518550,1246589997 +0518563,1246590273 +0518617,1246590244 +0518620,1246590097 +0518626,1246589982 +0518642,1246590078 +0518652,1246590352 +0518654,1246590236 +0518681,1246590247 +0518694,1246589689 +0522209,1246590235 +0522215,1246590003 +0522226,1246590268 +0522235,1246589921 +0522291,1246589935 +0522323,1246589908 +0522325,1246590074 +0522346,1246590199 +0522364,1246590346 +0522365,1246590031 +0522388,1246590135 +0522420,1246590052 +0522432,1246590274 +0522478,1246589924 +0522498,1246590136 +0522505,1246590217 +0522516,1246590299 +0522526,1246589905 +0522585,1246590004 +0522587,1246589912 +0522591,1246590227 +0522592,1246590290 +0522606,1246590306 +0522613,1246590107 +0522618,1246589902 +0522621,1246590296 +0522624,1246590063 +0522633,1246590102 +0522639,1246589964 +0522666,1246590297 +0522690,1246590196 +0522695,1246590229 +0522709,1246590023 +0522737,1246590231 +0522740,1246589896 +0522746,1246590267 +0522747,1246589785 +0522821,1246590070 +0522827,1246590344 +0522835,1246589946 +0522864,1246589973 +0522871,1246589904 +0522883,1246590065 +0522898,1246590047 +0522904,1246589698 +0522918,1246590039 +0522922,1246590033 +0522923,1246590309 +0522935,1246589906 +0522937,1246590002 +0522947,1246589978 +0522964,1246590327 +0522981,1246590257 +0522986,1246590120 +0522995,1246590300 +0522996,1246590450 +0523015,1246590137 +0523024,1246590301 +0523039,1246590140 +0523045,1246590272 +0523049,1246590041 +0523051,1246589959 +0523053,1246590364 +0523064,1246590109 +0523068,1246590103 +0523082,1246590139 +0523083,1246590053 +0523143,1246590090 +0523162,1246590104 +0523165,1246590185 +0523186,1246590256 +0523197,1246589702 +0523200,1246590245 +0523211,1246589955 +0523237,1246590028 +0523246,1246590317 +0523260,1246589917 +0523287,1246590341 +0523297,1246589903 +0523300,1246590180 +0523305,1246590038 +0523324,1246589763 +0523334,1246590250 +0523343,1246590042 +0523356,1246590054 +0523388,1246590220 +0523391,1246589968 +0523412,1246589966 +0523440,1246590260 +0523447,1246590261 +0523465,1246590037 +0523478,1246590077 +0523479,1246590076 +0523530,1246589788 +0523534,1246590278 +0523549,1246590298 +0523557,1246589780 +0523576,1246589983 +0523578,1246590279 +0523605,1246589962 +0523640,1246590311 +0523641,1246590226 +0523647,1246590110 +0523651,1246590012 +0523661,1246590333 +0523685,1246590211 +0523688,1246590210 +0523697,1246589952 +0523699,1246590069 +0523710,1246590223 +0523715,1246590186 +0523734,1246590108 +0523739,1246589897 +0523740,1246590124 +0523747,1246590305 +0523772,1246590271 +0523775,1246590255 +0523786,1246590187 +0523796,1246590358 +0523799,1246590310 +0523807,1246589977 +0523809,1246590067 +0523817,1246589771 +0523824,1246589774 +0523826,1246590307 +0523828,1246589773 +0523833,1246589842 +0523835,1246590252 +0523836,1246589770 +0523840,1246590221 +0523841,1246589844 +0523856,1246589974 +0523917,1246589839 +0523932,1246590027 +0524062,1246589979 +0524070,1246590203 +0524078,1246590085 +0524086,1246590127 +0524095,1246590080 +0524126,1246589898 +0524142,1246589945 +0524149,1246590130 +0524172,1246590184 +0524181,1246590337 +0524185,1246590345 +0524209,1246589783 +0524210,1246589841 +0524224,1246590022 +0524230,1246589970 +0524249,1246590357 +0524279,1246590046 +0524285,1246589940 +0524331,1246590087 +0524346,1246590190 +0524366,1246590254 +0524391,1246590275 +0524395,1246590269 +0524421,1246589836 +0524441,1246590282 +0524464,1246590308 +0524472,1246590291 +0524497,1246590057 +0524510,1246590293 +0524513,1246590092 +0524570,1246589800 +0524589,1246589830 +0524590,1246589938 +0524655,1246590263 +0524658,1246589793 +0524660,1246589825 +0524691,1246589792 +0524697,1246590209 +0524744,1246589972 +0524745,1246590371 +0524747,1246589915 +0524778,1246590343 +0524792,1246589794 +0524839,1246589831 +0524843,1246589829 +0524849,1246590366 +0524872,1246590081 +0525026,1246590204 +0525029,1246590101 +0525048,1246590117 +0525078,1246589823 +0525088,1246590303 +0525091,1246589828 +0525092,1246590215 +0525093,1246589958 +0525114,1246590246 +0525115,1246589992 +0525136,1246589950 +0525137,1246590202 +0525153,1246590284 +0525166,1246590131 +0525171,1246589988 +0525172,1246589933 +0525182,1246589986 +0525208,1246590264 +0525218,1246590195 +0525271,1246590251 +0525272,1246590197 +0525277,1246589834 +0525285,1246589954 +0525287,1246590248 +0525300,1246590205 +0525343,1246590183 +0525348,1246589909 +0525349,1246590188 +0525366,1246590240 +0525374,1246589845 +0525379,1246590259 +0525395,1246590331 +0525396,1246590286 +0525431,1246590207 +0525462,1246589947 +0525479,1246590340 +0525519,1246589922 +0525600,1246590005 +0525678,1246590192 +0525681,1246590008 +0525698,1246589886 +0525725,1246590241 +0525729,1246590369 +0525743,1246589975 +0525778,1246590356 +0525782,1246590234 +0525793,1246590206 +0525803,1246590292 +0525820,1246590304 +0525831,1246590228 +0525836,1246590134 +0525837,1246590237 +0525853,1246589869 +0525858,1246590398 +0525859,1246590359 +0525869,1246590313 +0525870,1246590213 +0525886,1246590138 +0525891,1246589873 +0525915,1246590129 +0525921,1246589932 +0525932,1246590336 +0525956,1246590230 +0525972,1246590354 +0525989,1246590232 +0525999,1246589893 +0526023,1246589885 +0526054,1246590201 +0526069,1246590178 +0526074,1246590258 +0526082,1246590347 +0526148,1246590061 +0526151,1246590239 +0526179,1246589889 +0526206,1246589892 +0526231,1246590238 +0526279,1246590219 +0526303,1246589891 +0526319,1246590376 +0526336,1246590280 +0526373,1246590126 +0526383,1246590253 +0526388,1246590355 +0526403,1246590281 +0526417,1246590287 +0526434,1246590360 +0526439,1246590270 +0526454,1246590332 +0526457,1246590348 +0526480,1246590314 +0526503,1246590118 +0526534,1246590342 +0526633,1246590323 +0526713,1246590153 +0526727,1246590160 +0526760,1246590374 +0526763,1246590372 +0526861,1246590440 +0526896,1246590335 +0526973,1246590386 +0527124,1246590391 +0527292,1246590388 +0527374,1246590457 +0527516,1246590418 +059214,10837 +072301,6975 +078937,148 +08000304,9097 +08000421,11074 +0800223,8182 +09000100,11056 +09000106001,11101 +09000153,10167 +09000177001,10936 +09000180,10985 +09000181,11027 +1234567,2 +1302001,1246588978 +1529791,8065 +186185,1246589851 +3392314,9824 +353070,5818 +356039,5752 +369080,5893 +375227,7973 +418916,6731 +482018,9844 +494475,10928 +505292,11104 +507295,1246588474 +523190,1246589850 +523191,1246589849 +525046,1246589852 +55007,56 +8000100,7467 +8000101,9094 +8000102,7486 +8000104,7201 +8000105,7942 +8000107,7208 +8000108,8804 +8000109,7314 +8000110,7351 +8000112,7346 +8000113,7998 +8000114,7706 +8000115,7651 +8000116,7468 +8000118,7329 +8000119,7330 +8000121,7338 +8000122,7584 +8000124,7528 +8000125,7357 +8000127,7355 +8000128,7309 +8000129,7750 +8000130,7683 +8000131,7540 +8000133,8969 +8000134,7629 +8000135,7679 +8000136,7646 +8000139,7323 +8000140,7324 +8000141,7815 +8000142,7482 +8000143,7308 +8000144,7207 +8000145,7206 +8000147,7322 +8000148,7326 +8000149,6997 +8000150,7488 +8000151,7312 +8000152,7551 +8000153,7354 +8000154,7321 +8000155,7628 +8000156,7535 +8000157,7585 +8000158,7630 +8000159,7682 +8000161,7681 +8000162,7688 +8000163,7888 +8000164,7857 +8000165,7919 +8000166,7935 +8000167,7929 +8000168,7930 +8000169,8066 +8000170,7957 +8000171,7940 +8000172,7951 +8000173,7963 +8000174,8404 +8000175,7955 +8000176,7966 +8000177,7979 +8000178,7978 +8000179,7986 +8000180,8003 +8000182,7994 +8000185,7987 +8000186,7988 +8000189,10099 +8000190,10863 +8000192,8022 +8000194,8054 +8000195,8026 +8000196,8024 +8000197,8029 +8000198,8028 +8000200,8031 +8000201,8032 +8000202,8033 +8000203,8100 +8000204,8039 +8000205,7924 +8000206,8045 +8000207,8060 +8000208,8059 +8000209,8042 +8000210,8052 +8000211,8055 +8000212,8061 +8000213,8846 +8000214,8908 +8000215,8092 +8000216,8096 +8000217,8079 +8000218,8072 +8000219,8080 +8000221,8098 +8000222,8104 +8000225,8190 +8000226,8198 +8000227,8197 +8000228,8199 +8000229,8214 +8000230,8213 +8000231,8221 +8000232,8224 +8000233,8339 +8000234,8342 +8000235,8347 +8000236,4757 +8000237,8349 +8000238,8364 +8000239,8365 +8000240,8366 +8000241,8460 +8000242,8874 +8000243,8896 +8000244,6125 +8000245,8458 +8000246,8805 +8000247,8813 +8000248,8892 +8000249,8902 +8000250,8891 +8000251,8893 +8000252,8907 +8000253,8906 +8000254,8897 +8000255,8988 +8000256,8941 +8000257,7334 +8000258,8957 +8000259,6987 +8000260,7327 +8000261,8972 +8000262,9023 +8000263,8970 +8000264,8971 +8000265,8973 +8000266,8975 +8000267,8974 +8000268,8978 +8000269,8984 +8000270,8986 +8000271,8987 +8000272,8989 +8000274,7822 +8000275,7525 +8000276,8992 +8000277,8995 +8000278,8994 +8000279,8996 +8000280,9019 +8000281,9003 +8000282,9004 +8000283,9025 +8000284,9011 +8000285,9018 +8000286,9017 +8000287,9015 +8000288,9016 +8000289,9022 +8000290,9020 +8000291,9021 +8000292,7952 +8000293,9024 +8000294,9029 +8000295,9030 +8000296,9034 +8000298,9040 +8000299,7876 +8000301,9050 +8000302,9099 +8000303,9095 +8000304,9101 +8000305,9103 +8000306,9109 +8000307,9123 +8000308,9124 +8000309,9125 +8000310,9131 +8000311,9129 +8000312,9127 +8000313,9136 +8000314,9134 +8000315,9869 +8000316,6753 +8000317,9756 +8000318,10435 +8000319,10713 +8000320,9790 +8000321,9791 +8000322,9722 +8000324,9724 +8000325,9862 +8000326,9748 +8000327,9727 +8000330,9842 +8000331,9889 +8000336,9901 +8000337,9916 +8000338,10035 +8000339,9918 +8000341,10050 +8000342,10048 +8000343,10049 +8000344,10061 +8000345,10062 +8000347,10063 +8000349,10057 +8000350,10060 +8000352,10073 +8000354,10075 +8000355,10080 +8000356,10084 +8000357,10083 +8000358,10088 +8000359,10089 +8000360,10092 +8000362,10105 +8000363,10106 +8000364,10116 +8000365,10171 +80003666,10172 +8000367,10180 +8000369,10217 +8000370,10218 +8000373,10457 +8000374,10456 +8000377,10464 +8000378,10576 +8000380,10715 +8000382,10786 +8000383,7268 +8000385,10836 +8000388,6702 +8000390,5878 +8000391,7569 +8000392,6614 +8000393,10934 +8000394,7397 +8000395,10945 +8000396,10946 +8000397,10947 +8000398,10950 +8000399,10948 +8000400,10949 +8000401,10956 +8000402,6505 +8000403,10963 +8000404,10093 +8000405,10967 +8000406,10971 +8000407,7778 +8000408,8088 +8000409,10974 +8000410,10975 +8000412,10976 +8000416,11025 +8000417,11036 +8000418,11055 +8000419,11054 +8000420,11062 +8000422,11105 +8000423,11106 +8000425,10920 +8000426,1246588656 +8000428,10743 +8000432,1246588906 +8000435,1246588983 +8000436,1246588987 +8000437,1246588975 +8000438,1246588981 +8000439,1246588993 +8000441,1246589146 +8000442,1246589462 +8000445,1246589701 +8000446,1246589766 +8000448,5896 +8000449,1246589862 +8000501,1246589858 +8000502,1246589857 +8000503,1246589860 +8000504,1246589867 +8000505,1246589871 +9000100,1246588968 +9000101,11064 +9000103,1246589136 +9000104,1246589147 +9000105,7591 +9000106,1246588778 +9000107,9128 +9000109,1246588792 +9000110,1246588806 +9000111,1246588809 +9000112,7950 +9000114,1246589671 +9000115,8101 +9000116,8102 +9000117,8103 +9000120,8200 +9000121,8215 +9000122,10100 +9000123,9005 +9000124,10102 +9000125,9007 +9000126,10104 +9000127,9009 +9000128,9010 +9000129,9051 +9000130,9909 +9000131,10043 +9000132,10054 +9000133,10058 +9000134,10066 +9000135,10065 +9000136,10059 +9000137,10074 +9000138,10108 +9000139,7320 +9000140,10111 +9000141,10064 +9000143,9892 +9000144,10112 +9000145,10114 +9000146,10115 +9000147001,10117 +9000148001,10121 +9000150,10122 +9000151,10127 +9000152001,10128 +9000154,10168 +9000155,10169 +9000156,1246589460 +9000157,10071 +9000158,10173 +9000159,9839 +9000160,10175 +9000161,10192 +9000162,10193 +9000163,10200 +9000164,1246589602 +9000165,10203 +9000166,10204 +9000167,1246589669 +9000168,10211 +9000169,10220 +9000170,1246589668 +9000171,10437 +9000172,10818 +9000175,1246589642 +9000176,10930 +9000178,10870 +9000179,10962 +9000181,1246588828 +9000182001,11123 +9000183,1246588843 +9000184,1246588875 +9000187,1246589670 +9000189,1246589695 +9000200,1246589816 +9000201,1246589847 +9000202,11092 +9000203,1246589859 +9000204,1246590381 +9000205,10213 +9000206,1246590397 +9000207,1246590416 +9000245,11033 +9000500,1246588832 +9000501,11084 +9000502,11332 +9000503,1246588985 +9000504,1246588986 +9000505,1246588814 +9000506,1246588820 +9000507,1246588994 +9000508,1246589133 +9000509,1246589679 +9000510,1246589680 +9000511,10047 +9000512,1246589820 +9000513,8183 +9000514,7964 +9000515,8186 +9000516,8185 +9000517,8196 +9000518,8195 +9000521,8203 +9000522,8204 +9000523,8208 +9000524,8210 +9000525,8209 +9000529,8226 +9000530,8336 +9000531,8337 +9000532,8911 +9000533,8910 +9000534,8912 +9000535,8956 +9000536,8958 +9000537,8990 +9000538,7752 +9000539,7751 +9000540,10938 +9000541,9041 +9000542,10961 +9000597,1246589764 +9000598,1246589700 +9000599,1246589699 +9000600,8109 +9000601,1246589866 diff --git a/node_modules/csvtojson/test/data/large-utf8.csv b/node_modules/csvtojson/test/data/large-utf8.csv new file mode 100644 index 0000000..d60ec90 --- /dev/null +++ b/node_modules/csvtojson/test/data/large-utf8.csv @@ -0,0 +1,5291 @@ +Field1,Field2 +абеубкб,каав1 +абеуудб,тево +абекбат,ббооэ +абектке,бвдтекээву +абеэадд,бавда +абеэдуа,това +абтббдо,бвдтеккоет +абтббдд,бвдтекэдод +абтвбэк,эвуу +абтоббе,бвдтекэввв +абтдаек,току +абтдббо,эуда +абтдеэд,тдаа +абтдеэе,уатэ +абтдтба,бавуд +абтедда,коее +абтедку,удут +абтееек,уоуа +абтееэе,еоке +абтеуак,туэв +абтттэу,ттв +абтктда,уооэ +абтэаоб,туэо +абтэаод,тэаб +абтэтуе,едбу +абуаоад,бвдтеккоув +абубебв,экоо +абувбда,баоад +абуввкэ,бвдтекэбэт +абуввэа,вэ +абувоке,тебк +абувува,уэбт +абувувб,этту +абуовко,тувк +абудавт,баовб +абудоэе,баовк +абуебта,уает +абуеввт,бвдтекэтув +абуееээ,эа +абуекеу,тэээ +абуеэвб,бтеэ +абуеэвв,бадбэ +абутаду,бвдтекэтвэ +абутоае,баоот +абутоб,удэв +абуттао,бвдтеккадд +абууатк,бадед +абуквто,двок +абукобу,вавт +абукувб,баккд +абуккка,бавэб +абуэауо,эотв +абуэодд,эоуб +абуэдвб,баеоб +абуэдуу,увду +абуэукд,баддт +абуээвб,увуб +абкбееэ,коаб +аааааад,ээва +аааааадв,уету +аааааадк,утэк +ааааааэ,бвдтекэбоа +ааааавв,квау +аааааве,ээвк +ааааавк,туук +аааааоа,уэвб +аааааоо,эувт +аааааот,ээоб +аааааоу,вк +аааааок,ээов +ааааада,утео +ааааадт,вакв +ааааадэ,евту +аааааед,деуд +ааааауа,тээд +ааааакт,бвдтекэбое +ааааакэ,бээе +аааавое,ваку +аааауук,бабау +ааааэа,ббато +ааааэба,ккдк +аааббуе,ував +аааббэв,ваов +аааббэо,уеае +аааббээ,оббэ +ааабваб,обтк +ааабвба,вбвт +ааабвбб,ээео +ааабвбт,ээее +ааабввв,ээеэ +ааабвов,детэ +ааабвду,баауу +ааабвеа,удко +ааабвеб,бвдтеккууу +ааабвео,ээтэ +ааабвеу,ээуб +ааабвеэ,окэу +ааабвув,ее +ааабвуу,еаоэ +ааабвкк,тэкт +ааабвэа,ээуэ +ааабвэу,веэа +ааабоаа,бааот +ааабоба,эээа +ааабобд,бвдтектэва +ааабова,удкб +ааабовв,эээе +ааабово,оаэу +ааабове,бааут +ааабовт,уодк +ааабовк,эээу +ааабовэ,уобо +ааабооо,удкэ +ааабооэ,кбуд +ааабодо,ууд +ааабоеб,уттв +ааабоуа,уэба +ааабоув,ууоэ +ааабоуо,обео +ааабоуу,баабт +ааабока,баабу +ааабокб,баабк +ааабокв,уобк +ааабоко,ку +ааабоэо,укбу +ааабоэд,уоде +ааабоэу,эо +ааабоэк,бааве +ааабдаа,воет +ааабдав,дбеу +ааабдао,дуеа +ааабдад,уэдо +ааабдак,баавэ +ааабдба,двоу +ааабдбб,бувб +ааабдве,бвдтеэабту +ааабдвк,бааоэ +ааабдоб,эууб +ааабдоо,кааб +ааабдка,утдэ +ааабека,убуб +ааабекк,каеб +ааабудк,уедб +ааавоок,бвдтекэебд +ааавдтв,овтт +ааавкав,бвдтекэдто +аааовев,баабб +аааовкк,оекб +ааадаук,кэке +ааадвкк,оввэ +ааадоед,туке +ааадтоэ,обтт +ааадтэт,утту +аааеоео,бабуд +аааееуб,укбв +аааеэуе,бвдтекекду +ааакауэ,твбв +ааактое,экоа +ааакудк,кбкэ +ааакуке,ээдэ +ааакктб,бвдтекэтэб +аааккуд,кбэб +аааэдад,кеэк +аааэеоа,эуув +аабаодд,утоу +аабаэуд,ууао +аабббтэ,эков +аабббку,дтвк +аабввеэ,эккв +аабвдто,ууэу +аабвдкт,увао +аабвке,квбт +аабвээе,вдко +аабдае,бвдтеэабуд +аабддбб,кодб +аабддеа,кэуэ +аабдтвк,тбеэ +аабеоэв,бвдтекктаа +аабеоэу,экке +аабедак,уекк +аабуаео,удуэ +аабуэев,уктк +аабкеэд,тквт +аававка,бвдтекэевэ +аавбеэу,удтэ +ааввэвк,укоу +аавдеуб,еэ +аавдтов,баб +аавдтда,ууау +аавдков,кбае +аавеват,утву +аавеоэб,ваоа +ааветтт,бавве +аавтбва,обтд +аавтдев,детк +аавтеаб,буад +аавтубб,уэтб +аавткао,уттк +аавкбаа,тэуд +ааоаоаэ,ээдд +ааодекд,бвдтектэбу +ааоуауе,баавб +ааоубет,бвдтекэтбу +ааоукув,обке +аадааэт,дэ +аадаоаа,ообк +аадбаовэ,тткк +аадеоет,едбо +аадеэок,вакк +аадкеот,ээкк +аадктае,утее +аадкквб,ээдб +ааебдво,укду +ааеткка,ббаде +ааектув,уетк +ааекуув,кбэв +ааеэодк,уевэ +аатвеук,ктк +аатообо,ууда +аатоету,таэт +аатувак,экве +ааткоак,бвдтеккубт +аатккэв,евук +аатэвув,ээуд +аатэдвв,уквэ +аатэддб,кэуу +аатэдтт,уеув +аауабвэ,бое +аауакву,эээд +аауаээа,эутэ +ааубвве,эудэ +ааукууд,ууав +ааукуэа,овка +аакаоао,каеу +аактадэ,баадв +аакуаву,бакту +аакувао,кабб +аакккев,бауеа +ааэаауу,товэ +ааэавээ,двоэ +ааэакта,туот +ааэбэтэ,окэо +ааэввдд,тээе +ааэвдве,бвдтекэевк +ааэвеэв,удте +ааэдова,баэее +ааэдкаэ,твау +ааэтэау,бвдтекэтбв +ааэуокк,туое +ааэукву,ээ +ааэктэе,эаав +ааэкуек,уеоу +ааээеак,бвдтекэеда +ааэээба,кбуу +абабаде,баэд +абаобвв,ууаэ +абаооее,ко +абаеатб,уеоа +абаебуэ,еоае +абаткту,декв +аббааэв,уоое +абббдоэ,бвдтекккбт +абббдкд,утоэ +абббубд,окуэ +аббое,уодб +аббтоэт,баэад +аббэкэу,еатв +абввэое,едад +абвовдв,экэт +абводет,бвдтеккккд +абвэаве,ука +абовута,деуо +абодеуо,ээак +абдбуаб,уауа +абдвбкб,бабет +абдвебу,бвдтекэоэд +абдвете,удэе +абдвекк,тоув +абдвуоо,эдбе +абдвуде,екду +абдвкдв,эвак +абдоавв,кбов +абдоаво,баотб +абдоауу,тотб +абдоаэо,бвдтекэбае +абдодкэ,тэау +абдодэб,бвдтекэаеб +абдоеао,дкео +абдоеот,тдоа +абдоуак,бвдтекэаэк +абддвэа,бвдтеккдвб +абддоаэ,тотд +абддоео,эеед +абддеек,дкдт +абддеуа,укек +абддэдб,уувк +абддэдт,текэ +абдеаоэ,убао +абдебад,кдтэ +абдеодо,бвдтекэако +абдедта,эвтт +абдекдэ,ббвоо +абдтаэа,куко +абдтбэт,бвдтекэатэ +абдтоек,эауа +абдттбу,уббу +абдттбк,баота +абдтубе,эвтэ +абдтэод,дууу +абдтэтб,удэо +абдуабб,увэа +абдубвв,бавтд +абдубэк,бвдтекэкео +абдувкт,бвдтекэаэв +абдутда,дкту +абдукое,етде +абдукоу,бавоа +абдукок,бвдтекэбут +абдквбв,бвдтекктдэ +абдквэд,тоуе +абдкотэ,бавеэ +абдэадт,бавэд +абдэбаб,баадб +абдэоеа,утэд +абдэебт,бвдтекэокд +абдэеву,ббате +абдэевэ,бауоо +абеатав,укте +абеатуе,ткте +абеаэбб,бдд +абеаэва,кабе +абеаэтв,кадэ +абебааб,уэек +абеббда,бвдтекэткк +абебууе,уеов +абеовко,деут +абеоттк,оэое +абеотуб,ббват +абедееб,экуу +абетэдт,эбвв +абкбета,баоук +абкбтеэ,тэбк +абквеао,баукк +абктдуе,бвдтеккууо +абктдут,бауоэ +абктеоа,теэо +абэдобе,утуа +аватвбэ,укаа +авбвддэ,бадав +авбэдуэ,бвдтеккддд +авбэдкв,куэо +авбэедк,дуао +авбэееа,убое +авбэтее,баееэ +авбэкба,тоео +авбэквт,коау +авбэкку,кукт +авватае,бввб +аввбвдк,оэв +аввбдэд,кэао +аввбэтб,уакб +авввдбт,эват +авввдбу,бвдтекэооэ +авввдбэ,ууок +авввеат,бда +авввевд,бабоа +авввуеэ,бвдтекктев +аввоаек,эдтб +аввоаеэ,бвдтекэббв +аввоооу,уеку +аввоетк,тукб +аввддед,кеоу +аввдетд,ттук +аввдэку,уоэо +аввебку,уттт +авветад,оккт +аввеуук,бвдтекэауа +аввтбэт,оббк +аввтеку,окке +аввтеэу,ваау +аввуетт,бауду +аввукоб,уудэ +аввэббэ,уук +аввэтбо,ттве +авобэеб,укбб +авоокое,бавбв +аводдуе,укуд +аводеву,вдкт +аводкба,баебу +авоедоу,кбуо +авоеуэб,дууо +авоеуэв,екбв +авоекбк,ткдб +авотдеа,уево +авотдеб,удтв +авотдев,баетк +авотдео,бвдтекэдво +авоэвеб,тетт +авдаебк,эаэт +авдоуоб,ууае +авдоуод,бвдтекэбэу +авдоуок,тдээ +авдоуоэ,баууе +авдоуээ,бауоу +авдтаэо,бвдтеккээу +авдууэа,бэку +авдуэкб,бвдтекэвак +авдэдоо,экэк +авдэувв,уубб +авдэутэ,укдо +авдэуээ,тако +авдэкав,экео +авеооэб,баубв +аветкут,ууе +авеудтд,вбео +авекоад,кода +авекдат,ут +автаовб,бвдтеэабуе +автбктт,уетв +автввкк,уубе +автвеау,уутэ +автотоа,ббаэе +автокдт,эадв +автокку,беа +автдббт,уэоу +автдвет,тбта +автдетб,от +автдуээ,квкд +автевот,бабээ +автеоэа,эукэ +авттдок,уваэ +автуокт,кдтк +автудэд,етоэ +автуебт,уэуа +авуадвэ,бвдтеккаеа +авубэто,двда +авубэте,баэве +авувбао,бвед +авувэбд,дб +авуовке,ееэв +авуодек,бвдтекэаут +авуоедт,баедд +авуотоб,бвдтеэаббд +авуеббу,баекд +авквекк,эээк +авквеэо,дуу +авкоэав,твкк +авкдатв,утед +авкдввв,тдкд +авкдеда,бэкт +авкдтэт,тобк +авкевау,экеа +авкетбб,дкбу +авкеует,бвдтекэббк +авкеукк,бакке +авкеуэд,эвау +авкеэбе,бэээ +авктавт,вавэ +авкуаду,тдуо +авкукэк,удка +авккаве,дкот +авккоэб,кобт +авккдае,бвдтекэвкк +авккдээ,утаа +авккэов,бабэб +авкэбоа,бвдтеккуаа +авэавев,эввв +авэбата,укка +авэбоба,уут +авэведу,бвдтекэеау +авэвтко,давд +авэдаук,ууэб +авэеотб,веэу +авэеуот,уооб +авэеуок,уеоэ +авэутбэ,тто +авэуэду,бббэд +авэуэдэ,бвдтекэеэа +авэкоте,тэкэ +авэктбб,бааэе +авээдтд,экээ +авээккт,ттад +аоаатеэ,уту +аоавоэо,эккд +аоавеоо,бвдтеэавке +аоаовае,уаев +аоаовуу,баоеэ +аоаоувд,кэео +аоаоэав,ууоу +аоадаук,баеба +аоадбеу,утеу +аоадбук,уоба +аоадбэд,уоек +аоаддак,ткду +аоадкэа,бббтт +аоатетв,бвдтекэоэб +аоатето,баудб +аоауавб,укое +аоаувэа,эувб +аоаудтб,твак +аоакдву,утдв +аоаккбу,уэбк +аоаккку,тдоэ +аоаэбэу,бтдб +аоаэдвт,бвдтекэээд +аоаэтуа,бвдтекккбо +аобааке,дкоб +аобавту,экку +аобаоев,уккв +аобаека,екак +аобатто,бвдтеккоуд +аоббвэд,бауэв +аоббккт,укву +аоббэбб,уеек +аобвдбк,дтеб +аобвуда,дтдэ +аобвкка,доэу +аобвкээ,кабв +аобвээу,экоб +аобовбд,уууд +аобовта,уэбд +аободвк,уект +аобоедо,ууэе +аобдккб,уэед +аобедтэ,уэтв +аобедуб,бадуе +аобедув,эвто +аобетек,бвдтеккука +аобекаэ,дуко +аобекеу,баэвв +аобкввэ,ткта +аобкекд,уттд +аобктав,уокк +аобктэо,ээае +аобкэвк,ббаэа +аовавкт,бвдтекээдб +аовбубу,бвдтеэаотк +аовбкуа,уэбв +аовбэкд,екеб +аоввваб,бактэ +аовветд,туэу +аоввктк,дутб +аовоабб,удуд +аовоаве,укот +аовоебк,дтут +аовотбв,эаот +аовотуа,ууба +аовоэкэ,баэов +аовдбуу,тбое +аовдудк,эукв +аовеаоаб,эбеу +аовтото,туев +аовтдтв,удэт +аовтева,тбку +аовтето,уоет +аовууео,уоту +аовктаа,тэуу +аовкууо,бвдтекэтут +аовкккв,тобо +аовкэте,уедэ +аовэаед,етад +аовэуоо,тевб +аовээка,утуд +аовээкт,еккб +аооадвб,эуот +аооаеуд,еудд +аооатоа,уууб +аооаэув,овбк +аообует,еэте +аообкке,дбэу +аооввов,кбтт +аоовдее,укук +аоовтад,укат +аоовтау,кбоо +аоовтба,ууэк +аоовэтт,укау +аоовэтк,одбб +аоооаок,тууб +аоооооэ,етее +аоодббб,еэеу +аоодбее,тээт +аоодввв,бвдтекккаа +аоодтвт,еэээ +аоодтдб,уээв +аоодэет,уевт +аооевва,уовк +аооеоед,дубв +аоотвэу,доед +аоотевв,ооао +аооубдэ,додб +аооудув,дттт +аооууув,укев +аооукоб,бвдтекэдкэ +аооуэдк,ообд +аоокбде,кадд +аоокбев,като +аооквду,уква +аоококе,тбка +аоококт,уток +аоокдоэ,доат +аоокдут,кбвэ +аооктдв,уэта +аоокует,уэвк +аоокууд,дута +аоокука,укке +аооэбэв,уэво +аооэвдт,уове +аооэоут,етаб +аооэоэв,этта +аооээдб,уктв +аодавдв,уууу +аодавуу,утев +аодавэв,уеао +аодаоаа,уукв +аодаоэк,уууа +аодадбд,ткод +аодадоб,уоот +аодадок,утуб +аодаеоо,бвдтеэаоуо +аодауод,уаао +аодауда,уаад +аодаэеа,уеоо +аодббаа,уэтк +аодббвд,едтэ +аодбвдк,укбт +аодбэеу,еоео +аодваке,каэе +аодввтт,кэее +аодвоад,утое +аодвтбо,дукк +аодоауа,туту +аодоеек,дкдв +аодотаа,укоэ +аодоквб,евба +аоддаве,дуку +аоддада,уээо +аоддаед,дуво +аоддбтб,тоае +аоддвак,бвдтекктэе +аоддвоб,уудт +аоддвде,удку +аоддете,укбд +аоддтуд,кбкк +аоддутк,укад +аоддукд,еукт +аоддэаб,удэк +аоддэеа,теок +аодедбб,оэва +аодедко,евеэ +аодееео,ууед +аодееуб,тбаэ +аодеттв,уэав +аодеуку,бвдтекэебу +аодеквв,еабе +аодтвэа,удээ +аодтвэв,тдбд +аодтеоо,дккб +аодккэе,еккт +аодкэкв,уееа +аодэбдв,дтту +аодэобб,уекв +аодэдав,укдэ +аодэеав,утод +аодэебт,утдб +аодэкээ,уэдэ +аоеаавк,уэад +аоеаовк,кадо +аоеадвк,бакте +аоеадкэ,еукэ +аоеауод,бабед +аоеаэве,уеад +аоеббвк,туеу +аоебокб,дквб +аоебдвв,етдк +аоебтоб,ткаа +аоебттк,эаее +аоебуде,ттоо +аоебуду,бвдтеккбед +аоебукд,дкбт +аоебкда,экад +аоебкто,токт +аоевакд,каок +аоеввао,уееу +аоевтэо,уэву +аоевкаб,бвдтеккувд +аоеоабо,дубо +аоеоаве,уквд +аоеоаеу,укдт +аоеодэу,уэбб +аоеоевк,дкуу +аоеоеот,кбат +аоеокде,дкув +аоеокто,уукт +аоедаоб,укуо +аоедаот,дкек +аоедбео,эутб +аоеддат,евод +аоеддее,бвдтекэеат +аоедебб,евдб +аоедтдо,дтеу +аоедкоэ,уоев +аоедэдэ,бабко +аоееввт,ууэв +аоееввк,ттуу +аоееоек,уэде +аоееокб,дудд +аоееоэд,едеб +аоееетв,укта +аоееето,уукк +аоеетав,кэко +аоеетбк,уоеа +аоееуту,дбуд +аоееуэв,еууэ +аоеекто,экка +аоееэдт,эбов +аоееэдэ,уэае +аоетбкэ,уобб +аоетвдо,туут +аоетдтт,уудб +аоетудв,бббуе +аоетууд,ттду +аоетктэ,уэак +аоеуаое,уэдд +аоеубэд,эдтт +аоеувуэ,кэдк +аоеуоуе,укае +аоеудээ,дкдд +аоеуеек,эбау +аоеуете,каоу +аоеуеуа,укуа +аоеууау,укуе +аоеуубв,эоэк +аоеукуу,уткэ +аоеуэвд,дуде +аоекаод,еаак +аоекаок,тэук +аоекббу,дкак +аоекбоб,увдо +аоекбде,дуда +аоекбту,дтэе +аоекбут,уутд +аоекбкв,еаад +аоекваб,укод +аоеквак,дуэк +аоеквбв,укоа +аоекввк,уэод +аоеквдк,ккоо +аоекотд,укаэ +аоекотк,уеде +аоекоуу,удда +аоекетд,тубу +аоекекд,екдо +аоекект,утвб +аоекубо,дкбб +аоекукт,дууэ +аоекктд,кбод +аоеэбве,утот +аоеэбед,дквт +аоеэвку,уккэ +аоеэетк,удуо +аоеэтуа,дкдэ +аоеэтэб,дкка +аоеэтэо,дубб +аоеэтэд,уквт +аоеэубб,уктд +аоеэуут,таут +аоеэууэ,укбэ +аоеээдт,еваа +аоеээта,тквв +аотаабб,екэа +аотабтв,еэво +аотавка,уэео +аотаетк,удвб +аотаттэ,утек +аотаубв,дудб +аотаэвэ,кбтэ +аотбаае,эоэа +аотбадт,уэкд +аотббэб,ууут +аотбвдэ,уэбе +аотбовэ,баооо +аотбоое,теоу +аотбебэ,удов +аотбтдэ,кбту +аотбуаа,дбут +аотбуде,евбе +аотбууа,укде +аотбкту,еэка +аотбэое,ддек +аотбэот,дтек +аотбэет,укоб +аотбэте,укуэ +аотбэуу,еэто +аотвдок,уэет +аотвдук,бвдтекэбтт +аоттдкк,дкбк +аоттевт,деде +аоттетд,тддэ +аоттуео,еутэ +аоттууа,туад +аоттууэ,дтув +аотткбэ,ебэб +аотткоэ,утау +аоттктэ,еуаб +аотувдэ,уэуб +аотудбб,еуээ +аотуеаб,каку +аотуубу,укку +аотуувт,утуо +аотуууа,дкут +аотууко,укба +аотууэу,уэау +аотуктд,деев +аотуэбэ,евбо +аотуэоб,деее +аоткббд,екде +аотквут,еэдб +аотковэ,утаэ +аоткотэ,ткбо +аоткеуд,уеуд +аотккэу,ууко +аотэвуа,дтэа +аотэвке,укаб +аотэоов,еууе +аотэодв,утэе +аотэоео,укэа +аотэдбт,тебб +аотэдеб,дуаа +аотэдув,тттб +аотэдуо,уэду +аотэдуэ,укээ +аотэеда,еэое +аотэеек,кэдэ +аотэекд,кауу +аотэеэд,еээу +аотэтоо,тавт +аотэтоэ,дкау +аотэуак,дукт +аотэукб,еэуу +аотэквд,эетк +аотэккд,уээу +аоуаауе,укак +аоуабба,еуэа +аоуабеэ,еабу +аоуавув,еэоо +аоуавуэ,тауа +аоуаоао,убаэ +аоуаоак,тбаб +аоуаооа,такд +аоуадээ,убео +аоуаеот,уудд +аоуаедб,ткдт +аоуаедв,уаак +аоуатбб,ууте +аоуатбв,тэдб +аоуаттб,ттта +аоуауод,уакв +аоуауеа,каба +аоуакок,ууад +аоуаэтэ,екэв +аоубббв,тата +аоуббвк,тэае +аоуббоо,эетб +аоуббке,екее +аоубвав,тэут +аоубват,дкву +аоубввв,еэок +аоубоек,бвдтекэукэ +аоубоуе,тадт +аоубоку,екае +аоубдба,евбв +аоубдеу,табв +аоубевд,еэее +аоубеуе,уэаа +аоубтав,уеед +аоубттв,утбб +аоубуба,дтуе +аоубквт,дкду +аоубквэ,уеот +аоубкек,уэдт +аоубэбт,еэкб +аоувава,тдвэ +аоувауэ,уует +аоувбвд,тткд +аоувбве,каэб +аоувбек,ууув +аоувбтв,уквк +аоувбут,еукб +аоуввве,уакэ +аоуввдв,еткк +аоуввка,еква +аоуввкб,удее +аоувобд,уктб +аоувоэв,уоао +аоувдеб,уевд +аоуведу,уэоэ +аоуведк,кбау +аоувтоо,табэ +аоувтед,дкбд +аоувтко,уккт +аоувуее,укда +аоувууу,уотб +аоувукд,еээе +аоувкаб,етбк +аоувкбд,тавд +аоувкео,екао +аоувктк,уеев +аоувкуу,убок +аоувэвд,уэот +аоувэоэ,уэбу +аоувэде,тткб +аоувэуд,тэео +аоуоабэ,еэбв +аоуоатэ,уауб +аоуоауэ,етдв +аоуоако,еэкв +аоуобвэ,туув +аоуовет,текк +аоуовэк,укео +аоуооав,тоод +аоуоооэ,еаба +аоуооев,экок +аоуодду,уеав +аоуодте,уетд +аоуодэт,тдбк +аоуодээ,утов +аоуоедт,дтто +аоуоеэу,укок +аоуотав,еувт +аоуоттт,уете +аоуотуу,еттк +аоуоубо,кает +аоуоута,еовв +аоуоуут,ттае +аоуоуэк,дуоэ +аоуокоу,увтт +аоуокте,бвдтеэаобк +аоуоктэ,етук +аоуокук,дтэк +аоуоэев,уоэв +аоуоэек,дудэ +аоуоэтд,уеко +аоудаво,удэу +аоудаеэ,уеуо +аоудакв,уубо +аоудбав,екуб +аоудбтв,уквб +аоудбэд,увов +аоудвао,дтвд +аоудвае,еоаб +аоудвоэ,дтво +аоудоэб,тбук +аоуддда,уебе +аоудтэк,тээв +аоудуоа,еэко +аоудудв,табд +аоудууэ,еэув +аоудуэв,евдд +аоудкоу,еобд +адкбаее,баоте +адкбато,баоуе +адкбатк,баока +адкбауб,бадеа +адкбаук,баебо +адкбаэо,бавву +адкбаэк,ээат +адкбббв,бавоо +адкббоо,бавуэ +адкббдв,бадтв +адкббдэ,бавэа +адкббеу,баддб +адкббеэ,бавэк +адкббтк,бвдтекквек +адкббкэ,баодв +адкббэа,баодэ +адкббэб,бавот +адкбвау,бадба +адкбваэ,экдб +адкбвбв,бавте +адкбвбэ,баууо +адкбвоэ,баеот +адкбвда,баквт +адкбвев,бадбб +адкбвэв,бвдтекквкб +адкбово,баеаа +адкбову,баовт +адкбооу,бавэо +адкбодд,бадод +адкбота,эвдв +адкбдао,бадду +адкбдда,бадвт +адкбдеа,экав +адкбдуб,бадео +адкбдка,баокт +адкбдкв,бавкв +адкбдкк,бакву +адкбдкэ,бадаа +адкбеат,бвдтекукув +адкбеоэ,бавуб +адкбеев,эудд +адкбето,бабоу +адкбека,этеб +адкбеэе,экее +адкбеэу,этее +адкбтба,экбд +адкбтбе,экод +адкбтбт,экат +адкбтвв,экту +адкбтво,бакуо +адкбтдв,баедо +адкбтдд,баоэе +адкбтуд,баеад +адкбтук,бауво +адкбткэ,баева +адкбтэв,баеее +адкбува,ббввб +адкбуво,эукд +адкбуеу,этек +адкбуув,бадбд +адкбуут,баодк +адкбукб,баоее +адкбуко,баеое +адкбукк,баооэ +адкбуэт,бавэв +адкбкаб,бадэт +адкбкае,баода +адкбкво,бавдд +адкбккк,бауеу +адкбкэо,баоуу +адкбэво,бвдтеккбдв +адкбэдд,баоек +адкбэет,баеет +адкбээо,ббвдт +адквадо,бадуо +адкваээ,бабтв +адквбав,бббээ +адквбуе,бвдтекккдв +адквбуу,эута +адкввку,бавкб +адквобб,бадвк +адквовв,бадак +адквову,эууе +адквовк,бавка +адквовэ,баеао +адквоок,бвдтеккатэ +адквотб,бадад +адквото,баеев +адквотд,бавэу +адквокт,бвдтекэддт +адквдаэ,баедэ +адквдбд,бакоб +адквдбк,бадву +адквдда,бвдтекэтвб +адквддо,бауеэ +адквддк,бвдтеккодэ +адквдед,баббо +адквдет,бвдтекэукб +адквдеу,баебэ +адквдкб,бауек +адквебв,бадвв +адквебо,ббвкэ +адквект,баевэ +адквтэд,бавэт +адквуоб,экеб +адквуоу,баевв +адквуед,баедб +адквутд,баова +адквууэ,бадва +адквуэд,бауэб +адквуээ,эуээ +адквкаа,эккб +адквкав,баеео +адквкае,бааоо +адквкдт,баувд +адквкуе,баоаэ +адквкут,баоак +адквккв,баетв +адквкко,баоэв +адквккд,баебд +адквкку,экот +адквкэа,баууэ +адквкэв,бааее +адквкээ,ббабэ +адквэвв,экэа +адквэвд,бвдтеккокк +адквэдб,баоэо +адквэде,баууд +адквэеэ,бвдтеккубе +адквэтк,батбб +адквэко,экта +адквэке,бадэо +адквээб,бавуа +адквээе,баеда +адкоаок,баеоэ +адкоадт,бадуа +адкоауа,бауот +адкоаув,баука +адкоаэе,баетд +адкоаээ,баоко +адкобво,бавеу +адкобву,бвдтеккбоа +адкобдк,бакоэ +адкобдэ,баобе +адкобэо,экэд +адковаб,экэу +адковду,бвдтекэевт +адковэв,баобо +адковэк,бауве +адкооба,бвдтекэкбб +адкообо,баодт +адкооед,баутд +адкооуэ,бакда +адкооэв,бвдтеккатк +адкодвт,баоеу +адкодвэ,бавтб +адкодоо,бвдтеккаке +адкодеэ,баввв +адкодтэ,баеае +адкодкв,бадбт +адкодко,баоээ +адкоееа,ээау +адкоеее,бауву +адкоето,бауэа +адкоеко,баквк +адкоект,бвдтекэдда +адкотбк,бвдтеккббб +адкоубк,баебт +адкоуут,баеек +адкокба,баету +адкокбу,бадтб +адкокбк,бавтв +адкокбэ,баоае +адкокдо,бадту +адкокдд,бвдтекэоэу +адкокдт,бауув +адкокуо,ээбу +адкоэаб,бавто +адкдабб,баоба +адкдабе,баебк +адкдаву,бавоэ +адкдавк,баодд +адкдадо,бабев +адкдадк,бвдтеккбае +адкдбда,баату +адкдбдк,бадтк +адкдбее,бабое +адкдбта,бавтэ +адкдбуб,баоаб +адкдбуо,ббвбв +адкдввт,бавтк +адкдвоэ,бавек +адкдвдо,баобт +адкдвеб,бвдтеккбдб +адкдвкт,бвдтекэвкэ +адкдвээ,баоку +адкдову,бабее +адкдоеа,бабео +адкдоту,баокк +адкдоув,бвдтекэддв +адкдоуо,бадбо +адкдоэо,баоеб +адкддау,бабов +адкддба,баутт +адкддбв,баээе +адкеэад,бвдтеккотв +адкеэбк,бабдэ +адкеэве,бвдтеккаув +адкеэву,баетб +адкеэтэ,баеку +адкеэуб,бавуе +адкеэка,баоаа +адкеээб,бавео +адктаае,бабоо +адктабо,бадбв +адктабэ,баевк +адктавт,бвдтекктоо +адктаде,баотэ +адктадт,бавкт +адктаду,баеов +адктает,бадао +адктатв,бадку +адктбвв,бвдтеккокэ +адктбдт,баееб +адктбкд,баово +адктбэд,баеед +адктввб,бвдтекэбов +адктввт,баувв +адктвтт,баувб +адктвкб,бвдтеккбоу +адктоаа,бвдтеккоео +адктоао,баает +адктовв,бавод +адктооб,бвдтеккбдо +адктодо,баубэ +адктоек,бабду +адктота,баеоа +адктоте,бадоэ +адктоуб,баокд +адктдов,бавду +адктддт,бвдтеккдав +адктдтб,бадбе +адктдке,бадкк +адктедк,бавтт +адктеее,баеву +адктетв,баеоу +адктекб,бауее +адктекэ,бадоб +адктеэв,бакбт +адкттдо,баддд +адкттэу,баокб +адкттэк,баетт +адктуаа,бадда +адктуаэ,бабеэ +адктууэ,бауов +адкткбэ,баубк +адкткоа,баоод +адкткду,бауок +адкткта,баоэб +адктктв,бааук +адктээт,бвдтеккдта +адкуавт,бвдтеккодо +адкуадо,бауое +адкуатв,бабкк +адкуатк,баоет +адкуаээ,баете +адкубба,бадке +адкубоб,бадээ +адкубдэ,баоеа +адкубее,бадуэ +адкубтб,бббед +адкубкб,баувт +адкубкв,бавов +адкубэа,бадкд +адкубээ,баоэк +адкуваб,ббобб +адкувбб,бааэб +адкувтт,бауоб +адкувув,бббеэ +адкувке,баоду +адкудаэ,бабто +адкуддт,бвдтеэабве +адкудэа,бвдтекэдеу +адкудэт,ббаоб +адкуеаб,бабуу +адкуевв,бауод +адкуевк,бавуу +адкуеоо,бауак +адкуетк,бвдтекэввб +адкуеуа,бвдтеккбео +адкутву,баодо +адкутоу,бвдтеккдоб +адкуттд,бадеэ +адкуттэ,бвдтекэеее +адкутуа,бавдк +адкууао,баввэ +адкуубв,бадэе +адкууве,ббаув +адкуувэ,бавдв +адкууед,бавдт +адкууеу,бвдтекэубт +адкууэб,бавок +адкукак,бауэе +адкукэу,бадек +адкуэод,бвдтеккдеу +адкуэдк,бвдтеккбкд +адкуэту,баоэт +адкуэкт,бвдтеккова +адкуээо,бааэд +адкуээк,бвдтекэттв +адккаоэ,бадтэ +адккадв,бавдэ +адккаек,баудв +адккбту,бвдтекккао +адкквау,баоде +адккввд,бааэу +адкквое,бадоа +адкквек,бабкт +адккоаа,баббэ +адккоаэ,бавев +адккобт,бабкв +адккобк,ббавб +адкковб,ббако +адккоеу,бабаэ +адккотк,баува +адккока,бауут +адккдбо,бабвд +адккдбе,баевд +адккдтд,баедк +адккдэд,бвдтекэаво +адккедб,бвдтеккдоу +адкктад,бвдтеккуко +адкктув,бадкэ +адкккат,бвдтекктуэ +адкккдо,ббвде +адкккеб,бвдтеккдад +адкккев,бвдтеккддо +адкккуэ,баваб +адккккб,бауеб +адккэаэ,бббое +адккэво,ббвув +адккэеа,бвдтеккдвт +адкэабо,бвдтекэоат +адкэаод,бвдтеккбво +адкэатв,баета +адкэбвв,бвдтеккукэ +адкэвту,баееа +адкэвуе,баоуд +адкэодэ,бвдтекэабу +адкэоеб,баэбд +адкэотт,баеок +адкэоуо,бауко +адкэдве,бабэд +адкэдок,баубу +адкэддк,бадка +адкэдеб,баддэ +адкэдев,бадэв +адкэдтв,баеат +адкэдко,бабкэ +адкэдэу,бадув +адкэебэ,бвдтеккаэт +адкэеде,бвдтеккдвэ +адкэеду,ббвуа +адкэеев,бвдтекэобэ +адкэето,баедв +адкэтвв,бвдтеэабвб +адкэтве,бвдтеккбуе +адкэуек,бвдтекэтуо +адкэуеэ,бабэк +адкэута,бавба +адкэкве,ббоаа +адкэкуо,бауэо +адкээвэ,бават +адкээто,бавау +адэааок,баутв +адэааээ,бавкд +адэабоэ,бауев +адэабдо,бауед +адэабтб,бауау +адэабтк,бвдтекккэв +адэабэт,баууу +адэавдк,бвдтеккдбо +адэаодт,бвдтеккдеа +адэаоду,бвдтеккоку +адэаоут,баууб +адэаокб,баувэ +адэакэо,бвдтеккодв +адэаэак,бвдтеккаэу +адэаэбэ,бвдтеккбтд +адэаэвб,баутэ +аоудкек,кбук +аоудэбэ,кэду +аоудэоа,уэдк +аоудэов,укеа +аоудэеб,татд +аоуевут,каук +аоуеоов,кеео +аоуедау,утэв +аоуедоэ,еэба +аоуедтт,еуау +аоуееэа,уедд +аоуекэк,еуод +аоуеээу,татт +аоутадк,тбак +аоутбтв,еувд +аоуттэб,еуте +аоутуэв,укко +аоутуэу,туэт +аоутквк,еуут +аоуткэд,эубу +аоутэае,уээб +аоууаво,ууеу +аоуубао,уеод +аоуубат,кбвд +аоуубак,таук +аоууввк,еват +аоуувук,теуб +аоуувэе,бадук +аоуувэу,дток +аоууобв,таба +аоууобо,ттуо +аоууобк,табе +аоууовт,екот +аоууоде,таве +аоуудво,кабд +аоуудут,еэае +аоуудкэ,така +аоууеак,бааэа +аоуутбу,тадб +аоуутвб,еттв +аоуутво,тадо +аоуутву,еутт +аоуутвэ,екэк +аоууткэ,укбк +аоуутэв,тоов +аоууута,еэов +аоууукк,уека +аоуууэв,еэед +аоуукэа,екуа +аоууэао,еэбо +аоууэок,тббе +аоууэоэ,екуу +аоууэее,уэвв +аоукаае,кэкб +аоукабв,еквт +аоукату,укоо +аоукауб,еэод +аоукаэт,укао +аоукббб,таед +аоуквдв,еэек +аоукоее,етеу +аоукоуо,таоо +аоукоуу,кэеа +аоукдад,таеа +аоукдбэ,дуэт +аоукдээ,каэу +аоукеав,еэеб +аоукетв,еэтк +аоуктад,еуао +аоукуаб,уэат +аоукубв,тадд +аоукуеа,тааб +аоуккбу,удбт +аоуккод,татк +аоуккеа,етэт +аоукккэ,еобу +аоукэбо,уууэ +аоукэво,ттээ +аоукэое,тбкк +аоукэтд,баакб +аоукэук,тудэ +аоуэабб,уеэт +аоуэауб,етбу +аоуэаэт,еутд +аоуэбаа,ектт +аоуэбав,еэеа +аоуэбвт,уэээ +аоуэбоэ,еэтб +аоуэбде,екау +аоуэбеэ,тквб +аоуэбуу,тэко +аоуэваб,уктт +аоуэвбв,екве +аоуэвбе,еэдо +аоуэвдв,туву +аоуэоаа,еуэу +аоуэобк,уэаб +аоуэобэ,еэбе +аоуэовб,уееэ +аоуэовэ,еуэв +аоуэооб,таэе +аоуэото,еуоу +аоуэдэв,еувэ +аоуэдэк,тэкд +аоуэебэ,еэбу +аоуэета,еээо +аоуэтав,таоэ +аоуэтдо,еэдв +аоуэтут,екео +аоуэткт,еэуд +аоуэтэе,укто +аоуэтэт,екку +аоуэуоа,еуеэ +аоуэуоэ,еэоа +аоуэуту,эвеэ +аоуэуэб,тавб +аоуэкак,екое +аоуэква,уээе +аоуээдо,екоб +аоуээдт,укдв +аоуээев,еэвб +аоуээка,етду +аоуээкв,еэет +аоуээко,кабк +аокааау,екэд +аокааео,еуде +аокаббд,етда +аокабда,ууак +аокабтк,уутб +аокабуа,бвдтекэукв +аокавбк,еубе +аокавок,етбв +аокавдв,уука +аокавке,бвдтеккэво +аокаоду,таае +аокадоо,кквб +аокадеу,тдое +аокаеае,кбвк +аокбевб,оэээ +аокбевд,едае +аоктеок,утэт +аокттад,екте +аокттау,едбэ +аокттое,тоук +аокттуа,етээ +аоктуак,кбув +аоктуба,тебт +аоктуве,еэту +аоктуэв,екоа +аокткдв,еэоэ +аокткте,таев +аокуабд,укуб +аокуабэ,еэкк +аокуадв,када +аокуаев,еуео +аокуаэб,кекк +аокуаэв,еэео +аокубео,табк +аокубэд,тктд +аокувдд,еэаб +аокувев,еуов +аокуоат,таоб +аокуоэк,тодэ +аокудво,етту +аокудэв,кебо +аокудэе,увод +аокуекв,тдее +аокуеко,ткбе +аокууек,бабдб +аокууэб,теоб +аокуктэ,бвдтекэтву +аокукуо,еэтэ +аокуэае,кэбу +аоккату,еэев +аоккаув,еээв +аоккбау,тккэ +аоккбоэ,таое +аокквбо,еута +аокквэб,еубд +аоккоао,утвв +аоккобо,баобб +аоккдта,еэак +аоккдуо,баэээ +аоккдээ,едод +аоккета,утбв +аокктбд,екуэ +аокктэа,еуоб +аоккууб,тоеу +аоккуэа,еуад +аоккков,теда +аоккэаэ,ууэа +аокэаэт,теаа +аокэбет,теке +аокэбек,екбб +аокэбеэ,тток +аокэбкв,тобт +аокэвва,тубе +аокэвво,еэвк +аокэобб,еуэк +аокэдво,тебе +аокэдет,уэао +аокэубк,эеее +аокэууа,ткоо +аокэууу,уауе +аокэкдб,каэа +аокэкта,ттвб +аокээао,ууов +аокээуэ,еуеа +аоэааак,уедк +аоэааэб,екдв +аоэааэд,едат +аоэавоб,бвдтекэтвт +аоэавое,тдка +аоэавко,уевв +аоэаооо,тату +аоэаото,ктду +аоэадоа,ткэт +аоэадоб,ткэу +аоэаеао,таоу +аоэаедд,етэу +аоэаеев,таао +аоэаето,тэуэ +аоэатак,еэбк +аоэатбв,убдб +аоэауву,екав +аоэакад,едвб +аоэакбб,теба +аоэакда,еэуо +аоэактт,убот +аоэакко,тдтк +аоэаэод,еутб +аоэбабе,еэку +аоэбадв,уээа +аоэбата,таод +аоэббеа,табб +аоэббуа,куав +аоэббук,таву +аоэббку,тову +аоэббэд,тббу +аоэбвуо,екуд +аоэботэ,тдвк +аоэбокв,тдто +аоэбоэд,едев +аоэбубб,етуе +аоэбубэ,укед +аоэбудт,бвдтекэеок +аоэбкуе,еуоа +аоэвавк,еттд +аоэвакт,утбт +аоэввае,еквб +аоэввбо,екка +аоэвввв,еудв +аоэввву,ктет +аоэввдэ,еуот +аоэввтк,еууу +аоэвове,еуав +аоэвооу,еткт +аоэвеоо,татв +аоэвутв,еткд +аоэоадэ,уукб +аоэоаее,еука +аоэобаа,туво +аоэобеб,эедэ +аоэобтв,етко +аоэовво,удуу +аоэовтд,укту +аоэообв,туед +аоэооод,тоеэ +аоэоодо,еткб +аоэодод,туае +аоэоеэа,етеб +аоэотво,уутк +аоэотву,еэао +аоэотка,ууее +аоэоуао,екбт +аоэоует,еукк +аоэокод,еэуе +аоэокоэ,кааа +аоэоэвк,етув +аоэоэоа,эадэ +аоэоэкт,етдэ +аоэдаук,таеб +аоэдбаа,бвдтекэтте +аоэдббд,тобб +аоэдббт,бвдтекэкдк +аоэдбкб,екеу +аоэдвое,тоад +аоэдвдт,таеэ +аоэдвдэ,уаэу +аоэдвее,ектэ +аоэддаа,ткеу +аоэддад,кабэ +аоэддед,укво +аоэддуд,баээк +аоэдеоу,таов +аоэдеда,увдв +аоэдтау,твэе +аоэдуае,бвдтекэеуу +аоэдуод,еттт +аоэдуэб,еуда +аоэдкаб,тева +аоэдквб,тобд +аоэеаве,квве +аоэеавк,уаэа +аоэеаот,убдэ +аоэеаде,тоуа +аоэеаду,тдэу +аоэебкб,тота +аоэебкд,уеет +аоэедек,бадок +аоэедук,тоеб +аоэедэв,эбат +аоэедэе,тутт +аоэеуеу,ттвд +аоэекво,ттеб +аоэеэау,етбд +аоэеэба,уукэ +аоэеэта,тдук +аоэтауа,тоуу +аоэтаэе,еуве +аоэтбва,теуд +аоэтбуе,бвдтекэеаэ +аоэтваа,теое +аоэтвбе,уттб +аоэтвка,тедт +аоэтодт,тдаэ +аоэтдэб,ттте +аоэтеаэ,утто +аоэтееэ,теээ +аоэттае,тедк +аоэттде,кбэд +аоэттеу,ттдо +аоэтттд,теку +аоэттуд,тодо +аоэттку,туба +аоэтуае,теоэ +аоэтубе,кебе +аоэтукд,тоба +аоэтуэо,ттбэ +аоэткае,екба +аоэткев,уедо +аоэткед,етва +аоэткуе,тоээ +аоэткут,тдаб +аоэткке,квбк +аоэткэо,ттао +аоэткэт,тдду +аоэтэак,тдкб +аоэуаат,уоэк +аоэуавт,тебу +аоэуаэе,ттеэ +аоэувбв,коеу +аоэувбо,ткву +аоэувеб,тоот +аоэувев,ткбу +аоэувтб,ттде +аоэувкв,тете +аоэувкк,тткв +аоэуоао,теко +аоэуобк,теэа +аоэуоду,ттау +аоэуоет,еувб +аоэутов,уеуэ +аоэутеу,ттбу +аоэутук,тдбт +аоэутка,тдэо +аоэууоэ,тддб +аоэукве,тедд +аоэукдв,тдэв +аоэукту,ттеу +аоэукуд,тетб +аоэукэб,уабв +аоэуэаа,ууеэ +аоэуэбо,тдкт +аоэуэдо,утве +аоэуэет,тууа +аоэуэке,тоат +аоэкбдд,теов +аоэквду,тккк +аоэквэб,теео +аоэквэв,тбет +аоэковт,тэак +аоэковк,тэбе +аоэкооэ,тэдв +аоэкото,удук +аоэкоте,тоэд +аоэкоуб,тоэу +аоэкоув,тдед +аоэкокв,тееу +аоэкоэд,тека +аоэкоэе,ттак +аоэкдбо,теаэ +аоэкдоэ,теед +аоэкдтк,тдеа +аоэкеаб,уедт +аоэктдо,етов +аоэктет,тдвв +аоэктук,теак +аоэкутд,тдэт +аоэкуту,теев +аоээадд,каод +аоээаку,еэбэ +аоээаэа,тдав +аоээбтд,еков +аоээооо,такт +аоээооу,такб +аоээодб,тоаэ +аоээоуу,теот +аоээоэе,тэтк +аоээдэа,тдуе +аоээевб,ккоу +аоээевэ,баэба +аоээеод,теав +аоээедэ,катв +аоээтаэ,утад +аоээтод,тдеу +аоээкдк,тоек +аоээкек,тоау +аоэээоу,убвт +аоэээдд,утбк +адааавк,теуэ +адаааеэ,тбдэ +адааатэ,тбкб +адааеаб,теаб +адааеаэ,текд +адааетб,тдбо +адааеке,тодт +адаатбе,ткуе +адаатбт,токд +адаатбк,уакт +адаатвв,тове +адаатоа,туак +адаатдэ,ттод +адааттд,ттек +адаатуе,ттдв +адааткэ,баотт +адаакбэ,уоуб +адаактд,эоде +адаакуо,убве +адаетое,утоб +адаетеб,кббд +адаетео,токв +адаетеу,ттат +адаэтко,тедв +адаэткд,тедо +адаэтку,тоту +адаэтэу,теув +адаэуау,бвдтекэкву +адаэуаэ,тебв +адаэуэе,кбут +адаэквб,тува +адаэкте,куве +адаэкэе,уаее +адбааэт,тдтб +адбабэу,теэв +адбавот,тбкв +адбавок,каву +адбавдв,теде +адбавуа,убат +адбавэв,тдэб +адбаоак,тобэ +адбаооу,тевд +адбаоед,укэу +адбаоээ,тдта +адбадак,ттва +адбадво,бвдтекктке +адбадоэ,ткук +адбаддд,теет +адбадде,тдеэ +адбадкт,укве +адбаеуд,удод +адбатбо,уато +адбатек,удбу +адбаттт,тоуо +адбаттк,теек +адбауае,тоет +адбаубу,эаеэ +адбаубк,эуоэ +адбакву,тдев +адбаэбб,тодб +адбаэта,уотэ +адбаэтд,уков +адбаэкд,товд +адбаээд,экбб +адбаээк,ккут +адббауб,теэу +адбббб,тоеа +адббббк,тдтт +адбббое,эувк +адбббкд,тоак +адбббку,ттэб +адббват,ттав +адббвев,тооу +адббвка,убдо +адббото,укув +адбботе,тэтт +адббдва,кетд +адббдув,ткээ +адббеот,ттвэ +адббедв,кббэ +адббеэо,увээ +адббтоа,тдуа +адббтот,тбкт +адббтдэ,тебд +адббтте,тдоу +адббттт,туэд +адббткд,ттбт +адббувб,тевв +адбвбте,бвдтекктду +адбвбкд,тубо +адбввэу,ттту +адбвуед,ттэу +адбоуда,тдкк +адбоудт,ткку +адбоуто,тдео +адбоууэ,уктэ +адбоуэк,удто +адбокэа,кббу +адбокэе,утао +адбоэву,ттаб +адбоэдд,тдот +адбоэеа,удуа +адбдаат,квко +адбеавэ,теэт +адбебео,тэдд +адбебеу,ткуэ +адбевба,тбуд +адбеооб,ткеа +адбеодт,теод +адбедбт,ттет +адбедоу,ттвт +адбедто,тдвт +адбеееб,кбда +адбееет,тооэ +адбетае,тдет +адбетбк,тдуб +адбеута,удоб +адбекво,тэот +адбекдв,увеб +адбекет,эбэк +адбекта,тоэо +адбектб,бвдтекэтку +адбекте,тэте +адбекку,тддв +адбекэт,тдак +адбеэду,ттбв +адбеэее,ттув +адбеэуб,твуа +адбеэуд,тоэб +адбеээб,токэ +адбеээу,теэе +адбтаае,увдк +адбтабб,удвд +адбтабо,тобу +адбтабд,тттк +адбтаку,ттвк +адбтбба,ткут +адбтбек,убдк +адбтбкд,тект +адбтбэк,тевэ +адбтвав,эуоу +адбтвао,утта +адбтвбв,катк +адбтвко,ттуэ +адбтооб,тэеб +адбтоов,тэед +адбтоду,эбуа +адбтоед,тоэа +адбтдба,туау +адбтдбб,ттуб +адбтдбо,кдто +адбтдбу,кдтв +адбтдуа,бакэб +адбтдко,тдвд +адбтдкк,ттвв +адбтдэт,кбба +адбтдэу,тэвт +адбтеау,тдэк +адбтеаэ,ууек +адбтеба,кбте +адбтеку,тебэ +адбттб,тово +адбттве,тква +адбттву,уаэт +адбттек,тддо +адбттте,квот +адбттэд,утат +адбтуот,тэат +адбтука,увэе +адбтуку,убае +адбтуэт,уоав +адбткак,уаку +адбткбв,увто +адбтэдд,кттв +адбтэдт,тэту +адбуааэ,тдбб +адбубте,теду +адбубко,утоо +адбувок,тооб +адбуовт,ткеэ +адбуоок,кбвб +адбуоэу,ттво +адбудад,ттку +адбудат,квов +адбудбэ,кбве +адбудод,тоут +адбудое,ттэе +адбудто,увве +адбуевк,уоте +адбуевэ,тэде +адбуеоо,ккбе +адбутбд,тээб +адбутвк,тков +адбутоа,ууке +адбутоу,уууо +адбутеу,уокд +адбутек,ктдт +адбутеэ,укеб +адбуубт,тктк +адбууте,ткэд +адбуука,квте +адбуукв,кеее +адбууэт,тккт +адбукбк,теао +адбуквт,тэвк +адбукеа,уаэо +адбуктв,убвэ +адбуктт,уоуо +адбукту,уеат +адбуктэ,тээк +адбуээу,увед +адбкабв,тдут +адбкаво,увту +адбкаов,тэво +адбкаод,увкт +адбкаоу,теад +адбкаеа,тоэт +адбкбво,тдуэ +адбкбву,удак +адбкбкд,убак +адбквао,тоэе +адбквбк,тдоо +адбквбэ,утуу +адбквев,тэуа +адбкоак,тккв +адбкоеэ,увое +адбкдат,ттэд +адбкедо,уоук +адбкедэ,тэтв +адбкеев,увте +адбкекк,увдд +адбктод,ббаео +адбкттк,ктеу +адбкуоб,тевт +адбкууо,уаэб +адбкукк,ттэа +адбкукэ,уткд +адбккав,тэоу +адбкктд,тоуэ +адбккке,ээад +адбкэбе,удув +адбкэка,тктэ +адбэаве,удтт +адбэадв,укуу +адбэаув,убдд +адбэакт,убод +адбэаэк,тдве +адбэбад,убеб +адбэввб,тват +адбэвот,увэу +адбэвто,уоуэ +адбэовд,бвдтеэаобт +адбэооа,тдао +адбэоув,кекв +адбэдвт,эатв +адбэдкэ,твуо +адбэдэа,ууэт +адбэевк,твку +адбэеэу,квуб +адбэеэк,баобв +адбэеээ,бвдтекэуту +адбэтоо,уатб +адбэткд,уадт +адбэубд,ттут +адбэуое,кедб +адбэкау,уввк +адбэкуб,уатд +адбэкуе,убвк +адбэкэб,уатт +адвааад,уаеа +адвааат,ткуб +адваабб,уввб +адваабд,увво +адвааод,удэб +адваадо,увоу +адвааеа,тэвв +адвааеб,убво +адвааэб,товт +адвабоо,ттто +адвабое,тету +адвабтк,тэка +адвабэу,удеу +адвавад,бвдтекккбу +адвавед,эете +адваоак,квет +адваодо,ууаа +адваоеэ,уеуа +адваоуб,увбт +адваоут,ткуд +адваоэд,удао +адвадаб,твэв +адвадвб,увут +адвадве,уебб +адвадвт,уебв +адвадоа,увэо +адваддб,уакд +адвадто,тэвэ +адвадуб,уббб +адвадку,тэао +адваеуб,увуо +адваекб,увка +адватат,тэбэ +адватвб,увкк +адватву,увэб +адватэе,эеуа +адваувб,бабеу +адвауоо,тэее +адвауде,тэет +адвауэа,тктб +адвауэк,убду +адвакаб,эеут +адваквв,уаэв +адваквд,тэбд +адвакэв,увуэ +адвакэт,утвд +адваэав,кеек +адваэбэ,ткэо +адваэед,убау +адваэеу,увет +адваэтт,увбо +адваэту,увбе +адваэув,эате +адваэуе,ткке +адваэкт,уаув +адваэку,уоэа +адвбаав,кдэе +адвбаат,тэба +адвбабо,кввэ +адвбабе,увуа +адвбавт,убав +адвбаоо,уоуд +адвбакв,твэб +адвбвао,увкэ +адвбвбд,кввк +адвбвот,квут +адвбоое,твба +адвбоуб,твэа +адвбдау,удуе +адвбдво,экае +адвбдтт,уаэе +адвбдуэ,уудо +адвбдэб,тэек +адвбеае,удев +адвбедо,эето +адвбедд,уббэ +адвбеэе,ббаое +адвбтак,кутб +адвбтба,тоев +адвбтбт,уддб +адвбтва,кете +адвбтед,ткэк +адвбтуо,уеаэ +адвбтук,тккд +адвбубт,тэбв +адвбуев,ткэб +адвбукк,ууде +адвбкаа,убаб +адвбкбе,увев +адвбкоу,ууаб +адвбкеэ,удвэ +адвбктб,тэоо +адвбктд,увео +адвбкуо,убвб +адвбкэо,эбае +адвбэбо,ткао +адвбэдт,уутв +адвбэду,туаа +адвбэед,квек +адвбэуэ,увку +адвбэкб,убба +адвбэкв,квэк +адвбээе,бакеэ +адввбоа,увее +адввбов,ууео +адввбоо,уааа +адввбдт,эквт +адввбув,кова +адввбэб,уакк +адвввао,уаео +адввваэ,бакба +адвввоу,тэав +адвввта,тэтд +адвввуб,бвдтекэткт +адвввув,увда +адввобд,уудв +адввоет,каад +адввоте,увек +адввотт,тэкк +адввоуе,уоко +адввоэт,ткаэ +адввдбэ,удок +адввдтт,кеев +адввдут,квтб +адввеба,эвое +адввебу,уаек +адвведк,укбо +адввтда,эееу +адввтэд,убву +адввуву,тэок +адввука,каео +адввкво,тэва +адввкве,уаеб +адввкдд,удвв +адввкте,кева +адввккв,квуе +адввэву,куоа +адвуоов,увву +адвуккт,бвдтекктэо +адвукэв,уоээ +адвэубв,тэоа +адвэубк,увкв +адвэудв,увбэ +адвэуеу,тэдт +адвэкве,уэке +адвэкод,куту +адвэкее,уебд +адвээеа,тэбу +адвээкв,ууээ +адвэээб,уебу +адвэээв,баеве +адоаавэ,тэоб +адоаадк,бвдтекккуб +адоааку,экуб +адоабов,убоу +адоабоу,квкк +адоабтэ,увоо +адоавае,тэвб +адоавау,бвдтекккуэ +адоавок,кеау +адоавдо,тэое +адоавеу,уоув +адоаоаа,ктдо +адоаову,эатб +адоаотв,удаб +адоаото,тэтб +адоаотд,бвдтекккэд +адоаоут,увдт +адоадау,уата +адоадбд,каек +адоадбк,удоо +адоадеу,удау +адоадуэ,увеа +адоаеут,уатк +адоатбу,ткат +адоатвд,ткак +адоатву,уако +адоатвэ,убоб +адоаткк,уату +адоауоа,уубт +адоауек,бакбд +адоаууу,кедд +адоакву,убад +адоакое,уака +адоакоу,уауу +адоакде,уоат +адоактв,удео +адоаэау,кеуа +адоаэтд,ктде +адоаэте,квту +адоаээо,ткко +адоаээк,тэод +адобаат,уаед +адобатк,увбу +адоббат,увке +адоббуд,кеаэ +адоббуе,уауд +адоббут,кеао +адобввт,уеба +адобвоу,уокт +адобоав,квта +адобоуэ,тэда +адобдаа,кекб +адобдбк,эатд +адобддб,баадд +адобдуа,уаук +адобебт,кеаа +адобебу,увтэ +адобедв,бабтб +адобетэ,уодо +адобеэт,удбд +адобтао,удед +адобтеэ,ууэд +адобттэ,тэто +адобуав,убоа +адобувт,ткка +адобуед,увтд +адобутд,уаеэ +адобукт,удат +адобукэ,удоу +адобуэе,тэаэ +адобкда,убов +адобкду,увэв +адобэку,кект +адоваоэ,квоэ +адовадэ,кеут +адовауу,ктка +адоввук,тээо +адоввке,уббд +адовоае,кебд +адовоед,эбеэ +адовоув,уввт +адовдав,коов +адовддо,удеа +адовдеа,уадэ +адовдтк,увва +адовдэк,кууб +адовеаэ,уддк +адовекб,удбб +адовеко,ткуа +адовтуо,кета +адовувв,бабке +адовуоб,уока +адовуту,уббв +адовууб,бббба +адовкке,тккб +адовкэд,удет +адовэуб,уоае +адовэуо,уоаа +адовэку,ткдо +адооадэ,уауэ +адооввд,кбву +адоодед,укэд +адоодке,уоэб +адоодкэ,уебт +адооеао,увув +адооеет,уаэд +адооетв,уаээ +адооеут,увэк +адооутэ,коеэ +адоокбв,уоэт +адоокбе,экте +адоокуа,удбв +адоокэе,удду +адоокэу,удаа +адооэаа,увдэ +адодбеу,бакбв +адодвеа,увбк +адодддт,бвдтекэтвд +адоекта,уддо +адоекуб,уевб +адоекуу,баедт +адоеккк,увэд +адотбтт,бабтт +адотбку,уаке +адотвот,тэеу +адотоее,ткба +адотоуб,тэдо +адотокб,экао +адотокв,ткуу +адотоко,тэду +адотдво,уаэк +адотдвд,уоад +адотдов,уота +адотдкэ,уодв +адотеаб,уебо +адотеао,увтв +адотеаэ,батбе +адотеов,уоуе +адоттот,кббк +адоттеа,коав +адотттк,тэеа +адотуаб,уввд +адотувб,кткб +адотуоо,удав +адотуоу,увуу +адотуду,уоуу +адотуте,уеду +адотутт,котб +адотутэ,утак +адотууд,убед +адотукэ,тбэе +адотуэб,кудд +адоткаа,увук +адоткбэ,удбо +адоткду,увта +адоткек,ткэа +адотэуа,уткт +адотэкд,удуб +адоуаад,удта +адоуаае,увот +адоуадэ,ктте +адоуатэ,удеб +адоуббб,увоб +адоубвк,эата +адоубду,кеуе +адоувкт,удву +адоуовв,кеок +адоуооб,уотв +адоуокв,кубв +адоуоко,утбе +адоуоэа,ббауо +адоуоэб,уаду +адоудбб,эбуэ +адоудвк,кубэ +адоудэо,квуу +адоудэк,бвдтекэбуб +адоуеав,квбу +адоуеда,уддт +адоуедэ,кдуу +адоуееэ,бвдтекэкбк +адоуету,уоэд +адоутвк,увдб +адоутдо,уввэ +адоутдд,удве +адоутеб,кееа +адоутта,увуе +адоуттт,бабте +адоутко,этуо +адоутэо,эаев +адоутээ,увоэ +адоуувд,экбт +адоууву,кебв +адоуудк,кевт +адоуууу,уудк +адоууээ,утте +адоукае,кето +адоукак,утут +адоукод,уева +адоукдд,кует +адоуэбб,утба +адоуэок,кеуо +адоуэте,удва +адоуэуе,уоеэ +адоуээе,кебэ +адокатк,уауо +адокауа,уебэ +адокбаэ,уедв +адокбоб,удбк +адокбде,кото +адокбэу,ттэк +адоквау,кеде +адокоат,ктта +адокодд,ктэт +адокоуа,убоо +адокоуо,уббт +адокоэб,утва +адокдбв,удэа +адокдбт,утбо +адокдбэ,уддэ +адокдеб,бабва +адокдед,ткее +адокдэв,уото +адокдэе,ктед +адокеао,удде +адокеае,удбе +адокеау,бвдтеккэдэ +адокеэб,кубт +адоктвб,кеба +адоктвв,ккао +адоктев,кдээ +адоктта,ковт +адоктэв,уоке +адокубд,удвк +адокубе,ууве +адокувт,квэа +адокуоа,утвт +адокуоб,увкд +адокуэа,квкэ +адоккаб,тэов +адоккау,удба +адоккут,убва +адоккук,утае +адоккэт,уекб +адокэаа,удае +адокэад,удаэ +адокэба,эбэд +адокэбб,бвдтекэобд +адокэод,квеа +адоэаев,куев +адоэббд,эоао +адоэбве,утво +адоэбвт,уотд +адоэбтд,квоа +адоэбте,какб +адоэбтт,квдк +адоэбке,уддд +адоэбэо,кеуб +адоэвбд,уеау +адоэввб,удеэ +адоэвоу,квдэ +адоэвок,квэв +адоэвео,эуое +адоэвед,удоэ +адоэвта,куоэ +адоэвув,кууа +адоэвэк,уеээ +адоэоэк,ковв +адоэдоб,уааб +адоэдое,кеат +адоэдуб,баатэ +адоэебв,утбэ +адоэеод,бабдт +адоэедэ,утав +адоэеэв,кеот +адоэтак,кеав +адоэтбе,кудо +адоэтте,кевк +адоэтуб,удек +адоэтэв,кевд +адоэуаб,уодд +адоэуав,кобд +адоэувт,куба +адоэует,утке +адоэууд,удбэ +адоэкаб,уоео +адоэкто,кеаб +адоэктк,квдо +адоэкуо,квдв +адоэкут,бвдтекэбдо +адоэккб,кутэ +адоээав,кеоо +адоээао,кдэа +адоээвб,куэе +адоээоо,квкб +адоээот,кттэ +адоээдб,ккау +адоээдв,ктэб +адоээде,кууэ +адоээее,кеуу +адоээуэ,ктко +адоээка,кутк +адоээкк,кедв +адоээкэ,баеде +аддааак,квэб +аддаабв,коод +аддаава,кеве +аддааеэ,кдкт +аддабав,кдэв +аддабаэ,ктуа +аддаббк,уаав +аддабдв,утку +аддабео,ктут +аддабуд,куво +аддабуе,кдук +аддабкд,квке +аддавак,эвэо +аддавбк,утаб +аддавту,ууту +аддавэб,кабт +аддавэт,ббааэ +аддаобо,квэт +аддаобу,утет +аддаобэ,ууду +аддаотт,кбоа +аддаоээ,утда +аддадао,коат +аддадот,бвдтеккоое +аддадоэ,эбкэ +аддадтв,эеуо +аддадку,утбу +аддадкэ,квуд +аддадэо,уувд +аддадэд,уубу +аддадэк,уубк +аддаеот,коао +аддаеоу,бвдтекккув +аддаееу,куео +аддаето,квуо +аддаетт,эобк +аддаеут,ктдэ +аддатау,эуэд +аддатбб,кеоб +аддатбе,коаэ +аддатбк,кеуд +аддатод,кове +аддатдт,кдэт +аддаттд,кткт +аддаттк,кдуд +аддатэб,квээ +аддатэе,бвдтекккеу +аддауад,квтд +аддауак,ктув +аддаубб,ктов +аддаубэ,квеу +аддаувт,эдод +аддауоу,квуэ +аддаудв,кобу +аддауто,утка +аддауэд,кебк +аддакеу,кббв +аддаэво,ууво +аддаэоб,ккво +аддаэов,ккбу +аддаэоу,эбтк +аддаэоэ,кдкд +аддаэкт,кукд +аддаээа,кеув +аддбаае,ктээ +аддбавт,ково +аддбаов,куэа +аддбатэ,утэб +аддбауа,уубд +аддбауб,уэок +аддбаэд,кдка +аддбббэ,коад +аддббва,баэек +аддббдв,кдке +аддббеб,кткк +аддббек,квэо +аддббто,эадд +аддббте,кубо +аддбввб,бвдтекэквв +аддбвод,ктеб +аддбвео,ктэо +аддбобт,укэв +аддбовт,квдд +аддбову,бвдтеккэуэ +аддбоот,квуа +аддбото,куаб +аддбоут,ктев +аддбокв,укэб +аддбокк,кббб +аддбдод,укдк +аддбдое,батбу +аддбдоу,укав +аддбдда,ктдв +аддбедд,кбку +аддбеуэ,кедк +аддбека,квее +аддбтвэ,куду +аддбтдв,эуоо +аддбтдэ,куок +аддбтэа,квоу +аддбтэе,ковб +аддбуэв,кттд +аддбуэт,бабде +аддбуэк,кеоэ +аддбква,ктку +аддбков,квэд +аддбкуу,кобэ +аддбэае,кдкв +аддваев,ктеа +аддваув,кееэ +аддвбаб,эуэе +аддвбвт,кеод +аддвбву,кеое +аддвбке,куат +аддвваэ,ббабо +аддвова,кэда +аддвдоб,квэу +аддвдоэ,куау +аддвддк,куэу +аддвдео,ккаб +аддвдее,ковд +аддвдта,кевв +аддвдув,уэтэ +аддвебб,куек +аддвевб,кукб +аддвеве,коае +аддвевэ,ккбв +аддвеое,кооа +аддвеео,кебб +аддвекд,кквв +аддвеэо,ктоб +аддвтве,бвдтекэдуд +аддвтоэ,кево +аддвтда,экаа +аддвтдб,квто +аддвтдд,ктек +аддвтэт,коак +аддвуоо,ктвк +аддвуот,кдэк +аддвутк,ккву +аддвууб,эдэа +аддвукт,кток +аддвкао,ктее +аддвкба,кеоа +аддвкбб,ктту +аддвкбт,кеду +аддвкок,кдкк +аддвкео,квдб +аддвкед,кдэб +аддвкее,кееб +аддвкек,какв +аддвктб,какд +аддвкуа,куоб +аддвкук,кебт +аддвэаа,куэт +аддвэбт,куоу +аддвэбк,кукэ +аддвэвк,кббт +аддвэев,кевб +аддвэед,квтк +аддвэтб,кетк +адддобв,эттв +адеакау,кобб +адеакое,уэут +адеакке,ккое +адеакэе,кеак +адеаэад,квкв +адеаэаэ,кткэ +адеаэба,эоае +адеаэео,ктто +адеаээв,ккаа +адеаэээ,эддо +адебабе,квду +адебабк,ккве +адебаеа,куэд +адеббдт,кдко +адеббев,како +адеббуа,кубд +адебвбб,кткд +адебвов,эдвт +адебвек,эаув +адебвтд,кедо +адебвуэ,кобв +адебвко,кобе +адебоат,кека +адебово,кттк +адебове,кутт +адебодд,куто +адебоев,ээаа +адебоэу,ктоэ +адебдвэ,бвдтекэбде +адебдеу,квеэ +адебдто,куао +адебдте,кетт +адебдтт,квку +адебдут,бвдтекетуд +адебдкк,кббо +адебевв,куде +адебеоб,эоба +адебедд,коое +адебеед,кеет +адебеэб,кутд +адебтбу,эвет +адебтвв,кбее +адебтвк,ккак +адебтеу,кооб +адебтуу,бвдтеккэкк +адебткт,куоо +адебубу,эбде +адебувт,квкт +адебуду,кедэ +адебуэк,кдкэ +адебкау,эаэа +адебкаэ,кобк +адебкву,ктке +адебкок,ковэ +адебкев,ктда +адебкук,баевт +адебкэа,кееу +адебэав,кабу +адебэвт,кбеу +адебэок,ккуу +адебэдб,ктвэ +адебэед,кабо +адебэет,кббе +адебэут,кбеэ +адевабк,кттт +адевавд,куаа +адеваек,квод +адевауб,кеке +адевбкв,кооо +адевбэв,кеку +адеввбо,кууо +адеввво,ктэу +адеввде,квое +адеввтв,ктуо +адеввтт,кукк +адеввуе,квде +адеввку,квтв +адевобв,кудв +адеводв,кдэу +адевотт,куае +адевддб,эбео +адевдэб,кувк +адевеов,квтт +адевтто,кбво +адевтэа,квок +адевувэ,кбта +адевуоа,каое +адевудд,квед +адевутт,эввд +адевууа,кэвд +адевкот,ктдк +адевкдэ,ктэд +адевэак,ктуб +адевэаэ,кткв +адевэдв,квда +адевэдт,ктук +адевэкк,куув +адеоаде,коба +адеоаек,кетб +адеобад,каке +адеовад,эдае +адеоввв,кууд +адеовов,куад +адеовоу,кдкб +адеоотэ,эввб +адеооуб,куед +адеооуу,квдт +адеоокб,кеае +адеодеу,кбуэ +адеодта,куук +адеоебт,куеэ +адеоедб,кбак +адеоедо,ктоу +адеотбе,эуок +адеотеа,кота +адеотеб,эдот +адеоувэ,эеду +адеокоу,ктэе +адеокэо,ккав +адеоэте,кеда +адедаад,кеед +адедаба,куеу +адедавк,куда +адедаеа,кэву +адедбао,квеб +адедбое,кэбт +адедвве,бауба +адедвте,квоо +адедвкт,ктоо +адедвкк,эдеу +адедвэв,кеуэ +адедооу,кудб +адедоок,кувв +адедооэ,кувт +адедодд,кдэо +адедоду,куут +адедоет,кету +адедотд,коек +адедоту,кква +адедоуд,баэае +адедоуе,кеов +адедоэв,каут +адеддбд,ктаа +адеддвк,кетэ +адедддб,эдее +адедддэ,ктдд +адеддув,эбек +адеддуу,эодб +адеддэк,куее +адедебк,эвтб +адедевв,кекэ +адедед,утэо +адедедт,эдуе +адедееэ,эотт +адедеко,кувэ +адедеэб,бвдтеккоод +адедубо,кдку +адедубт,куот +адедубу,куое +адедкте,куэв +адедэак,кдуа +адедэбо,бабда +адедэбк,кккв +адедэвб,кудэ +адедэео,куву +адедэуэ,ктэа +адееабу,бакээ +адееаоб,эдеб +адееадв,эдбк +адееадт,ктод +адееадк,ккуэ +адееатб,кеэт +адееуко,ктот +адетдвб,бауаэ +адетков,ккбб +адеуабв,ктоа +адеуадэ,кува +адеувке,бвдтекэтбд +адекооа,эвко +адекоот,эдаб +адекдба,эдкб +адекдбв,эбтэ +адекдво,эоео +адекдоо,эеев +адекдод,куеб +адекдое,куэк +адекдеу,куеа +адекдуу,куаэ +адекевк,ктуд +адекеоа,кевэ +адекедб,бадве +адекееу,эодэ +адекето,эбкв +адекекв,кууу +адектбд,эоув +адектот,ктдб +адектев,эбээ +адектув,эваа +адекубб,эдбб +адекубэ,ккбк +адекува,кукв +адекуот,куод +адекуоу,кдут +адекует,ккбт +адекукк,эвоэ +адеккав,эовб +адеккое,этэу +адеккоу,кдуе +адекктв,эоеа +адекэат,котв +адекэбу,ккук +адекэва,бвдтекквок +адекэдэ,ккуа +адекэеа,кэад +адекэку,ккоэ +адеэаоб,эбто +адеэбеб,эеае +адеэбео,эвбв +адеэвад,куов +адеэвбд,кууе +адеэвоэ,кодд +адеэвда,ккдб +адеэвеа,эдду +адеэвэк,эдэу +адеэоаа,ктео +адеэоао,эдбэ +адеэдат,кэое +адеэдоб,эбоэ +адеэдтк,эбка +адеэдэд,эдео +адеэебе,квбэ +адеэееб,бвдтеккове +адеэеэу,эота +адеэтдт,эдке +адеэтду,бакаэ +адеэтек,квбв +адеэуаб,эдоу +адеэуду,эбут +адеэуеа,бвдтекэеав +адеэуеб,эбда +адеэууе,ккод +адеэууу,кэоб +адеэуэд,эуат +адеэков,этэо +адеэктб,ббвто +адеэкту,эвте +адеэккк,куку +адеээве,эвэб +адеээвк,куте +адеээоо,эвву +адеээдо,ктеэ +адеээее,эбко +адеээку,уеву +адтаабо,бадво +адтаабе,баоуб +адтааеб,эооб +адтаатд,куээ +адтабда,коту +адтабдв,кувб +адтабдо,ккку +адтабдк,эове +адтабео,эдуб +адтабтб,ккок +адтабту,баэат +адтабэт,бвдтекккее +адтавдв,кквд +адтавук,кубб +адтавко,кквт +адтавкт,эаке +адтавкк,эотк +адтавкэ,ккбд +адтаоао,эваб +адтаоад,эваэ +адтадаэ,эаоэ +адтадбв,кеву +адтадбт,кдтт +адтадвв,кудк +адтадвэ,эбдэ +адтадов,коок +адтадот,эбтд +адтадкт,эетэ +адтаебб,эвев +адтаевт,эвек +адтаеов,кэаэ +адтаеот,эвкт +адтаеду,эоак +адтаете,экау +адтаеэб,ккот +адтаеэу,эоау +адтатбв,эоке +адтатбо,кеэу +адтатва,эаеу +адтатвб,бвдтекэтдк +адтатде,эдва +адтатев,кэаб +адтаттв,эдед +адтатуа,кута +адтаубк,эбдд +адтауве,эуаа +адтауда,эдтэ +адтаудд,эддк +адтауеэ,эбтв +адтаутк,эвуо +адтаууо,эобв +адтауут,эбуо +адтауук,эооо +адтауко,эоок +адтакбэ,эотб +адтакта,эвук +адтакуе,эвду +адтакуу,кодт +адтакко,батбт +адтакэб,ккба +адтаэае,эдак +адтаэбб,эввк +адтаэбо,бакбо +адтаэоэ,эвоо +адтбаба,эдет +адтбауу,бвдтеккуэк +адтббот,бвдтекэкак +адтббдд,этэв +адтббет,эоед +адтббек,бвдтеккдет +адтббто,эдэд +адтббко,эобе +адтбвба,эбкб +адтбввв,кэоа +адтбвоо,ккоб +адтбвта,эвот +адтбвтт,кэаа +адтбвту,ккэк +адтбвтк,ктву +адтбвув,эвкв +адтбвуэ,кодк +адтбоат,эвба +адтбодд,эбтб +адтбоэд,баовэ +адтбдве,бвдтекковб +адтбевэ,эотэ +адтбедэ,кэту +адтбета,эодв +адтбтак,эдев +адтбтвт,эвуб +адтбтов,эвдд +адтбтод,эоад +адтбтеа,баото +адтбтэб,бавук +адтбуек,баэбт +адтбуто,эоэо +адтбкод,эдвэ +адтбкдв,баэоо +адтбкдк,баову +адтбкеа,баввк +адтбкэд,бадуб +адтбкэе,этэк +адтбэак,кэбд +адтбэвб,эубе +адтбэоа,эввт +адтбэдт,кэво +адтбэдэ,кккд +адтбэее,эбэо +адтбэуд,эвту +адтбэут,эбеб +адтбэко,эобэ +адтбэке,эвда +адтбээе,эдуд +адтбээт,бакбб +адтбэээ,эдуо +адтвааа,бвдтектвдк +адтваба,ккде +адтвабб,экэо +адтвавв,эоэе +адтваде,эбэв +адтваев,эвеу +адтваео,эдку +адтваук,кэтб +адтвауэ,бавко +адтвакд,эбет +адтваэд,эткэ +адтваээ,баобэ +адтвбаа,баобк +адтвбау,эбкт +адтвбаэ,эбдк +адтвббу,ккеэ +адтвбво,эвоб +адтвбве,эоее +адтвбвт,эвбо +адтвбот,этэа +адтвбоу,эдау +адтвбеб,эбдо +адтвбте,эоуд +адтввве,эокд +адтввдд,кэдо +адтвоов,эвад +адтвоот,эбкк +адтвоок,эбее +адтвооэ,эоуу +адтвоув,баута +адтвоук,эдув +адтвокд,эдтд +адтвоэд,бвдтекэквд +адтвоэк,эобд +адтвдао,баоту +адтвдат,эоэт +адтвдод,эдеэ +адтвддт,баввт +адтвдеа,эоуэ +адтвдто,бвдтекэкбэ +адтвдтэ,баотд +адтвеаа,эвуе +адтвееэ,эеад +адтвека,кэок +адтвекв,эуак +адтвеэк,кэод +адтвтаа,кэдд +адтвтаб,эвее +адтвтав,эттт +адтвтак,баукв +адтвтва,бауто +адтвтве,баукэ +адтвтоо,эоет +адтвтео,эеуб +адтвтто,кэот +адтвттт,кэоу +адтвтка,бвдтеэадоэ +адтвтке,кэдт +адтвуаа,эдте +адтвубэ,эбдт +адтвудо,эоеэ +адтвутэ,эдаа +адтвууа,эвва +адтвуко,эуаб +адтвуэо,эокэ +адтвкад,эоод +адтвкае,эатэ +адтвкбв,баддк +адтвквт,эвво +адтвкев,эвтк +адтвкув,экуа +адтвкуэ,эвбд +адтвэду,эово +адтвэео,эвдк +адтвэед,эдад +адтвэкт,кэтв +адтвэкэ,эоту +адтвээа,эвэк +адтоабб,эбеа +адтобаэ,эбте +адтобоу,эткк +адтобту,эбуе +адтобуд,эову +адтобуе,эбуу +адтобкв,эбук +адтовва,эбкд +адтовут,эоеу +адтообо,эотд +адтообд,эоте +адтообу,эвав +адтооок,эоуе +адтоодб,эоут +адтооду,эетв +адтоотв,эокв +адтооэо,эвео +адтоево,этуе +адтокбе,эдба +адтокка,эдкэ +адтоккд,эаку +адтоэбв,бадвэ +адтоэбе,эдкт +адтоэвэ,эубо +адтоэод,эода +адтоэдв,эткд +адтдаео,бвдтеэаоок +адтдаэб,эооэ +адтдбаб,эоек +адтдбвэ,эвбу +адтдбда,экба +адтдбео,эвод +адтдбеу,этка +адтдбуд,эото +адтдвао,эдтв +адтдвад,эубт +адтдвбк,этте +адтдвдв,этэе +адтдвеэ,эттэ +адтдвтк,эуад +адтдвтэ,бвдтекковд +адтдвуу,эдбо +адтдвкк,эддб +адтдвэе,эбду +адтдодв,эвэе +адтддбд,эдка +адтддвт,бвдтекктко +адтддвк,этед +адтддтд,эобб +адтддук,эбке +адтдеад,эоку +адтдеат,эвбб +адтдебо,эдвб +адтдевв,эвэв +адтдеоа,эдоо +адтдеов,эдуа +адтдеод,эвуа +адтдедо,этэб +адтдетт,эуао +адтдеэа,эвдэ +адтдтбэ,эбед +адтдтоу,эбку +адтдкоа,эдоб +адтдкоб,эдоэ +адтдкеа,этет +адтдкуб,эоээ +адтдэот,эвэд +адтдэдэ,эвбе +адтеаое,эдде +адтеадб,эоов +адтеаеа,эокб +адтеаеу,эуэв +адтебву,этуа +адтебуд,баэкэ +адтебка,эоко +адтебээ,этээ +адтевав,эоэб +адтевтб,кэка +адтевкэ,эоаб +адтеовк,эооу +адтеода,эоаа +адтеотв,баеод +адтеоуэ,эддв +адтедао,бавут +адтедву,бадов +адтедев,баотк +адтедуб,баове +адтееау,бадэб +адтееак,баовд +адтеебд,баоуэ +адтеебу,эдвв +адтеевв,эуаэ +адтееоу,эвве +адттеуу,эакэ +адттеко,эовд +адтттае,эввэ +адтуекд,эбдв +адтуеку,эвэт +адтуекк,эвэу +адтуеэу,эоеб +адтэдэв,тэкб +адуатуб,баеак +адуатэт,эдве +адуаутэ,эвбк +адуауут,эвае +адуакад,эбэе +адуакву,бадут +адуакда,эвкк +адуакдо,эоое +адуакка,этуу +адуаэвв,эоук +адуаэоб,эоев +адубабк,эвтв +адубадб,эеде +адубауб,эуав +адубаут,баооб +адубвкв,эвед +адубтау,эвуд +адубтко,эвуэ +адубкуе,эбуд +адубэеу,эубк +адувдва,эодк +адуведу,ббатт +адувеео,эдкк +адувэво,бабеб +адуобку,этуб +адуовед,эвбт +адуооуу,эдбу +адуоеоу,эеаа +адуокуу,эдтк +адудавб,эеат +адудатб,эоот +адудбов,эуеэ +адудбое,эодд +адудбдк,эвеа +адудбку,эоаэ +адудвев,бадкт +адудвед,бадэк +адудвту,эобу +адудвуе,эвкд +адудвэе,ббаау +адудоба,баебв +адудобу,эвкэ +адудовб,эвут +адудоое,эвку +адудоут,эоуа +адуддеа,баоув +адуддеу,эддт +адудеаб,эвка +адудеат,эвде +адудебб,эдта +адудебв,эдао +адудевт,эбта +адудетв,эовк +адудеув,баодб +адудтоб,бавкэ +адудтек,эдву +адудттк,бавку +адудткэ,эдуэ +адудтэб,бвдтекэтаб +адудуак,эдаэ +адудуеэ,эвбэ +адудэак,эеао +адудээд,ббодо +адуеаау,эдое +адуеава,бадвд +адуеаву,бавту +адуеаеа,бббкэ +адуеатэ,баеаб +адуеаээ,эдбв +адуебав,эоат +адуебоа,эбэу +адуебуд,эвээ +адуевдо,эакд +адуевеа,эоду +адуевуа,бабку +адуевэв,эовв +адуевэе,баоау +адуеовэ,эадо +адуеодо,баоке +адуеодэ,баето +адуеоее,эоуо +адуеоэк,эобо +адуедбд,эетт +адуедтв,эддд +адуедтд,эвтд +адуедэд,баоов +адуееба,эовэ +адуеебу,бабек +адуеевв,бвдтекэбоэ +адуеевк,бавоб +адуетао,бвдтекквда +адуетбт,эобт +адуетдт,эвке +адуеуао,бвдтеэаоук +адуеуоэ,бвдтекэтдэ +адуеквб,эвув +адуекет,эбэб +адуекеу,эвеб +адуекэд,эовт +адуеэвд,эеаб +адуеэео,баокв +адуеэкк,эоэд +адуеэкэ,бактб +адутбте,этто +адутваб,эбдб +адутвое,бавед +адутвда,эеуе +адутвкк,эдда +адутоаб,эдэб +адутока,эоэв +адутоэк,эвоа +адутдев,эаек +адутдту,эает +адутдув,эуау +адутдуо,бвдтекуээе +адутдка,эуае +адутдэт,эубэ +адутетт,эвдт +адуттдк,эаок +адуттуэ,эудо +адутуту,бадвб +адутуув,эауб +адутуэо,ббаак +адутуэд,эавк +адутквд,бабаб +адуткко,этут +адутккэ,эдок +адуткэо,эдоа +адуткээ,эттк +адууаве,эдто +адуубот,эдат +адуубоу,бадаб +адуубуд,батбк +адуубуу,бвдтеккэбе +адуубуэ,эдут +адуубка,экдо +адуубкб,эвкб +адуувдт,баэвт +адуувуо,эдеа +адуувуд,этэд +адууодк,баоев +адуудва,эдов +адуудвк,эаое +адуудээ,эвао +адууеоу,эета +адууедк,эдэе +адууеее,эвов +адуутак,эубв +адуутбе,бавта +адуутбк,баддо +адуутвд,бавээ +адуутдд,баоат +адууттд,этке +адуутуэ,баоуа +адууткк,эуод +адуутэе,бадат +адууубо,эеео +адууубу,бвдтекквэд +адууэоа,баотв +адууэод,эаед +адууэок,эедк +адууэдв,эоав +адууээа,эбтт +адукаао,бвдтекэбаа +адукаба,бауту +адукада,эуде +адукббт,эуба +адукбед,эвта +адукбет,бабдв +адукваа,бвдтекккэе +адуквок,эува +адуквео,этэт +адуквуд,эуоб +адуквэб,бвдтеккобе +адуквэк,бвдтеккобэ +адукотд,эедт +адукоуб,эудв +адукоэо,бвдтеккокт +адукебе,баеэе +адуктоб,эдав +адуктод,этко +адуктдд,бвдтеккбет +адуктте,эеек +адуктуо,эодт +адукткв,эвэа +адуктэе,баокэ +адуккбд,эддэ +адуккбу,эбба +адуккбэ,бакдт +адукээт,бадде +адуэает,эуве +адуэауэ,эуэт +адуэбвк,эувэ +адуэвбо,эткт +адуэвуэ,баоав +адуэоак,эудт +адуэоое,баоэу +адуэодд,эокт +адуэоду,эеув +адуэдва,баоуо +адуэдтт,экбе +адуэедв,эдкв +адуэтаа,эбоа +адуэттк,этуэ +адуэтуд,бадбк +адуэуод,эдту +адуэуот,эуду +адуэудо,эееэ +адуэуко,экак +адуэукэ,эткв +адуэкдк,бадкв +адуэктд,бауук +адуэкте,ббатк +адуэккв,экаэ +адуэкэе,эбев +адуээаэ,бадкб +адуээбэ,бавоу +адуээве,бауте +адкааво,баооу +адкаавд,бадбу +адкаатб,эдэт +адкаатт,бауда +адкабае,эдэв +адкабак,эбок +адкабок,бавеа +адкабдк,бадеб +адкабтв,бадэд +адкабтэ,ээбэ +адкабуо,баоое +адкавбу,бвдтекэтук +адкаввб,бббка +адкавов,бвдтеккбкэ +адкавдт,эудб +адкавдк,эткб +адкавкк,эуов +адкаоак,бакое +адкаеаб,эуоа +адкаеао,эдбд +адкаеое,баебе +адкаеуд,баеаэ +адкатак,бабвэ +адкатвэ,эдэо +адкатеа,бвдтектукт +адкаттд,эетд +адкатуб,бавеб +адкатут,экду +адкатку,бвдтекэбву +адкаткк,бавуо +адкауаа,баоок +адкауоо,экбв +адкауод,бвдтеккуеа +адкаудо,этеу +адкаудд,эокк +адкаутк,бавкк +адкакбо,бвдтекктде +адкакдо,этуд +адкакдт,этув +адкакео,эеет +адкакет,бадта +адкакэу,эееа +адкаэве,бадев +адкаэвк,эттд +адкаэдэ,бавув +адкаэкд,баоео +адкбабе,экде +адкбаоо,бавее +адкбаот,баобу +адкбаоу,бадуу +адкбада,баовв +адкбаеб,бадко +адэаэед,ббвое +адэаэув,бвдтеккдек +адэббва,бвдтекэеек +адэбвад,бббкд +адэбвуб,баует +адэбвуу,баутб +адэбоеэ,бвдтеутэвк +адэбдад,бауоа +адэбдэу,батбэ +адэбеаа,бвдтеэаауб +адэбекд,бвдтекээвт +адэбтаа,бвдтекктат +адэбтае,бавво +адэбтат,бвдтеккауе +адэбтак,бакак +адэбток,бвдтеккоуб +адэбткд,бвдтеккакб +адэбубк,бвдтеккббо +адэбувэ,бвдтеккдод +адэбудт,бвдтеккбва +адэбэев,бвдтекэдао +адэбэеу,бвдтеккеэу +адэбэто,баевб +адэбэтэ,баеуа +адэбэук,бвдтекэдтк +адэвбад,бадэу +адэвбэк,бвдтеккбот +адэвват,ббвуб +адэввву,ббвтд +адэввтд,бвдтеккбтэ +адэвоэв,бакдв +адэвоэт,бакдо +адэвдбо,баееу +адэвдве,баувк +адэвдеа,баеоо +адэвебо,бвдтекктео +адэвевв,баукд +адэвекв,бакта +адэвеке,бвдтеккэбд +адэвтбэ,бвдтекктук +адэвтоа,бвдтеккдбэ +адэвтот,бвдтеккдду +адэвтеу,бвдтеккате +адэвтта,бвдтеккоед +адэвтуб,ббвбб +адэвтэе,ббвад +адэвуба,бвдтеккбтв +адэвубв,ббвбу +адэвубо,бвдтеккдбе +адэвудб,бвдтеккдво +адэвуев,бвдтеккуев +адэвуек,бадто +адэвуту,бвдтекэака +адэвууо,бвдтекээаб +адэвуку,бббкк +адэвуэа,бакоа +адэвкаб,бакде +адэвкао,бакдд +адэвкде,бвдтеэавкэ +адэвктб,бвдтеккбдк +адэвктд,ббвук +адэвктт,бвдтеккбук +адэвкку,ббвэо +адэвэаа,бакдк +адэвэоа,баубб +адэвэто,баеуэ +адэвэтэ,баккб +адэвэуе,ббову +адэвэкв,бббтд +адэвэкд,бббкт +адэвээа,бвдтеккктт +адэоааб,бвдтекэвбб +адэоавк,бббдэ +адэоаоб,бвдтеккваэ +адэоаеу,бвдтеккдее +адэоаув,бвдтеккакк +адэоауо,бвдтекковт +адэоаэв,баект +адэоаэк,бвдтеккдао +адэобад,бббут +адэобак,бббуэ +адэобвб,бвдтеккуеэ +адэобео,бвдтеккоеу +адэобуа,бвдтекквбэ +адэовво,бвдтеккддб +адэоовэ,ббвуо +адэооео,ббвоа +адэодвв,бвдтекквоа +адэодот,баудд +адэодэу,бвдтекктуд +адэоеок,баудк +адэоетд,бвдтеккбэу +адэоект,ббвед +адэотаэ,бауео +адэотва,бвдтекквов +адэотвб,бвдтеккэээ +адэотоб,бвдтеккввэ +адэотув,бвдтеккодт +адэоткэ,баэбе +адэоуба,бвдтеккдда +адэоуоа,бвдтеккдеэ +адэоуов,бауэд +адэоуот,бвдтеккатд +адэоуэт,бвдтеккукт +адэокау,бвдтеккттк +адэоков,бакду +адэокдв,бвдтекктав +адэокуа,бвдтеккото +адэокуо,бвдтекэабд +адэокут,баэаэ +адэоэаб,бвдтекэбко +адэоэву,бвдтеэаааэ +адэоэдд,бвдтеккдае +адэоэев,бакук +адэоэуд,бвдтеккодк +адэдаав,бвдтеккоуо +адэдаад,бвдтеккдоа +адэдаау,бактк +адэдаво,бвдтеккдот +адэдаву,бвдтеккоде +адэдавк,бвдтекктвв +адэдадэ,бвдтеккако +адэдауо,бвдтекквбб +адэдаку,бвдтеккоэе +адэдакэ,бвдтеккбке +адэдбод,бвдтеккаек +адэдбдо,бвдтеккудв +адэдбке,бвдтеккдвд +адэдбэу,бвдтекктвэ +адэдвак,ббввэ +адэдвбэ,бвдтекэабк +адэдвва,бвдтеккбка +адэдвву,бвдтекэтуе +адэдвде,бвдтеккдто +адэдвуд,бвдтеккоуа +адэдвуе,бвдтекэоэо +адэдвкб,бвдтеккаэб +адэдоае,бактт +адэдобэ,бвдтекэдду +адэдоэд,бвдтекэатд +адэддбт,бвдтекктак +адэдддб,баэаб +адэдддд,бвдтеккокд +адэддде,ббвба +адэдддэ,бвдтеккоко +адэддее,бббеб +адэддка,баэав +адэддкб,бвдтекккад +адэддкк,баэбу +адэддэб,ббвтк +адэддэо,баэак +адэддэт,бвдтеккоэб +адэдеав,бббеа +адэдебк,ббоао +адэдева,бвдтеккобо +адэдеое,баэда +адэдедб,бвдтеккоту +адэдедв,бвдтекквбд +адэдееэ,бвдтекккуу +адэдето,бвдтеккеээ +адэдетд,баээт +адэдетт,ббвте +адэдету,ббовэ +адэдетэ,баэук +адэдекэ,бвдтеккоут +адэдеэб,баэое +адэдеэо,бвдтеккдву +адэдеэд,бвдтеккоке +адэдеэк,бвдтеккбее +адэдтбв,бббуб +адэдтбк,ббвдэ +адэдтбэ,бвдтеккбко +адэдтву,бвдтеккбеэ +адэдтоо,бвдтеккоот +адэдтот,бвдтеккаут +адэдтдо,бвдтекктво +адэдтеб,бвдтекквеэ +адэдтеу,бвдтеккбеб +адэдтуе,бвдтеккаэе +адэдуат,бвдтеккбдд +адэдудо,бвдтеккоэв +адэдуео,бвдтекквод +адэдутв,бвдтеккбэе +адэдэвк,бвдтеккокв +адэеобв,бвдтеккдео +адэедвб,бвдтеккбэа +адэедве,бвдтеккдвк +адэеддд,ббавд +адэедтэ,баэоу +адэеевэ,бвдтеккбуб +адэееоб,бвдтекквбо +адэеект,бвдтеккоэд +адэетае,бббук +адэетат,бвдтеккоэо +адэетба,бббдт +адэетбэ,бббде +адэетве,бвдтеккокб +адэеуве,бвдтекквоу +адэеуоа,ббаок +адэеудк,ббвэа +адэеуек,ббвэу +адэеуеэ,бббуо +адэеутд,бвдтекквао +адэеуук,ббоае +адэеуке,бвдтеккввт +адэтадо,бвдтеккаэк +адэтбде,бвдтеккбба +адэтбкв,бвдтеккока +адэтдав,ббвов +адэтеде,бвдтеккдоо +адэтуэе,бвдтекэотд +адэтэаэ,бвдтеккаеу +адэтэба,баэтт +адэтэоэ,бвдтекэеед +адэтэеб,бвдтекэтау +адэтэео,бвдтекктвб +адэтэуе,ббваа +адэуаад,бвдтеккоду +адэуаат,бвдтекквэк +адэуаау,баэдо +адэуаак,бвдтеккоэа +адэуабб,бббэу +адэубаб,бвдтеккктд +адэуббд,бвдтеккоук +адэубоэ,бвдтеккоеа +адэубдд,бббтв +адэубеб,бвдтеккбту +адэубео,бббув +адэубто,бвдтеккбвд +адэубкэ,бвдтеккоэу +адэувтэ,баэед +адэувэе,бвдтекэбав +адэуотв,бвдтеккдов +адэуоуб,ббвэт +адэуоуэ,бвдтекэбдк +адэуока,бвдтекэвву +адэуоко,бвдтеккдаэ +адэуоэб,бвдтеэааод +адэуоэо,бвдтеккоэт +адэуоээ,бвдтеккбкк +адэудоа,бвдтеккоуэ +адэудок,бвдтеэавтт +адэудоэ,бвдтеккввв +адэуддо,бвдтеккдбт +адэудеу,бвдтекквбв +адээокв,бвдтеккбвэ +адээедо,бвдтеккбтк +адээедт,бвдтеккдак +адээедк,бвдтекквву +адээеед,бббоэ +адээеуб,бвдтекэаке +адээекв,бвдтеккоээ +адээеэо,бвдтеккудк +адээтво,бвдтекктао +адээтот,бвдтеккдое +адээудв,бвдтеккдтб +адээуеу,бвдтеккдев +адээууэ,ббаов +адээкдк,бвдтеккотк +адээкэо,бвдтекэодв +адээкээ,ббвуу +адэээок,бвдтекктаэ +адэээкв,бвдтекквко +адээээк,ббаво +аеааааа,ббадт +аеаааат,бвдтеккеэк +аеааабд,бвдтекэбэо +аеааавт,бвдтеэаадд +аеаааед,бвдтекэада +аеаабаа,ббвдк +аеаабае,бвдтеккута +аеаабед,бвдтеккота +аеаабэв,бвдтеккотб +аеааото,ббовд +аеаауда,бвдтеккдок +аеабаэд,бвдтекквое +аеабввт,бвдтеккдбв +аеабвоб,бвдтекэеае +аеабвуб,ббвок +аеабвка,бвдтекктуа +аеабову,бвдтеккбув +аеабттд,бвдтеккбеа +аеабттэ,бвдтеккдау +аеабуед,бвдтекэеоа +аеаваут,бвдтеккдаб +аеавввэ,бвдтеккаеэ +аеаввкд,бвдтекэадт +аеаввэо,бвдтеккдбд +аеаввэу,бббте +аеавоок,бвдтеккббэ +аеаводт,ббаоэ +аеавоеа,ббвао +аеавоеб,бвдтекэаба +аеавоет,бвдтеккбду +аеавоте,бвдтекквак +аеавоув,бвдтекэадб +аеавоку,бвдтекэббе +аеавдтк,бвдтеккддэ +аеавдэк,бббдо +аеавдээ,бвдтеккооб +аеавеае,бвдтеккоее +аеавеат,бвдтеккбэд +аеавебе,бббэк +аеавеот,бвдтекэовк +аеавету,бвдтекктеа +аеавеуэ,бвдтекккте +аеавттт,ббвоу +аеавувэ,бвдтекэвтк +аеавууд,бвдтеккдвв +аеавууе,бвдтеккоев +аеавукб,бвдтекуэдк +аеавуэе,бвдтекэоод +аеавуэт,бвдтекэата +аеавквд,ббвкв +аеавкоа,бвдтекэобк +аеавкод,бвдтекэбау +аеавкое,бвдтекэвот +аеавкоу,бвдтекэабт +аеавктэ,ббаэо +аеавкка,бвдтеккауа +аеавккт,бвдтекктдо +аеавкку,бвдтекквво +аеавкэа,ббвдв +аеавкэб,бвдтеккток +аеавэот,бвдтекэоае +аеавэтэ,бвдтекэоту +аеавэук,бвдтекэвва +аеавэка,бвдтекэдбе +аеаоаак,бвдтекковв +аеаоавт,бвдтекэаув +аеаоавк,бвдтекэуээ +аеаоакэ,бвдтеэаоав +аеаобвд,бвдтекэбвб +аеаобоэ,бвдтекэвад +аеаобдб,бббет +аеаобуэ,бвдтекэдае +аеаобку,бвдтекэдау +аеаовао,ббаао +аеаоввт,бвдтекэате +аеаовка,бвдтекктда +аеаовэт,бвдтеэабдд +аеаоовк,бвдтекэооа +аеаоовэ,бвдтекэеот +аеаоооа,бвдтеккооэ +аеаооок,бббкб +аеаоода,бвдтеккобу +аеаооде,бвдтеккоуе +аеаооуа,бббов +аеаооуб,бвдтеккоок +аеаодду,бвдтекэвкт +аеаодед,бвдтеккдеб +аеаодтэ,ббвут +аеаодут,бвдтеккттт +аеаодэа,бвдтеккткэ +аеаодэе,бвдтеккддк +аеаоуут,бвдтеэадав +аеаокву,бвдтеккоуу +аеаоэбд,бвдтеккдбб +аеаоэвт,бвдтекоеее +аеаоэеэ,ббовк +аеадауб,бвдтекээоу +аеадауд,бвдтеккдве +аеадакт,бвдтеккоов +аеадвеа,бвдтекктут +аеадвеб,бвдтеккдед +аеадвук,ббадв +аеадвка,бббод +аеадвкв,ббадо +аеадвку,ббаеа +аеадоае,бвдтеккддт +аеадовб,бвдтеккддв +аеадооа,бвдтекктуб +аеадооб,ббакт +аеадода,бвдтеккода +аеадодт,бвдтеккобд +аеадоду,бвдтеккоек +аеадоее,бвдтеккотд +аеадоув,бвдтекэбвд +аеадоут,бвдтекковк +аеаддав,бвдтекэвко +аеаддбе,бвдтекэодт +аеаддэу,бвдтекэауу +аеадеаэ,бвдтеккбдт +аеадетб,бвдтекэвед +аеадетв,бвдтекквот +аеадете,бвдтекэаот +аеадетт,бвдтекквэу +аеадеув,бвдтекккта +аеадеут,бвдтекэвеэ +аеадеэд,бвдтекэает +аеадеэе,бвдтеккттб +аеадтбэ,бвдтекктвд +аеадтва,бвдтекктдб +аеадтвб,бвдтеккдбу +аеадтве,бвдтеккдде +аеадтвк,ббауе +аеадтут,бвдтекэбвт +аеадтуу,бвдтеккоеб +аеадтуэ,ббаук +аеадтко,бвдтеккоеэ +аеадтэт,бббтб +аеадуао,бвдтекктек +аеадуба,бвдтекктдк +аеадувк,бвдтекктту +аеадуек,бббоо +аеадутт,бвдтеккбуэ +аеадууб,бвдтеккабт +аеадуук,бвдтекэакк +аеадууэ,бвдтекээтэ +аеадкав,бвдтеккбое +аеадкао,ббвае +аеадкво,бвдтекэадв +аеадкоэ,бвдтекково +аеадктд,ббаэк +аеадкуэ,бвдтекэаау +аеадкэт,бвдтекээто +аеадкэу,бвдтеккткв +аеадэау,ббаээ +аеадэвб,ббввд +аеадэет,бвдтекээдо +аеадэтк,бвдтеккбкт +аеаеааа,ббаэу +аеаеабб,бвдтеккдоэ +аеаеабт,бвдтекэббд +аеаеакк,бвдтекэатк +аеаеаэд,бвдтекэвто +аеаеаэе,бвдтекккак +аеаеаэк,бвдтекэодд +аеаеаээ,бвдтеккдтв +аеаебвэ,бвдтеккббк +аеаебот,бвдтекэдаа +аеаебдв,бббэо +аеаебдт,бвдтекэвэт +аеаебду,бвдтекктвт +аеаебдк,бббек +аеаебее,бвдтеккоэк +аеаебеэ,бвдтеккдбк +аеаебтб,бвдтеккову +аеаебуу,бвдтекквва +аеаебук,ббвуд +аеаебкэ,бвдтекктдд +аеаеваа,бвдтекэбкт +аеаевбо,бвдтеккоба +аеаеввэ,бвдтекэбво +аеаевок,бвдтекэоуе +аеаевта,бвдтекэаео +аеаевэа,бвдтекэкто +аеаеоае,бвдтекэавв +аеаеове,бвдтекктот +аеаеоок,бвдтекктаб +аеаеоее,бвдтеккттэ +аеаеото,бвдтеккдва +аеаеотэ,бвдтекэват +аеаеоуа,бвдтекэоеу +аеаеока,бвдтекктуе +аеаедот,бвдтеккуба +аеаедда,бвдтеккобт +аеаеддв,бвдтекэадэ +аеаедтб,бвдтекэвэв +аеаедтд,бвдтекэвбо +аеаедуэ,бвдтекктуу +аеаедкк,бвдтекэбук +аеаееаа,бвдтеккуов +аеаееаб,бвдтеккада +аеаееау,бвдтеккадо +аеаееба,бвдтеккадв +аеаеебб,бвдтеккадб +аеаеевб,бвдтекэдвб +аеаеевв,бвдтеккаде +аеаееоу,бвдтеккобв +аеаеедэ,ббббэ +аеаеетд,бвдтекэббэ +аеаеекв,бвдтекктау +аеаееэа,бвдтеккдаа +аеаееэо,бвдтеккотт +аеаетак,бвдтекэоеа +аеаетдк,бббва +аеаетуе,бвдтекэабб +аеаетко,бвдтекктеб +аеаеуод,бвдтеккуае +аеаеудт,бвдтекэатт +аеаеукв,бвдтекковэ +аеаеуээ,бвдтекэоау +аеаекбе,бвдтеккоте +аеаекоб,бвдтекэдко +аеаекдв,бвдтекэаее +аеаекек,бвдтекэдтэ +аеаекта,бвдтекэоаб +аеаекуд,бвдтекэвэб +аеаекэа,бвдтекэвтэ +аеаеэаэ,бвдтекэввд +аеаеэеа,бббвб +аеаеэет,бвдтекэвдд +аеаеэув,бвдтеэаваа +аеатавт,бвдтекэодэ +аеатбау,бвдтекэббу +аеатбоу,бвдтекэадо +аеатбку,бвдтекэаов +аеатвдв,бвдтеккткт +аеатвэт,бвдтеккдба +аеатоаэ,бвдтекктод +аеатовд,бвдтекэвку +аеатовэ,бвдтекэткв +аеатоод,бвдтеккотэ +аеатоте,бвдтеккуэд +аеатоэо,бвдтекктеэ +аеатдвк,бвдтекэбэб +аеатддк,бвдтекэддк +аеатдкк,бвдтекктву +аеатеат,бвдтекктта +аеатеов,бвдтекктеу +аеатеоу,бвдтекктед +аеатету,бвдтекэвде +аеатеуе,бвдтеккаед +аеатеут,бвдтекэдоо +аеатекв,бвдтеккуут +аеатеке,бвдтекктэа +аеаттао,бвдтекэодо +аеаттае,бвдтекктдт +аеаттту,бвдтекэвоб +аеаттэу,бвдтекэаеэ +аеатудб,бвдтекктув +аеатудд,бвдтеккккт +аеатуэа,бвдтекэоуа +аеатква,бвдтеэавбт +аеаткеа,бвдтекктад +аеаткет,бвдтеккукк +аеатэад,бвдтеккткб +аеатэек,бвдтекэвбе +аеатэту,бвдтекэвтв +аеауабо,бвдтекэадк +аеауабк,бвдтекэвуе +аеауаде,бвдтекэаву +аеауаеб,бвдтекэоао +аеауаев,бвдтекэоад +аеауаео,бвдтекэова +аеауаеэ,ббода +аеауаук,бвдтекктте +аеауауэ,бвдтекктуо +аеауакб,бвдтекктое +аеауаээ,бвдтеккуау +аеаубат,бвдтекэоео +аеауббб,ббодв +аеаубвб,бвдтеккткк +аеаубтт,бвдтекквуо +аеаубуе,бвдтеккуаэ +аеаував,бвдтекэаэа +аеауввэ,бвдтеэабдб +аеаувоб,бвдтеккува +аеаувдб,бвдтекэаоб +аеаувдк,бвдтекэааа +аеаувеб,бвдтекэодб +аеаувед,ббодэ +аеаувеэ,ббодк +аеаувув,бвдтекктве +аеаувку,бвдтекквуе +аеаувэб,бвдтекктдв +аеаувэу,бвдтеккткд +аеауобд,бвдтекэвэд +аеауобе,бвдтекэдке +аеауодк,бвдтекэдов +аеауоеэ,бвдтекэаед +аеауоуо,бвдтекэове +аеауоук,бвдтекэаку +аеауокд,бвдтекэдуо +аеаудае,бвдтекэбаэ +аеаудвб,бвдтекэовб +аеаудоб,бвдтекэвкв +аеаудот,бвдтекктоу +аеаудок,бвдтекктбб +аеаудед,бвдтеэаатк +аеаудуу,бвдтекэвдэ +аеаудке,бвдтекктба +аеаудэв,бвдтекэдак +аеаудэе,бвдтекэауд +аеауеао,бвдтеккуое +аеауеау,бвдтеккудэ +аеауебо,бвдтекэобо +аеауевк,бвдтекээео +аеауеод,бвдтекктбд +аеауеоэ,бвдтекккэо +аеауедо,бвдтеккуву +аеауеуб,бвдтекэоед +аеауеук,бвдтекэоду +аеаутаб,бвдтекэвдт +аеаутоэ,бвдтекэаае +аеауттд,бвдтекэоаэ +аеаутку,бвдтекэдвк +аеауууу,бвдтекэввт +аеауука,бвдтекктто +аеауукт,бвдтекэатб +аеауукк,бвдтеккттд +аеаууэк,бвдтекэаад +аеаукав,бвдтекэоув +аеаукба,бвдтеккуоу +аеаукоа,бвдтекэабв +аеаукоб,бвдтекэабо +аеаукоо,бвдтекэддо +аеаукда,бвдтекэооо +аеаукте,бвдтекэову +аеаукту,бвдтекктэб +аеаукуа,бвдтекэооб +аеаукуо,бвдтекэвэе +аеаукэт,бвдтекктэв +аеаукэк,бвдтеэавуу +аеауэад,бвдтеккуот +аеауэва,бвдтеккуак +аеауэод,бвдтекээоа +аеауэео,бвдтекэакэ +аеауэуб,бвдтекктээ +аеакавб,бвдтекктэу +аеакаве,бвдтекээод +аеакаоо,бвдтеэаавт +аеакадэ,бвдтеэавдэ +аеакаее,бвдтекэдбо +аеакатт,бвдтекэакб +аеакауе,бвдтекэауб +аеакаут,бвдтекэаду +аеакббд,бвдтекэвбв +аеакббт,бвдтекэдаэ +аеакбвб,бвдтекэвод +аеакбвт,бвдтекэвбд +аеакбот,бвдтекэвту +аеакбок,бвдтекэаое +аеакбду,бвдтекэдку +аеакбед,бвдтеэаввд +аеакбкэ,бвдтекэббб +аеакбэк,бвдтекэвув +аеакваб,бвдтекэауе +аеаквад,бвдтекэбве +аеаквба,бвдтекэакв +аеаквбу,бвдтекэбку +аеакввв,бвдтекэава +аеаквод,бвдтекэоэк +аеаквоу,бвдтекэвок +аеаквеб,бвдтеккуве +аеаквтэ,бвдтекэвка +аеаквуу,бвдтекэавэ +аеаквка,бвдтекэаод +аеаквэб,бвдтекэоэт +аеакоае,бвдтекккка +аеаковб,бвдтекккав +аеаковв,бвдтекккаб +аеаково,бвдтеккудт +аеакоеб,бвдтеккууд +аеакоев,бвдтеккукв +аеакото,бвдтеккуэа +аеакоут,бвдтеккуэу +аеакоуу,бвдтеккуэо +аеакоке,бвдтекккет +аеакокт,бвдтеккуээ +аеакеое,бвдтекккэк +аеакеоэ,бвдтекккбэ +аеакека,бвдтекэааб +аеакеэу,бвдтекккук +аеактау,бвдтекккеэ +аеактдд,бвдтекэаоо +аеактук,бвдтекэаве +аеактэд,бвдтекэауэ +аеакудв,бвдтекэдбб +аеакудэ,бвдтеккктэ +аеакуэу,бвдтекэток +аебакбб,бвдтекэкээ +аебваэо,бвдтекэотк +аебвбав,бвдтекэабэ +аебвбде,бвдтекэбвв +аебвбео,бвдтекэоав +аебвбуе,бвдтекэоуо +аебвбкк,бвдтекэаук +аебвваэ,бвдтекэобе +аебввба,бвдтекэаоэ +аебввва,бвдтекэбвэ +аебввву,бвдтекккоб +аебввут,бвдтекэаоу +аебвовэ,бвдтекэвеа +аебвока,бвдтекэтве +аебвоэд,бвдтекэеод +аебвдад,бвдтекэоба +аебвдбб,бвдтекэовэ +аебвдоу,бвдтекэвуо +аебвдет,бвдтекэуее +аебвдуд,бвдтекэвоа +аебвдуу,бвдтекэбвк +аебвдэк,бвдтекэаат +аебвебк,бвдтекэадд +аебведа,бвдтекэвтд +аебведу,бвдтекэвев +аебвеек,бвдтекэбад +аебвкба,бвдтекэаеу +аебвкве,бвдтекккок +аебвквт,бвдтекккоэ +аебвкдэ,бвдтекэвее +аебвкеб,бвдтекэбкэ +аебвкээ,бвдтекэввк +аебвэбе,бвдтекээбэ +аебвэбу,бвдтекэдвв +аебвэва,бвдтекэдуб +аебвэое,бвдтекэдбт +аебвэоу,бвдтекэаав +аебвэдб,бвдтекэддэ +аебоаае,бвдтекэвте +аебоаок,бвдтекэокк +аебоаеб,бвдтекэдат +аебоаее,бвдтекэоое +аебоаеу,бвдтекэота +аебобаэ,бвдтекэоэа +аебоббт,бвдтекэбкд +аебобва,бвдтекэаэе +аебобво,бвдтекэаэт +аебобву,бвдтекккку +аебобдв,бвдтекэвуэ +аебобуе,бвдтекэавт +аебовкэ,бвдтеэаабэ +аебовэк,бвдтекэвэо +аебооаб,бвдтекэоуд +аебооов,бвдтекэаев +аебооок,бвдтекэбок +аебооеэ,бвдтекэоте +аебодаэ,бвдтекэдут +аебодду,бвдтекэокв +аебодэо,бвдтекэбка +аебоеба,бвдтекэвав +аебоеду,бвдтекэокэ +аеботбк,бвдтекэбуэ +аеботэб,бвдтекэоее +аебоуат,бвдтекэекб +аебоувк,бвдтекэавб +аебоуоу,бвдтекэвээ +аебокао,бвдтекэвду +аебоэот,бвдтекэоуб +аебоэеа,бвдтекэвоо +аебоэук,бвдтекэбэв +аебдббв,бвдтекэаак +аебдбоо,бвдтекэдкт +аебдбок,бвдтекэакд +аебдбдб,бвдтекэваб +аебдбдд,бвдтекэкет +аебдбте,бвдтекэдвт +аебдбук,бвдтекэдеа +аебдбко,бвдтекэеду +аебдваэ,бвдтекэавк +аебдвбд,бвдтекэвао +аебдвдк,бвдтекэдад +аебдвео,бвдтеккктв +аебдвуу,бвдтеккэбу +аебдвкт,бвдтекэдуу +аебдоба,бвдтеккэба +аебдобк,бвдтекэаек +аебдовт,бвдтекэбао +аебдодк,бвдтекэвбу +аебдоеб,бвдтекэткд +аебдоеу,бвдтекэаэо +аебдотэ,бвдтекэвут +аебдоук,бвдтекэдое +аебддод,бвдтекэобу +аебдддд,бвдтекэбкк +аебддеу,бвдтекэавд +аебддкд,бвдтекэвдк +аебдеаа,бвдтекэауо +аебдеат,бвдтекэатв +аебдевэ,бвдтекэвкб +аебдеео,бвдтекэбаб +аебдеэк,бвдтеккккк +аебдтаа,бвдтекэтбк +аебдтбб,бвдтекэдбэ +аебдтвт,бвдтекэоде +аебдтоб,бвдтекэату +аебдтов,бвдтекэвуа +аебдтдт,бвдтекэвов +аебдтдэ,бвдтекэдоэ +аебдтед,бвдтекэббт +аебдтук,бвдтекэвеу +аебдтко,бвдтекэооу +аебдтэб,бвдтекэвдб +аебдуаб,бвдтекэобв +аебдувв,бвдтекэдвд +аебдутб,бвдтекккту +аебдуту,бвдтекэбта +аебдууо,бвдтекэвэк +аебдука,бвдтекэабе +аебдуэу,бвдтекэбэк +аебдкбо,бвдтекэвба +аебдкбэ,бвдтекэоаа +аебдкву,бвдтекэоко +аебдкеа,бвдтекэдок +аебдкто,бвдтекэаоа +аебдэбо,бвдтекэвта +аебдэбк,бвдтекэаао +аебдэвэ,бвдтекэвое +аебдэов,бвдтекэвво +аебдэдд,бвдтекэвдв +аебдэеэ,бвдтекэовд +аебдэуо,бвдтеккктк +аебдэкт,бвдтекэвет +аебеааэ,бвдтекэоут +аебеавк,бвдтеэаодэ +аебеаед,бвдтекэотб +аебеаеэ,бвдтекэаеа +аебеато,бвдтекэовв +аебебао,бвдтекэаэу +аебебак,бвдтекэввэ +аебеббв,бвдтекэоеэ +аебеббэ,бвдтекэодк +аебебоэ,бвдтекэвдо +аебебек,бвдтекэвау +аебебтд,бвдтекэедэ +аебебув,бвдтеккккв +аебебуо,бвдтекккко +аебебкб,бвдтекэбто +аебевбо,бвдтеккэеа +аебевбт,бвдтекэвае +аебеввб,бвдтекэоуу +аебевев,бвдтекэдкд +аебевтэ,бвдтекэато +аебевэб,бвдтекэоэе +аебевэо,бвдтекэтба +аебеоба,бвдтекэета +аебеобб,бвдтекэакт +аебеооа,бвдтекэдув +аебеодк,бвдтекэбдэ +аебеотэ,бвдтекэвуб +аебеокв,бвдтекэааэ +аебедау,бвдтекэаок +аебедде,бвдтекэдав +аебедек,бвдтекэбба +аебедэв,бвдтеэавбд +аебееве,бвдтекэоот +аебееву,бвдтекэоук +аебеетб,бвдтекэвбк +аебеетд,бвдтекэбкв +аебеетт,бвдтеккэбк +аебееэв,бвдтекэбэа +аебееээ,бвдтекэотв +аебетак,бвдтекэдбк +аебетоб,бвдтекэбда +аебетод,бвдтекэеоо +аебетоу,бвдтекэббо +аебетув,бвдтеккэвт +аебетуэ,бвдтекэоеб +аебетку,бвдтекэово +аебетэо,бвдтекэеэв +аебеувд,бвдтекэукт +аебеуде,бвдтекэоак +аебеуее,бвдтекэода +аебеута,бвдтекэдев +аебеутв,бвдтекэдее +аебеутд,бвдтекэбэд +аебеууо,бвдтекэбтд +аебеуут,бвдтеккэвэ +аебеукд,бвдтекэбтб +аебеукт,бвдтекэвэа +аебекаэ,бвдтекэдэк +аебеква,бвдтекэбкб +аебеквб,бвдтекэево +аебекее,бвдтекэоек +аебектв,бвдтекэвтт +аебекуе,бвдтеккэтд +аебекут,бвдтекэбак +аебеккк,бвдтекэвкд +аебекэа,бвдтекэотт +аебеэаб,бвдтеккэте +аебеэбд,бвдтекэева +аебеэбу,бвдтекэоок +аебеэде,бвдтекэдеэ +аебеэдт,бвдтекэдаб +аебеэдэ,бвдтекэбат +аебеэту,бвдтекэетб +аебтаде,бвдтекэаэб +аебтатв,бвдтекэвуд +аебтатэ,бвдтекэбээ +аебтауб,бвдтекэоээ +аебтакт,бвдтекэддб +аебтаэт,бвдтекэвуу +аебтбав,бвдтекэдек +аебтбад,бвдтекэоуэ +аебтбау,бвдтекэдва +аебтббе,бвдтекэков +аебтбде,бвдтекэваа +аебтвеа,бвдтекэаде +аебтвуд,бвдтеэаоээ +аебтвкб,бвдтекэдба +аебтвээ,бвдтекэбоу +аебтоад,бвдтекэбуд +аебтовк,бвдтекэобт +аебтодо,бвдтекэбуе +аебтоеэ,бвдтекэаэд +аебтока,бвдтекэвеб +аебтоэв,бвдтекэбдв +аебтдее,бвдтеэаоку +аебтдкд,бвдтекэаээ +аебтдэт,бвдтекэбеб +аебтдээ,бвдтекэдбд +аебтеба,бвдтекэоку +аебтевб,бвдтекэдву +аебтеео,бвдтекэокб +аебтетэ,бвдтекэдот +аебтекв,бвдтекэвбэ +аебттбд,бвдтекэдед +аебттвв,бвдтекэвке +аебттву,бвдтекэдту +аебттот,бвдтекэтбт +аебттеэ,бвдтекэтдт +аебттту,бвдтекэвук +аебттуб,бвдтекэеад +аебтткд,бвдтекэоет +аебттку,бвдтекэдкб +аебттэу,бвдтекэеао +аебтуао,бвдтекэеэб +аебтуад,бвдтекэбте +аебтубк,бвдтекэеэт +аебтудк,бвдтекэдеб +аебтуеу,бвдтекэута +аебтууэ,бвдтекэбтв +аебтуке,бвдтекэдэа +аебткбе,бвдтекэбуу +аебтквт,бвдтекэтот +аебткву,бвдтекэдео +аебткоа,бвдтекэтао +аебткок,бвдтекэддд +аебтккв,бвдтекэовт +аебткэа,бвдтекэтаэ +аебткэт,бвдтекэотэ +аебтэот,бвдтекэеве +аебтэок,бвдтекэбод +аебтэдв,бвдтекэбео +аебтэее,бвдтекэдуэ +аебтэтт,бвдтекэтеу +аебтэкд,бвдтекэедк +аебтээо,бвдтекэбеа +аебтээу,бвдтекэтед +аебуаае,бвдтекээвк +аебуаак,бвдтекэбев +аебуабб,бвдтекэдде +аебуабу,бвдтекэдкв +аебуабк,бвдтекэбед +аебуакб,бвдтекэедв +аебуаке,бвдтекэтое +аебуббт,бвдтекэекэ +аебубвб,бвдтеэааэе +аебубтк,бвдтеэаава +аебубуу,бвдтекэеак +аебубкб,бвдтеэабкв +аебубкд,бвдтекэеба +аебубке,бвдтекэебб +аебубэб,бвдтекээуб +аебубэт,бвдтекээдэ +аебуваа,бвдтекэебе +аебуваэ,бвдтекэтод +аебувбб,бвдтекэебк +аебувбв,бвдтекэебт +аебувбо,бвдтеэаббв +аебувва,бвдтекэтвв +аебувдв,бвдтекээте +аебувтб,бвдтекэеуэ +аебувтд,бвдтекээкб +аебувте,бвдтекэеэк +аебувув,бвдтекэтад +аебувкд,бвдтеэаакд +аебуоав,бвдтекэтае +аебуоак,бвдтеэабкб +аебуобу,бвдтекэекв +аебуодв,бвдтеэаадк +аебуоед,бвдтеэабво +аебуокв,бвдтекээтб +аебуоээ,бвдтекэтту +аебудаа,бвдтекээут +аебудбк,бвдтекэтак +аебудвб,бвдтеэавдо +аебудвв,бвдтеэааоа +аебудео,бвдтеэавэе +аебудеу,бвдтекээдв +аебудек,бвдтекээоб +аебудте,бвдтекээку +аебудуд,бвдтеэавут +аебудка,бвдтекэээе +аебудку,бвдтеэаабу +аебудэа,бвдтекэтвк +аебудэе,бвдтеэаавд +аебудэу,бвдтеэаако +аебуебт,бвдтекээвэ +аебуево,бвдтеэааеа +аебуеоо,бвдтеэааэд +аебуеоу,бвдтекэтбо +аебуеде,бвдтеэаауе +аебуеуа,бвдтеэаааа +аебуеуб,бвдтеэаатв +аебуека,бвдтеэабэб +аебуекк,бвдтеэабэд +аебуеэв,бвдтеэааве +аебутак,бвдтекэтво +аебутве,бвдтеэабвк +аебутвэ,бвдтекэтва +аебутов,бвдтекэтбэ +аебутдв,бвдтеэаатт +аебутдэ,бвдтеэаата +аебутев,бвдтекэтек +аебутео,бвдтеэаадэ +аебутет,бвдтеэааек +аебуттт,бвдтеэаабо +аебуттэ,бвдтекэтоу +аебутуо,бвдтеэаадо +аебуткб,бвдтеэавдв +аебуубк,бвдтекэтео +аебуубэ,бвдтеэавтв +аебуувд,бвдтекэтев +аебуувэ,бвдтекээот +аебууоу,бвдтеэаавб +аебуудв,бвдтеэаоод +аебууеэ,бвдтекэттб +аебуута,бвдтекэтеэ +аебуутб,бвдтекэттт +аебуутк,бвдтекээдд +аебуууб,бвдтекээво +аебууув,бвдтеэааат +аебуукб,бвдтеэааов +аебууэе,бвдтеэаада +аебукау,бвдтеэавбк +аебуквв,бвдтекээбк +аебукет,бвдтекээеу +аебуктд,бвдтеэаауо +аебуктт,бвдтекээкэ +аебуктэ,бвдтекэуте +аебукку,бвдтекэээб +аебукэо,бвдтеэаббб +аебукэе,бвдтекээва +аебукэу,бвдтекэээт +аебуэаа,бвдтеэабкэ +аебуэат,бвдтеэавоо +аебуэбв,бвдтеэаабт +аебуэва,бвдтекэкэе +аебуэвв,бвдтеэаатд +аебуэве,бвдтеэавве +аебуэов,бвдтекээбд +аебуэто,бвдтекээкд +аебуэтк,бвдтеэабэо +аебуэуо,бвдтеэааэо +аебуэка,бвдтекэээк +аебуэээ,бвдтеэавкк +аебкаае,бвдтекээбб +аебкабэ,бвдтекээту +аебкаот,бвдтеэааау +аебкаде,бвдтекээка +аебкает,бвдтеэабоо +аебкаеэ,бвдтеэавте +аебкатт,бвдтекээбт +аебкату,бвдтеэааее +аебкауе,бвдтеэабае +аебкбаа,бвдтеэаабе +аебкбаэ,бвдтекээаа +аебкбвд,бвдтекэээа +аебкбоб,бвдтеэаакт +аебкбда,бвдтекээет +аебкбдо,бвдтекээоэ +аебкбдк,бвдтеэаауэ +аебкбтт,бвдтекээау +аебкбту,бвдтекээке +аебкбэт,бвдтеэавко +аебкбээ,бвдтеэааое +аебкваа,бвдтеэавак +аебквду,бвдтеэаабб +аебквек,бвдтекэээо +аебквтд,бвдтеэаает +аебкоаб,бвдтекээээ +аебкобк,бвдтеэааба +аебкове,бвдтеэаавэ +аебкоод,бвдтеэавэд +аебкодэ,бвдтеэааде +аебкдаа,бвдтекээеб +аебкдат,бвдтеэааэк +аебкдвб,бвдтеэаакв +аебкдвв,бвдтеэабэк +аебкдву,бвдтеэааеб +аебкдет,бвдтеэаааб +аебкеат,бвдтекээбо +аебкеаэ,бвдтеэабдо +аебкебу,бвдтеэааэт +аебкеву,бвдтекэуэб +аебкеоб,бвдтеэааот +аебкееа,бвдтекэээу +аебкето,бвдтеэавуо +аебктбу,бвдтеэавдд +аебктва,бвдтеэааэу +аебктвт,бвдтекээкв +аебктдв,бвдтеэааук +аебктев,бвдтеэаоев +аебктед,бвдтеэавот +аебкткб,бвдтеэавду +аебктэд,бвдтекэткэ +аеввваэ,бвдтеэавое +аевввбе,бвдтеэааао +аеввввт,бвдтеэавтк +аевввое,бвдтекээвб +аевввэб,бвдтекээое +аеввово,бвдтекээак +аеввове,бвдтеэаауд +аевводт,бвдтеэабээ +аеввотд,бвдтеэаодт +аеввоте,бвдтеэааоб +аеввокк,бвдтеэабое +аеввдва,бвдтеэааев +аеввдов,бвдтеэавуд +аеввдук,бвдтекээвд +аеввдэк,бвдтеэабот +аеввеае,бвдтеэавбу +аеввебт,бвдтеэавээ +аеввевт,бвдтекээае +аеввеке,бвдтеэааад +аеввеку,бвдтекээбв +аеввеэб,бвдтеэавву +аеввеэв,бвдтеэавэа +аеввтат,бвдтеэаоат +аеввтбо,бвдтеэабау +аеввтбк,бвдтекээав +аеввтвб,бвдтеэавэт +аеввтвд,бвдтеэаато +аеввтоо,бвдтеэабав +аеввтоэ,бвдтекээтд +аеввттт,бвдтеэавэу +аеввтэа,бвдтеэабэт +аеввтэе,бвдтеэаввэ +аеввуаэ,бвдтеэааво +аеввуоу,бвдтеэавоб +аеввуда,бвдтекэкэт +аеввудт,бвдтеэавту +аеввуду,бвдтекэуке +аеввквб,бвдтеэаауа +аеввкву,бвдтеэаодд +аеввкое,бвдтекээдт +аеввктд,бвдтекээуо +аеввкуб,бвдтекээад +аеввкко,бвдтеэаате +аеввкэк,бвдтеэааду +аеввэад,бвдтекэтэк +аеввэбк,бвдтеэааоэ +аеввэвв,бвдтеэааоо +аеввэво,бвдтеэаоаэ +аеввэое,бвдтекээат +аеввэоу,бвдтеэааав +аеввэду,бвдтекээук +аеввэтд,бвдтеэаову +аеввэкб,бвдтеэавеу +аеввэкт,бвдтеэабва +аеввээе,бвдтеэаоаа +аеввээт,бвдтеэадеа +аевоабе,бвдтеэабоу +аевоавд,бвдтеэаоаб +аевоаоэ,бвдтеэабда +аевоаде,бвдтеэавув +аевоадэ,бвдтеэаадб +аевоаеб,бвдтекээеэ +аевоаео,бвдтеэаотд +аевоатд,бвдтеэабаэ +аевоатк,бвдтеэабао +аевоакв,бвдтеэабоэ +аевоако,бвдтеэааео +аевобдо,бвдтеэааэа +аевобтв,бвдтеэабад +аевобте,бвдтеэабке +аевобкт,бвдтеэавет +аевобэу,бвдтекэуав +аевоваа,бвдтеэавде +аевовбб,бвдтекээее +аевовоу,бвдтеэаавк +аевовдт,бвдтеэаобу +аевовта,бвдтекээбу +аевовку,бвдтеэаодб +аевовэу,бвдтекээао +аевооаа,бвдтеэабка +аевооае,бвдтеэааок +аевоовд,бвдтекэуто +аевооод,бвдтеэавеа +аевоодо,бвдтеэаадв +аевооет,бвдтеэааед +аевоокк,бвдтеэавва +аевооэб,бвдтекээтк +аеводбв,бвдтекээтт +аеводда,бвдтеэавта +аеводду,бвдтеэавтб +аеводте,бвдтеэааоу +аеводук,бвдтеэаауу +аеводуэ,бвдтеэааут +аевоеоа,бвдтекэукк +аевоеод,бвдтеэавук +аевоедэ,бвдтеэавэк +аевоееу,бвдтекэука +аевоеут,бвдтекээко +аевоеук,бвдтеэавуэ +аевотае,бвдтекээтв +аевотда,бвдтеэаобб +аевотдб,бвдтеэаввт +аевотду,бвдтеэабба +аевотеб,бвдтеэаабв +аевоттб,бвдтеэаооо +аевотке,бвдтеэавбб +аевоткк,бвдтеэавба +аевотэу,бвдтекээев +аевотээ,бвдтеэаатэ +аевоуба,бвдтеэавво +аевоубе,бвдтеэабкт +аевоуод,бвдтеэабак +аевоуоэ,бвдтекэкэу +аевоуда,бвдтеэабвд +аевоуду,бвдтеэаоае +аевоуув,бвдтеэавуб +аевоууе,бвдтеэавее +аевоукт,бвдтеэабку +аевоуэт,бвдтеэаоек +аевоуээ,бвдтеэаоба +аевокау,бвдтекээуу +аевокаэ,бвдтеэаату +аевокбу,бвдтекэууб +аевоквд,бвдтекэууд +аевоквт,бвдтеэаоау +аевоквк,бвдтекэууо +аевокоо,бвдтекэкдв +аевокое,бвдтеэавев +аевокот,бвдтекэууа +аевокда,бвдтеэаввб +аевокдб,бвдтекэкдд +аевокет,бвдтекээуд +аевоэбу,бвдтекэкоэ +аевоэов,бвдтеэааву +аевдатв,бвдтекээуэ +аевдауа,бвдтеэавао +аевдаук,бвдтеэааке +аевдакт,бвдтеэабву +аевдаэе,бвдтеэаака +аевдбвт,бвдтекэкэк +аевдбдв,бвдтекээде +аевдбдэ,бвдтеэабоа +аевдбув,бвдтеэабкд +аевдбкб,бвдтеэаооу +аевдбке,бвдтеэаоде +аевдваэ,бвдтекэуко +аевдвба,бвдтекэкдб +аевдввд,бвдтеэаавв +аевдвоа,бвдтекээуа +аевдвдэ,бвдтеэаоеу +аевдвуэ,бвдтеэаадт +аевдвке,бвдтекээда +аевдооб,бвдтеэааку +аевдодт,бвдтеэабэа +аевдотт,бвдтеэавед +аевдоэб,бвдтеэавуе +аевдоэе,бвдтеэавтэ +аевддвб,бвдтекэкот +аевдддб,бвдтеэавкв +аевддтд,бвдтеэаоак +аевддув,бвдтеэавэб +аевддэу,бвдтеэааеу +аевдеба,бвдтеэавэо +аевдебо,бвдтеэааэв +аевдеуа,бвдтекэкаа +аевдекэ,бвдтекэкоа +аевдеэа,бвдтекээок +аевдтее,бвдтеэавто +аевдтек,бвдтекэуэо +аевдтта,бвдтекэкве +аевдтэб,бвдтекэуэв +аевдтэу,бвдтеэаваэ +аевдудд,бвдтекээув +аевдуде,бвдтеэаоуб +аевдуду,бвдтекээбе +аевдуук,бвдтеэаодо +аевдуэв,бвдтекэуэд +аевдкоэ,бвдтекэкоб +аевдкдо,бвдтекэквэ +аевдкдэ,бвдтеэаотт +аевдкув,бвдтеэаакб +аевеавт,бвдтеэавад +аевеавэ,бвдтеэабаб +аевеадк,бвдтеэаббу +аевеаук,бвдтекэкво +аевеакк,бвдтеэаоао +аевеаэб,бвдтекэквк +аевеаэв,бвдтеэавбе +аевеаэо,бвдтекээек +аевеббд,бвдтеэавдт +аевеббе,бвдтекэээв +аевебот,бвдтекээеа +аевебоу,бвдтеэавав +аевебео,бвдтеэавкд +аевебтт,бвдтеэабоб +аевебуб,бвдтекээкк +аевебув,бвдтекээоо +аевебкв,бвдтекээкт +аевевак,бвдтеэавтд +аевевбк,бвдтеэабэе +аевевуб,бвдтеэавеб +аевевув,бвдтеэабэу +аевевуу,бвдтекэкод +аевевке,бвдтекээед +аевевку,бвдтеэавдк +аевеоаа,бвдтеэавае +аевеодо,бвдтеэабко +аевеодк,бвдтекээаэ +аевеодэ,бвдтеэабкк +аевеотт,бвдтеэавда +аевеоуд,бвдтекэкде +аевеоуэ,бвдтеэавеэ +аевеоэе,бвдтеэаооб +аевеоэт,бвдтеэавкт +аеведоб,бвдтеэавау +аеведтв,бвдтекээду +аеведуэ,бвдтеэаода +аевеебэ,бвдтекээвв +аеветаа,бвдтеэааае +аеветук,бвдтеэабэв +аеветкб,бвдтеэааак +аеветэк,бвдтекэккт +аевеуве,бвдтеэавдб +аевеувэ,бвдтеэаотэ +аевеудо,бвдтекээуе +аевеуук,бвдтеэаоет +аевеукв,бвдтеэавод +аевеуэо,бвдтеэават +аевекао,бвдтеэавэв +аевеква,бвдтеэаоад +аевекоб,бвдтеэаввк +аевекот,бвдтеэабод +аевекоу,бвдтеэавоу +аевекео,бвдтекэктэ +аевекек,бвдтеэаоэк +аевекеэ,бвдтеэаоеэ +аевектэ,бвдтеэаобо +аевекуа,бвдтеэавбо +аевеккт,бвдтеэабок +аевекэб,бвдтекэкуо +аевеэбе,бвдтеэабвэ +аевеэвб,бвдтекээов +аевеэов,бвдтеэаоот +аевеэет,бвдтеэавоа +аевеэув,бвдтеэаоед +аевеэкэ,бвдтеэавов +аевеэээ,бвдтекэкэо +аевтаво,бвдтекэкке +аевтаед,бвдтеэаваб +аевтатэ,бвдтеэабук +аевтауд,бвдтеэавек +аевтакв,бвдтеэаоду +аевтбдк,бвдтеэаатб +аевтбеб,бвдтеэавоэ +аевтбуэ,бвдтекэккэ +аевтват,бвдтекэкэв +аевтвоб,бвдтеэавок +аевтвуэ,бвдтеэавбэ +аевтоао,бвдтекэкэб +аевтобэ,бвдтеэаоут +аевтоот,бвдтеэавка +аевтоуо,бвдтеэабвт +аевтоко,бвдтеэавео +аевтокк,бвдтеэаоее +аевтдао,бвдтеэавкб +аевтдбу,бвдтеэавку +аевтдод,бвдтеэаота +аевтдоэ,бвдтеэавуа +аевтдед,бвдтеэаоов +аевтдеу,бвдтеэаодк +аевтдка,бвдтеэаобд +аевтеао,бвдтеэаббк +аевтеод,бвдтеэаодв +аевттоо,бвдтеэаово +аевтубо,бвдтеэабео +аевтуву,бвдтеэабта +аевтута,бвдтеэаоуд +аевтуто,бвдтеэаоув +аевтктб,бвдтеэадда +аевткэт,бвдтеэаоое +аевтэуо,бвдтеэаокт +аевубвд,бвдтеэаоэб +аевувэв,бвдтеэаокк +аевуоуд,бвдтеэадеу +аевуебт,бвдтеэадбк +аеэвбд,бакоу +аувоаб,тэуе +аукэоу,бдк +акаааоад,эаэу +акааадвб,ббауд +акаавво,кбкв +аэааабаа,ббает +аэааабатааб,бббаб +аэааабео,бабту +аэааабууааб,баэот +аэааабка,баэке +аэааабкб,ббаву +бводету,в +боавааб,бвдтеккэук +бевэуэб,кате +бктбке,бвдтекэкеб +ооэвобд,эквд +оеоауа,екбк +оетаоэ,еуев +отэака,екэо +оуевву,уэуо +дбкэбт,туоб +дквабк,экдд +дэддуе,баэвк +еаевэв,бббад +еаувэе,бвдтеккдуд +евобэа,бвдтекэкеа +евобэб,бвдтекэкдэ +евеадт,бвдтекэкев +ееаау,ет +кааабаа,удту +кааабаб,эаэд +кааабав,удкт +кааабад,уваб +кааабае,уэдв +кааабау,увак +кааабак,ккад +кааабаэ,уобд +кааабба,уоеб +каааббв,уодт +каааббо,уээк +каааббд,ууат +каааббе,утеб +каааббт,удтк +каааббк,уовэ +каааббэ,уооа +кааабвб,уоок +кааабвв,уекд +кааабвд,уевк +кааабве,уоеу +кааабву,уоее +кааабвк,уоаэ +кааабвэ,ууеа +кааабоа,утко +кааабоб,уеда +кааабоо,кэтэ +кааабод,утвэ +кааабое,утуэ +кааабот,утдт +кааабоэ,уово +кааабда,уовд +кааабдб,укбе +кааабдв,удкв +кааабдо,уоак +кааабдд,увау +кааабде,уват +кааабду,уовв +кааабдк,уовт +кааабдэ,тээу +кааабеа,удкк +кааабеб,уобв +кааабев,уееб +кааабео,уоед +кааабед,уовб +кааабее,утвк +кааабет,уеое +кааабеу,уеке +кааабек,утоа +кааабеэ,уткв +кааабтб,уткб +кааабтв,уткк +кааабто,уккк +кааабтд,укеу +кааабте,уэбэ +кааабтт,уэое +кааабту,уэвэ +кааабтк,уэоа +кааабтэ,катт +кааабуа,уэеу +кааабуб,уэда +кааабув,уэеб +кааабуо,уэто +кааабуд,кдад +кааабуе,уэее +кааабут,уэтт +кааабуу,уэуэ +кааабук,уэук +кааабуэ,уэкт +кааабка,каао +кааабкв,уээд +кааабке,уэку +кааабкт,уэкк +кааабкэ,бааээ +кааабэа,бакто +кааабэв,кавв +кааабэд,каед +кааабэе,кавт +кааабэт,кавд +кааабэу,кавэ +кааабэк,кавк +каааваа,каоб +каааваб,каов +кааавав,каоо +кааавао,кбаа +кааавад,каоэ +кааавае,уэвд +кааават,каде +кааавау,ката +кааавак,каеэ +каааваэ,кадв +кааавба,каев +кааавбб,каее +кааавбв,катб +кааавбо,ккдт +кааавбд,кэак +кааавбе,каэв +кааавбт,каэт +кааавбу,кауэ +кааавбк,каув +кааавбэ,кака +каааввб,каэк +каааввв,кбад +кааавве,кбэа +каааввт,кбэк +кааавву,кбэу +каааввк,кбээ +каааввэ,квбд +кааавоа,квбо +кааавоб,кввб +кааавов,кввд +кааавоо,кооэ +кааавод,кодв +кааавое,коду +кааавот,дуеу +кааавоу,кодэ +кааавок,котд +кааавоэ,коте +кааавда,котт +кааавдб,кдта +кааавдв,ккуд +кааавдо,ккэт +кааавдд,тбве +кааавде,кдек +кааавдт,ккае +кааавду,ккбо +кааавдк,ккэв +кааавдэ,кэав +кааавеа,ккэб +кааавеб,ккэо +кааавев,кэау +кааавео,кэат +кааавед,ккэу +кааавее,кэкк +кааавет,кэдб +кааавеу,уоод +кааавек,кэеу +кааавеэ,тэку +кааавта,уову +кааавтб,кэув +кааавтв,эаво +кааавто,кэуа +кааавтд,кэуб +кааавте,кэуо +кааавтт,кэуе +кааавту,кэуд +кааавтк,кэук +кааавтэ,кэкд +кааавуа,кэкт +кааавуб,кэку +кааавув,кэкэ +кааавуд,уквв +кааавуе,уеве +кааавут,кээв +кааавуу,кээе +кааавук,кээд +кааавуэ,кээт +кааавка,эабэ +кааавкб,эаао +кааавкв,эаад +кааавко,эаве +кааавкд,эабб +кааавке,эабк +кааавкт,эабу +кааавку,эабе +кааавкк,эабт +кааавкэ,эавв +кааавэа,эава +кааавэб,эавб +кааавэв,уэев +кааавэо,эавд +кааавэд,эавэ +кааавэе,эаоа +кааавэт,эаод +кааавэк,эада +кааавээ,укут +каааоаб,эаеа +каааоав,эаээ +каааоао,эаэе +каааоад,эбаб +каааоае,эбао +каааоат,эбаэ +каааоау,эбво +каааоак,эбвд +каааоаэ,эбве +каааоба,эбоб +каааобб,эбвэ +каааобв,эбву +каааобо,эбот +каааобд,эбод +каааобе,эктэ +каааобт,туео +каааобу,эует +каааобк,бадое +каааобэ,баубо +каааова,эуэа +каааовб,эуэб +каааовв,эувв +каааовд,эувд +каааове,эктв +каааовт,эудк +каааову,эуву +каааооа,экдв +каааооб,эккэ +каааоот,ээаб +каааооу,ээбт +каааоок,бааое +каааооэ,ээбк +каааодб,бааеа +каааодв,баадк +каааодо,баадэ +каааодд,баатб +каааоде,баатв +каааоду,баато +каааодэ,бааеу +каааоеа,баата +каааоев,баауо +каааоед,баауе +каааоее,баака +каааоет,баакд +каааоеу,баако +каааоек,баакк +каааоеэ,баакэ +каааота,бааэв +каааотв,бабае +каааото,бабат +каааотд,баббт +каааоте,бабуб +каааоттт,бабув +каааоту,бабка +каааотэ,бавбу +каааоуа,бавбк +каааоуо,бадеу +каааоуд,бадет +каааоуу,бадтд +каааоук,баеут +каааока,баубе +каааокв,баукт +каааоко,увтк +каааоке,бакот +каааокк,туав +каааоэа,екук +каааоэб,уетэ +каааоэв,ттбд +каааоэо,баэод +каааоэд,уоэу +каааоэе,баэде +каааоэт,баэдт +каааоэу,баэду +каааоэк,баэеа +каааоээ,баэдк +кааадаа,баэдэ +кааадаб,баэет +кааадав,теае +кааадао,баэто +кааадад,бааэо +кааадае,баэту +кааадат,баэуб +кааадау,ууук +кааадак,какк +кааадаэ,баэуд +кааадба,баэуе +кааадбв,баэут +кааадбт,ббаве +кааадбу,ббаот +кааадбк,ббаее +кааадбэ,ббаед +кааадва,ббатв +кааадвв,бббае +кааадво,бббат +кааадве,баэва +кааадвт,бвдтекктет +кааадвк,баудо +кааадов,бвдтеккэат +кааадое,бвдтеккэко +кааадот,бвдтеккэку +кааадоу,бвдтеккэуе +кааадок,бвдтеккэкб +кааадоэ,бвдтеккээо +каааддб,бвдтекэбдт +каааддв,бвдтекэдтв +кааадде,бвдтекэуаб +каааддт,бвдтекэутт +каааддк,екэт +каааддэ,бвдтекэктв +каааеаб,бвдтекэкек +каааеав,бвдтекэкеу +каааеао,бвдтекэкта +каааеад,бвдтекэкту +каааеае,бвдтекэкуб +эааабаа,бвдтеккэтк +эааабаб,ббатд +эааабао,бвдтекэбот +эааабад,бвдтекэбду +эааабае,уеэб +эааабат,бвдтеккуук +эааабау,эбвк +эааабаэ,бвдтеккуэв +эааабба,бвдтекккат +эаааббб,бвдтекккаэ +эаааббв,уэеа +эаааббд,бвдтекэтуб +эаааббе,кбаб +эаааббт,кбав +эаааббу,кбао +эааабва,кваа +эааабвб,квбе +эааабвв,бабаа +эааабво,эаае +эааабвд,бабав +эааабве,эаау +эааабвт,бабад +эааабву,эааэ +эааабвк,эаба +эааабвэ,эаеб +эааабоа,ээаэ +эааабоб,баадо +эааабов,бааед +эааабоо,бааек +эааабод,баатт +эааабое,баате +эааабот,бааеэ +эааабоу,баауд +эааабок,бабак +эааабоэ,уова +эааабда,баббб +эааабдб,баатд +эааабдо,экэв +эааабдд,баббв +эааабде,баббд +эааабдт,баббе +эааабдуааб,баббу +эааабдкааб,бабвб +эааабеа,бабвв +эааабеб,бабву +эааабевааб,бабвк +эааабед,бабтк +эааабее,бабтэ +эааабет,бвдтекэдта +эааабеу,баауб +эааабек,бабуо +эааабеэ,экоэ +эааабта,бабуе +эааабтб,бабэв +эааабтв,бабэо +эааабто,баваа +эааабтд,бвдтекэтав +эааабте,бавао +эааабтт,бавад +эааабту,бвдтекэттэ +эааабтк,бавбб +эааабтэ,бавва +эааабуа,бвдтекэттк +эааабуб,бадоу +эааабув,бакбк +эааабуе,бвдтекэтдв +эааабут,баэоа +эааабук,бакуа +эааабуэ,баэтв +эааабкб,бвдтеккквк +эааабквааб,бббво +эааабко,бвдтекккдо +эааабкд,бвдтекккуе +эааабку,бвдтекэтуа +эааабкэ,бвдтекэтэе +эаааваа,бвдтекэкбт +эаааваб,бвдтекэкду +эааавав,ббаэв +эааавао,бвдтекэкеэ +эааавад,бвдтеэаокб +эааавае,бавбо +эааават,бвдтеэаоэу +эааавау,бвдтеэадбт +эааавде,ббаоо +эаааеаа,бвдтеккков +эаааеаб,ббакд +эаааеав,ббоов +эаааеао,бвдтеккэке +эаааеад,бвдтеккэкт +эаааеае,бвдтекккбд +эаааеат,бвдтеккква +эаааеау,бвдтеккээд +эаааеак,бвдтекэбоо +эаааеаэ,бвдтекэтуэ +эаааеба,бвдтекэтка +эаааебб,бааду +эаааебв,бвдтекэква +эаааебо,кбко +эаааебд,уэтд +эаааебе,кбкт +эаааебт,кбке +эаааебу,кбэт +эаааебк,кбэе +эаааевб,квао +эаааевв,квад +эаааево,квак +эаааевд,квба +эаааеве,кваэ +эаааевэ,кввт +эаааеоа,коот +эаааеоб,кооу +эаааеов,кэбб +эаааеоо,кэба +эаааеод,кэбв +эаааеое,кэет +эаааеот,кэек +эаааеоу,кээа +эаааеок,ууев +эаааеоэ,ууеб +эаааеда,баэок +эаааедб,эадб +эаааедв,баэтб +эаааеэу,бвдтекэутд +эаааеэк,бвдтекэуаа +эаааеээ,бвдтекэтээ +эааатаа,кбаэ +эааатаб,бвдтекэктт diff --git a/node_modules/csvtojson/test/data/lineBreak b/node_modules/csvtojson/test/data/lineBreak new file mode 100644 index 0000000..bee6c82 --- /dev/null +++ b/node_modules/csvtojson/test/data/lineBreak @@ -0,0 +1,8 @@ +F_Year,Event ID,Event Date,Time,Location,Rotue,TOC,Person type,Injury degree,FWI,Precursor,Gender,Under 16,Apparent age,Fatal,Alcohol/Drugs,Impairment,Encumbrances & Group Travel,Risk-taking Behaviour,Sub-standard conditions,Design,Operational error,Crowd management,Non-standard operation,Rushing,3rd Party Behaviour,Narrative Full,Period +2013/2014,2914930,3/2/14,23:02:00,Pembrey and Burry Port,Wales,Arriva Trains Wales,Passenger,Minor non-reportable,0.001,Passenger falls from platform onto track (no electric shock nor struck by train) under the influence,Male,,Unknown,,x,,,,,,,,,,,"A report was initially received from Dyfed Powys Police that a person had been struck by a train at Pembrey and Burry Port station and that an ambulance was in attendance (the ambulance was the source of the police report). It later transpired that the person was inebriated and had fallen off of Pembrey platform after attempting to board the train after the doors were closed and the train was ready to depart. It has been confirmed (by Pembrey signaller) that the person has not been struck by the train and has NOT fallen under the train. One police officer on site. + +Later advice from the train crew working 2B21 2135 Milford Haven to Cardiff Central stated the person had attempted to board 2B21 as it was ready to depart from the platform, bounced off of the train falling backwards, had then gotten back up and then fallen off of the platform and onto the track behind the train. The persons injuries (if any) have not been disclosed. + +The person was been removed from the track and normal working resumed from 2326. The on call MOM was called to attend and act a RIO if required, but was stood down after the incident was resolved. + +The initial call came from Dyfed Powys Police under reference 333 when it was advised that their report had come from the Ambulance Service (reference 1523673) and the BTP were also made aware by Dyfed Powys Police under their reference 470.",13 diff --git a/node_modules/csvtojson/test/data/longHeader b/node_modules/csvtojson/test/data/longHeader new file mode 100644 index 0000000..b34aede --- /dev/null +++ b/node_modules/csvtojson/test/data/longHeader @@ -0,0 +1,2 @@ +Date,Advertiser,Advertiser ID,Advertiser Status,Advertiser Integration Code,Insertion Order,Insertion Order ID,Insertion Order Status,Insertion Order Integration Code,Partner Currency,Advertiser Currency,Clicks,% Clicks Leading to Conversions,Conversions per 1000 Impressions,CPM Fee 1 (Adv Currency),CPM Fee 1 (Partner Currency),CPM Fee 1 (USD),CPM Fee 2 (Adv Currency),CPM Fee 2 (Partner Currency),CPM Fee 2 (USD),Click Rate (CTR),Data Fees (Adv Currency),Data Fees (Partner Currency),Data Fees (USD),Impressions,% Impressions Leading to Conversions,Post-Click Conversions,Post-View Conversions,Media Cost (Advertiser Currency),Media Cost eCPA (PC) (Adv Currency),Media Cost eCPA (PC) (Partner Currency),Media Cost eCPA (PC) (USD),Media Cost eCPA (PV) (Adv Currency),Media Cost eCPA (PV) (Partner Currency),Media Cost eCPA (PV) (USD),Media Cost eCPA (Adv Currency),Media Cost eCPA (Partner Currency),Media Cost eCPA (USD),Video Media Cost eCPCV (Adv Currency),Video Media Cost eCPCV (Partner Currency),Video Media Cost eCPCV (USD),Media Cost eCPC (Adv Currency),Media Cost eCPC (Partner Currency),Media Cost eCPC (USD),Media Cost eCPM (Adv Currency),Media Cost eCPM (Partner Currency),Media Cost eCPM (USD),Media Cost (Partner Currency),Media Cost (USD),Media Fee 1 (Adv Currency),Media Fee 1 (Partner Currency),Media Fee 1 (USD),Media Fee 2 (Adv Currency),Media Fee 2 (Partner Currency),Media Fee 2 (USD),DCM Post-Click Revenue,DCM Post-View Revenue,Profit (Advertiser Currency),Profit eCPM (Adv Currency),Profit eCPM (Partner Currency),Profit eCPM (USD),Profit Margin,Profit (Partner Currency),Profit (USD),Revenue (Adv Currency),Revenue eCPA (PC) (Adv Currency),Revenue eCPA (PC) (Partner Currency),Revenue eCPA (PC) (USD),Revenue eCPA (PV) (Adv Currency),Revenue eCPA (PV) (Partner Currency),Revenue eCPA (PV) (USD),Revenue eCPA (Adv Currency),Revenue eCPA (Partner Currency),Revenue eCPA (USD),Video Revenue eCPCV (Adv Currency),Video Revenue eCPCV (Partner Currency),Video Revenue eCPCV (USD),Revenue eCPC (Adv Currency),Revenue eCPC (Partner Currency),Revenue eCPC (USD),Revenue eCPM (Adv Currency),Revenue eCPM (Partner Currency),Revenue eCPM (USD),Revenue (Partner Currency),Revenue (USD),Complete Views (Video),First-Quartile Views (Video),Fullscreens (Video),Midpoint Views (Video),Audio Mutes (Video),Pauses (Video),Starts (Video),Skips (Video),Third-Quartile Views (Video),Total Conversions,Total Media Cost (Advertiser Currency),Total Media Cost eCPA (PC) (Adv Currency),Total Media Cost eCPA (PC) (Partner Currency),Total Media Cost eCPA (PC) (USD),Total Media Cost eCPA (PV) (Adv Currency),Total Media Cost eCPA (PV) (Partner Currency),Total Media Cost eCPA (PV) (USD),Total Media Cost eCPA (Adv Currency),Total Media Cost eCPA (Partner Currency),Total Media Cost eCPA (USD),Total Video Media Cost eCPCV (Adv Currency),Total Video Media Cost eCPCV (Partner Currency),Total Video Media Cost eCPCV (USD),Total Media Cost eCPC (Adv Currency),Total Media Cost eCPC (Partner Currency),Total Media Cost eCPC (USD),Total Media Cost eCPM (Adv Currency),Total Media Cost eCPM (Partner Currency),Total Media Cost eCPM (USD),Total Media Cost (Partner Currency),Total Media Cost (USD),Completion Rate (Video) +8/26/16,1000 AAAAAA AAAA AAAA - AAAAAA - #AAAAAAAA - AAA,1161431,Active,,1010101010 - 1000 AAAAAAA AAAA AAAA - AAAAAAA AAAA - 28 Jun 2016 - AAAAAAA - #AAAAAAAA - AAAAAAA,2427940,Paused,CTR,CAD,CAD,2,0.00%,0,0,0,0,0,0,0,0.13%,0,0,0,1540,0.00%,0,0,7.476659,0,0,0,0,0,0,0,0,0,0,0,0,3.738329,3.73833,2.892061,4.854973,4.854973,3.755923,7.476659,5.784121,0.971966,0.971966,0.751936,0,0,0,0,0,10.031375,6.51388,6.51388,5.035214,54.26%,10.031375,7.75423,18.48,0,0,0,0,0,0,0,0,0,0,0,0,9.24,9.24,7.145143,12,12,9.279407,18.48,14.290287,0,0,0,0,0,0,0,0,0,0,8.448625,0,0,0,0,0,0,0,0,0,0,0,0,4.224312,4.224312,3.268029,5.48612,5.48612,4.244193,8.448625,6.536057,0.00% \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/noheaderWithVaryColumnNum b/node_modules/csvtojson/test/data/noheaderWithVaryColumnNum new file mode 100644 index 0000000..f4a2faf --- /dev/null +++ b/node_modules/csvtojson/test/data/noheaderWithVaryColumnNum @@ -0,0 +1,2 @@ +John,25,XXX +Samantha,28,YYY,7 diff --git a/node_modules/csvtojson/test/data/noheadercsv b/node_modules/csvtojson/test/data/noheadercsv new file mode 100644 index 0000000..6a302b4 --- /dev/null +++ b/node_modules/csvtojson/test/data/noheadercsv @@ -0,0 +1,5 @@ +CC102-PDMI-001,eClass_5.1.3,10/3/2014,12,40,green,40 +CC200-009-001,eClass_5.1.3,11/3/2014,5,3,blue,38 +CC200-070-001,eClass_5.1.3,10/4/2014,15,13,red,45 +CC200-099,eClass_5.1.3,10/5/2014,20,17,orange,28 +CC200-100,eClass_5.1.3,10/3/2014,5,4,black,32 diff --git a/node_modules/csvtojson/test/data/pipeAsQuote b/node_modules/csvtojson/test/data/pipeAsQuote new file mode 100644 index 0000000..71b9085 --- /dev/null +++ b/node_modules/csvtojson/test/data/pipeAsQuote @@ -0,0 +1,2 @@ +test,test2,test3 +blag,blagh,|blahhh, blah| diff --git a/node_modules/csvtojson/test/data/quoteTolerant b/node_modules/csvtojson/test/data/quoteTolerant new file mode 100644 index 0000000..142dd71 --- /dev/null +++ b/node_modules/csvtojson/test/data/quoteTolerant @@ -0,0 +1,2 @@ +"Style","Description","SKU","BusinessAreaCode","BusinessAreaDescription","DepartmentCode","DepartmentDescription","ClassCode","ClassDescription","ColorCode","ColorDescription","SizeCode","SizeDescription","PrimaryMaterialCode","PrimaryMaterialDescription","VendorCode","VendorDescription","CurrentRetail" +"503951518","OVERSIZE ROUND GOLD PENDANT ON 32" THICK BLACK CORD","00505039515193","W12","Jewelry","1231","Jewelry","123111","D2 New Jewelry Necklace","70","GOLD","100","1 Size","065","Costume/Imitation","3522","KENNETH JAY LANE, INC.","79.0000" diff --git a/node_modules/csvtojson/test/data/tabsv b/node_modules/csvtojson/test/data/tabsv new file mode 100644 index 0000000..9719cfd --- /dev/null +++ b/node_modules/csvtojson/test/data/tabsv @@ -0,0 +1,5 @@ +JournalCode JournalLib EcritureNum EcritureDate CompteNum CompteLib CompAuxNum CompAuxLib PieceRef PieceDate EcritureLib Debit Credit EcritureLet DateLet ValidDate Montantdevise Idevise +AA BBBBBB 0 20140701 CCCCCCCC ddddddddddddddd ZZZZZZZ1 20140701 EEEEE EEE EEEEEE 34,81 0,00 20150630 0,00 +AA BBBBBB 0 20140701 CCCCCCCC ddddddddddddddd ZZZZZZZ2 20140701 EEEEE EEE EEEEEE 12,02 0,00 20150630 0,00 +AA BBBBBB 0 20140701 CCCCCCCC ddddddddddddddd ZZZZZZZ3 20140701 EEEEE EEE EEEEEE 37,98 0,00 20150630 0,00 +AA BBBBBB 0 20140701 CCCCCCCC ddddddddddddddd ZZZZZZZ4 20140701 EEEEE EEE EEEEEE 27,48 0,00 20150630 0,00 diff --git a/node_modules/csvtojson/test/data/testData b/node_modules/csvtojson/test/data/testData new file mode 100644 index 0000000..4f57323 --- /dev/null +++ b/node_modules/csvtojson/test/data/testData @@ -0,0 +1,3 @@ +date,employee.name,employee.age,employee.number,address.0,address.1,employee.key.0,employee.key.1,*omit*id +2012-02-12,Eric,31,51234,Dunno Street,Kilkeny Road,key1,key2,2 +2012-03-06,Ted,28,51289,O FUTEBOL.¿,Tormore,key3,key4,4 \ No newline at end of file diff --git a/node_modules/csvtojson/test/data/testEol b/node_modules/csvtojson/test/data/testEol new file mode 100644 index 0000000..5f313dc --- /dev/null +++ b/node_modules/csvtojson/test/data/testEol @@ -0,0 +1 @@ +John,25,xxx Samantha,28,yyy diff --git a/node_modules/csvtojson/test/data/trailingComma b/node_modules/csvtojson/test/data/trailingComma new file mode 100644 index 0000000..86dec48 --- /dev/null +++ b/node_modules/csvtojson/test/data/trailingComma @@ -0,0 +1,3 @@ +field1,field2 +value1,value2, +value1,value2, diff --git a/node_modules/csvtojson/test/data/twodoublequotes b/node_modules/csvtojson/test/data/twodoublequotes new file mode 100644 index 0000000..08046c6 --- /dev/null +++ b/node_modules/csvtojson/test/data/twodoublequotes @@ -0,0 +1,2 @@ +title,actors,data,uuid,fieldA,fieldB +"""","[""Neil"", ""Bill"""", ""Carl"",""Richard"",""Linus""]",xyabcde,"fejal""eifa","bnej""""falkfe","""eisjfes""" diff --git a/node_modules/csvtojson/test/testCSVConverter.fork.ts b/node_modules/csvtojson/test/testCSVConverter.fork.ts new file mode 100644 index 0000000..a4679c0 --- /dev/null +++ b/node_modules/csvtojson/test/testCSVConverter.fork.ts @@ -0,0 +1,682 @@ +// import {Converter} from "../src/Converter"; +// import csv from "../src"; +// var assert = require("assert"); +// var fs = require("fs"); +// var sandbox = require("sinon").sandbox.create(); +// var file = __dirname + "/data/testData"; +// var trailCommaData = __dirname + "/data/trailingComma"; +// describe("CSV Convert in Background Process", function () { +// afterEach(function () { +// sandbox.restore(); +// }); + + +// it("should read from a stream", function (done) { +// var obj = new Converter({ +// fork: true +// }); +// var stream = fs.createReadStream(file); +// obj.then(function (obj) { +// assert.equal(obj.length, 2); +// done(); +// },(err)=>{ +// console.log(err.toString()); +// }); +// stream.pipe(obj); +// }); + +// it("should call onNext once a row is parsed.", function (done) { +// var obj = new Converter({fork:true}); +// var stream = fs.createReadStream(file); +// var called = false; +// obj.subscribe(function (resultRow) { +// assert(resultRow); +// called = true; +// }); +// obj.on("done", function () { +// assert(called); +// done(); +// }); +// stream.pipe(obj); +// }); + +// it("should emit end_parsed message once it is finished.", function (done) { +// var obj = new Converter({fork:true}); +// obj.then(function (result) { +// assert(result); +// assert(result.length === 2); +// assert(result[0].date); +// assert(result[0].employee); +// assert(result[0].employee.name); +// assert(result[0].employee.age); +// assert(result[0].employee.number); +// assert(result[0].employee.key.length === 2); +// assert(result[0].address.length === 2); +// done(); +// }); +// fs.createReadStream(file).pipe(obj); +// }); + +// it("should handle traling comma gracefully", function (done) { +// var stream = fs.createReadStream(trailCommaData); +// var obj = new Converter({fork:true}); +// obj.then(function (result) { +// assert(result); +// assert(result.length > 0); +// done(); +// }); +// stream.pipe(obj); +// }); + +// it("should handle comma in column which is surrounded by qoutes", function (done) { +// var testData = __dirname + "/data/dataWithComma"; +// var rs = fs.createReadStream(testData); +// var obj = new Converter({ +// "quote": "#", +// "fork":true +// }); +// obj.then(function (result) { +// assert(result[0].col1 === "\"Mini. Sectt"); +// assert.equal(result[3].col2, "125001,fenvkdsf"); +// // console.log(result); +// done(); +// }); +// rs.pipe(obj); +// }); + +// it("should be able to convert a csv to column array data", function (done) { +// var columArrData = __dirname + "/data/columnArray"; +// var rs = fs.createReadStream(columArrData); +// var result:any = {}; +// var csvConverter = new Converter({fork:true}); +// //end_parsed will be emitted once parsing finished +// csvConverter.then(function () { +// assert(result.TIMESTAMP.length === 5); +// done(); +// }); + +// //record_parsed will be emitted each time a row has been parsed. +// csvConverter.subscribe(function (resultRow, rowIndex) { +// for (var key in resultRow) { +// if (resultRow.hasOwnProperty(key)) { +// if (!result[key] || !(result[key] instanceof Array)) { +// result[key] = []; +// } +// result[key][rowIndex] = resultRow[key]; +// } +// } +// }); +// rs.pipe(csvConverter); +// }); + +// it("should be able to convert csv string directly", function (done) { +// var testData = __dirname + "/data/testData"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// //end_parsed will be emitted once parsing finished +// csvConverter.then(function (jsonObj) { +// assert.equal(jsonObj.length, 2); +// }); +// csvConverter.fromString(data).then(function (jsonObj) { +// assert(jsonObj.length === 2); +// done(); +// }); +// }); + +// it("should be able to convert csv string with error", function (done) { +// var testData = __dirname + "/data/dataWithUnclosedQuotes"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// csvConverter.fromString(data).then(undefined, function (err) { +// // console.log(err); +// assert(err); +// assert.equal(err.err, "unclosed_quote"); +// done(); +// }); +// }); + +// it("should be able to convert csv string without callback provided", function (done) { +// var testData = __dirname + "/data/testData"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// //end_parsed will be emitted once parsing finished +// csvConverter.then(function (jsonObj) { +// assert(jsonObj.length === 2); +// done(); +// }); +// csvConverter.fromString(data); +// }); + +// it("should be able to handle columns with double quotes", function (done) { +// var testData = __dirname + "/data/dataWithQoutes"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// csvConverter.fromString(data).then(function (jsonObj) { +// assert(jsonObj[0].TIMESTAMP === '13954264"22', JSON.stringify(jsonObj[0].TIMESTAMP)); + +// assert(jsonObj[1].TIMESTAMP === 'abc, def, ccc', JSON.stringify(jsonObj[1].TIMESTAMP)); +// done(); +// }); +// }); + +// it("should be able to handle columns with two double quotes", function (done) { +// var testData = __dirname + "/data/twodoublequotes"; +// var data = fs.readFileSync(testData).toString(); +// var csvConverter = new Converter({fork:true}); +// csvConverter.fromString(data).then(function (jsonObj) { +// assert.equal(jsonObj[0].title, "\""); +// assert.equal(jsonObj[0].data, "xyabcde"); +// assert.equal(jsonObj[0].uuid, "fejal\"eifa"); +// assert.equal(jsonObj[0].fieldA, "bnej\"\"falkfe"); +// assert.equal(jsonObj[0].fieldB, "\"eisjfes\""); +// done(); +// }); +// }); + +// it("should handle empty csv file", function (done) { +// var testData = __dirname + "/data/emptyFile"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({fork:true}); +// csvConverter.then(function (jsonObj) { +// assert(jsonObj.length === 0); +// done(); +// }); +// rs.pipe(csvConverter); +// }); + +// it("should parse large csv file", function (done) { +// var testData = __dirname + "/data/large-csv-sample.csv"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({fork:true}); +// var count = 0; +// csvConverter.subscribe(function () { +// // console.log(arguments); +// count++; +// }); +// csvConverter.then(function () { +// assert.equal(count, 5290); +// done(); +// }); +// rs.pipe(csvConverter); +// }); + +// it("should parse data and covert to specific types", function (done) { +// var testData = __dirname + "/data/dataWithType"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({ +// fork:true, +// checkType: true, +// colParser: { +// "column6": "string", +// "column7": "string" +// } +// }); +// csvConverter.subscribe(function (d) { +// assert(typeof d.column1 === "number"); +// assert(typeof d.column2 === "string"); +// assert.equal(d["colume4"], "someinvaliddate"); +// assert(d.column5.hello === "world"); +// assert(d.column6 === '{"hello":"world"}'); +// assert(d.column7 === "1234"); +// assert(d.column8 === "abcd"); +// assert(d.column9 === true); +// assert(d.column10[0] === 23); +// assert(d.column10[1] === 31); +// assert(d.column11[0].hello === "world"); +// assert(d["name#!"] === false); +// }); +// csvConverter.on("done", function () { +// done(); +// }); +// rs.pipe(csvConverter); +// }); + +// it("should turn off field type check", function (done) { +// var testData = __dirname + "/data/dataWithType"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({ +// fork:true, +// checkType: false +// }); +// csvConverter.subscribe(function (d) { +// assert(typeof d.column1 === "string"); +// assert(typeof d.column2 === "string"); +// assert(d["column3"] === "2012-01-01"); +// assert(d["colume4"] === "someinvaliddate"); +// assert(d.column5 === '{"hello":"world"}'); +// assert.equal(d["column6"], '{"hello":"world"}'); +// assert(d["column7"] === "1234"); +// assert(d["column8"] === "abcd"); +// assert(d.column9 === "true"); +// assert(d.column10[0] === "23"); +// assert(d.column10[1] === "31"); +// assert(d["name#!"] === 'false'); +// }); +// csvConverter.then(function () { +// done(); +// }); +// rs.pipe(csvConverter); +// }); + +// it("should emit data event correctly", function (done) { +// var testData = __dirname + "/data/large-csv-sample.csv"; + +// var csvConverter = new Converter({ +// fork:true +// },{objectMode:true}); +// var count = 0; +// csvConverter.on("data", function (d) { +// count++; +// }); +// csvConverter.on("done", function () { +// assert.equal(csvConverter.parsedLineNumber, 5290); +// done(); +// }); +// var rs = fs.createReadStream(testData); +// rs.pipe(csvConverter); +// }); + +// it("should process column with linebreaks", function (done) { +// var testData = __dirname + "/data/lineBreak"; +// var rs = fs.createReadStream(testData); +// var csvConverter = new Converter({ +// fork:true, +// checkType: true +// }); +// csvConverter.subscribe(function (d) { +// assert(d.Period === 13); +// assert(d["Apparent age"] === "Unknown"); +// done(); +// }); +// rs.pipe(csvConverter); +// }); + +// it("be able to ignore empty columns", function (done) { +// var testData = __dirname + "/data/dataIgnoreEmpty"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(csv({ +// ignoreEmpty: true , +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 3); +// assert(j.col2.length === 2); +// assert(j.col2[1] === "d3"); +// assert(j.col4.col3 === undefined); +// assert(j.col4.col5 === "world"); +// assert(res[1].col1 === "d2"); +// assert(res[2].col1 === "d4"); +// done(); +// }); +// }); + +// it("should allow no header", function (done) { +// var testData = __dirname + "/data/noheadercsv"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// noheader: true, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 5); +// assert(j.field1 === "CC102-PDMI-001"); +// assert(j.field2 === "eClass_5.1.3"); +// done(); +// }); +// }); + +// it("should allow customised header", function (done) { +// var testData = __dirname + "/data/noheadercsv"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// noheader: true, +// headers: ["a", "b"], +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 5); +// assert(j.a === "CC102-PDMI-001"); +// assert(j.b === "eClass_5.1.3"); +// assert(j.field3 === "10/3/2014"); +// done(); +// }); +// }); + +// it("should allow customised header to override existing header", function (done) { +// var testData = __dirname + "/data/complexJSONCSV"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// headers: [], +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 2); +// assert(j.field1 === "Food Factory"); +// assert(j.field2 === "Oscar"); +// done(); +// }); +// }); + +// it("should handle when there is an empty string", function (done) { +// var testData = __dirname + "/data/dataWithEmptyString"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// noheader: true, +// headers: ["a", "b", "c"], +// checkType: true, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; + +// // assert(res.length===2); +// assert(j.a === "green"); +// assert(j.b === 40); +// assert.equal(j.c, ""); +// done(); +// }); +// }); + +// it("should detect eol correctly when first chunk is smaller than header row length", function (done) { +// var testData = __dirname + "/data/dataNoTrimCRLF"; +// var rs = fs.createReadStream(testData, { highWaterMark: 3 }); + +// var st = rs.pipe(new Converter({ +// trim: false, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 2); +// assert(j.name === "joe"); +// assert(j.age === "20"); +// assert.equal(res[1].name, "sam"); +// assert.equal(res[1].age, "30"); +// done(); +// }); +// }); + +// it("should detect eol correctly when first chunk ends in middle of CRLF line break", function (done) { +// var testData = __dirname + "/data/dataNoTrimCRLF"; +// var rs = fs.createReadStream(testData, { highWaterMark: 9 }); + +// var st = rs.pipe(new Converter({ +// trim: false, +// fork:true +// })); +// st.then(function (res) { +// var j = res[0]; +// assert(res.length === 2); +// assert(j.name === "joe"); +// assert(j.age === "20"); +// assert.equal(res[1].name, "sam"); +// assert.equal(res[1].age, "30"); +// done(); +// }); +// }); + +// it("should emit eol event when line ending is detected as CRLF", function (done) { +// var testData = __dirname + "/data/dataNoTrimCRLF"; +// var rs = fs.createReadStream(testData); + +// var st = rs.pipe(new Converter({ +// fork:true +// })); +// var eolCallback = sandbox.spy(function (eol) { +// assert.equal(eol, "\r\n"); +// }); +// st.on("eol", eolCallback); +// st.then(function () { +// assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); +// done(); +// }) +// }); + +// it("should emit eol event when line ending is detected as LF", function (done) { +// var testData = __dirname + "/data/columnArray"; +// var rs = fs.createReadStream(testData); + +// var st = rs.pipe(new Converter({ +// fork:true +// })); +// var eolCallback = sandbox.spy(function (eol) { +// assert.equal(eol, "\n"); +// }); +// st.on("eol", eolCallback); +// st.then(function () { +// assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); +// done(); +// }) +// }); + +// it("should remove the Byte Order Mark (BOM) from input", function (done) { +// var testData = __dirname + "/data/dataNoTrimBOM"; +// var rs = fs.createReadStream(testData); +// var st = rs.pipe(new Converter({ +// trim: false, +// fork:true +// })); +// st.then( function (res) { +// var j = res[0]; + +// assert(res.length===2); +// assert(j.name === "joe"); +// assert(j.age === "20"); +// done(); +// }); +// }); + +// it("should set output as csv", function (done) { +// var testData = __dirname + "/data/complexJSONCSV"; +// var rs = fs.createReadStream(testData); +// var numOfRow = 0; +// csv({ output: "csv",fork:true }) +// .fromStream(rs) +// .subscribe(function (row, idx) { +// numOfRow++; +// assert(row); +// assert(idx >= 0); +// }) + +// .on("done", function (error) { +// assert(!error); +// assert.equal(2, numOfRow); +// assert(numOfRow !== 0); +// done(); +// }); +// }); +// it("should process long header", function (done) { +// var testData = __dirname + "/data/longHeader"; +// var rs = fs.createReadStream(testData, { highWaterMark: 100 }); +// var numOfRow = 0; +// var numOfJson = 0; +// csv({fork:true}, { highWaterMark: 100 }) +// .fromStream(rs) +// .subscribe(function (res, idx) { +// numOfJson++; +// assert.equal(res.Date, '8/26/16'); +// assert(idx >= 0); +// }) +// .on("done", function () { +// assert(numOfJson === 1); +// done(); +// }); +// }); +// it("should parse #139", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/data#139"); +// csv({fork:true}) +// .fromStream(rs) +// .then(function (res) { +// assert.equal(res[1].field3, "9001009395 9001009990"); +// done(); +// }); +// }); + +// it("should ignore column", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); +// var headerEmitted = false; +// csv({ +// ignoreColumns: /TIMESTAMP/, +// fork:true +// }) +// .fromStream(rs) +// .on("header", function (header) { +// assert.equal(header.indexOf("TIMESTAMP"), -1); +// assert.equal(header.indexOf("UPDATE"), 0); +// if (headerEmitted) { +// throw ("header event should only happen once") +// } +// headerEmitted = true; +// }) +// // .on("csv", function (row, idx) { +// // if (!headerEmitted) { +// // throw ("header should be emitted before any data events"); +// // } +// // assert(idx >= 0); +// // if (idx === 1) { +// // assert.equal(row[0], "n"); +// // } +// // }) +// .subscribe(function (j, idx) { +// // console.log(j); +// assert(!j.TIMESTAMP); +// assert(idx >= 0); +// }) +// .on("done", function (err) { +// assert(!err); +// assert(headerEmitted); +// done(); +// }); +// }); +// it("should include column", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); +// csv({ +// includeColumns: /TIMESTAMP/, +// fork:true +// }) +// .fromStream(rs) +// .on("header", function (header) { +// assert.equal(header.indexOf("TIMESTAMP"), 0); +// assert.equal(header.indexOf("UPDATE"), -1); +// assert.equal(header.length, 1); +// }) +// .subscribe(function (j, idx) { +// assert(idx >= 0); +// if (idx === 1) { +// assert.equal(j.TIMESTAMP, "abc, def, ccc"); +// } +// assert(!j.UID) +// assert(!j['BYTES SENT']) +// }) +// .on("done", function () { +// done(); +// }); +// }); +// it("should allow headers and include columns to be given as reference to the same var", function (done) { +// var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); +// var headers = [ +// 'first', +// 'second', +// 'third', +// ]; + +// var expected = headers; + +// csv({ +// headers: headers, +// includeColumns: /(first|second|third)/, +// fork:true +// }) +// .fromStream(rs) +// .on("header", function (header) { +// expected.forEach(function (value, index) { +// assert.equal(header.indexOf(value), index); +// }); +// }) +// .subscribe(function (j, idx) { +// assert(idx >= 0); +// assert.equal(expected.length, Object.keys(j).length); +// expected.forEach(function (attribute) { +// assert(j.hasOwnProperty(attribute)); +// }); +// }) +// .on("done", function () { +// done(); +// }); +// }); + +// it("should leave provided params objects unmutated", function() { +// var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); +// var includeColumns = [ +// 'fieldA.title', +// 'description', +// ]; + + +// return csv({ +// includeColumns: /(fieldA\.title|description)/, +// fork:true +// }) +// .fromStream(rs) +// .on("json", function(j, idx) { +// assert(idx >= 0); +// }) +// .on("header", function(header) { +// includeColumns.forEach(function (value, index) { +// assert.equal(index, header.indexOf(value)); +// }); +// }) +// }); +// it("should accept pipe as quote", function (done) { +// csv({ +// quote: "|", +// output: "csv", +// "fork":true +// }) +// .fromFile(__dirname + "/data/pipeAsQuote") +// .subscribe(function (csv) { +// assert.equal(csv[2], "blahhh, blah"); +// }) +// .on('done', function () { +// done() +// }); +// }) +// it("should allow async subscribe function", () => { +// return csv({ trim: true,fork:true }) +// .fromString(`a,b,c +// 1,2,3 +// 4,5,6`) +// .subscribe((d) => { +// return new Promise((resolve, reject) => { +// setTimeout(() => { +// d.a = 10; +// resolve(); +// }, 20); +// }) +// }) +// .then((d) => { +// assert.equal(d[0].a, 10); +// assert.equal(d[1].a, 10); +// }) +// }) +// it("should omit a column", () => { +// return csv({ +// colParser: { +// "a": "omit" +// }, +// fork:true +// }) +// .fromString(`a,b,c +// 1,2,3 +// fefe,5,6`) +// .then((d) => { +// assert.strictEqual(d[0].a, undefined); +// assert.equal(d[1].a, undefined); +// }) +// }) + +// }); diff --git a/node_modules/csvtojson/test/testCSVConverter.ts b/node_modules/csvtojson/test/testCSVConverter.ts new file mode 100644 index 0000000..3ece5e1 --- /dev/null +++ b/node_modules/csvtojson/test/testCSVConverter.ts @@ -0,0 +1,450 @@ +import {Converter} from "../src/Converter"; +import csv from "../src"; +var assert = require("assert"); +var fs = require("fs"); +var sandbox = require("sinon").sandbox.create(); +var file = __dirname + "/data/testData"; +var trailCommaData = __dirname + "/data/trailingComma"; +describe("CSV Converter", function () { + afterEach(function () { + sandbox.restore(); + }); + + it("should create new instance of csv", function () { + var obj = new Converter(); + assert(obj); + }); + + it("should read from a stream", function (done) { + var obj = new Converter(); + var stream = fs.createReadStream(file); + obj.then(function (obj) { + assert.equal(obj.length, 2); + done(); + }); + stream.pipe(obj); + }); + + it("should call onNext once a row is parsed.", function (done) { + var obj = new Converter(); + var stream = fs.createReadStream(file); + var called = false; + obj.subscribe(function (resultRow) { + assert(resultRow); + called = true; + }); + obj.on("done", function () { + assert(called); + done(); + }); + stream.pipe(obj); + }); + + it("should emit end_parsed message once it is finished.", function (done) { + var obj = new Converter(); + obj.then(function (result) { + assert(result); + assert(result.length === 2); + assert(result[0].date); + assert(result[0].employee); + assert(result[0].employee.name); + assert(result[0].employee.age); + assert(result[0].employee.number); + assert(result[0].employee.key.length === 2); + assert(result[0].address.length === 2); + done(); + }); + fs.createReadStream(file).pipe(obj); + }); + + it("should handle traling comma gracefully", function (done) { + var stream = fs.createReadStream(trailCommaData); + var obj = new Converter(); + obj.then(function (result) { + assert(result); + assert(result.length > 0); + done(); + }); + stream.pipe(obj); + }); + + it("should handle comma in column which is surrounded by qoutes", function (done) { + var testData = __dirname + "/data/dataWithComma"; + var rs = fs.createReadStream(testData); + var obj = new Converter({ + "quote": "#" + }); + obj.then(function (result) { + assert(result[0].col1 === "\"Mini. Sectt"); + assert.equal(result[3].col2, "125001,fenvkdsf"); + // console.log(result); + done(); + }); + rs.pipe(obj); + }); + + it("should be able to convert a csv to column array data", function (done) { + var columArrData = __dirname + "/data/columnArray"; + var rs = fs.createReadStream(columArrData); + var result:any = {}; + var csvConverter = new Converter(); + //end_parsed will be emitted once parsing finished + csvConverter.then(function () { + assert(result.TIMESTAMP.length === 5); + done(); + }); + + //record_parsed will be emitted each time a row has been parsed. + csvConverter.subscribe(function (resultRow, rowIndex) { + for (var key in resultRow) { + if (resultRow.hasOwnProperty(key)) { + if (!result[key] || !(result[key] instanceof Array)) { + result[key] = []; + } + result[key][rowIndex] = resultRow[key]; + } + } + }); + rs.pipe(csvConverter); + }); + + it("should be able to convert csv string directly", function (done) { + var testData = __dirname + "/data/testData"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter(); + //end_parsed will be emitted once parsing finished + csvConverter.then(function (jsonObj) { + assert.equal(jsonObj.length, 2); + }); + csvConverter.fromString(data).then(function (jsonObj) { + assert(jsonObj.length === 2); + done(); + }); + }); + + it("should be able to convert csv string with error", function (done) { + var testData = __dirname + "/data/dataWithUnclosedQuotes"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter(); + csvConverter.fromString(data).then(undefined, function (err) { + assert(err); + assert.equal(err.err, "unclosed_quote"); + done(); + }); + }); + + it("should be able to convert csv string without callback provided", function (done) { + var testData = __dirname + "/data/testData"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter(); + //end_parsed will be emitted once parsing finished + csvConverter.then(function (jsonObj) { + assert(jsonObj.length === 2); + done(); + }); + csvConverter.fromString(data); + }); + + it("should be able to handle columns with double quotes", function (done) { + var testData = __dirname + "/data/dataWithQoutes"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter(); + csvConverter.fromString(data).then(function (jsonObj) { + assert(jsonObj[0].TIMESTAMP === '13954264"22', JSON.stringify(jsonObj[0].TIMESTAMP)); + + assert(jsonObj[1].TIMESTAMP === 'abc, def, ccc', JSON.stringify(jsonObj[1].TIMESTAMP)); + done(); + }); + }); + + it("should be able to handle columns with two double quotes", function (done) { + var testData = __dirname + "/data/twodoublequotes"; + var data = fs.readFileSync(testData).toString(); + var csvConverter = new Converter(); + csvConverter.fromString(data).then(function (jsonObj) { + assert.equal(jsonObj[0].title, "\""); + assert.equal(jsonObj[0].data, "xyabcde"); + assert.equal(jsonObj[0].uuid, "fejal\"eifa"); + assert.equal(jsonObj[0].fieldA, "bnej\"\"falkfe"); + assert.equal(jsonObj[0].fieldB, "\"eisjfes\""); + done(); + }); + }); + + it("should handle empty csv file", function (done) { + var testData = __dirname + "/data/emptyFile"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter(); + csvConverter.then(function (jsonObj) { + assert(jsonObj.length === 0); + done(); + }); + rs.pipe(csvConverter); + }); + + it("should parse large csv file", function (done) { + var testData = __dirname + "/data/large-csv-sample.csv"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter(); + var count = 0; + csvConverter.subscribe(function () { + //console.log(arguments); + count++; + }); + csvConverter.then(function () { + assert(count === 5290); + done(); + }); + rs.pipe(csvConverter); + }); + + it("should parse data and covert to specific types", function (done) { + var testData = __dirname + "/data/dataWithType"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter({ + checkType: true, + colParser: { + "column6": "string", + "column7": "string" + } + }); + csvConverter.subscribe(function (d) { + assert(typeof d.column1 === "number"); + assert(typeof d.column2 === "string"); + assert.equal(d["colume4"], "someinvaliddate"); + assert(d.column5.hello === "world"); + assert(d.column6 === '{"hello":"world"}'); + assert(d.column7 === "1234"); + assert(d.column8 === "abcd"); + assert(d.column9 === true); + assert(d.column10[0] === 23); + assert(d.column10[1] === 31); + assert(d.column11[0].hello === "world"); + assert(d["name#!"] === false); + }); + csvConverter.on("done", function () { + done(); + }); + rs.pipe(csvConverter); + }); + + it("should turn off field type check", function (done) { + var testData = __dirname + "/data/dataWithType"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter({ + checkType: false + }); + csvConverter.subscribe(function (d) { + assert(typeof d.column1 === "string"); + assert(typeof d.column2 === "string"); + assert(d["column3"] === "2012-01-01"); + assert(d["colume4"] === "someinvaliddate"); + assert(d.column5 === '{"hello":"world"}'); + assert.equal(d["column6"], '{"hello":"world"}'); + assert(d["column7"] === "1234"); + assert(d["column8"] === "abcd"); + assert(d.column9 === "true"); + assert(d.column10[0] === "23"); + assert(d.column10[1] === "31"); + assert(d["name#!"] === 'false'); + }); + csvConverter.then(function () { + done(); + }); + rs.pipe(csvConverter); + }); + + it("should emit data event correctly", function (done) { + var testData = __dirname + "/data/large-csv-sample.csv"; + + var csvConverter = new Converter({ + }); + var count = 0; + csvConverter.on("data", function (d) { + count++; + }); + csvConverter.on("end", function () { + assert.equal(count, 5290); + done(); + }); + var rs = fs.createReadStream(testData); + rs.pipe(csvConverter); + }); + + it("should process column with linebreaks", function (done) { + var testData = __dirname + "/data/lineBreak"; + var rs = fs.createReadStream(testData); + var csvConverter = new Converter({ + checkType: true + }); + csvConverter.subscribe(function (d) { + assert(d.Period === 13); + assert(d["Apparent age"] === "Unknown"); + done(); + }); + rs.pipe(csvConverter); + }); + + it("be able to ignore empty columns", function (done) { + var testData = __dirname + "/data/dataIgnoreEmpty"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(csv({ ignoreEmpty: true })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 3); + assert(j.col2.length === 2); + assert(j.col2[1] === "d3"); + assert(j.col4.col3 === undefined); + assert(j.col4.col5 === "world"); + assert(res[1].col1 === "d2"); + assert(res[2].col1 === "d4"); + done(); + }); + }); + + it("should allow no header", function (done) { + var testData = __dirname + "/data/noheadercsv"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter({ noheader: true })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 5); + assert(j.field1 === "CC102-PDMI-001"); + assert(j.field2 === "eClass_5.1.3"); + done(); + }); + }); + + it("should allow customised header", function (done) { + var testData = __dirname + "/data/noheadercsv"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter({ + noheader: true, + headers: ["a", "b"] + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 5); + assert(j.a === "CC102-PDMI-001"); + assert(j.b === "eClass_5.1.3"); + assert(j.field3 === "10/3/2014"); + done(); + }); + }); + + it("should allow customised header to override existing header", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter({ + headers: [] + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.field1 === "Food Factory"); + assert(j.field2 === "Oscar"); + done(); + }); + }); + + it("should handle when there is an empty string", function (done) { + var testData = __dirname + "/data/dataWithEmptyString"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter({ + noheader: true, + headers: ["a", "b", "c"], + checkType: true + })); + st.then(function (res) { + var j = res[0]; + + // assert(res.length===2); + assert(j.a === "green"); + assert(j.b === 40); + assert.equal(j.c, ""); + done(); + }); + }); + + it("should detect eol correctly when first chunk is smaller than header row length", function (done) { + var testData = __dirname + "/data/dataNoTrimCRLF"; + var rs = fs.createReadStream(testData, { highWaterMark: 3 }); + + var st = rs.pipe(new Converter({ + trim: false + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.name === "joe"); + assert(j.age === "20"); + assert.equal(res[1].name, "sam"); + assert.equal(res[1].age, "30"); + done(); + }); + }); + + it("should detect eol correctly when first chunk ends in middle of CRLF line break", function (done) { + var testData = __dirname + "/data/dataNoTrimCRLF"; + var rs = fs.createReadStream(testData, { highWaterMark: 9 }); + + var st = rs.pipe(new Converter({ + trim: false + })); + st.then(function (res) { + var j = res[0]; + assert(res.length === 2); + assert(j.name === "joe"); + assert(j.age === "20"); + assert.equal(res[1].name, "sam"); + assert.equal(res[1].age, "30"); + done(); + }); + }); + + it("should emit eol event when line ending is detected as CRLF", function (done) { + var testData = __dirname + "/data/dataNoTrimCRLF"; + var rs = fs.createReadStream(testData); + + var st = rs.pipe(new Converter()); + var eolCallback = sandbox.spy(function (eol) { + assert.equal(eol, "\r\n"); + }); + st.on("eol", eolCallback); + st.then(function () { + assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); + done(); + }) + }); + + it("should emit eol event when line ending is detected as LF", function (done) { + var testData = __dirname + "/data/columnArray"; + var rs = fs.createReadStream(testData); + + var st = rs.pipe(new Converter()); + var eolCallback = sandbox.spy(function (eol) { + assert.equal(eol, "\n"); + }); + st.on("eol", eolCallback); + st.then(function () { + assert.equal(eolCallback.callCount, 1, 'should emit eol event once'); + done(); + }) + }); + + it("should remove the Byte Order Mark (BOM) from input", function (done) { + var testData = __dirname + "/data/dataNoTrimBOM"; + var rs = fs.createReadStream(testData); + var st = rs.pipe(new Converter({ + trim: false + })); + st.then( function (res) { + var j = res[0]; + + assert(res.length===2); + assert(j.name === "joe"); + assert(j.age === "20"); + done(); + }); + }); +}); diff --git a/node_modules/csvtojson/test/testCSVConverter2.ts b/node_modules/csvtojson/test/testCSVConverter2.ts new file mode 100644 index 0000000..91da899 --- /dev/null +++ b/node_modules/csvtojson/test/testCSVConverter2.ts @@ -0,0 +1,583 @@ +import { Converter } from "../src/Converter"; +import csv from "../src"; +var assert = require("assert"); +var fs = require("fs"); +var sandbox = require('sinon').sandbox.create(); +describe("testCSVConverter2", function () { + afterEach(function () { + sandbox.restore(); + }); + + it("should convert from large csv string", function (done) { + var csvStr = fs.readFileSync(__dirname + "/data/large-csv-sample.csv", "utf8"); + var conv = new Converter({ + }); + conv.fromString(csvStr).then(function (res) { + assert(res.length === 5290); + done(); + }); + }); + + it("should set eol", function (done) { + var rs = fs.createReadStream(__dirname + "/data/large-csv-sample.csv"); + var conv = new Converter({ + eol: "\n" + }); + var count = 0; + conv.subscribe(function (resultJson, index) { + count++; + assert(resultJson); + // assert(row.length === 2); + assert(index >= 0); + }); + conv.on("error", function () { + console.log(arguments); + }); + conv.then(function (result) { + assert(result); + assert(count === 5290); + done(); + }); + rs.pipe(conv); + }); + + it("should convert tsv String", function (done) { + var tsv = __dirname + "/data/dataTsv"; + var csvStr = fs.readFileSync(tsv, "utf8"); + var conv = new Converter({ + delimiter: "\t", + "checkType": false + }); + conv.fromString(csvStr).then(function (res) { + assert(res); + assert.equal(res.length, 200); + done(); + }); + }); + + it("should allow customised header with nohead csv string.", function (done) { + var testData = __dirname + "/data/noheadercsv"; + var rs = fs.readFileSync(testData, "utf8"); + var conv = new Converter({ + noheader: true, + headers: ["a", "b", "c", "e", "f", "g"] + }); + conv.fromString(rs).then(function (json) { + assert.equal(json[0].field7, 40); + assert.equal(json[0].a, "CC102-PDMI-001"); + done(); + }); + }); + + it("should parse fromFile", function (done) { + var csvFile = __dirname + "/data/large-csv-sample.csv"; + var conv = new Converter({ + }); + conv.fromFile(csvFile).then(function (res) { + assert.equal(res.length, 5290); + done(); + }); + }); + + it("should fromFile should emit error", function (done) { + var csvFile = __dirname + "/data/dataWithUnclosedQuotes"; + var conv = new Converter({ + }); + conv.fromFile(csvFile).then(function (res) { + + done(); + }, function (err) { + assert(err); + done(); + }); + }); + + it("should parse no header with dynamic column number", function (done) { + var testData = __dirname + "/data/noheaderWithVaryColumnNum"; + var rs = fs.readFileSync(testData, "utf8"); + var conv = new Converter({ + noheader: true + }); + conv.fromString(rs).then(function (json) { + assert.equal(json.length, 2); + assert.equal(json[1].field4, 7); + done(); + }); + }); + + it("should parse tabsv data with dynamic columns", function (done) { + var testData = __dirname + "/data/tabsv"; + var rs = fs.readFileSync(testData, "utf8"); + var conv = new Converter({ + delimiter: "\t" + }); + conv.fromString(rs).then(function (json) { + assert.equal(json[0].Idevise, ""); + done(); + }); + }); + + it("should use first line break as eol", function (done) { + var testData = __dirname + "/data/testEol"; + var conv = new Converter({ + noheader: true + }); + conv.fromFile(testData).then(function (json) { + assert(json); + done(); + }); + }); + + + it("should detect delimiter", function (done) { + var testData = __dirname + "/data/dataWithAutoDelimiter"; + var rs = fs.createReadStream(testData); + var conv = new Converter({ delimiter: "auto" }); + conv.then(function (res) { + assert.equal(res[0].col1, "Mini. Sectt:hisar S.O"); + assert.equal(res[1].col1, "#Mini. Sectt"); + done(); + }); + rs.pipe(conv); + }); + + it("should emit delimiter event", function (done) { + var testData = __dirname + "/data/dataWithAutoDelimiter"; + var rs = fs.createReadStream(testData); + var conv = new Converter({ delimiter: "auto" }); + var delimiterCallback = sandbox.spy(function (delimiter) { + assert.equal(delimiter, ":"); + }); + conv.on("delimiter", delimiterCallback); + conv.then(function () { + assert.equal(delimiterCallback.callCount, 1); + done(); + }); + rs.pipe(conv); + }); + + it("should emit delimiter event when no header", function (done) { + var testData = __dirname + "/data/dataWithAutoDelimiter"; + var rs = fs.createReadStream(testData); + var conv = new Converter({ delimiter: "auto", noheader: true }); + var delimiterCallback = sandbox.spy(function (delimiter) { + assert.equal(delimiter, ":"); + }); + conv.on("delimiter", delimiterCallback); + conv.then(function () { + assert.equal(delimiterCallback.callCount, 1); + done(); + }); + rs.pipe(conv); + }); + + // it("should not emit delimiter event when delimiter is specified", function (done) { + // var testData = __dirname + "/data/columnArray"; + // var rs = fs.createReadStream(testData); + // var conv = new Converter(); + // conv.on("delimiter", function (delimiter) { + // assert.fail("delimiter event should not have been emitted"); + // }); + // conv.then(function () { + // done(); + // }); + + // rs.pipe(conv); + // }); + + it("should stripe out whitespaces if trim is true", function (done) { + var testData = __dirname + "/data/dataWithWhiteSpace"; + var rs = fs.createReadStream(testData); + var conv = new Converter({ trim: true }); + conv.then(function (res) { + assert.equal(res[0]["Column 1"], "Column1Row1"); + assert.equal(res[0]["Column 2"], "Column2Row1"); + done(); + }); + rs.pipe(conv); + }); + + it("should convert triple quotes correctly", function (done) { + var testData = __dirname + "/data/dataWithTripleQoutes"; + var rs = fs.createReadStream(testData); + var conv = new Converter({ trim: true }); + conv.then(function (res) { + assert.equal(res[0].Description, "ac, abs, moon"); + assert.equal(res[1].Model, "Venture \"Extended Edition\""); + assert.equal(res[2].Model, "Venture \"Extended Edition, Very Large\""); + done(); + }); + rs.pipe(conv); + }); + + + + it("should pre process raw data in the line", function (done) { + var testData = __dirname + "/data/quoteTolerant"; + var rs = fs.createReadStream(testData); + var conv = new Converter(); + conv.preRawData(function (d) { + return d.replace('THICK', 'THIN'); + }); + conv.then(function (res) { + assert(res[0].Description.indexOf('THIN') > -1); + done(); + }); + rs.pipe(conv); + }); + + it("should pre process by line in the line", function (done) { + var testData = __dirname + "/data/quoteTolerant"; + var rs = fs.createReadStream(testData); + var conv = new Converter(); + conv.preFileLine(function (line, lineNumber) { + if (lineNumber === 1) { + line = line.replace('THICK', 'THIN'); + } + return line; + }); + + conv.then(function (res) { + assert(res[0].Description.indexOf('THIN') > -1); + done(); + }); + rs.pipe(conv); + }); + + it("should support object mode", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var conv = new Converter({}, { + objectMode: true + }); + conv.on("data", function (d) { + assert(typeof d === "object"); + }); + conv.then(function (res) { + assert(res); + assert(res.length > 0); + done(); + }); + rs.pipe(conv); + }); + + it("should get delimiter automatically if there is no header", function (done) { + var test_converter = new Converter({ + delimiter: 'auto', + headers: ['col1', 'col2'], + noheader: true, + checkColumn: true + }); + + var my_data = 'first_val\tsecond_val'; + test_converter.fromString(my_data).then(function (result) { + assert.equal(result.length, 1); + assert.equal(result[0].col1, "first_val"); + assert.equal(result[0].col2, "second_val"); + done(); + }); + }); + + it("should process escape chars", function (done) { + var test_converter = new Converter({ + escape: "\\", + checkType: true + }); + + var testData = __dirname + "/data/dataWithSlashEscape"; + var rs = fs.createReadStream(testData); + test_converter.then(function (res) { + assert.equal(res[0].raw.hello, "world"); + assert.equal(res[0].raw.test, true); + done(); + }); + rs.pipe(test_converter); + }); + + it("should process escape chars when delimiter is between escaped quotes", function(done) { + var test_converter = new Converter({ + escape: "\\" + }); + + var testData = + __dirname + "/data/dataWithSlashEscapeAndDelimiterBetweenQuotes"; + var rs = fs.createReadStream(testData); + test_converter.then(function(res) { + assert.equal(res[0].raw, '"hello,"world"'); + done(); + }); + rs.pipe(test_converter); + }); + + it("should output ndjson format", function(done) { + var conv = new Converter(); + conv.fromString("a,b,c\n1,2,3\n4,5,6") + .on("data", function (d) { + d = d.toString(); + assert.equal(d[d.length - 1], "\n"); + }) + .on("done", done); + }); + + it("should parse from stream", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + csv() + .fromStream(rs) + .then(function (res) { + assert(res); + done(); + }); + }); + + it("should set output as csv", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var numOfRow = 0; + csv({ output: "csv" }) + .fromStream(rs) + .subscribe(function (row, idx) { + numOfRow++; + assert(row); + assert(idx >= 0); + }) + + .on("done", function (error) { + assert(!error); + assert.equal(2, numOfRow); + assert(numOfRow !== 0); + done(); + }); + }); + + it("should transform with subscribe function", function (done) { + var testData = __dirname + "/data/complexJSONCSV"; + var rs = fs.createReadStream(testData); + var numOfRow = 0; + var numOfJson = 0; + csv() + .fromStream(rs) + .subscribe(function (json, idx) { + json.a = "test"; + assert(idx >= 0); + }) + .on("data", function (d) { + const j = JSON.parse(d.toString()); + assert.equal(j.a, "test"); + }) + .on("end", function () { + done(); + }); + }); + + it("should parse a complex JSON", function (done) { + var converter = new Converter({ checkType: true }); + var r = fs.createReadStream(__dirname + "/data/complexJSONCSV"); + converter.then(function (res) { + assert(res); + assert(res.length === 2); + assert(res[0].fieldA.title === "Food Factory"); + assert(res[0].fieldA.children.length === 2); + assert(res[0].fieldA.children[0].name === "Oscar"); + assert(res[0].fieldA.children[0].id === 23); + assert(res[0].fieldA.children[1].name === "Tikka"); + assert.equal(res[0].fieldA.children[1].employee.length, 2); + assert(res[0].fieldA.children[1].employee[0].name === "Tim", JSON.stringify(res[0].fieldA.children[1].employee[0])); + assert(res[0].fieldA.address.length === 2); + assert(res[0].fieldA.address[0] === "3 Lame Road"); + assert(res[0].fieldA.address[1] === "Grantstown"); + assert(res[0].description === "A fresh new food factory", res[0].description); + done(); + }); + r.pipe(converter); + }); + + it("should allow flatKey to change parse behaviour", function (done) { + var conv = new Converter({ + flatKeys: true + }); + conv.fromString("a.b,b.d,c.a\n1,2,3\n4,5,6").subscribe(function (d) { + assert(d["a.b"]); + assert(d["b.d"]); + assert(d["c.a"]); + }) + .on("done", done); + }); + it("should allow flat mods to change parse behaviour", function (done) { + var conv = new Converter({ + colParser: { + "a.b": { + flat: true + } + } + }); + conv.fromString("a.b,b.d,c.a\n1,2,3\n4,5,6").subscribe(function (d) { + assert(d["a.b"]); + }) + .on("done", done); + }); + + it("should process long header", function (done) { + var testData = __dirname + "/data/longHeader"; + var rs = fs.createReadStream(testData, { highWaterMark: 100 }); + var numOfRow = 0; + var numOfJson = 0; + csv({}, { highWaterMark: 100 }) + .fromStream(rs) + .subscribe(function (res, idx) { + numOfJson++; + assert.equal(res.Date, '8/26/16'); + assert(idx >= 0); + }) + .on("done", function () { + assert(numOfJson === 1); + done(); + }); + }); + + it("should parse #139", function (done) { + var rs = fs.createReadStream(__dirname + "/data/data#139"); + csv() + .fromStream(rs) + .then(function (res) { + assert.equal(res[1].field3, "9001009395 9001009990"); + done(); + }); + }); + + it("should ignore column", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); + var headerEmitted = false; + csv({ + ignoreColumns: /TIMESTAMP/ + }) + .fromStream(rs) + .on("header", function (header) { + assert.equal(header.indexOf("TIMESTAMP"), -1); + assert.equal(header.indexOf("UPDATE"), 0); + if (headerEmitted) { + throw ("header event should only happen once") + } + headerEmitted = true; + }) + // .on("csv", function (row, idx) { + // if (!headerEmitted) { + // throw ("header should be emitted before any data events"); + // } + // assert(idx >= 0); + // if (idx === 1) { + // assert.equal(row[0], "n"); + // } + // }) + .subscribe(function (j, idx) { + assert(!j.TIMESTAMP); + assert(idx >= 0); + }) + .on("done", function () { + assert(headerEmitted); + done(); + }); + }); + it("should keep space around comma in csv", function () { + const str = `"Name","Number" + "John , space", 1234 + "Mr. , space", 4321 + `; + return csv().fromString(str) + .then((data) => { + assert.equal(data[0].Name, "John , space"); + assert.equal(data[1].Name, "Mr. , space"); + }) + }) + + it("should include column", function (done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithQoutes"); + csv({ + includeColumns: /TIMESTAMP/ + }) + .fromStream(rs) + .on("header", function (header) { + assert.equal(header.indexOf("TIMESTAMP"), 0); + assert.equal(header.indexOf("UPDATE"), -1); + assert.equal(header.length, 1); + }) + .subscribe(function (j, idx) { + assert(idx >= 0); + if (idx === 1) { + assert.equal(j.TIMESTAMP, "abc, def, ccc"); + } + assert(!j.UID) + assert(!j['BYTES SENT']) + }) + .on("done", function () { + done(); + }); + }); + + it("should allow headers and include columns to be given as reference to the same var", function (done) { + var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); + var headers = [ + 'first', + 'second', + 'third', + ]; + + var expected = headers; + + csv({ + headers: headers, + includeColumns: /(first|second|third)/, + }) + .fromStream(rs) + .on("header", function (header) { + expected.forEach(function (value, index) { + assert.equal(header.indexOf(value), index); + }); + }) + .subscribe(function (j, idx) { + assert(idx >= 0); + assert.equal(expected.length, Object.keys(j).length); + expected.forEach(function (attribute) { + assert(j.hasOwnProperty(attribute)); + }); + }) + .on("done", function () { + done(); + }); + }); + + it("should leave provided params objects unmutated", function() { + var rs = fs.createReadStream(__dirname + "/data/complexJSONCSV"); + var includeColumns = [ + 'fieldA.title', + 'description', + ]; + + + return csv({ + includeColumns: /(fieldA\.title|description)/, + }) + .fromStream(rs) + .on("json", function(j, idx) { + assert(idx >= 0); + }) + .on("header", function(header) { + includeColumns.forEach(function (value, index) { + assert.equal(index, header.indexOf(value)); + }); + }) + }); + + it("should only call done once", function (done) { + var counter=0; + csv() + .fromString('"a","b", "c""') + .on('done',function(){ + counter++; + }); + setTimeout(function(){ + assert.equal(counter,1); + done(); + },100); + }) +}); diff --git a/node_modules/csvtojson/test/testCSVConverter3.ts b/node_modules/csvtojson/test/testCSVConverter3.ts new file mode 100644 index 0000000..6fb9c05 --- /dev/null +++ b/node_modules/csvtojson/test/testCSVConverter3.ts @@ -0,0 +1,323 @@ +import csv from "../src"; +import assert from "assert"; +var fs = require("fs"); +import { sandbox } from "sinon"; +import CSVError from "../src/CSVError"; +const sb = sandbox.create(); +describe("testCSVConverter3", function () { + afterEach(function () { + sb.restore(); + }); + it("should parse large csv file with UTF-8 without spliting characters", function (done) { + var testData = __dirname + "/data/large-utf8.csv"; + var rs = fs.createReadStream(testData); + var csvConverter = csv({ + }); + var count = 0; + csvConverter.preRawData(function (csvRawData) { + assert(csvRawData.charCodeAt(0) < 2000); + return csvRawData; + }) + csvConverter.on("data", function () { + count++; + }); + csvConverter.then(function () { + assert(count === 5290); + done(); + }); + rs.pipe(csvConverter); + }); + it("should setup customise type convert function", function (done) { + csv({ + checkType: true, + colParser: { + "column1": "string", + "column5": function (item, head, resultRow, row, i) { + assert.equal(item, '{"hello":"world"}'); + assert.equal(head, "column5"), + assert(resultRow); + assert(row); + assert.equal(i, 5); + return "hello world"; + } + } + }) + .fromFile(__dirname + "/data/dataWithType") + .subscribe(function (json) { + assert.equal(typeof json.column1, "string"); + assert.equal(json.column5, "hello world"); + assert.strictEqual(json["name#!"], false); + assert.strictEqual(json["column9"], true); + }) + .on('done', function () { + done() + }); + }) + it("should accept pipe as quote", function (done) { + csv({ + quote: "|", + output: "csv" + }) + .fromFile(__dirname + "/data/pipeAsQuote") + .subscribe(function (csv) { + assert.equal(csv[2], "blahhh, blah"); + }) + .on('done', function () { + done() + }); + }) + it("emit file not exists error when try to open a non-exists file", function () { + let called = false; + const cb = sb.spy((err) => { + assert(err.toString().indexOf("File does not exist") > -1); + }); + return csv() + .fromFile("somefile") + .subscribe(function (csv) { + + }) + .on("error", cb) + .then(() => { + assert(false); + }, (err) => { + assert.equal(cb.callCount, 1); + }) + + }) + it("should include column that is both included and excluded", () => { + return csv({ + includeColumns: /b/, + ignoreColumns: /a|b/ + }) + .fromString(`a,b,c +1,2,3 +4,5,6`) + .subscribe((d) => { + assert(d.b); + assert(!d.a); + }) + }) + it("should allow async preLine hook", () => { + return csv() + .preFileLine((line) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve(line + "changed") + }, 20); + + }) + }) + .fromString(`a,b +1,2`) + .subscribe((d) => { + assert(d.bchanged); + assert.equal(d.bchanged, "2changed"); + }) + + }) + + it("should allow async subscribe function", () => { + return csv({ trim: true }) + .fromString(`a,b,c + 1,2,3 + 4,5,6`) + .subscribe((d) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + d.a = 10; + resolve(); + }, 20); + }) + }) + .then((d) => { + assert.equal(d[0].a, 10); + assert.equal(d[1].a, 10); + }) + }) + it("should propagate value to next then", () => { + return csv({ trim: true }) + .fromString(`a,b,c + 1,2,3 + 4,5,6`) + .then(undefined, undefined) + .then((d) => { + assert.equal(d.length, 2); + assert.equal(d[0].a, "1"); + }) + + }) + it("should propagate error to next then", () => { + return csv({ trim: true }) + .fromFile(__dirname + "/data/dataWithUnclosedQuotes") + .then(undefined, undefined) + .then(() => { + assert(false) + }, (err: CSVError) => { + assert(err); + assert.equal(err.err, "unclosed_quote"); + }) + }) + it("should fallback to text is number can not be parsed", () => { + return csv({ + colParser: { + "a": "number" + } + }) + .fromString(`a,b,c + 1,2,3 + fefe,5,6`) + .then((d) => { + assert.strictEqual(d[0].a, 1); + assert.equal(d[1].a, "fefe"); + }) + }) + it("should omit a column", () => { + return csv({ + colParser: { + "a": "omit" + } + }) + .fromString(`a,b,c + 1,2,3 + fefe,5,6`) + .then((d) => { + assert.strictEqual(d[0].a, undefined); + assert.equal(d[1].a, undefined); + }) + }) + it("could turn off quote and should trim even quote is turned off", () => { + return csv({ + quote: "off", + trim: true + }) + .fromString(`a,b,c + "1","2","3" + "fefe,5",6`) + .then((d) => { + assert.equal(d[0].a, '"1"'); + assert.equal(d[0].b, '"2"'); + assert.equal(d[1].a, '"fefe'); + assert.equal(d[1].b, '5"'); + }) + }) + it("should allow ignoreEmpty with checkColumn", () => { + return csv({ + checkColumn: true, + ignoreEmpty: true + }) + .fromString(`date,altitude,airtime + 2016-07-08,2000,23 + + 2016-07-09,3000,43`) + .then((data) => { + + }, (err) => { + console.log(err); + assert(!err); + }) + }); + it("should allow quotes without content", () => { + const data = "a|^^|^b^"; + return csv({ + delimiter: '|', + quote: '^', + noheader: true, + }) + .fromString(data) + .then((jsonObj) => { + assert.equal(jsonObj[0].field2, ""); + }); + }) + it("should parse header with quotes correctly", function () { + var testData = __dirname + "/data/csvWithUnclosedHeader"; + return csv({ + headers: ["exam_date", "sample_no", "status", "sample_type", "patient_id", "last_name", "first_name", "gender_of_patient", "patient_birth_date", "patient_note", "patient_department", "accession_number", "sample_site", "physician", "operator", "department", "note", "test_order_code", "draw_time", "approval_status", "approval_time", "report_layout", "patient_account_number", "none_1", "errors_detected_during_measurement", "age", "error_code_01", "weight", "error_code_02", "height", "error_code_03", "hcg_beta_p", "error_code_04", "troponin_i_p", "error_code_05", "ck_mb_p", "error_code_06", "d_dimer_p", "error_code_07", "hscrp_p", "error_code_08", "myoglobin_p", "error_code_09", "nt_probnp", "error_code_10", "crp", "error_code_11", "bnp", "error_code_12", "tnt", "error_code_13", "demo_p", "error_code_14", "pct", "error_code_15"] + }) + .fromFile(testData) + .then((d) => { + assert.equal(d.length, 2); + assert.equal(d[0].sample_no, "12669"); + }) + + }); + it ("should stream json string correctly",function(done){ + const data=`a,b,c +1,2,3 +4,5,6` + let hasLeftBracket=false; + let hasRightBracket=false; + csv({ + downstreamFormat:"array" + }) + .fromString(data) + .on("data",(d)=>{ + const str=d.toString(); + if (str[0]==="[" && str.length ===2){ + hasLeftBracket=true; + }else if (str[0]==="]" && str.length===2){ + hasRightBracket=true; + }else{ + assert.equal(str[str.length-2],","); + } + + }) + .on("end",()=>{ + assert.equal(hasLeftBracket,true); + assert.equal(hasRightBracket,true); + done(); + }) + }) + it ("should stream json line correctly",function(done){ + const data=`a,b,c +1,2,3 +4,5,6` + csv({ + downstreamFormat:"line" + }) + .fromString(data) + .on("data",(d)=>{ + const str=d.toString(); + + assert.notEqual(str[str.length-2],","); + }) + .on("end",()=>{ + done(); + }) + }) + it ("should not send json if needEmitAll is false",async function(){ + const data=`a,b,c +1,2,3 +4,5,6` + return csv({ + needEmitAll:false + }) + .fromString(data) + .then((d)=>{ + assert(d.length===0); + }) + }) + it ("should convert null to null object",async function(){ + const data=`a,b,c +null,2,3 +4,5,6` + return csv({ + nullObject:true + }) + .fromString(data) + .then((d)=>{ + assert.equal(d[0].a,null) + }) + }) + it ("should process period properly",async function(){ + const data=`a..,b,c +1,2,3 +4,5,6` + return csv({ + }) + .fromString(data) + .then((d)=>{ + assert.equal(d[0]["a.."],1); + assert.equal(d[1]["a.."],4); + }) + }) +}); diff --git a/node_modules/csvtojson/test/testErrorHandle.ts b/node_modules/csvtojson/test/testErrorHandle.ts new file mode 100644 index 0000000..0a9ef8f --- /dev/null +++ b/node_modules/csvtojson/test/testErrorHandle.ts @@ -0,0 +1,57 @@ +import {Converter} from "../src/Converter"; +import CSVError from "../src/CSVError"; +var assert = require("assert"); +var fs = require("fs"); + +describe("Converter error handling", function() { + it("should handle quote not closed", function(done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithUnclosedQuotes"); + var conv = new Converter({}); + conv.on("error", function(err:CSVError) { + assert(err.err === "unclosed_quote"); + done(); + }); + rs.pipe(conv); + }); + + + it ("should handle column number mismatched error", function(done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithMismatchedColumn"); + var conv = new Converter({ + checkColumn:true + }); + var tested = false; + conv.on("error", function(err:CSVError) { + if (tested === false) { + assert(err.err === "column_mismatched"); + tested = true; + // done(); + } + }); + conv.on('done',function() { + assert(tested); + done(); + }); + rs.pipe(conv); + }); + + it("should treat quote not closed as column_mismatched when alwaysSplitAtEOL is true", function(done) { + var rs = fs.createReadStream(__dirname + "/data/dataWithUnclosedQuotes"); + var conv = new Converter({ + checkColumn:true, + alwaysSplitAtEOL:true, + }); + var tested = false; + conv.on("error", function(err:CSVError) { + if (tested === false) { + assert(err.err === "column_mismatched"); + tested = true; + } + }); + conv.on('done',function() { + assert(tested); + done(); + }); + rs.pipe(conv); + }); +}); diff --git a/node_modules/csvtojson/tsconfig.json b/node_modules/csvtojson/tsconfig.json new file mode 100644 index 0000000..2f7994c --- /dev/null +++ b/node_modules/csvtojson/tsconfig.json @@ -0,0 +1,64 @@ +{ + "compilerOptions": { + /* Basic Options */ + "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "lib": ["es5","es6"], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + "declaration": true, /* Generates corresponding '.d.ts' file. */ + "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./v2", /* Redirect output structure to the directory. */ + "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.test.ts" + ] + +} \ No newline at end of file diff --git a/node_modules/csvtojson/typings.d.ts b/node_modules/csvtojson/typings.d.ts new file mode 100644 index 0000000..daa7346 --- /dev/null +++ b/node_modules/csvtojson/typings.d.ts @@ -0,0 +1,4 @@ +declare module "*.json"{ + const value: any; + export default value; +} \ No newline at end of file diff --git a/node_modules/csvtojson/v1/core/CSVError.js b/node_modules/csvtojson/v1/core/CSVError.js new file mode 100644 index 0000000..ef8e75c --- /dev/null +++ b/node_modules/csvtojson/v1/core/CSVError.js @@ -0,0 +1,27 @@ +var util = require("util"); +module.exports = CSVError; +function CSVError(err, index, extra) { + Error.call(this, ""); + this.err = err; + this.line = index; + this.extra = extra; + this.message = "Error: " + err + ". JSON Line number: " + index + (extra ? " near: " + extra : ""); + this.name = "CSV Error"; +} +util.inherits(CSVError, Error); + +CSVError.prototype.toString = function() { + return JSON.stringify([this.err, this.line, this.extra]); +}; + +CSVError.column_mismatched = function(index, extra) { + return new CSVError("column_mismatched", index, extra); +}; + +CSVError.unclosed_quote = function(index, extra) { + return new CSVError("unclosed_quote", index, extra); +}; + +CSVError.fromArray = function(arr) { + return new CSVError(arr[0], arr[1], arr[2]); +}; diff --git a/node_modules/csvtojson/v1/core/Converter.js b/node_modules/csvtojson/v1/core/Converter.js new file mode 100644 index 0000000..5242155 --- /dev/null +++ b/node_modules/csvtojson/v1/core/Converter.js @@ -0,0 +1,580 @@ +var util = require("util"); +var Transform = require("stream").Transform; +var os = require("os"); +var stripBom = require('strip-bom'); +var eol = os.EOL; +// var Processor = require("./Processor.js"); +var defParam = require("./defParam"); +var fileline = require("./fileline"); +var fileLineToCSVLine = require("./fileLineToCSVLine"); +var linesToJson = require("./linesToJson"); +var CSVError = require("./CSVError"); +var workerMgr = null; +var _ = require('lodash'); +var rowSplit = require("./rowSplit"); +function Converter(params, options) { + Transform.call(this, options); + this._options = options || {}; + this.param = defParam(params); + this.param._options = this._options; + // this.resultObject = new Result(this); + // this.pipe(this.resultObject); // it is important to have downstream for a transform otherwise it will stuck + this.started = false;//indicate if parsing has started. + this.recordNum = 0; + this.lineNumber = 0; //file line number + this._csvLineBuffer = ""; + this.lastIndex = 0; // index in result json array + //this._pipe(this.lineParser).pipe(this.processor); + // this.initNoFork(); + if (this.param.forked) { + this.param.forked = false; + this.workerNum = 2; + } + this.flushCb = null; + this.processEnd = false; + this.sequenceBuffer = []; + this._needJson = null; + this._needEmitResult = null; + this._needEmitFinalResult = null; + this._needEmitHeader = null; + this._needEmitJson = null; + this._needPush = null; + this._needEmitCsv = null; + this._csvTransf = null; + this.finalResult = []; + // this.on("data", function() {}); + this.on("error", emitDone(this)); + this.on("end", emitDone(this)); + this.initWorker(); + process.nextTick(function () { + if (this._needEmitFinalResult === null) { + this._needEmitFinalResult = this.listeners("end_parsed").length > 0; + } + if (this._needEmitResult === null) { + this._needEmitResult = this.listeners("record_parsed").length > 0; + } + if (this._needEmitJson === null) { + this._needEmitJson = this.listeners("json").length > 0; + } + if (this._needEmitHeader === null) { + this._needEmitHeader = this.listeners("header").length > 0; + } + if (this._needEmitCsv === null) { + this._needEmitCsv = this.listeners("csv").length > 0; + } + if (this._needJson === null) { + this._needJson = this._needEmitJson || this._needEmitFinalResult || this._needEmitResult || this.transform || this._options.objectMode; + } + if (this._needPush === null) { + this._needPush = this.listeners("data").length > 0 || this.listeners("readable").length > 0; + // this._needPush=false; + } + this.param._needParseJson = this._needJson || this._needPush; + }.bind(this)); + + return this; +} + +util.inherits(Converter, Transform); +function emitDone(conv) { + return function (err) { + if (!conv._hasDone) { + conv._hasDone = true; + process.nextTick(function () { + conv.emit('done', err); + }); + }; + } +} + + +function bufFromString(str) { + var length=Buffer.byteLength(str); + var buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(length) + : new Buffer(length); + buffer.write(str); + return buffer; +} + +Converter.prototype._transform = function (data, encoding, cb) { + data=this.prepareData(data); + var idx =data.length-1; + var left=null; + /** + * From Keyang: + * The code below is to check if a single utf8 char (which could be multiple bytes) being split. + * If the char being split, the buffer from two chunk needs to be concat + * check how utf8 being encoded to understand the code below. + * If anyone has any better way to do this, please let me know. + */ + if ((data[idx] & 1<<7) !=0){ + while ((data[idx] & 3<<6) === 128){ + idx--; + } + idx--; + } + if (idx !=data.length-1){ + left=data.slice(idx+1); + data=data.slice(0,idx+1) + var _cb=cb; + var self=this; + cb=function(){ + if (self._csvLineBuffer){ + self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]); + }else{ + self._csvLineBuffer=left; + } + _cb(); + } + } + data = data.toString("utf8"); + if (this.started === false) { + this.started = true; + data = stripBom(data); + if (this.param.toArrayString) { + if (this._needPush) { + this.push("[" + eol, "utf8"); + } + } + } + var self = this; + this.preProcessRaw(data, function (d) { + if (d && d.length > 0) { + self.processData(d, cb); + } else { + cb(); + } + }); +}; + +Converter.prototype.prepareData = function (data) { + if (this._csvLineBuffer && this._csvLineBuffer.length>0){ + if (typeof this._csvLineBuffer === "string"){ + this._csvLineBuffer=bufFromString(this._csvLineBuffer); + } + return Buffer.concat([this._csvLineBuffer,data]); + }else{ + return data; + } + // return this._csvLineBuffer + data; +}; + +Converter.prototype.setPartialData = function (d) { + this._csvLineBuffer = d; +}; + +Converter.prototype.processData = function (data, cb) { + var params = this.param; + if (params.ignoreEmpty && !params._headers) { + data = data.replace(/^\s+/, ""); + } + var eol = this.param.eol; + var fileLines = fileline(data, this.param); + if (this.param.eol !== eol) { + this.emit("eol", this.param.eol); + } + if (fileLines.lines.length > 0) { + if (this.preProcessLine && typeof this.preProcessLine === "function") { + fileLines.lines = this._preProcessLines(fileLines.lines, this.lastIndex); + } + if (!params._headers) { //header is not inited. init header + this.processHead(fileLines, cb); + } else { + if (params.workerNum <= 1) { + var lines = fileLineToCSVLine(fileLines, params); + this.setPartialData(lines.partial); + var jsonArr = linesToJson(lines.lines, params, this.recordNum); + this.processResult(jsonArr); + this.lastIndex += jsonArr.length; + this.recordNum += jsonArr.length; + cb(); + } else { + this.workerProcess(fileLines, cb); + } + } + } else { + this.setPartialData(fileLines.partial); + cb(); + } +}; + +Converter.prototype._preProcessLines = function (lines, startIdx) { + var rtn = []; + for (var i = 0, len = lines.length; i < len; i++) { + var result = this.preProcessLine(lines[i], startIdx + i + 1); + if (typeof result === "string") { + rtn.push(result); + } else { + rtn.push(lines[i]); + this.emit("error", new Error("preProcessLine should return a string but got: " + JSON.stringify(result))); + } + } + return rtn; +}; + +Converter.prototype.initWorker = function () { + var workerNum = this.param.workerNum - 1; + if (workerNum > 0) { + workerMgr = require("./workerMgr"); + this.workerMgr = workerMgr(); + this.workerMgr.initWorker(workerNum, this.param); + } +}; + +Converter.prototype.preRawData = function (func) { + this.preProcessRaw = func; + return this; +}; + +Converter.prototype.preFileLine = function (func) { + this.preProcessLine = func; + return this; +}; + +/** + * workerpRocess does not support embeded multiple lines. + */ +Converter.prototype.workerProcess = function (fileLine, cb) { + var self = this; + var line = fileLine; + var eol = this.getEol(); + this.setPartialData(line.partial); + this.workerMgr.sendWorker(line.lines.join(eol) + eol, this.lastIndex, cb, function (results, lastIndex) { + var buf; + var cur = self.sequenceBuffer[0]; + if (cur.idx === lastIndex) { + cur.result = results; + var records = []; + while (self.sequenceBuffer[0] && self.sequenceBuffer[0].result) { + buf = self.sequenceBuffer.shift(); + records = records.concat(buf.result); + } + self.processResult(records); + self.recordNum += records.length; + } else { + for (var i = 0, len = self.sequenceBuffer.length; i < len; i++) { + buf = self.sequenceBuffer[i]; + if (buf.idx === lastIndex) { + buf.result = results; + break; + } + } + } + }); + this.sequenceBuffer.push({ + idx: this.lastIndex, + result: null + }); + this.lastIndex += line.lines.length; +}; + +Converter.prototype.processHead = function (fileLine, cb) { + var params = this.param; + if (params._headers) { + return cb(); + } + //dirty hack + params._needFilterRow = false; + // if header is not inited. init header + var lines = fileLine.lines; + var left = ""; + var headerRow = []; + if (!params.noheader) { + while (lines.length) { + var line = left + lines.shift(); + var delimiter = params.delimiter; + var row = rowSplit(line, params); + if (params.delimiter !== delimiter) { + this.emit("delimiter", params.delimiter); + } + if (row.closed) { + headerRow = row.cols; + left = ""; + break; + } else { + left = line + this.getEol(); + } + } + } + params._needFilterRow = true; + if (!params.noheader && headerRow.length === 0) { //if one chunk of data does not complete header row. + this.setPartialData(left); + return cb(); + } + if (params.noheader) { + if (params.headers) { + params._headers = params.headers; + } else { + params._headers = []; + } + } else { + if (params.headers) { + params._headers = params.headers; + } else { + params._headers = headerRow; + } + } + configIgnoreIncludeColumns(params); + params._headers = require("./filterRow")(params._headers, params); + if (this._needEmitHeader && this.param._headers) { + this.emit("header", this.param._headers); + } + var delimiter = params.delimiter; + var lines = fileLineToCSVLine(fileLine, params); + if (params.delimiter !== delimiter) { + this.emit("delimiter", params.delimiter); + } + this.setPartialData(lines.partial); + if (this.param.workerNum > 1) { + this.workerMgr.setParams(params); + } + var res = linesToJson(lines.lines, params, 0); + // Put the header with the first row + // if(res.length > 0) res[0].header = params._headers; + this.processResult(res); + this.lastIndex += res.length; + this.recordNum += res.length; + + cb(); +}; +function configIgnoreIncludeColumns(params) { + if (params._postIgnoreColumns) { + for (var i = 0; i < params.ignoreColumns.length; i++) { + var ignoreCol = params.ignoreColumns[i]; + if (typeof ignoreCol === "string") { + var idx = params._headers.indexOf(ignoreCol); + if (idx > -1) { + params.ignoreColumns[i] = idx; + } else { + params.ignoreColumns[i] = -1; + } + } + } + params.ignoreColumns.sort(function (a, b) { return b - a; }); + } + if (params._postIncludeColumns) { + for (var i = 0; i < params.includeColumns.length; i++) { + var includeCol = params.includeColumns[i]; + if (typeof includeCol === "string") { + var idx = params._headers.indexOf(includeCol); + if (idx > -1) { + params.includeColumns[i] = idx; + } else { + params.includeColumns[i] = -1; + } + } + } + } + params.ignoreColumns = _.uniq(params.ignoreColumns); + params.includeColumns = _.uniq(params.includeColumns); +} + +Converter.prototype.processResult = function (result) { + for (var i = 0, len = result.length; i < len; i++) { + var r = result[i]; + if (r.err) { + this.emit("error", r.err); + } else { + this.emitResult(r); + } + } +}; + +Converter.prototype.emitResult = function (r) { + var index = r.index; + var header = this.param; + var row = r.row; + var result = r.json; + var resultJson = null; + var resultStr = null; + if (typeof result === "string") { + resultStr = result; + } else { + resultJson = result; + } + if (resultJson === null && this._needJson) { + resultJson = JSON.parse(resultStr); + if (typeof row === "string") { + row = JSON.parse(row); + } + } + if (this.transform && typeof this.transform === "function") { + this.transform(resultJson, row, index); + resultStr = null; + } + if (this._needEmitJson) { + this.emit("json", resultJson, index); + } + if (this._needEmitCsv) { + if (typeof row === "string") { + row = JSON.parse(row); + } + this.emit("csv", row, index); + } + if (this.param.constructResult && this._needEmitFinalResult) { + this.finalResult.push(resultJson); + } + if (this._needEmitResult) { + this.emit("record_parsed", resultJson, row, index); + } + if (this.param.toArrayString && index > 0 && this._needPush) { + this.push("," + eol); + } + if (this._options && this._options.objectMode) { + this.push(resultJson); + } else { + if (this._needPush) { + if (resultStr === null) { + resultStr = JSON.stringify(resultJson); + } + this.push(!this.param.toArrayString ? resultStr + eol : resultStr, "utf8"); + } + } +}; + +Converter.prototype.preProcessRaw = function (data, cb) { + cb(data); +}; + +// FIXME: lineNumber is not used. +Converter.prototype.preProcessLine = function (line, lineNumber) { + return line; +}; + +Converter.prototype._flush = function (cb) { + var self = this; + this.flushCb = function () { + self.emit("end_parsed", self.finalResult); + if (self.workerMgr) { + self.workerMgr.destroyWorker(); + } + cb(); + if (!self._needPush) { + self.emit("end"); + } + }; + if (this._csvLineBuffer.length > 0) { + var eol = this.getEol(); + if (this._csvLineBuffer[this._csvLineBuffer.length - 1] !== eol) { + this._csvLineBuffer += eol; + } + this.processData(this._csvLineBuffer, function () { + this.checkAndFlush(); + }.bind(this)); + } else { + this.checkAndFlush(); + } + return; +}; + +Converter.prototype.checkAndFlush = function () { + if (this._csvLineBuffer.length !== 0) { + this.emit("error", CSVError.unclosed_quote(this.recordNum, this._csvLineBuffer), this._csvLineBuffer); + } + if (this.param.toArrayString && this._needPush) { + this.push(eol + "]", "utf8"); + } + if (this.workerMgr && this.workerMgr.isRunning()) { + this.workerMgr.drain = function () { + this.flushCb(); + }.bind(this); + } else { + this.flushCb(); + } +}; + +Converter.prototype.getEol = function (data) { + if (!this.param.eol && data) { + for (var i = 0, len = data.length; i < len; i++) { + if (data[i] === "\r") { + if (data[i + 1] === "\n") { + this.param.eol = "\r\n"; + } else { + this.param.eol = "\r"; + } + return this.param.eol; + } else if (data[i] === "\n") { + this.param.eol = "\n"; + return this.param.eol; + } + } + this.param.eol = eol; + } + + return this.param.eol || eol; +}; + +Converter.prototype.fromFile = function (filePath, cb, options) { + var fs = require('fs'); + var rs = null; + if (typeof cb ==="object" && typeof options === "undefined"){ + options=cb; + cb=null; + } + this.wrapCallback(cb, function () { + if (rs && rs.destroy) { + rs.destroy(); + } + }); + fs.exists(filePath, function (exist) { + if (exist) { + rs = fs.createReadStream(filePath,options); + rs.pipe(this); + } else { + this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct.")); + } + }.bind(this)); + return this; +}; + +Converter.prototype.fromStream = function (readStream, cb) { + if (cb && typeof cb === "function") { + this.wrapCallback(cb); + } + readStream.pipe(this); + return this; +}; + +Converter.prototype.transf = function (func) { + this.transform = func; + return this; +}; + +Converter.prototype.fromString = function (csvString, cb) { + if (typeof csvString !== "string") { + if (cb && typeof cb ==="function"){ + return cb(new Error("Passed CSV Data is not a string.")); + } + } + if (cb && typeof cb === "function") { + this.wrapCallback(cb, function () { + }); + } + process.nextTick(function () { + this.end(csvString); + }.bind(this)); + return this; +}; + +Converter.prototype.wrapCallback = function (cb, clean) { + if (clean === undefined) { + clean = function () { }; + } + if (cb && typeof cb === "function") { + this.once("end_parsed", function (res) { + if (!this.hasError) { + cb(null, res); + } + }.bind(this)); + } + this.once("error", function (err) { + this.hasError = true; + if (cb && typeof cb === "function") { + cb(err); + } + clean(); + }.bind(this)); +}; + +module.exports = Converter; diff --git a/node_modules/csvtojson/v1/core/csvline.js b/node_modules/csvtojson/v1/core/csvline.js new file mode 100644 index 0000000..eb98473 --- /dev/null +++ b/node_modules/csvtojson/v1/core/csvline.js @@ -0,0 +1,23 @@ +var getEol = require("./getEol"); +var rowSplit = require("./rowSplit"); +/** + * Convert lines to csv columns + * @param {[type]} lines [file lines] + * @param {[type]} param [Converter param] + * @return {[type]} {lines:[[col1,col2,col3...]],partial:String} + */ +module.exports = function(lines, param) { + var csvLines = []; + var left = ""; + while (lines.length) { + var line = left + lines.shift(); + var row = rowSplit(line, param); + if (row.closed || param.alwaysSplitAtEOL) { + csvLines.push(row.cols); + left = ""; + } else { + left = line + (getEol(line, param) || "\n"); // if unable to getEol from data, assume "\n" + } + } + return {lines: csvLines, partial: left}; +}; diff --git a/node_modules/csvtojson/v1/core/dataToCSVLine.js b/node_modules/csvtojson/v1/core/dataToCSVLine.js new file mode 100644 index 0000000..703ad1d --- /dev/null +++ b/node_modules/csvtojson/v1/core/dataToCSVLine.js @@ -0,0 +1,17 @@ +var fileline=require("./fileline"); +var csvline=require("./csvline"); +/** + * Convert data chunk to csv lines with cols + * @param {[type]} data [description] + * @param {[type]} params [description] + * @return {[type]} {lines:[[col1,col2,col3]],partial:String} + */ +module.exports = function(data, params) { + var line = fileline(data, params); + var lines = line.lines; + var csvLines = csvline(lines, params); + return { + lines: csvLines.lines, + partial: csvLines.partial + line.partial + }; +}; diff --git a/node_modules/csvtojson/v1/core/defParam.js b/node_modules/csvtojson/v1/core/defParam.js new file mode 100644 index 0000000..a94ea3c --- /dev/null +++ b/node_modules/csvtojson/v1/core/defParam.js @@ -0,0 +1,67 @@ +var numExp = /^[0-9]+$/; +module.exports = function (params) { + var _param = { + constructResult: true, //set to false to not construct result in memory. suitable for big csv data + delimiter: ',', // change the delimiter of csv columns. It is able to use an array to specify potencial delimiters. e.g. [",","|",";"] + ignoreColumns: [], // columns to ignore upon input. + includeColumns: [], // columns to include upon input. + quote: '"', //quote for a column containing delimiter. + trim: true, //trim column's space charcters + checkType: false, //whether check column type + toArrayString: false, //stream down stringified json array instead of string of json. (useful if downstream is file writer etc) + ignoreEmpty: false, //Ignore empty value while parsing. if a value of the column is empty, it will be skipped parsing. + workerNum: getEnv("CSV_WORKER", 1), //number of parallel workers. If multi-core CPU available, increase the number will get better performance for large csv data. + fork: false, //use another CPU core to convert the csv stream + noheader: false, //indicate if first line of CSV file is header or not. + headers: null, //an array of header strings. If noheader is false and headers is array, csv header will be ignored. + flatKeys: false, // Don't interpret dots and square brackets in header fields as nested object or array identifiers at all. + maxRowLength: 0, //the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0 + checkColumn: false, //whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false + escape: '"', //escape char for quoted column + colParser:{}, //flags on columns to alter field processing. + + /**below are internal params */ + _columnConv:[], + _headerType: [], + _headerTitle: [], + _headerFlag: [], + _headers: null, + _needFilterRow: false + }; + if (!params) { + params = {}; + } + for (var key in params) { + if (params.hasOwnProperty(key)) { + if (Array.isArray(params[key])) { + _param[key] = [].concat(params[key]); + } else { + _param[key] = params[key]; + } + } + } + if (_param.ignoreColumns.length > 0 && !numExp.test(_param.ignoreColumns.join(""))) { + _param._postIgnoreColumns = true; + } + if (_param.includeColumns.length > 0 && !numExp.test(_param.includeColumns.join(""))) { + _param._postIncludeColumns = true; + } + + if (_param.ignoreColumns.length || _param.includeColumns.length) { + _param._needFilterRow = true; + if (!_param._postIgnoreColumns){ + _param.ignoreColumns.sort(function (a, b) { return b-a;}); + } + } + + + return _param; +}; + +function getEnv(key, def) { + if (process.env[key]) { + return process.env[key]; + } else { + return def; + } +} diff --git a/node_modules/csvtojson/v1/core/defaultParsers/index.js b/node_modules/csvtojson/v1/core/defaultParsers/index.js new file mode 100644 index 0000000..aac3f58 --- /dev/null +++ b/node_modules/csvtojson/v1/core/defaultParsers/index.js @@ -0,0 +1,7 @@ +module.exports = [ + require('./parser_array.js'), + require('./parser_json.js'), + require('./parser_omit.js'), + require('./parser_jsonarray.js'), + require("./parser_flat.js") +]; diff --git a/node_modules/csvtojson/v1/core/defaultParsers/parser_array.js b/node_modules/csvtojson/v1/core/defaultParsers/parser_array.js new file mode 100644 index 0000000..9801cec --- /dev/null +++ b/node_modules/csvtojson/v1/core/defaultParsers/parser_array.js @@ -0,0 +1,12 @@ +module.exports = { + "name": "array", + "processSafe":true, + "regExp": /^\*array\*/, + "parserFunc": function parser_array(params) { + var fieldName = params.head.replace(this.regExp, ''); + if (params.resultRow[fieldName] === undefined) { + params.resultRow[fieldName] = []; + } + params.resultRow[fieldName].push(params.item); + } +}; diff --git a/node_modules/csvtojson/v1/core/defaultParsers/parser_flat.js b/node_modules/csvtojson/v1/core/defaultParsers/parser_flat.js new file mode 100644 index 0000000..d10e0dd --- /dev/null +++ b/node_modules/csvtojson/v1/core/defaultParsers/parser_flat.js @@ -0,0 +1,10 @@ +module.exports = { + "name": "flat", + "processSafe": true, + "regExp": /^\*flat\*/, + "parserFunc": function parser_flat (params) { + var key = this.getHeadStr(); + var val = params.item; + params.resultRow[key] = val; + } +}; diff --git a/node_modules/csvtojson/v1/core/defaultParsers/parser_json.js b/node_modules/csvtojson/v1/core/defaultParsers/parser_json.js new file mode 100644 index 0000000..9cb2eda --- /dev/null +++ b/node_modules/csvtojson/v1/core/defaultParsers/parser_json.js @@ -0,0 +1,70 @@ +var arrReg = /\[([0-9]*)\]/; + + +function processHead(pointer, headArr, arrReg, flatKeys) { + var headStr, match, index; + while (headArr.length > 1) { + headStr = headArr.shift(); + // match = headStr.match(arrReg); + match = flatKeys ? false : headStr.match(arrReg); + if (match) { //if its array, we need add an empty json object into specified index. + if (pointer[headStr.replace(match[0], '')] === undefined) { + pointer[headStr.replace(match[0], '')] = []; + } + index = match[1]; //get index where json object should stay + pointer = pointer[headStr.replace(match[0], '')]; + if (index === '') { //if its dynamic array index, push to the end + index = pointer.length; + } + if (!pointer[index]) { //current index in the array is empty. we need create a new json object. + pointer[index] = {}; + } + pointer = pointer[index]; + } else { //not array, just normal JSON object. we get the reference of it + if (pointer[headStr] === undefined) { + pointer[headStr] = {}; + } + pointer = pointer[headStr]; + } + } + return pointer; +} +module.exports = { + "name": "json", + "processSafe": true, + "regExp": /^\*json\*/, + "parserFunc": function parser_json(params) { + var fieldStr = this.getHeadStr(); + var headArr = (params.config && params.config.flatKeys) ? [fieldStr] : fieldStr.split('.'); + var match, index, key; + //now the pointer is pointing the position to add a key/value pair. + var pointer = processHead(params.resultRow, headArr, arrReg, params.config && params.config.flatKeys); + key = headArr.shift(); + match = (params.config && params.config.flatKeys) ? false : key.match(arrReg); + if (match) { // the last element is an array, we need check and treat it as an array. + try { + key = key.replace(match[0], ''); + if (!pointer[key] || !(pointer[key] instanceof Array)) { + pointer[key] = []; + } + if (pointer[key]) { + index = match[1]; + if (index === '') { + index = pointer[key].length; + } + pointer[key][index] = params.item; + } else { + params.resultRow[fieldStr] = params.item; + } + } catch (e) { + params.resultRow[fieldStr] = params.item; + } + } else { + if (typeof pointer === "string"){ + params.resultRow[fieldStr] = params.item; + }else{ + pointer[key] = params.item; + } + } + } +}; diff --git a/node_modules/csvtojson/v1/core/defaultParsers/parser_jsonarray.js b/node_modules/csvtojson/v1/core/defaultParsers/parser_jsonarray.js new file mode 100644 index 0000000..0fe4fb5 --- /dev/null +++ b/node_modules/csvtojson/v1/core/defaultParsers/parser_jsonarray.js @@ -0,0 +1,22 @@ +module.exports = { + "name": "jsonarray", + "processSafe":true, + "regExp": /^\*jsonarray\*/, + "parserFunc": function parser_jsonarray (params) { + var fieldStr = params.head.replace(this.regExp, ""); + var headArr = fieldStr.split('.'); + var pointer = params.resultRow; + while (headArr.length > 1) { + var headStr = headArr.shift(); + if (pointer[headStr] === undefined) { + pointer[headStr] = {}; + } + pointer = pointer[headStr]; + } + var arrFieldName = headArr.shift(); + if (pointer[arrFieldName] === undefined) { + pointer[arrFieldName] = []; + } + pointer[arrFieldName].push(params.item); + } +}; diff --git a/node_modules/csvtojson/v1/core/defaultParsers/parser_omit.js b/node_modules/csvtojson/v1/core/defaultParsers/parser_omit.js new file mode 100644 index 0000000..6b67aea --- /dev/null +++ b/node_modules/csvtojson/v1/core/defaultParsers/parser_omit.js @@ -0,0 +1,6 @@ +module.exports = { + "name": "omit", + "regExp": /^\*omit\*/, + "processSafe":true, + "parserFunc": function parser_omit() {} +}; diff --git a/node_modules/csvtojson/v1/core/fileLineToCSVLine.js b/node_modules/csvtojson/v1/core/fileLineToCSVLine.js new file mode 100644 index 0000000..b81d321 --- /dev/null +++ b/node_modules/csvtojson/v1/core/fileLineToCSVLine.js @@ -0,0 +1,15 @@ +var csvline=require("./csvline"); +/** + * Convert data chunk to csv lines with cols + * @param {[type]} data [description] + * @param {[type]} params [description] + * @return {[type]} {lines:[[col1,col2,col3]],partial:String} + */ +module.exports = function(fileLine, params) { + var lines = fileLine.lines; + var csvLines = csvline(lines,params); + return { + lines: csvLines.lines, + partial: csvLines.partial + fileLine.partial + }; +}; diff --git a/node_modules/csvtojson/v1/core/fileline.js b/node_modules/csvtojson/v1/core/fileline.js new file mode 100644 index 0000000..c9beef1 --- /dev/null +++ b/node_modules/csvtojson/v1/core/fileline.js @@ -0,0 +1,13 @@ +var getEol = require("./getEol"); +/** + * convert data chunk to file lines array + * @param {string} data data chunk as utf8 string + * @param {object} param Converter param object + * @return {Object} {lines:[line1,line2...],partial:String} + */ +module.exports = function(data, param) { + var eol = getEol(data,param); + var lines = data.split(eol); + var partial = lines.pop(); + return {lines: lines, partial: partial}; +}; diff --git a/node_modules/csvtojson/v1/core/filterRow.js b/node_modules/csvtojson/v1/core/filterRow.js new file mode 100644 index 0000000..516edbb --- /dev/null +++ b/node_modules/csvtojson/v1/core/filterRow.js @@ -0,0 +1,19 @@ +module.exports=function filterRow(row, param) { + if (param.ignoreColumns instanceof Array && param.ignoreColumns.length > 0) { + for (var igRow = 0, igColLen = param.ignoreColumns.length; igRow < igColLen; igRow++) { + if (param.ignoreColumns[igRow] >= 0) { + row.splice(param.ignoreColumns[igRow], 1); + } + } + } + if (param.includeColumns instanceof Array && param.includeColumns.length > 0) { + var cleanRowArr = []; + for (var inRow = 0, inColLen = param.includeColumns.length; inRow < inColLen; inRow++) { + if (param.includeColumns[inRow] >= 0) { + cleanRowArr.push(row[param.includeColumns[inRow]]); + } + } + row = cleanRowArr; + } + return row; +} \ No newline at end of file diff --git a/node_modules/csvtojson/v1/core/getDelimiter.js b/node_modules/csvtojson/v1/core/getDelimiter.js new file mode 100644 index 0000000..4ff121e --- /dev/null +++ b/node_modules/csvtojson/v1/core/getDelimiter.js @@ -0,0 +1,22 @@ +module.exports = getDelimiter; +var defaulDelimiters = [",", "|", "\t", ";", ":"]; +function getDelimiter(rowStr,param) { + var checker; + if (param.delimiter === "auto"){ + checker = defaulDelimiters; + } else if (param.delimiter instanceof Array) { + checker = param.delimiter; + } else { + return param.delimiter; + } + var count = 0; + var rtn = ","; + checker.forEach(function(delim) { + var delimCount = rowStr.split(delim).length; + if (delimCount > count) { + rtn = delim; + count = delimCount; + } + }); + return rtn; +} diff --git a/node_modules/csvtojson/v1/core/getEol.js b/node_modules/csvtojson/v1/core/getEol.js new file mode 100644 index 0000000..3e5a93d --- /dev/null +++ b/node_modules/csvtojson/v1/core/getEol.js @@ -0,0 +1,20 @@ +//return eol from a data chunk. +var eol = require("os").EOL; +module.exports = function(data, param) { + if (!param.eol && data) { + for (var i = 0, len = data.length; i < len; i++) { + if (data[i] === "\r") { + if (data[i + 1] === "\n") { + param.eol = "\r\n"; + } else if (data[i + 1]) { + param.eol = "\r"; + } + return param.eol; + } else if (data[i] === "\n") { + param.eol = "\n"; + return param.eol; + } + } + } + return param.eol; +}; diff --git a/node_modules/csvtojson/v1/core/index.js b/node_modules/csvtojson/v1/core/index.js new file mode 100644 index 0000000..0d705f6 --- /dev/null +++ b/node_modules/csvtojson/v1/core/index.js @@ -0,0 +1,6 @@ +module.exports = constructor; +module.exports.Converter = require("./Converter.js"); + +function constructor(param,options) { + return new module.exports.Converter(param, options); +} diff --git a/node_modules/csvtojson/v1/core/linesToJson.js b/node_modules/csvtojson/v1/core/linesToJson.js new file mode 100644 index 0000000..3493c2a --- /dev/null +++ b/node_modules/csvtojson/v1/core/linesToJson.js @@ -0,0 +1,235 @@ +var parserMgr = require("./parserMgr.js"); +var CSVError = require("./CSVError"); +var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/; +/** + * Convert lines of csv array into json + * @param {[type]} lines [[col1,col2,col3]] + * @param {[type]} params Converter params with _headers field populated + * @param {[type]} idx start pos of the lines + * @return {[type]} [{err:null,json:obj,index:line,row:[csv row]}] + */ +module.exports = function (lines, params, idx) { + if (params._needParseJson) { + if (!params._headers || !Array.isArray(params._headers)) { + params._headers = []; + } + if (!params.parseRules) { + var row = params._headers; + params.parseRules = parserMgr.initParsers(row, params); + } + return processRows(lines, params, idx); + } else { + return justReturnRows(lines, params, idx); + } +}; + +function justReturnRows(lines, params, idx) { + var rtn = []; + for (var i = 0, len = lines.length; i < len; i++) { + rtn.push({ + err: null, + json: {}, + index: idx++, + row: lines[i] + }); + } + return rtn; +} + +function processRows(csvRows, params, startIndex) { + var res = []; + for (var i = 0, len = csvRows.length; i < len; i++) { + var r = processRow(csvRows[i], params, startIndex++); + if (r) { + res.push(r); + } + } + return res; +} + +function processRow(row, param, index) { + var parseRules = param.parseRules; + if (param.checkColumn && row.length !== parseRules.length) { + return { + err: CSVError.column_mismatched(index) + }; + } + + var headRow = param._headers; + var resultRow = convertRowToJson(row, headRow, param); + if (resultRow) { + return { + json: resultRow, + index: index, + row: row + }; + } else { + return null; + } +} + +function convertRowToJson(row, headRow, param) { + var hasValue = false; + var resultRow = {}; + + for (var i = 0, len = row.length; i < len; i++) { + var convertFunc, head, item; + item = row[i]; + + if (param.ignoreEmpty && item === '') { + continue; + } + hasValue = true; + + head = headRow[i]; + if (!head || head === "") { + head = headRow[i] = "field" + (i + 1); + } + var convFunc = getConvFunc(head, i, param); + if (convFunc) { + var convRes = convFunc(item, head, resultRow,row,i); + if (convRes !== undefined) { + setPath(resultRow, head, convRes); + } + } else { + var flag = getFlag(head, i, param); + if (flag === 'omit') { + continue; + } + if (param.checkType) { + convertFunc = checkType(item, head, i, param); + item = convertFunc(item); + } + var title = getTitle(head, i, param); + if (flag === 'flat' || param.flatKeys) { + resultRow[title] = item; + } else { + setPath(resultRow, title, item); + } + } + } + if (hasValue) { + return resultRow; + } else { + return false; + } +} + +var builtInConv={ + "string":stringType, + "number":numberType, + "omit":function(){} +} +function getConvFunc(head,i,param){ + if (param._columnConv[i] !== undefined){ + return param._columnConv[i]; + }else{ + var flag=param.colParser[head]; + if (flag === undefined){ + return param._columnConv[i]=false; + } + if (typeof flag ==="string"){ + flag=flag.trim().toLowerCase(); + var builtInFunc=builtInConv[flag]; + if (builtInFunc){ + return param._columnConv[i]=builtInFunc; + }else{ + return param._columnConv[i]=false; + } + }else if (typeof flag ==="function"){ + return param._columnConv[i]=flag; + }else{ + return param._columnConv[i]=false; + } + } +} +function setPath(json, path, value) { + var _set = require('lodash/set'); + var pathArr = path.split('.'); + if (pathArr.length === 1) { + json[path] = value; + } else { + _set(json, path, value); + } +} + +function getFlag(head, i, param) { + if (typeof param._headerFlag[i] === "string") { + return param._headerFlag[i]; + } else if (head.indexOf('*omit*') > -1) { + return param._headerFlag[i] = 'omit'; + } else if (head.indexOf('*flat*') > -1) { + return param._headerFlag[i] = 'flat'; + } else { + return param._headerFlag[i] = ''; + } +} + +function getTitle(head, i, param) { + if (param._headerTitle[i]) { + return param._headerTitle[i]; + } + + var flag = getFlag(head, i, param); + var str = head.replace('*flat*', '').replace('string#!', '').replace('number#!', ''); + return param._headerTitle[i] = str; +} + +function checkType(item, head, headIdx, param) { + if (param._headerType[headIdx]) { + return param._headerType[headIdx]; + } else if (head.indexOf('number#!') > -1) { + return param._headerType[headIdx] = numberType; + } else if (head.indexOf('string#!') > -1) { + return param._headerType[headIdx] = stringType; + } else if (param.checkType) { + return param._headerType[headIdx] = dynamicType; + } else { + return param._headerType[headIdx] = stringType; + } +} + +function numberType(item) { + var rtn = parseFloat(item); + if (isNaN(rtn)) { + return item; + } + return rtn; +} + +function stringType(item) { + return item.toString(); +} + +function dynamicType(item) { + var trimed = item.trim(); + if (trimed === "") { + return stringType(item); + } + if (numReg.test(trimed)) { + return numberType(item); + } else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") { + return booleanType(item); + } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") { + return jsonType(item); + } else { + return stringType(item); + } +} + +function booleanType(item) { + var trimed = item.trim(); + if (trimed.length === 5 && trimed.toLowerCase() === "false") { + return false; + } else { + return true; + } +} + +function jsonType(item) { + try { + return JSON.parse(item); + } catch (e) { + return item; + } +} diff --git a/node_modules/csvtojson/v1/core/parser.js b/node_modules/csvtojson/v1/core/parser.js new file mode 100644 index 0000000..6b2a408 --- /dev/null +++ b/node_modules/csvtojson/v1/core/parser.js @@ -0,0 +1,116 @@ +var explicitTypes = ["number", "string"]; + +function Parser(name, regExp, parser, processSafe) { + this.name = typeof name === "undefined" ? "Default" : name; + this.regExp = null; + this.type = ""; + this.processSafe = processSafe; + if (typeof regExp !== "undefined") { + if (typeof regExp === "string") { + this.regExp = new RegExp(regExp); + } else { + this.regExp = regExp; + } + } + if (typeof parser !== "undefined") { + this.parse = parser; + } +} +// var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/; +Parser.prototype.convertType = function(item) { + var type=this.type; + if (type === 'number') { + var rtn = parseFloat(item); + if (isNaN(rtn)) { + return 0; + } else { + return rtn; + } + } else if (this.param && this.param.checkType && type === '') { + var trimed = item.trim(); + if (trimed === ""){ + return trimed; + } + if (!isNaN(trimed)) { + return parseFloat(trimed); + } else if (trimed.length === 5 && trimed.toLowerCase() === "false") { + return false; + } else if (trimed.length === 4 && trimed.toLowerCase() === "true") { + return true; + } else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1]==="]") { + try { + return JSON.parse(trimed); + } catch (e) { + return item; + } + } else { + return item; + } + } + return item; +}; + +Parser.prototype.setParam = function(param) { + this.param = param; +}; + +Parser.prototype.test = function(str) { + return this.regExp && this.regExp.test(str); +}; + +Parser.prototype.parse = function(params) { + params.resultRow[params.head] = params.item; +}; + +Parser.prototype.getHeadStr = function() { + if (this.headStr) { + return this.headStr; + } else { + var head = this.head; + this.headStr = head.replace(this.regExp, ''); + if (!this.headStr) { + this.headStr = "Unknown Header"; + } + return this.getHeadStr(); + } +}; + +Parser.prototype.getHead = function() { + return this.head; +}; + +Parser.prototype.initHead = function(columnTitle) { + this.head = columnTitle; + var wholeHead = columnTitle.replace(this.regExp, ''); + //init type && headStr + var splitArr = wholeHead.split("#!"); + if (splitArr.length === 1) { //no explicit type + this.headStr = splitArr[0]; + } else { + var type = splitArr.shift(); + if (explicitTypes.indexOf(type.toLowerCase()) > -1) { + this.type = type; + this.headStr = splitArr.join("#!"); + } else { //no explicit type + this.headStr = wholeHead; + } + } + if (!this.headStr) { + this.headStr = wholeHead ? wholeHead : "Unknown Head"; + } +}; + +Parser.prototype.clone = function() { + var obj = Object.create(this); + var newParser = new Parser(); + for (var key in obj) { + newParser[key] = obj[key]; + } + return newParser; +}; + +Parser.prototype.getName = function() { + return this.name; +}; + +module.exports = Parser; diff --git a/node_modules/csvtojson/v1/core/parserMgr.js b/node_modules/csvtojson/v1/core/parserMgr.js new file mode 100644 index 0000000..f95bfa7 --- /dev/null +++ b/node_modules/csvtojson/v1/core/parserMgr.js @@ -0,0 +1,69 @@ +//implementation +var registeredParsers = []; +var Parser = require("./parser.js"); +var defaultParser = require("./defaultParsers"); + +function registerParser (parser) { + if (parser instanceof Parser && registeredParsers.indexOf(parser) === -1) { + registeredParsers.push(parser); // TODO indexOf doesn't work with object references + } +} + +function getParser(columnTitle, param) { + var inst, parser; + function getParserByName(parserName) { + var parser; + registeredParsers.forEach(function(p){ + if (p.getName() === parserName){ + parser = p; + } + }); + if (parser) { + var inst = parser.clone(); + return inst; + } + return new Parser(); //TODO remove new + } + columnTitle = columnTitle ? columnTitle : ''; + registeredParsers.forEach(function(p) { + if (p.test(columnTitle)) { + parser=p; + } + }); + if (parser) { + inst = parser.clone(); + inst.head = columnTitle; + } else { + inst = getParserByName("json", columnTitle); + } + inst.setParam(param); + inst.initHead(columnTitle); + return inst; +} + +function addParser(name, regExp, parseFunc) { + var parser = new Parser(name, regExp, parseFunc,false); //TODO remove new + registerParser(parser); +} + +function addSafeParser(parserPath) { + //TODO impl +} + +function initParsers(row, param) { + var parsers = []; + row.forEach(function (columnTitle) { + parsers.push(getParser(columnTitle, param)); + }); + return parsers; +} + +defaultParser.forEach(function (parserCfg){ + //TODO refactor this + addParser(parserCfg.name, parserCfg.regExp, parserCfg.parserFunc, parserCfg.processSafe); +}); + +//module interfaces +module.exports.addParser = addParser; +module.exports.initParsers = initParsers; +module.exports.getParser = getParser; diff --git a/node_modules/csvtojson/v1/core/rowSplit.js b/node_modules/csvtojson/v1/core/rowSplit.js new file mode 100644 index 0000000..2b1fd4c --- /dev/null +++ b/node_modules/csvtojson/v1/core/rowSplit.js @@ -0,0 +1,131 @@ +var getDelimiter = require("./getDelimiter"); +var filterRow=require("./filterRow"); +/** + * Convert a line of string to csv columns according to its delimiter + * the param._header may not be ready when this is called. + * @param {[type]} rowStr [description] + * @param {[type]} param [Converter param] + * @return {[type]} {cols:["a","b","c"],closed:boolean} the closed field indicate if the row is a complete row + */ +module.exports = function rowSplit(rowStr, param) { + if (rowStr === "") { + return { cols: [], closed: true }; + } + var quote = param.quote; + var trim = param.trim; + var escape = param.escape; + if (param.delimiter instanceof Array || param.delimiter.toLowerCase() === "auto") { + param.delimiter = getDelimiter(rowStr, param); + } + var delimiter = param.delimiter; + var rowArr = rowStr.split(delimiter); + if (quote === "off") { + return { cols: rowArr, closed: true }; + } + var row = []; + var inquote = false; + var quoteBuff = ''; + for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) { + var e = rowArr[i]; + if (!inquote && trim) { + e = e.trim(); + } + var len = e.length; + if (!inquote) { + if (isQuoteOpen(e, param)) { //quote open + e = e.substr(1); + if (isQuoteClose(e, param)) { //quote close + e = e.substring(0, e.length - 1); + e = _escapeQuote(e, quote, escape); + row.push(e); + continue; + } else { + inquote = true; + quoteBuff += e; + continue; + } + } else { + row.push(e); + continue; + } + } else { //previous quote not closed + if (isQuoteClose(e, param)) { //close double quote + inquote = false; + e = e.substr(0, len - 1); + quoteBuff += delimiter + e; + quoteBuff = _escapeQuote(quoteBuff, quote, escape); + if (trim) { + quoteBuff = quoteBuff.replace(/\s+$/, ""); + } + row.push(quoteBuff); + quoteBuff = ""; + } else { + quoteBuff += delimiter + e; + } + } + } + + if (!inquote && param._needFilterRow) { + row = filterRow(row, param); + } + + return { cols: row, closed: !inquote }; + // if (param.workerNum<=1){ + // }else{ + // if (inquote && quoteBuff.length>0){//for multi core, quote will be closed at the end of line + // quoteBuff=_escapeQuote(quoteBuff,quote,escape);; + // if (trim){ + // quoteBuff=quoteBuff.trimRight(); + // } + // row.push(quoteBuff); + // } + // return {cols:row,closed:true}; + // } + +}; + + + +function isQuoteOpen(str, param) { + var quote = param.quote; + var escape = param.escape; + return str[0] === quote && ( + str[1] !== quote || + str[1] === escape && (str[2] === quote || str.length === 2)); +} +function isQuoteClose(str, param) { + var quote = param.quote; + var count = 0; + var idx = str.length - 1; + var escape = param.escape; + while (str[idx] === quote || str[idx] === escape) { + idx--; + count++; + } + return count % 2 !== 0; +} + +function twoDoubleQuote(str, quote) { + var twoQuote = quote + quote; + var curIndex = -1; + while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) { + str = str.substring(0, curIndex) + str.substring(++curIndex); + } + return str; +} + +var cachedRegExp = {}; +function _escapeQuote(segment, quote, escape) { + + var key = "es|" + quote + "|" + escape; + if (cachedRegExp[key] === undefined) { + + // if (escape === "\\") { + // escape = "\\\\"; + // } + cachedRegExp[key] = new RegExp('\\'+escape + '\\'+quote, 'g'); + } + var regExp = cachedRegExp[key]; + // console.log(regExp,segment); + return segment.replace(regExp, quote); +} diff --git a/node_modules/csvtojson/v1/core/worker.js b/node_modules/csvtojson/v1/core/worker.js new file mode 100644 index 0000000..cd7b69a --- /dev/null +++ b/node_modules/csvtojson/v1/core/worker.js @@ -0,0 +1,84 @@ +var param = null; +var fileLine = require("./fileline"); +var csvline = require("./csvline"); +var linesToJson = require("./linesToJson"); +var CSVError = require('./CSVError'); +var eom = "\x03"; +var eom1 = "\x0e"; +var eom2 = "\x0f"; +/** + * message is like : + * 0{"a":"b"} + * 13345|a,b,c + * + * is 0-9 + */ +var buffer=""; +process.stdin.on("data", function(d) { + var str = d.toString("utf8"); + var all = buffer + str; + var cmdArr = all.split(eom); + while (cmdArr.length > 1) { + processMsg(cmdArr.shift()); + } + buffer = cmdArr[0]; +}); + +process.on("message", processMsg); +function processMsg(msg) { + if (msg) { + var cmd = msg[0]; + var data = msg.substr(1); + switch (cmd) { + case "0": + initParams(data); + break; + case "1": + processData(data); + break; + default: + console.error("Unknown command: " + msg); + } + } +} + +function initParams(data) { + param = JSON.parse(data); +} + +/** + * e.g. + * 1023|a,b,c,d\ne,f,g,h\n + * | + */ +function processData(data) { + if (!param){ + console.error("Parameter not initialised when processing data."); + process.exit(1); + } + var sepIdx = data.indexOf("|"); + var startIdx = parseInt(data.substr(0, sepIdx)); + var csvData = data.substr(sepIdx + 1); + var lines = fileLine(csvData,param); //convert to file lines. + // process.send("0"+lines.lines.length+"|"+lines.partial); + var csvLines = csvline(lines.lines,param); + var res = linesToJson(csvLines.lines,param,startIdx); + if (csvLines.partial) { + var lastIdx = res.length > 0 ? res[res.length - 1].index + 1 : startIdx; + res.push({ + err:CSVError.unclosed_quote(lastIdx, csvLines.partial) + }); + } + // console.error(res) + //1|^|^err|^data|&|^|^err|^data + var str="1"; + res.forEach(function(item) { + var errStr = item.err ? item.err.toString() : ""; + str += item.index + eom2 + JSON.stringify(item.row) + eom2 + errStr + eom2 + JSON.stringify(item.json) + eom1; + }); + sendData(str); +} + +function sendData(str) { + process.stdout.write(str + eom); +} diff --git a/node_modules/csvtojson/v1/core/workerMgr.js b/node_modules/csvtojson/v1/core/workerMgr.js new file mode 100644 index 0000000..6b34e32 --- /dev/null +++ b/node_modules/csvtojson/v1/core/workerMgr.js @@ -0,0 +1,150 @@ +module.exports = workerMgr; +var eom = "\x03"; +var eom1 = "\x0e"; +var eom2 = "\x0f"; +var CSVError = require('./CSVError'); +function workerMgr() { + var exports = { + initWorker: initWorker, + sendWorker: sendWorker, + setParams: setParams, + drain: function(){}, + isRunning: isRunning, + destroyWorker: destroyWorker + }; + var workers = []; + var running = 0; + var waiting = null; + function initWorker(num, params) { + workers = []; + running = 0; + waiting = null; + for (var i = 0; i < num; i++) { + workers.push(new Worker(params)); + } + + } + function isRunning() { + return running > 0; + } + function destroyWorker() { + workers.forEach(function(w) { + w.destroy(); + }); + } + + function sendWorker(data, startIdx, transformCb, cbResult) { + if (workers.length > 0) { + var worker = workers.shift(); + running++; + worker.parse(data, startIdx, function(result) { + // var arr=JSON.parse(result); + // arr.forEach(function(item){ + // console.log('idx',item.index) + // }) + workers.push(worker); + cbResult(result, startIdx); + running--; + if (waiting === null && running === 0) { + exports.drain(); + } else if (waiting) { + sendWorker.apply(this, waiting); + waiting = null; + } + }); + process.nextTick(transformCb); + } else { + waiting = [data, startIdx, transformCb, cbResult]; + } + } + + function setParams(params) { + workers.forEach(function(w) { + w.setParams(params); + }); + } + return exports; +} + +function Worker(params) { + var spawn = require("child_process").spawn; + this.cp = spawn(process.execPath, [__dirname + "/worker.js"], { + env: { + child:true + }, + stdio:['pipe', 'pipe', 2, 'ipc'] + // stdio:[0,1,2,'ipc'] + }); + this.setParams(params); + this.cp.on("message", this.onChildMsg.bind(this)); + this.buffer = ""; + var self = this; + this.cp.stdout.on("data", function(d) { + var str = d.toString("utf8"); + var all = self.buffer + str; + var cmdArr = all.split(eom); + while (cmdArr.length > 1) { + self.onChildMsg(cmdArr.shift()); + } + self.buffer = cmdArr[0]; + }); +} + +Worker.prototype.setParams = function(params) { + var msg = "0" + JSON.stringify(params); + this.sendMsg(msg); +}; + +/** + * msg is like: + * + * cmd is from 0-9 + */ +Worker.prototype.onChildMsg = function(msg) { + if (msg) { + var cmd = msg[0]; + var data = msg.substr(1); + switch (cmd) { + case "0": //total line number of current chunk + if (this.cbLine) { + var sp = data.split("|"); + var len = parseInt(sp[0]); + var partial = sp[1]; + this.cbLine(len, partial); + } + break; + case "1": // json array of current chunk + if (this.cbResult) { + var rows = data.split(eom1); + rows.pop(); + var res = []; + rows.forEach(function(row) { + var sp = row.split(eom2); + res.push({ + index: sp[0], + row: sp[1], + err: sp[2] ? CSVError.fromArray(JSON.parse(sp[2])) : null, + json: sp[3] + }); + }); + this.cbResult(res); + } + break; + } + } +}; + +Worker.prototype.parse = function(data, startIdx, cbResult) { + this.cbResult = cbResult; + var msg = "1" + startIdx + "|" + data; + this.sendMsg(msg); +}; + +Worker.prototype.destroy = function() { + this.cp.kill(); +}; + +Worker.prototype.sendMsg = function(msg) { + this.cp.stdin.write(msg + eom, "utf8"); + // this.cp.send(msg) +}; diff --git a/node_modules/csvtojson/v1/index.js b/node_modules/csvtojson/v1/index.js new file mode 100644 index 0000000..c39382d --- /dev/null +++ b/node_modules/csvtojson/v1/index.js @@ -0,0 +1,6 @@ +//deprecated but leave it for backward compatibility +module.exports.core=require("./core"); + +//live apis +module.exports=require("./core"); +module.exports.interfaces = require("./interfaces"); diff --git a/node_modules/csvtojson/v1/interfaces/cli/index.js b/node_modules/csvtojson/v1/interfaces/cli/index.js new file mode 100644 index 0000000..aecd8b2 --- /dev/null +++ b/node_modules/csvtojson/v1/interfaces/cli/index.js @@ -0,0 +1 @@ +module.exports = require("./main.js"); \ No newline at end of file diff --git a/node_modules/csvtojson/v1/interfaces/cli/main.js b/node_modules/csvtojson/v1/interfaces/cli/main.js new file mode 100644 index 0000000..7fcb264 --- /dev/null +++ b/node_modules/csvtojson/v1/interfaces/cli/main.js @@ -0,0 +1,42 @@ +/** + * Convert input to process stdout + */ + +//implementation +var Converter = require("../../core/Converter.js"); +function _initConverter(){ + var csvConverter = new Converter(); + var started = false; + var writeStream = process.stdout; + csvConverter.on("record_parsed",function(rowJSON){ + if (started){ + writeStream.write(",\n"); + } + writeStream.write(JSON.stringify(rowJSON)); //write parsed JSON object one by one. + if (started === false){ + started = true; + } + }); + writeStream.write("[\n"); //write array symbol + + csvConverter.on("end_parsed",function(){ + writeStream.write("\n]"); //end array symbol + }); + csvConverter.on("error",function(err){ + console.error(err); + process.exit(-1); + }); + return csvConverter; +} +function convertFile(fileName){ + var csvConverter=_initConverter(); + csvConverter.from(fileName); +} + +function convertString(csvString){ + var csvConverter=_initConverter(); + csvConverter.from(csvString); +} +//module interfaces +module.exports.convertFile = convertFile; +module.exports.convertString = convertString; \ No newline at end of file diff --git a/node_modules/csvtojson/v1/interfaces/index.js b/node_modules/csvtojson/v1/interfaces/index.js new file mode 100644 index 0000000..8cde6bd --- /dev/null +++ b/node_modules/csvtojson/v1/interfaces/index.js @@ -0,0 +1,2 @@ +module.exports.web=require("./web"); +module.exports.cli=require("./cli"); \ No newline at end of file diff --git a/node_modules/csvtojson/v1/interfaces/web/index.js b/node_modules/csvtojson/v1/interfaces/web/index.js new file mode 100644 index 0000000..1437d3a --- /dev/null +++ b/node_modules/csvtojson/v1/interfaces/web/index.js @@ -0,0 +1 @@ +module.exports = require("./webServer.js"); \ No newline at end of file diff --git a/node_modules/csvtojson/v1/interfaces/web/webServer.js b/node_modules/csvtojson/v1/interfaces/web/webServer.js new file mode 100644 index 0000000..d8aebc8 --- /dev/null +++ b/node_modules/csvtojson/v1/interfaces/web/webServer.js @@ -0,0 +1,23 @@ +var http = require("http"); +var Converter = require("../../core/Converter.js"); +function startWebServer (args) { + args = args || {}; + var serverArgs = { + port: args.port || '8801', + urlpath: args.urlpath || '/parseCSV' + }; + var server = http.createServer(); + server.on("request", function(req, res){ + if (req.url === serverArgs.urlpath && req.method === "POST"){ + req.pipe(new Converter({constructResult:false})).pipe(res); + } else { + res.end("Please post data to: " + serverArgs.urlpath); + } + }); + + server.listen(serverArgs.port); + console.log("CSV Web Server Listen On:" + serverArgs.port); + console.log("POST to " + serverArgs.urlpath + " with CSV data to get parsed."); + return server; +} +module.exports.startWebServer = startWebServer; diff --git a/node_modules/csvtojson/v2/CSVError.d.ts b/node_modules/csvtojson/v2/CSVError.d.ts new file mode 100644 index 0000000..c01913c --- /dev/null +++ b/node_modules/csvtojson/v2/CSVError.d.ts @@ -0,0 +1,14 @@ +export default class CSVError extends Error { + err: string; + line: number; + extra: string | undefined; + static column_mismatched(index: number, extra?: string): CSVError; + static unclosed_quote(index: number, extra?: string): CSVError; + static fromJSON(obj: any): CSVError; + constructor(err: string, line: number, extra?: string | undefined); + toJSON(): { + err: string; + line: number; + extra: string | undefined; + }; +} diff --git a/node_modules/csvtojson/v2/CSVError.js b/node_modules/csvtojson/v2/CSVError.js new file mode 100644 index 0000000..58911c4 --- /dev/null +++ b/node_modules/csvtojson/v2/CSVError.js @@ -0,0 +1,42 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var CSVError = /** @class */ (function (_super) { + __extends(CSVError, _super); + function CSVError(err, line, extra) { + var _this = _super.call(this, "Error: " + err + ". JSON Line number: " + line + (extra ? " near: " + extra : "")) || this; + _this.err = err; + _this.line = line; + _this.extra = extra; + _this.name = "CSV Parse Error"; + return _this; + } + CSVError.column_mismatched = function (index, extra) { + return new CSVError("column_mismatched", index, extra); + }; + CSVError.unclosed_quote = function (index, extra) { + return new CSVError("unclosed_quote", index, extra); + }; + CSVError.fromJSON = function (obj) { + return new CSVError(obj.err, obj.line, obj.extra); + }; + CSVError.prototype.toJSON = function () { + return { + err: this.err, + line: this.line, + extra: this.extra + }; + }; + return CSVError; +}(Error)); +exports.default = CSVError; +//# sourceMappingURL=CSVError.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/CSVError.js.map b/node_modules/csvtojson/v2/CSVError.js.map new file mode 100644 index 0000000..98ace86 --- /dev/null +++ b/node_modules/csvtojson/v2/CSVError.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CSVError.js","sourceRoot":"","sources":["../src/CSVError.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;IAAsC,4BAAK;IAUzC,kBACS,GAAW,EACX,IAAY,EACZ,KAAc;QAHvB,YAKE,kBAAM,SAAS,GAAG,GAAG,GAAG,sBAAsB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAE1F;QANQ,SAAG,GAAH,GAAG,CAAQ;QACX,UAAI,GAAJ,IAAI,CAAQ;QACZ,WAAK,GAAL,KAAK,CAAS;QAGrB,KAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;;IAChC,CAAC;IAhBM,0BAAiB,GAAxB,UAAyB,KAAa,EAAE,KAAc;QACpD,OAAO,IAAI,QAAQ,CAAC,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IACM,uBAAc,GAArB,UAAsB,KAAa,EAAE,KAAc;QACjD,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IACM,iBAAQ,GAAf,UAAgB,GAAG;QACjB,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IASD,yBAAM,GAAN;QACE,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAA;IACH,CAAC;IAEH,eAAC;AAAD,CAAC,AA1BD,CAAsC,KAAK,GA0B1C"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Converter.d.ts b/node_modules/csvtojson/v2/Converter.d.ts new file mode 100644 index 0000000..23ab7d0 --- /dev/null +++ b/node_modules/csvtojson/v2/Converter.d.ts @@ -0,0 +1,39 @@ +/// +import { Transform, TransformOptions, Readable } from "stream"; +import { CSVParseParam } from "./Parameters"; +import { ParseRuntime } from "./ParseRuntime"; +import CSVError from "./CSVError"; +export declare class Converter extends Transform implements PromiseLike { + options: TransformOptions; + preRawData(onRawData: PreRawDataCallback): Converter; + preFileLine(onFileLine: PreFileLineCallback): Converter; + subscribe(onNext?: (data: any, lineNumber: number) => void | PromiseLike, onError?: (err: CSVError) => void, onCompleted?: () => void): Converter; + fromFile(filePath: string, options?: string | CreateReadStreamOption | undefined): Converter; + fromStream(readStream: Readable): Converter; + fromString(csvString: string): Converter; + then(onfulfilled?: (value: any[]) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike): PromiseLike; + readonly parseParam: CSVParseParam; + readonly parseRuntime: ParseRuntime; + private params; + private runtime; + private processor; + private result; + constructor(param?: Partial, options?: TransformOptions); + _transform(chunk: any, encoding: string, cb: Function): void; + _flush(cb: Function): void; + private processEnd(cb); + readonly parsedLineNumber: number; +} +export interface CreateReadStreamOption { + flags?: string; + encoding?: string; + fd?: number; + mode?: number; + autoClose?: boolean; + start?: number; + end?: number; + highWaterMark?: number; +} +export declare type CallBack = (err: Error, data: Array) => void; +export declare type PreFileLineCallback = (line: string, lineNumber: number) => string | PromiseLike; +export declare type PreRawDataCallback = (csvString: string) => string | PromiseLike; diff --git a/node_modules/csvtojson/v2/Converter.js b/node_modules/csvtojson/v2/Converter.js new file mode 100644 index 0000000..909a38a --- /dev/null +++ b/node_modules/csvtojson/v2/Converter.js @@ -0,0 +1,193 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var stream_1 = require("stream"); +var Parameters_1 = require("./Parameters"); +var ParseRuntime_1 = require("./ParseRuntime"); +var bluebird_1 = __importDefault(require("bluebird")); +// import { ProcessorFork } from "./ProcessFork"; +var ProcessorLocal_1 = require("./ProcessorLocal"); +var Result_1 = require("./Result"); +var Converter = /** @class */ (function (_super) { + __extends(Converter, _super); + function Converter(param, options) { + if (options === void 0) { options = {}; } + var _this = _super.call(this, options) || this; + _this.options = options; + _this.params = Parameters_1.mergeParams(param); + _this.runtime = ParseRuntime_1.initParseRuntime(_this); + _this.result = new Result_1.Result(_this); + // if (this.params.fork) { + // this.processor = new ProcessorFork(this); + // } else { + _this.processor = new ProcessorLocal_1.ProcessorLocal(_this); + // } + _this.once("error", function (err) { + // console.log("BBB"); + //wait for next cycle to emit the errors. + setImmediate(function () { + _this.result.processError(err); + _this.emit("done", err); + }); + }); + _this.once("done", function () { + _this.processor.destroy(); + }); + return _this; + } + Converter.prototype.preRawData = function (onRawData) { + this.runtime.preRawDataHook = onRawData; + return this; + }; + Converter.prototype.preFileLine = function (onFileLine) { + this.runtime.preFileLineHook = onFileLine; + return this; + }; + Converter.prototype.subscribe = function (onNext, onError, onCompleted) { + this.parseRuntime.subscribe = { + onNext: onNext, + onError: onError, + onCompleted: onCompleted + }; + return this; + }; + Converter.prototype.fromFile = function (filePath, options) { + var _this = this; + var fs = require("fs"); + // var rs = null; + // this.wrapCallback(cb, function () { + // if (rs && rs.destroy) { + // rs.destroy(); + // } + // }); + fs.exists(filePath, function (exist) { + if (exist) { + var rs = fs.createReadStream(filePath, options); + rs.pipe(_this); + } + else { + _this.emit('error', new Error("File does not exist. Check to make sure the file path to your csv is correct.")); + } + }); + return this; + }; + Converter.prototype.fromStream = function (readStream) { + readStream.pipe(this); + return this; + }; + Converter.prototype.fromString = function (csvString) { + var csv = csvString.toString(); + var read = new stream_1.Readable(); + var idx = 0; + read._read = function (size) { + if (idx >= csvString.length) { + this.push(null); + } + else { + var str = csvString.substr(idx, size); + this.push(str); + idx += size; + } + }; + return this.fromStream(read); + }; + Converter.prototype.then = function (onfulfilled, onrejected) { + var _this = this; + return new bluebird_1.default(function (resolve, reject) { + _this.parseRuntime.then = { + onfulfilled: function (value) { + if (onfulfilled) { + resolve(onfulfilled(value)); + } + else { + resolve(value); + } + }, + onrejected: function (err) { + if (onrejected) { + resolve(onrejected(err)); + } + else { + reject(err); + } + } + }; + }); + }; + Object.defineProperty(Converter.prototype, "parseParam", { + get: function () { + return this.params; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Converter.prototype, "parseRuntime", { + get: function () { + return this.runtime; + }, + enumerable: true, + configurable: true + }); + Converter.prototype._transform = function (chunk, encoding, cb) { + var _this = this; + this.processor.process(chunk) + .then(function (result) { + // console.log(result); + if (result.length > 0) { + _this.runtime.started = true; + return _this.result.processResult(result); + } + }) + .then(function () { + _this.emit("drained"); + cb(); + }, function (error) { + _this.runtime.hasError = true; + _this.runtime.error = error; + _this.emit("error", error); + cb(); + }); + }; + Converter.prototype._flush = function (cb) { + var _this = this; + this.processor.flush() + .then(function (data) { + if (data.length > 0) { + return _this.result.processResult(data); + } + }) + .then(function () { + _this.processEnd(cb); + }, function (err) { + _this.emit("error", err); + cb(); + }); + }; + Converter.prototype.processEnd = function (cb) { + this.result.endProcess(); + this.emit("done"); + cb(); + }; + Object.defineProperty(Converter.prototype, "parsedLineNumber", { + get: function () { + return this.runtime.parsedLineNumber; + }, + enumerable: true, + configurable: true + }); + return Converter; +}(stream_1.Transform)); +exports.Converter = Converter; +//# sourceMappingURL=Converter.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Converter.js.map b/node_modules/csvtojson/v2/Converter.js.map new file mode 100644 index 0000000..4e1f317 --- /dev/null +++ b/node_modules/csvtojson/v2/Converter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Converter.js","sourceRoot":"","sources":["../src/Converter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iCAA+D;AAC/D,2CAA0D;AAC1D,+CAAgE;AAChE,sDAAyB;AAOzB,iDAAiD;AACjD,mDAAkD;AAClD,mCAAkC;AAMlC;IAA+B,6BAAS;IAuFtC,mBAAY,KAA8B,EAAS,OAA8B;QAA9B,wBAAA,EAAA,YAA8B;QAAjF,YACE,kBAAM,OAAO,CAAC,SAuBf;QAxBkD,aAAO,GAAP,OAAO,CAAuB;QAE/E,KAAI,CAAC,MAAM,GAAG,wBAAW,CAAC,KAAK,CAAC,CAAC;QACjC,KAAI,CAAC,OAAO,GAAG,+BAAgB,CAAC,KAAI,CAAC,CAAC;QACtC,KAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,KAAI,CAAC,CAAC;QAC/B,0BAA0B;QAC1B,8CAA8C;QAC9C,WAAW;QACX,KAAI,CAAC,SAAS,GAAG,IAAI,+BAAc,CAAC,KAAI,CAAC,CAAC;QAC1C,IAAI;QACJ,KAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAC,GAAQ;YAC1B,sBAAsB;YACtB,yCAAyC;YACzC,YAAY,CAAC;gBACX,KAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC9B,KAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;QAEL,CAAC,CAAC,CAAC;QACH,KAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,KAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAA;QAEF,OAAO,KAAI,CAAC;IACd,CAAC;IA9GD,8BAAU,GAAV,UAAW,SAA6B;QACtC,IAAI,CAAC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,+BAAW,GAAX,UAAY,UAA+B;QACzC,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,UAAU,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,6BAAS,GAAT,UACE,MAAoE,EACpE,OAAiC,EACjC,WAAwB;QACxB,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG;YAC5B,MAAM,QAAA;YACN,OAAO,SAAA;YACP,WAAW,aAAA;SACZ,CAAA;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,4BAAQ,GAAR,UAAS,QAAgB,EAAE,OAAqD;QAAhF,iBAiBC;QAhBC,IAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,iBAAiB;QACjB,sCAAsC;QACtC,4BAA4B;QAC5B,oBAAoB;QACpB,MAAM;QACN,MAAM;QACN,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAC,KAAK;YACxB,IAAI,KAAK,EAAE;gBACT,IAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,EAAE,CAAC,IAAI,CAAC,KAAI,CAAC,CAAC;aACf;iBAAM;gBACL,KAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC,CAAC;aAChH;QACH,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IACD,8BAAU,GAAV,UAAW,UAAoB;QAC7B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,8BAAU,GAAV,UAAW,SAAiB;QAC1B,IAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAM,IAAI,GAAG,IAAI,iBAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,KAAK,GAAG,UAAU,IAAI;YACzB,IAAI,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjB;iBAAM;gBACL,IAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACf,GAAG,IAAI,IAAI,CAAC;aACb;QACH,CAAC,CAAA;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,wBAAI,GAAJ,UAAyC,WAAgE,EAAE,UAA8D;QAAzK,iBAmBC;QAlBC,OAAO,IAAI,kBAAC,CAAC,UAAC,OAAO,EAAE,MAAM;YAC3B,KAAI,CAAC,YAAY,CAAC,IAAI,GAAG;gBACvB,WAAW,EAAE,UAAC,KAAY;oBACxB,IAAI,WAAW,EAAE;wBACf,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;qBAC7B;yBAAM;wBACL,OAAO,CAAC,KAAY,CAAC,CAAC;qBACvB;gBACH,CAAC;gBACD,UAAU,EAAE,UAAC,GAAU;oBACrB,IAAI,UAAU,EAAE;wBACd,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;qBAC1B;yBAAM;wBACL,MAAM,CAAC,GAAG,CAAC,CAAC;qBACb;gBACH,CAAC;aACF,CAAA;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IACD,sBAAW,iCAAU;aAArB;YACE,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;;;OAAA;IACD,sBAAW,mCAAY;aAAvB;YACE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;;;OAAA;IA8BD,8BAAU,GAAV,UAAW,KAAU,EAAE,QAAgB,EAAE,EAAY;QAArD,iBAmBC;QAlBC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;aAC1B,IAAI,CAAC,UAAC,MAAM;YACX,uBAAuB;YACvB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACrB,KAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBAE5B,OAAO,KAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC1C;QACH,CAAC,CAAC;aACD,IAAI,CAAC;YACJ,KAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,EAAE,EAAE,CAAC;QACP,CAAC,EAAE,UAAC,KAAK;YACP,KAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC7B,KAAI,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAC3B,KAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,EAAE,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IACD,0BAAM,GAAN,UAAO,EAAY;QAAnB,iBAcC;QAbC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;aACnB,IAAI,CAAC,UAAC,IAAI;YACT,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBAEnB,OAAO,KAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aACxC;QACH,CAAC,CAAC;aACD,IAAI,CAAC;YACJ,KAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC,EAAE,UAAC,GAAG;YACL,KAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxB,EAAE,EAAE,CAAC;QACP,CAAC,CAAC,CAAA;IACN,CAAC;IACO,8BAAU,GAAlB,UAAmB,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,EAAE,EAAE,CAAC;IACP,CAAC;IACD,sBAAI,uCAAgB;aAApB;YACE,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACvC,CAAC;;;OAAA;IACH,gBAAC;AAAD,CAAC,AA3JD,CAA+B,kBAAS,GA2JvC;AA3JY,8BAAS"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Parameters.d.ts b/node_modules/csvtojson/v2/Parameters.d.ts new file mode 100644 index 0000000..6fe5cda --- /dev/null +++ b/node_modules/csvtojson/v2/Parameters.d.ts @@ -0,0 +1,93 @@ +export interface CSVParseParam { + /** + * delimiter used for seperating columns. Use "auto" if delimiter is unknown in advance, in this case, delimiter will be auto-detected (by best attempt). Use an array to give a list of potential delimiters e.g. [",","|","$"]. default: "," + */ + delimiter: string | string[]; + /** + * This parameter instructs the parser to ignore columns as specified by the regular expression. Example: /(name|age)/ will ignore columns whose header contains "name" or "age" + */ + ignoreColumns?: RegExp; + /** + * This parameter instructs the parser to include only those columns as specified by the regular expression. Example: /(name|age)/ will parse and include columns whose header contains "name" or "age" + */ + includeColumns?: RegExp; + /** + * If a column contains delimiter, it is able to use quote character to surround the column content. e.g. "hello, world" wont be split into two columns while parsing. Set to "off" will ignore all quotes. default: " (double quote) + */ + quote: string; + /** + * Indicate if parser trim off spaces surrounding column content. e.g. " content " will be trimmed to "content". Default: true + */ + trim: boolean; + /** + * This parameter turns on and off whether check field type. Default is false. + */ + checkType: boolean; + /** + * Ignore the empty value in CSV columns. If a column value is not given, set this to true to skip them. Default: false. + */ + ignoreEmpty: boolean; + /** + * Delegate parsing work to another process. + */ + /** + * Indicating csv data has no header row and first row is data row. Default is false. + */ + noheader: boolean; + /** + * An array to specify the headers of CSV data. If --noheader is false, this value will override CSV header row. Default: null. Example: ["my field","name"]. + */ + headers?: string[]; + /** + * Don't interpret dots (.) and square brackets in header fields as nested object or array identifiers at all (treat them like regular characters for JSON field identifiers). Default: false. + */ + flatKeys: boolean; + /** + * the max character a csv row could have. 0 means infinite. If max number exceeded, parser will emit "error" of "row_exceed". if a possibly corrupted csv data provided, give it a number like 65535 so the parser wont consume memory. default: 0 + */ + maxRowLength: number; + /** + * whether check column number of a row is the same as headers. If column number mismatched headers number, an error of "mismatched_column" will be emitted.. default: false + */ + checkColumn: boolean; + /** + * escape character used in quoted column. Default is double quote (") according to RFC4108. Change to back slash (\) or other chars for your own case. + */ + escape: string; + /** + * Allows override parsing logic for a specific column. It accepts a JSON object with fields like: headName: . e.g. {field1:'number'} will use built-in number parser to convert value of the field1 column to number. Another example {"name":nameProcessFunc} will use specified function to parse the value. + */ + colParser: { + [key: string]: string | CellParser | ColumnParam; + }; + /** + * End of line character. If omitted, parser will attempt to retrieve it from the first chunks of CSV data + */ + eol?: string; + /** + * Always interpret each line (as defined by eol) as a row. This will prevent eol characters from being used within a row (even inside a quoted field). Default is false. Change to true if you are confident no inline line breaks (like line break in a cell which has multi line text) + */ + alwaysSplitAtEOL: boolean; + /** + * The format to be converted to. "json" (default) -- convert csv to json. "csv" -- convert csv to csv row array. "line" -- convert csv to csv line string + */ + output: "json" | "csv" | "line"; + /** + * Convert string "null" to null object in JSON outputs. Default is false. + */ + nullObject: boolean; + /** + * Define the format required by downstream (this parameter does not work if objectMode is on). `line` -- json is emitted in a single line separated by a line breake like "json1\njson2" . `array` -- downstream requires array format like "[json1,json2]". Default is line. + */ + downstreamFormat: "line" | "array"; + /** + * Define whether .then(callback) returns all JSON data in its callback. Default is true. Change to false to save memory if subscribing json lines. + */ + needEmitAll: boolean; +} +export declare type CellParser = (item: string, head: string, resultRow: any, row: string[], columnIndex: number) => any; +export interface ColumnParam { + flat?: boolean; + cellParser?: string | CellParser; +} +export declare function mergeParams(params?: Partial): CSVParseParam; diff --git a/node_modules/csvtojson/v2/Parameters.js b/node_modules/csvtojson/v2/Parameters.js new file mode 100644 index 0000000..b2dad04 --- /dev/null +++ b/node_modules/csvtojson/v2/Parameters.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function mergeParams(params) { + var defaultParam = { + delimiter: ',', + ignoreColumns: undefined, + includeColumns: undefined, + quote: '"', + trim: true, + checkType: false, + ignoreEmpty: false, + // fork: false, + noheader: false, + headers: undefined, + flatKeys: false, + maxRowLength: 0, + checkColumn: false, + escape: '"', + colParser: {}, + eol: undefined, + alwaysSplitAtEOL: false, + output: "json", + nullObject: false, + downstreamFormat: "line", + needEmitAll: true + }; + if (!params) { + params = {}; + } + for (var key in params) { + if (params.hasOwnProperty(key)) { + if (Array.isArray(params[key])) { + defaultParam[key] = [].concat(params[key]); + } + else { + defaultParam[key] = params[key]; + } + } + } + return defaultParam; +} +exports.mergeParams = mergeParams; +//# sourceMappingURL=Parameters.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Parameters.js.map b/node_modules/csvtojson/v2/Parameters.js.map new file mode 100644 index 0000000..6526008 --- /dev/null +++ b/node_modules/csvtojson/v2/Parameters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Parameters.js","sourceRoot":"","sources":["../src/Parameters.ts"],"names":[],"mappings":";;AAiGA,qBAA4B,MAA+B;IACzD,IAAM,YAAY,GAAkB;QAClC,SAAS,EAAE,GAAG;QACd,aAAa,EAAE,SAAS;QACxB,cAAc,EAAE,SAAS;QACzB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,eAAe;QACf,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,SAAS;QACd,gBAAgB,EAAE,KAAK;QACvB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,KAAK;QACjB,gBAAgB,EAAC,MAAM;QACvB,WAAW,EAAC,IAAI;KACjB,CAAA;IACD,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,EAAE,CAAC;KACb;IACD,KAAK,IAAI,GAAG,IAAI,MAAM,EAAE;QACtB,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC9B,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aAC5C;iBAAM;gBACL,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;aACjC;SACF;KACF;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AArCD,kCAqCC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/ParseRuntime.d.ts b/node_modules/csvtojson/v2/ParseRuntime.d.ts new file mode 100644 index 0000000..7552e72 --- /dev/null +++ b/node_modules/csvtojson/v2/ParseRuntime.d.ts @@ -0,0 +1,59 @@ +/// +import { CellParser } from "./Parameters"; +import { Converter, PreRawDataCallback, PreFileLineCallback } from "./Converter"; +import CSVError from "./CSVError"; +export interface ParseRuntime { + /** + * If need convert ignoreColumn from column name(string) to column index (number). Parser needs column index. + */ + needProcessIgnoreColumn: boolean; + /** + * If need convert includeColumn from column name(string) to column index (number). Parser needs column index. + */ + needProcessIncludeColumn: boolean; + /** + * the indexes of columns to reserve, undefined means reserve all, [] means hide all + */ + selectedColumns?: number[]; + ended: boolean; + hasError: boolean; + error?: Error; + /** + * Inferred delimiter + */ + delimiter: string | string[]; + /** + * Inferred eol + */ + eol?: string; + /** + * Converter function for a column. Populated at runtime. + */ + columnConv: (CellParser | null)[]; + headerType: any[]; + headerTitle: string[]; + headerFlag: any[]; + /** + * Inferred headers + */ + headers?: any[]; + csvLineBuffer?: Buffer; + /** + * after first chunk of data being processed and emitted, started will become true. + */ + started: boolean; + preRawDataHook?: PreRawDataCallback; + preFileLineHook?: PreFileLineCallback; + parsedLineNumber: number; + columnValueSetter: Function[]; + subscribe?: { + onNext?: (data: any, lineNumber: number) => void | PromiseLike; + onError?: (err: CSVError) => void; + onCompleted?: () => void; + }; + then?: { + onfulfilled: (value: any[]) => any; + onrejected: (err: Error) => any; + }; +} +export declare function initParseRuntime(converter: Converter): ParseRuntime; diff --git a/node_modules/csvtojson/v2/ParseRuntime.js b/node_modules/csvtojson/v2/ParseRuntime.js new file mode 100644 index 0000000..c2955e4 --- /dev/null +++ b/node_modules/csvtojson/v2/ParseRuntime.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function initParseRuntime(converter) { + var params = converter.parseParam; + var rtn = { + needProcessIgnoreColumn: false, + needProcessIncludeColumn: false, + selectedColumns: undefined, + ended: false, + hasError: false, + error: undefined, + delimiter: converter.parseParam.delimiter, + eol: converter.parseParam.eol, + columnConv: [], + headerType: [], + headerTitle: [], + headerFlag: [], + headers: undefined, + started: false, + parsedLineNumber: 0, + columnValueSetter: [], + }; + if (params.ignoreColumns) { + rtn.needProcessIgnoreColumn = true; + } + if (params.includeColumns) { + rtn.needProcessIncludeColumn = true; + } + return rtn; +} +exports.initParseRuntime = initParseRuntime; +//# sourceMappingURL=ParseRuntime.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/ParseRuntime.js.map b/node_modules/csvtojson/v2/ParseRuntime.js.map new file mode 100644 index 0000000..286e7ae --- /dev/null +++ b/node_modules/csvtojson/v2/ParseRuntime.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ParseRuntime.js","sourceRoot":"","sources":["../src/ParseRuntime.ts"],"names":[],"mappings":";;AA8DA,0BAAiC,SAAoB;IACnD,IAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;IACpC,IAAM,GAAG,GAAiB;QACxB,uBAAuB,EAAE,KAAK;QAC9B,wBAAwB,EAAE,KAAK;QAC/B,eAAe,EAAE,SAAS;QAC1B,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,SAAS;QACzC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG;QAC7B,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACf,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,KAAK;QACd,gBAAgB,EAAE,CAAC;QACnB,iBAAiB,EAAE,EAAE;KACtB,CAAA;IACD,IAAI,MAAM,CAAC,aAAa,EAAE;QACxB,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC;KACpC;IACD,IAAI,MAAM,CAAC,cAAc,EAAE;QACzB,GAAG,CAAC,wBAAwB,GAAG,IAAI,CAAC;KACrC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AA3BD,4CA2BC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/ProcessFork.d.ts b/node_modules/csvtojson/v2/ProcessFork.d.ts new file mode 100644 index 0000000..ff6be73 --- /dev/null +++ b/node_modules/csvtojson/v2/ProcessFork.d.ts @@ -0,0 +1,33 @@ +/// +/// +import { Processor, ProcessLineResult } from "./Processor"; +import P from "bluebird"; +import { Converter } from "./Converter"; +import { ChildProcess } from "child_process"; +export declare class ProcessorFork extends Processor { + protected converter: Converter; + flush(): P; + destroy(): P; + childProcess: ChildProcess; + inited: boolean; + private resultBuf; + private leftChunk; + private finalChunk; + private next?; + constructor(converter: Converter); + private prepareParam(param); + private initWorker(); + private flushResult(); + private appendBuf(data); + process(chunk: Buffer): P; +} +export interface Message { + cmd: string; +} +export interface InitMessage extends Message { + params: any; +} +export interface StringMessage extends Message { + value: string; +} +export declare const EOM = "\u0003"; diff --git a/node_modules/csvtojson/v2/ProcessFork.js b/node_modules/csvtojson/v2/ProcessFork.js new file mode 100644 index 0000000..bb56903 --- /dev/null +++ b/node_modules/csvtojson/v2/ProcessFork.js @@ -0,0 +1,154 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var Processor_1 = require("./Processor"); +var bluebird_1 = __importDefault(require("bluebird")); +var Parameters_1 = require("./Parameters"); +var CSVError_1 = __importDefault(require("./CSVError")); +var ProcessorFork = /** @class */ (function (_super) { + __extends(ProcessorFork, _super); + function ProcessorFork(converter) { + var _this = _super.call(this, converter) || this; + _this.converter = converter; + _this.inited = false; + _this.resultBuf = []; + _this.leftChunk = ""; + _this.finalChunk = false; + _this.childProcess = require("child_process").spawn(process.execPath, [__dirname + "/../v2/worker.js"], { + stdio: ["pipe", "pipe", "pipe", "ipc"] + }); + _this.initWorker(); + return _this; + } + ProcessorFork.prototype.flush = function () { + var _this = this; + return new bluebird_1.default(function (resolve, reject) { + // console.log("flush"); + _this.finalChunk = true; + _this.next = resolve; + _this.childProcess.stdin.end(); + // this.childProcess.stdout.on("end",()=>{ + // // console.log("!!!!"); + // this.flushResult(); + // }) + }); + }; + ProcessorFork.prototype.destroy = function () { + this.childProcess.kill(); + return bluebird_1.default.resolve(); + }; + ProcessorFork.prototype.prepareParam = function (param) { + var clone = Parameters_1.mergeParams(param); + if (clone.ignoreColumns) { + clone.ignoreColumns = { + source: clone.ignoreColumns.source, + flags: clone.ignoreColumns.flags + }; + } + if (clone.includeColumns) { + clone.includeColumns = { + source: clone.includeColumns.source, + flags: clone.includeColumns.flags + }; + } + return clone; + }; + ProcessorFork.prototype.initWorker = function () { + var _this = this; + this.childProcess.on("exit", function () { + _this.flushResult(); + }); + this.childProcess.send({ + cmd: "init", + params: this.prepareParam(this.converter.parseParam) + }); + this.childProcess.on("message", function (msg) { + if (msg.cmd === "inited") { + _this.inited = true; + } + else if (msg.cmd === "eol") { + if (_this.converter.listeners("eol").length > 0) { + _this.converter.emit("eol", msg.value); + } + } + else if (msg.cmd === "header") { + if (_this.converter.listeners("header").length > 0) { + _this.converter.emit("header", msg.value); + } + } + else if (msg.cmd === "done") { + // this.flushResult(); + } + }); + this.childProcess.stdout.on("data", function (data) { + // console.log("stdout", data.toString()); + var res = data.toString(); + // console.log(res); + _this.appendBuf(res); + }); + this.childProcess.stderr.on("data", function (data) { + // console.log("stderr", data.toString()); + _this.converter.emit("error", CSVError_1.default.fromJSON(JSON.parse(data.toString()))); + }); + }; + ProcessorFork.prototype.flushResult = function () { + // console.log("flush result", this.resultBuf.length); + if (this.next) { + this.next(this.resultBuf); + } + this.resultBuf = []; + }; + ProcessorFork.prototype.appendBuf = function (data) { + var res = this.leftChunk + data; + var list = res.split("\n"); + var counter = 0; + var lastBit = list[list.length - 1]; + if (lastBit !== "") { + this.leftChunk = list.pop() || ""; + } + else { + this.leftChunk = ""; + } + this.resultBuf = this.resultBuf.concat(list); + // while (list.length) { + // let item = list.shift() || ""; + // if (item.length === 0 ) { + // continue; + // } + // // if (this.params.output !== "line") { + // // item = JSON.parse(item); + // // } + // this.resultBuf.push(item); + // counter++; + // } + // console.log("buf length",this.resultBuf.length); + }; + ProcessorFork.prototype.process = function (chunk) { + var _this = this; + return new bluebird_1.default(function (resolve, reject) { + // console.log("chunk", chunk.length); + _this.next = resolve; + // this.appendReadBuf(chunk); + _this.childProcess.stdin.write(chunk, function () { + // console.log("chunk callback"); + _this.flushResult(); + }); + }); + }; + return ProcessorFork; +}(Processor_1.Processor)); +exports.ProcessorFork = ProcessorFork; +exports.EOM = "\x03"; +//# sourceMappingURL=ProcessFork.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/ProcessFork.js.map b/node_modules/csvtojson/v2/ProcessFork.js.map new file mode 100644 index 0000000..4a7ee23 --- /dev/null +++ b/node_modules/csvtojson/v2/ProcessFork.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ProcessFork.js","sourceRoot":"","sources":["../src/ProcessFork.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAA2D;AAC3D,sDAAwB;AAGxB,2CAA0D;AAI1D,wDAAkC;AAElC;IAAmC,iCAAS;IAuB1C,uBAAsB,SAAoB;QAA1C,YACE,kBAAM,SAAS,CAAC,SAKjB;QANqB,eAAS,GAAT,SAAS,CAAW;QAL1C,YAAM,GAAY,KAAK,CAAC;QAChB,eAAS,GAAwB,EAAE,CAAC;QACpC,eAAS,GAAW,EAAE,CAAC;QACvB,gBAAU,GAAY,KAAK,CAAC;QAIlC,KAAI,CAAC,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,GAAG,kBAAkB,CAAC,EAAE;YACrG,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;SACvC,CAAC,CAAC;QACH,KAAI,CAAC,UAAU,EAAE,CAAC;;IACpB,CAAC;IA5BD,6BAAK,GAAL;QAAA,iBAWC;QAVC,OAAO,IAAI,kBAAC,CAAC,UAAC,OAAO,EAAE,MAAM;YAC3B,wBAAwB;YACxB,KAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,KAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACpB,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC9B,0CAA0C;YAC1C,4BAA4B;YAC5B,wBAAwB;YACxB,KAAK;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IACD,+BAAO,GAAP;QACE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACzB,OAAO,kBAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAcO,oCAAY,GAApB,UAAqB,KAAmB;QACtC,IAAM,KAAK,GAAK,wBAAW,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,aAAa,EAAC;YACtB,KAAK,CAAC,aAAa,GAAC;gBAClB,MAAM,EAAC,KAAK,CAAC,aAAa,CAAC,MAAM;gBACjC,KAAK,EAAC,KAAK,CAAC,aAAa,CAAC,KAAK;aAChC,CAAA;SACF;QACD,IAAI,KAAK,CAAC,cAAc,EAAC;YACvB,KAAK,CAAC,cAAc,GAAC;gBACnB,MAAM,EAAC,KAAK,CAAC,cAAc,CAAC,MAAM;gBAClC,KAAK,EAAC,KAAK,CAAC,cAAc,CAAC,KAAK;aACjC,CAAA;SACF;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACO,kCAAU,GAAlB;QAAA,iBAqCC;QApCC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAC;YAC1B,KAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACrB,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACtC,CAAC,CAAC;QAClB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,UAAC,GAAY;YAC3C,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE;gBACxB,KAAI,CAAC,MAAM,GAAG,IAAI,CAAC;aACpB;iBAAM,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE;gBAC5B,IAAI,KAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAC;oBAC7C,KAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAqB,CAAC,KAAK,CAAC,CAAC;iBACzD;aACF;iBAAK,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE;gBAC9B,IAAI,KAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAC;oBAChD,KAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAqB,CAAC,KAAK,CAAC,CAAC;iBAC5D;aACF;iBAAK,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAC;gBAE3B,sBAAsB;aACvB;QAEH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,IAAI;YACvC,0CAA0C;YAC1C,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,oBAAoB;YACpB,KAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEtB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,IAAI;YACvC,0CAA0C;YAC1C,KAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IAEL,CAAC;IACO,mCAAW,GAAnB;QACE,sDAAsD;QACtD,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAC3B;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IACO,iCAAS,GAAjB,UAAkB,IAAY;QAC5B,IAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAClC,IAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,EAAE,EAAE;YAClB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;SACnC;aAAM;YACL,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;SACrB;QACD,IAAI,CAAC,SAAS,GAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,wBAAwB;QACxB,mCAAmC;QACnC,8BAA8B;QAC9B,gBAAgB;QAChB,MAAM;QACN,4CAA4C;QAC5C,oCAAoC;QACpC,SAAS;QACT,+BAA+B;QAC/B,eAAe;QACf,IAAI;QACJ,mDAAmD;IACrD,CAAC;IAED,+BAAO,GAAP,UAAQ,KAAa;QAArB,iBAUC;QATC,OAAO,IAAI,kBAAC,CAAC,UAAC,OAAO,EAAE,MAAM;YAC3B,sCAAsC;YACtC,KAAI,CAAC,IAAI,GAAG,OAAO,CAAC;YACpB,6BAA6B;YAC7B,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE;gBACnC,iCAAiC;gBACjC,KAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IACH,oBAAC;AAAD,CAAC,AA/HD,CAAmC,qBAAS,GA+H3C;AA/HY,sCAAa;AA2Ib,QAAA,GAAG,GAAG,MAAM,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Processor.d.ts b/node_modules/csvtojson/v2/Processor.d.ts new file mode 100644 index 0000000..96abc57 --- /dev/null +++ b/node_modules/csvtojson/v2/Processor.d.ts @@ -0,0 +1,17 @@ +/// +/// +import { Converter } from "./Converter"; +import P from "bluebird"; +import { JSONResult } from "./lineToJson"; +import { CSVParseParam } from "./Parameters"; +import { ParseRuntime } from "./ParseRuntime"; +export declare abstract class Processor { + protected converter: Converter; + protected params: CSVParseParam; + protected runtime: ParseRuntime; + constructor(converter: Converter); + abstract process(chunk: Buffer, finalChunk?: boolean): P; + abstract destroy(): P; + abstract flush(): P; +} +export declare type ProcessLineResult = string | string[] | JSONResult; diff --git a/node_modules/csvtojson/v2/Processor.js b/node_modules/csvtojson/v2/Processor.js new file mode 100644 index 0000000..9017563 --- /dev/null +++ b/node_modules/csvtojson/v2/Processor.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Processor = /** @class */ (function () { + function Processor(converter) { + this.converter = converter; + this.params = converter.parseParam; + this.runtime = converter.parseRuntime; + } + return Processor; +}()); +exports.Processor = Processor; +//# sourceMappingURL=Processor.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Processor.js.map b/node_modules/csvtojson/v2/Processor.js.map new file mode 100644 index 0000000..39c52df --- /dev/null +++ b/node_modules/csvtojson/v2/Processor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Processor.js","sourceRoot":"","sources":["../src/Processor.ts"],"names":[],"mappings":";;AAMA;IAGE,mBAAsB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;QACxC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC;IACxC,CAAC;IAIH,gBAAC;AAAD,CAAC,AAVD,IAUC;AAVqB,8BAAS"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/ProcessorLocal.d.ts b/node_modules/csvtojson/v2/ProcessorLocal.d.ts new file mode 100644 index 0000000..6cdb1d5 --- /dev/null +++ b/node_modules/csvtojson/v2/ProcessorLocal.d.ts @@ -0,0 +1,22 @@ +/// +/// +import { Processor, ProcessLineResult } from "./Processor"; +import P from "bluebird"; +export declare class ProcessorLocal extends Processor { + flush(): P; + destroy(): P; + private rowSplit; + private eolEmitted; + private _needEmitEol?; + private readonly needEmitEol; + private headEmitted; + private _needEmitHead?; + private readonly needEmitHead; + process(chunk: Buffer, finalChunk?: boolean): P; + private processCSV(csv, finalChunk); + private processDataWithHead(lines); + private filterHeader(); + private processCSVBody(lines); + private prependLeftBuf(buf); + private runPreLineHook(lines); +} diff --git a/node_modules/csvtojson/v2/ProcessorLocal.js b/node_modules/csvtojson/v2/ProcessorLocal.js new file mode 100644 index 0000000..978fab7 --- /dev/null +++ b/node_modules/csvtojson/v2/ProcessorLocal.js @@ -0,0 +1,310 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var Processor_1 = require("./Processor"); +var bluebird_1 = __importDefault(require("bluebird")); +var dataClean_1 = require("./dataClean"); +var getEol_1 = __importDefault(require("./getEol")); +var fileline_1 = require("./fileline"); +var util_1 = require("./util"); +var rowSplit_1 = require("./rowSplit"); +var lineToJson_1 = __importDefault(require("./lineToJson")); +var CSVError_1 = __importDefault(require("./CSVError")); +var ProcessorLocal = /** @class */ (function (_super) { + __extends(ProcessorLocal, _super); + function ProcessorLocal() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.rowSplit = new rowSplit_1.RowSplit(_this.converter); + _this.eolEmitted = false; + _this._needEmitEol = undefined; + _this.headEmitted = false; + _this._needEmitHead = undefined; + return _this; + } + ProcessorLocal.prototype.flush = function () { + var _this = this; + if (this.runtime.csvLineBuffer && this.runtime.csvLineBuffer.length > 0) { + var buf = this.runtime.csvLineBuffer; + this.runtime.csvLineBuffer = undefined; + return this.process(buf, true) + .then(function (res) { + if (_this.runtime.csvLineBuffer && _this.runtime.csvLineBuffer.length > 0) { + return bluebird_1.default.reject(CSVError_1.default.unclosed_quote(_this.runtime.parsedLineNumber, _this.runtime.csvLineBuffer.toString())); + } + else { + return bluebird_1.default.resolve(res); + } + }); + } + else { + return bluebird_1.default.resolve([]); + } + }; + ProcessorLocal.prototype.destroy = function () { + return bluebird_1.default.resolve(); + }; + Object.defineProperty(ProcessorLocal.prototype, "needEmitEol", { + get: function () { + if (this._needEmitEol === undefined) { + this._needEmitEol = this.converter.listeners("eol").length > 0; + } + return this._needEmitEol; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ProcessorLocal.prototype, "needEmitHead", { + get: function () { + if (this._needEmitHead === undefined) { + this._needEmitHead = this.converter.listeners("header").length > 0; + } + return this._needEmitHead; + }, + enumerable: true, + configurable: true + }); + ProcessorLocal.prototype.process = function (chunk, finalChunk) { + var _this = this; + if (finalChunk === void 0) { finalChunk = false; } + var csvString; + if (finalChunk) { + csvString = chunk.toString(); + } + else { + csvString = dataClean_1.prepareData(chunk, this.converter.parseRuntime); + } + return bluebird_1.default.resolve() + .then(function () { + if (_this.runtime.preRawDataHook) { + return _this.runtime.preRawDataHook(csvString); + } + else { + return csvString; + } + }) + .then(function (csv) { + if (csv && csv.length > 0) { + return _this.processCSV(csv, finalChunk); + } + else { + return bluebird_1.default.resolve([]); + } + }); + }; + ProcessorLocal.prototype.processCSV = function (csv, finalChunk) { + var _this = this; + var params = this.params; + var runtime = this.runtime; + if (!runtime.eol) { + getEol_1.default(csv, runtime); + } + if (this.needEmitEol && !this.eolEmitted && runtime.eol) { + this.converter.emit("eol", runtime.eol); + this.eolEmitted = true; + } + // trim csv file has initial blank lines. + if (params.ignoreEmpty && !runtime.started) { + csv = util_1.trimLeft(csv); + } + var stringToLineResult = fileline_1.stringToLines(csv, runtime); + if (!finalChunk) { + this.prependLeftBuf(util_1.bufFromString(stringToLineResult.partial)); + } + else { + stringToLineResult.lines.push(stringToLineResult.partial); + stringToLineResult.partial = ""; + } + if (stringToLineResult.lines.length > 0) { + var prom = void 0; + if (runtime.preFileLineHook) { + prom = this.runPreLineHook(stringToLineResult.lines); + } + else { + prom = bluebird_1.default.resolve(stringToLineResult.lines); + } + return prom.then(function (lines) { + if (!runtime.started + && !_this.runtime.headers) { + return _this.processDataWithHead(lines); + } + else { + return _this.processCSVBody(lines); + } + }); + } + else { + return bluebird_1.default.resolve([]); + } + }; + ProcessorLocal.prototype.processDataWithHead = function (lines) { + if (this.params.noheader) { + if (this.params.headers) { + this.runtime.headers = this.params.headers; + } + else { + this.runtime.headers = []; + } + } + else { + var left = ""; + var headerRow = []; + while (lines.length) { + var line = left + lines.shift(); + var row = this.rowSplit.parse(line); + if (row.closed) { + headerRow = row.cells; + left = ""; + break; + } + else { + left = line + getEol_1.default(line, this.runtime); + } + } + this.prependLeftBuf(util_1.bufFromString(left)); + if (headerRow.length === 0) { + return []; + } + if (this.params.headers) { + this.runtime.headers = this.params.headers; + } + else { + this.runtime.headers = headerRow; + } + } + if (this.runtime.needProcessIgnoreColumn || this.runtime.needProcessIncludeColumn) { + this.filterHeader(); + } + if (this.needEmitHead && !this.headEmitted) { + this.converter.emit("header", this.runtime.headers); + this.headEmitted = true; + } + return this.processCSVBody(lines); + }; + ProcessorLocal.prototype.filterHeader = function () { + this.runtime.selectedColumns = []; + if (this.runtime.headers) { + var headers = this.runtime.headers; + for (var i = 0; i < headers.length; i++) { + if (this.params.ignoreColumns) { + if (this.params.ignoreColumns.test(headers[i])) { + if (this.params.includeColumns && this.params.includeColumns.test(headers[i])) { + this.runtime.selectedColumns.push(i); + } + else { + continue; + } + } + else { + this.runtime.selectedColumns.push(i); + } + } + else if (this.params.includeColumns) { + if (this.params.includeColumns.test(headers[i])) { + this.runtime.selectedColumns.push(i); + } + } + else { + this.runtime.selectedColumns.push(i); + } + // if (this.params.includeColumns && this.params.includeColumns.test(headers[i])){ + // this.runtime.selectedColumns.push(i); + // }else{ + // if (this.params.ignoreColumns && this.params.ignoreColumns.test(headers[i])){ + // continue; + // }else{ + // if (this.params.ignoreColumns && !this.params.includeColumns){ + // this.runtime.selectedColumns.push(i); + // } + // } + // } + } + this.runtime.headers = util_1.filterArray(this.runtime.headers, this.runtime.selectedColumns); + } + }; + ProcessorLocal.prototype.processCSVBody = function (lines) { + if (this.params.output === "line") { + return lines; + } + else { + var result = this.rowSplit.parseMultiLines(lines); + this.prependLeftBuf(util_1.bufFromString(result.partial)); + if (this.params.output === "csv") { + return result.rowsCells; + } + else { + return lineToJson_1.default(result.rowsCells, this.converter); + } + } + // var jsonArr = linesToJson(lines.lines, params, this.recordNum); + // this.processResult(jsonArr); + // this.lastIndex += jsonArr.length; + // this.recordNum += jsonArr.length; + }; + ProcessorLocal.prototype.prependLeftBuf = function (buf) { + if (buf) { + if (this.runtime.csvLineBuffer) { + this.runtime.csvLineBuffer = Buffer.concat([buf, this.runtime.csvLineBuffer]); + } + else { + this.runtime.csvLineBuffer = buf; + } + } + }; + ProcessorLocal.prototype.runPreLineHook = function (lines) { + var _this = this; + return new bluebird_1.default(function (resolve, reject) { + processLineHook(lines, _this.runtime, 0, function (err) { + if (err) { + reject(err); + } + else { + resolve(lines); + } + }); + }); + }; + return ProcessorLocal; +}(Processor_1.Processor)); +exports.ProcessorLocal = ProcessorLocal; +function processLineHook(lines, runtime, offset, cb) { + if (offset >= lines.length) { + cb(); + } + else { + if (runtime.preFileLineHook) { + var line = lines[offset]; + var res = runtime.preFileLineHook(line, runtime.parsedLineNumber + offset); + offset++; + if (res && res.then) { + res.then(function (value) { + lines[offset - 1] = value; + processLineHook(lines, runtime, offset, cb); + }); + } + else { + lines[offset - 1] = res; + while (offset < lines.length) { + lines[offset] = runtime.preFileLineHook(lines[offset], runtime.parsedLineNumber + offset); + offset++; + } + cb(); + } + } + else { + cb(); + } + } +} +//# sourceMappingURL=ProcessorLocal.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/ProcessorLocal.js.map b/node_modules/csvtojson/v2/ProcessorLocal.js.map new file mode 100644 index 0000000..e31eee6 --- /dev/null +++ b/node_modules/csvtojson/v2/ProcessorLocal.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ProcessorLocal.js","sourceRoot":"","sources":["../src/ProcessorLocal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAA2D;AAC3D,sDAAyB;AACzB,yCAA0C;AAC1C,oDAA8B;AAC9B,uCAA2C;AAC3C,+BAA6D;AAC7D,uCAAsC;AACtC,4DAAsC;AAEtC,wDAAkC;AAIlC;IAAoC,kCAAS;IAA7C;QAAA,qEAmOC;QA/MS,cAAQ,GAAa,IAAI,mBAAQ,CAAC,KAAI,CAAC,SAAS,CAAC,CAAC;QAClD,gBAAU,GAAG,KAAK,CAAC;QACnB,kBAAY,GAAa,SAAS,CAAC;QAOnC,iBAAW,GAAG,KAAK,CAAC;QACpB,mBAAa,GAAa,SAAS,CAAC;;IAqM9C,CAAC;IAlOC,8BAAK,GAAL;QAAA,iBAeC;QAdC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YACvE,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;YACvC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;iBAC3B,IAAI,CAAC,UAAC,GAAG;gBACR,IAAI,KAAI,CAAC,OAAO,CAAC,aAAa,IAAI,KAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;oBACvE,OAAO,kBAAC,CAAC,MAAM,CAAC,kBAAQ,CAAC,cAAc,CAAC,KAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;iBAC/G;qBAAM;oBACL,OAAO,kBAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;iBACvB;YACH,CAAC,CAAC,CAAA;SACL;aAAM;YACL,OAAO,kBAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACtB;IACH,CAAC;IACD,gCAAO,GAAP;QACE,OAAO,kBAAC,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAID,sBAAY,uCAAW;aAAvB;YACE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;gBACnC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAChE;YACD,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;;;OAAA;IAGD,sBAAY,wCAAY;aAAxB;YACE,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;gBACpC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACpE;YACD,OAAO,IAAI,CAAC,aAAa,CAAC;QAE5B,CAAC;;;OAAA;IACD,gCAAO,GAAP,UAAQ,KAAa,EAAE,UAAkB;QAAzC,iBAuBC;QAvBsB,2BAAA,EAAA,kBAAkB;QACvC,IAAI,SAAiB,CAAC;QACtB,IAAI,UAAU,EAAE;YACd,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;SAC9B;aAAM;YACL,SAAS,GAAG,uBAAW,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;SAE7D;QACD,OAAO,kBAAC,CAAC,OAAO,EAAE;aACf,IAAI,CAAC;YACJ,IAAI,KAAI,CAAC,OAAO,CAAC,cAAc,EAAE;gBAC/B,OAAO,KAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;aAC/C;iBAAM;gBACL,OAAO,SAAS,CAAC;aAClB;QACH,CAAC,CAAC;aACD,IAAI,CAAC,UAAC,GAAG;YACR,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzB,OAAO,KAAI,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;aACzC;iBAAM;gBACL,OAAO,kBAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aACtB;QACH,CAAC,CAAC,CAAA;IACN,CAAC;IACO,mCAAU,GAAlB,UAAmB,GAAW,EAAE,UAAmB;QAAnD,iBA4CC;QA3CC,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,gBAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SACtB;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE;YACvD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;SACxB;QACD,yCAAyC;QACzC,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAC1C,GAAG,GAAG,eAAQ,CAAC,GAAG,CAAC,CAAC;SACrB;QACD,IAAM,kBAAkB,GAAG,wBAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,CAAC,cAAc,CAAC,oBAAa,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;SAChE;aAAM;YACL,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC1D,kBAAkB,CAAC,OAAO,GAAG,EAAE,CAAC;SACjC;QACD,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,IAAI,IAAI,SAAa,CAAC;YACtB,IAAI,OAAO,CAAC,eAAe,EAAE;gBAC3B,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;aACtD;iBAAM;gBACL,IAAI,GAAG,kBAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;aAC5C;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAC,KAAK;gBACrB,IAAI,CAAC,OAAO,CAAC,OAAO;uBACf,CAAC,KAAI,CAAC,OAAO,CAAC,OAAO,EACxB;oBACA,OAAO,KAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;iBACxC;qBAAM;oBACL,OAAO,KAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;iBACnC;YAEH,CAAC,CAAC,CAAA;SAEH;aAAM;YAEL,OAAO,kBAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACtB;IAEH,CAAC;IACO,4CAAmB,GAA3B,UAA4B,KAAe;QACzC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACvB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5C;iBAAM;gBACL,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;aAC3B;SACF;aAAM;YACL,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,SAAS,GAAa,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC,MAAM,EAAE;gBACnB,IAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAClC,IAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,GAAG,CAAC,MAAM,EAAE;oBACd,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC;oBACtB,IAAI,GAAG,EAAE,CAAC;oBACV,MAAM;iBACP;qBAAM;oBACL,IAAI,GAAG,IAAI,GAAG,gBAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;iBAC1C;aACF;YACD,IAAI,CAAC,cAAc,CAAC,oBAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAEzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC1B,OAAO,EAAE,CAAC;aACX;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACvB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;aAC5C;iBAAM;gBACL,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;aAClC;SACF;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YACjF,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;QACD,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC1C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;SACzB;QACD,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACO,qCAAY,GAApB;QACE,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACxB,IAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACvC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;oBAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;4BAC7E,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;yBACtC;6BAAM;4BACL,SAAS;yBACV;qBACF;yBAAM;wBACL,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACtC;iBACF;qBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;oBACrC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC/C,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBACtC;iBACF;qBAAM;oBACL,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACtC;gBACD,kFAAkF;gBAClF,0CAA0C;gBAC1C,SAAS;gBACT,kFAAkF;gBAClF,gBAAgB;gBAChB,WAAW;gBACX,qEAAqE;gBACrE,8CAA8C;gBAC9C,QAAQ;gBAER,MAAM;gBACN,IAAI;aACL;YACD,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,kBAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;SACxF;IAEH,CAAC;IACO,uCAAc,GAAtB,UAAuB,KAAe;QACpC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;YACjC,OAAO,KAAK,CAAC;SACd;aAAM;YACL,IAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,oBAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE;gBAChC,OAAO,MAAM,CAAC,SAAS,CAAC;aACzB;iBAAM;gBACL,OAAO,oBAAU,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;aACrD;SACF;QAED,kEAAkE;QAClE,+BAA+B;QAC/B,oCAAoC;QACpC,oCAAoC;IACtC,CAAC;IAEO,uCAAc,GAAtB,UAAuB,GAAW;QAChC,IAAI,GAAG,EAAE;YACP,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;gBAC9B,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;aAC/E;iBAAM;gBACL,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG,GAAG,CAAC;aAClC;SACF;IAEH,CAAC;IACO,uCAAc,GAAtB,UAAuB,KAAe;QAAtC,iBAUC;QATC,OAAO,IAAI,kBAAC,CAAC,UAAC,OAAO,EAAE,MAAM;YAC3B,eAAe,CAAC,KAAK,EAAE,KAAI,CAAC,OAAO,EAAE,CAAC,EAAE,UAAC,GAAG;gBAC1C,IAAI,GAAG,EAAE;oBACP,MAAM,CAAC,GAAG,CAAC,CAAC;iBACb;qBAAM;oBACL,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChB;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IACH,qBAAC;AAAD,CAAC,AAnOD,CAAoC,qBAAS,GAmO5C;AAnOY,wCAAc;AAqO3B,yBAAyB,KAAe,EAAE,OAAqB,EAAE,MAAc,EAC7E,EAAkB;IAElB,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;QAC1B,EAAE,EAAE,CAAC;KACN;SAAM;QACL,IAAI,OAAO,CAAC,eAAe,EAAE;YAC3B,IAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAM,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,GAAG,MAAM,CAAC,CAAC;YAC7E,MAAM,EAAE,CAAC;YACT,IAAI,GAAG,IAAK,GAA2B,CAAC,IAAI,EAAE;gBAC3C,GAA2B,CAAC,IAAI,CAAC,UAAC,KAAK;oBACtC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;oBAC1B,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,GAAa,CAAC;gBAClC,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;oBAC5B,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,GAAG,MAAM,CAAW,CAAC;oBACpG,MAAM,EAAE,CAAC;iBACV;gBACD,EAAE,EAAE,CAAC;aACN;SACF;aAAM;YACL,EAAE,EAAE,CAAC;SACN;KACF;AACH,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Result.d.ts b/node_modules/csvtojson/v2/Result.d.ts new file mode 100644 index 0000000..60deda9 --- /dev/null +++ b/node_modules/csvtojson/v2/Result.d.ts @@ -0,0 +1,18 @@ +/// +import { Converter } from "./Converter"; +import { ProcessLineResult } from "./Processor"; +import P from "bluebird"; +import CSVError from "./CSVError"; +export declare class Result { + private converter; + private readonly needEmitLine; + private _needPushDownstream?; + private readonly needPushDownstream; + private readonly needEmitAll; + private finalResult; + constructor(converter: Converter); + processResult(resultLines: ProcessLineResult[]): P; + appendFinalResult(lines: any[]): void; + processError(err: CSVError): void; + endProcess(): void; +} diff --git a/node_modules/csvtojson/v2/Result.js b/node_modules/csvtojson/v2/Result.js new file mode 100644 index 0000000..c5b62c3 --- /dev/null +++ b/node_modules/csvtojson/v2/Result.js @@ -0,0 +1,164 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var bluebird_1 = __importDefault(require("bluebird")); +var os_1 = require("os"); +var Result = /** @class */ (function () { + function Result(converter) { + this.converter = converter; + this.finalResult = []; + } + Object.defineProperty(Result.prototype, "needEmitLine", { + get: function () { + return !!this.converter.parseRuntime.subscribe && !!this.converter.parseRuntime.subscribe.onNext || this.needPushDownstream; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Result.prototype, "needPushDownstream", { + get: function () { + if (this._needPushDownstream === undefined) { + this._needPushDownstream = this.converter.listeners("data").length > 0 || this.converter.listeners("readable").length > 0; + } + return this._needPushDownstream; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Result.prototype, "needEmitAll", { + get: function () { + return !!this.converter.parseRuntime.then && this.converter.parseParam.needEmitAll; + // return !!this.converter.parseRuntime.then; + }, + enumerable: true, + configurable: true + }); + Result.prototype.processResult = function (resultLines) { + var _this = this; + var startPos = this.converter.parseRuntime.parsedLineNumber; + if (this.needPushDownstream && this.converter.parseParam.downstreamFormat === "array") { + if (startPos === 0) { + pushDownstream(this.converter, "[" + os_1.EOL); + } + } + // let prom: P; + return new bluebird_1.default(function (resolve, reject) { + if (_this.needEmitLine) { + processLineByLine(resultLines, _this.converter, 0, _this.needPushDownstream, function (err) { + if (err) { + reject(err); + } + else { + _this.appendFinalResult(resultLines); + resolve(); + } + }); + // resolve(); + } + else { + _this.appendFinalResult(resultLines); + resolve(); + } + }); + }; + Result.prototype.appendFinalResult = function (lines) { + if (this.needEmitAll) { + this.finalResult = this.finalResult.concat(lines); + } + this.converter.parseRuntime.parsedLineNumber += lines.length; + }; + Result.prototype.processError = function (err) { + if (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onError) { + this.converter.parseRuntime.subscribe.onError(err); + } + if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onrejected) { + this.converter.parseRuntime.then.onrejected(err); + } + }; + Result.prototype.endProcess = function () { + if (this.converter.parseRuntime.then && this.converter.parseRuntime.then.onfulfilled) { + if (this.needEmitAll) { + this.converter.parseRuntime.then.onfulfilled(this.finalResult); + } + else { + this.converter.parseRuntime.then.onfulfilled([]); + } + } + if (this.converter.parseRuntime.subscribe && this.converter.parseRuntime.subscribe.onCompleted) { + this.converter.parseRuntime.subscribe.onCompleted(); + } + if (this.needPushDownstream && this.converter.parseParam.downstreamFormat === "array") { + pushDownstream(this.converter, "]" + os_1.EOL); + } + }; + return Result; +}()); +exports.Result = Result; +function processLineByLine(lines, conv, offset, needPushDownstream, cb) { + if (offset >= lines.length) { + cb(); + } + else { + if (conv.parseRuntime.subscribe && conv.parseRuntime.subscribe.onNext) { + var hook_1 = conv.parseRuntime.subscribe.onNext; + var nextLine_1 = lines[offset]; + var res = hook_1(nextLine_1, conv.parseRuntime.parsedLineNumber + offset); + offset++; + // if (isAsync === undefined) { + if (res && res.then) { + res.then(function () { + processRecursive(lines, hook_1, conv, offset, needPushDownstream, cb, nextLine_1); + }, cb); + } + else { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false); + if (needPushDownstream) { + pushDownstream(conv, nextLine_1); + } + while (offset < lines.length) { + var line = lines[offset]; + hook_1(line, conv.parseRuntime.parsedLineNumber + offset); + offset++; + if (needPushDownstream) { + pushDownstream(conv, line); + } + } + cb(); + } + // } else if (isAsync === true) { + // (res as PromiseLike).then(function () { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, true); + // }, cb); + // } else if (isAsync === false) { + // processRecursive(lines, hook, conv, offset, needPushDownstream, cb, nextLine, false); + // } + } + else { + if (needPushDownstream) { + while (offset < lines.length) { + var line = lines[offset++]; + pushDownstream(conv, line); + } + } + cb(); + } + } +} +function processRecursive(lines, hook, conv, offset, needPushDownstream, cb, res) { + if (needPushDownstream) { + pushDownstream(conv, res); + } + processLineByLine(lines, conv, offset, needPushDownstream, cb); +} +function pushDownstream(conv, res) { + if (typeof res === "object" && !conv.options.objectMode) { + var data = JSON.stringify(res); + conv.push(data + (conv.parseParam.downstreamFormat === "array" ? "," + os_1.EOL : os_1.EOL), "utf8"); + } + else { + conv.push(res); + } +} +//# sourceMappingURL=Result.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/Result.js.map b/node_modules/csvtojson/v2/Result.js.map new file mode 100644 index 0000000..ec645e7 --- /dev/null +++ b/node_modules/csvtojson/v2/Result.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Result.js","sourceRoot":"","sources":["../src/Result.ts"],"names":[],"mappings":";;;;;AAEA,sDAAyB;AAEzB,yBAAyB;AACzB;IAgBE,gBAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;QADhC,gBAAW,GAAU,EAAE,CAAC;IACY,CAAC;IAf7C,sBAAY,gCAAY;aAAxB;YACE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,kBAAkB,CAAA;QAC7H,CAAC;;;OAAA;IAED,sBAAY,sCAAkB;aAA9B;YACE,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;gBAC1C,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3H;YACD,OAAO,IAAI,CAAC,mBAAmB,CAAC;QAClC,CAAC;;;OAAA;IACD,sBAAY,+BAAW;aAAvB;YACE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC;YACnF,6CAA6C;QAC/C,CAAC;;;OAAA;IAGD,8BAAa,GAAb,UAAc,WAAgC;QAA9C,iBA8BC;QA7BC,IAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC;QAC9D,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,KAAK,OAAO,EAAE;YACrF,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,QAAG,CAAC,CAAC;aAC3C;SACF;QACD,oBAAoB;QACpB,OAAO,IAAI,kBAAC,CAAC,UAAC,OAAO,EAAE,MAAM;YAC3B,IAAI,KAAI,CAAC,YAAY,EAAE;gBACrB,iBAAiB,CACf,WAAW,EACX,KAAI,CAAC,SAAS,EACd,CAAC,EACD,KAAI,CAAC,kBAAkB,EACvB,UAAC,GAAG;oBACF,IAAI,GAAG,EAAE;wBACP,MAAM,CAAC,GAAG,CAAC,CAAC;qBACb;yBAAM;wBACL,KAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;wBACpC,OAAO,EAAE,CAAC;qBACX;gBACH,CAAC,CACF,CAAA;gBACD,aAAa;aACd;iBAAM;gBACL,KAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;gBACpC,OAAO,EAAE,CAAC;aACX;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,kCAAiB,GAAjB,UAAkB,KAAY;QAC5B,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACnD;QACD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC;IAC/D,CAAC;IACD,6BAAY,GAAZ,UAAa,GAAa;QACxB,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE;YAC1F,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;SACpD;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE;YACnF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAClD;IACH,CAAC;IACD,2BAAU,GAAV;QAEI,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE;YACpF,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAChE;iBAAI;gBACH,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;aAClD;SACF;QACH,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE;YAC9F,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;SACrD;QACD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,KAAK,OAAO,EAAE;YACrF,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,QAAG,CAAC,CAAC;SAC3C;IACH,CAAC;IACH,aAAC;AAAD,CAAC,AA9ED,IA8EC;AA9EY,wBAAM;AAgFnB,2BACE,KAA0B,EAE1B,IAAe,EACf,MAAc,EACd,kBAA2B,EAC3B,EAAkB;IAElB,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE;QAC1B,EAAE,EAAE,CAAC;KACN;SAAM;QACL,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE;YACrE,IAAM,MAAI,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC;YAChD,IAAM,UAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAM,GAAG,GAAG,MAAI,CAAC,UAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,MAAM,CAAC,CAAC;YACxE,MAAM,EAAE,CAAC;YACT,+BAA+B;YAC/B,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE;gBACnB,GAAG,CAAC,IAAI,CAAC;oBACP,gBAAgB,CAAC,KAAK,EAAE,MAAI,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAQ,CAAC,CAAC;gBAChF,CAAC,EAAE,EAAE,CAAC,CAAC;aACR;iBAAM;gBACL,wFAAwF;gBACxF,IAAI,kBAAkB,EAAE;oBACtB,cAAc,CAAC,IAAI,EAAE,UAAQ,CAAC,CAAC;iBAChC;gBACD,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;oBAC5B,IAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC3B,MAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,MAAM,CAAC,CAAC;oBACxD,MAAM,EAAE,CAAC;oBACT,IAAI,kBAAkB,EAAE;wBACtB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;qBAC5B;iBACF;gBACD,EAAE,EAAE,CAAC;aACN;YACD,iCAAiC;YACjC,kDAAkD;YAClD,2FAA2F;YAC3F,YAAY;YACZ,kCAAkC;YAClC,0FAA0F;YAC1F,IAAI;SACL;aAAM;YACL,IAAI,kBAAkB,EAAE;gBACtB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;oBAC5B,IAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC7B,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC5B;aAEF;YACD,EAAE,EAAE,CAAC;SACN;KAEF;AACH,CAAC;AAED,0BACE,KAA0B,EAC1B,IAAiE,EACjE,IAAe,EACf,MAAc,EACd,kBAA2B,EAC3B,EAAkB,EAClB,GAAsB;IAEtB,IAAI,kBAAkB,EAAE;QACtB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;KAC3B;IACD,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AACD,wBAAwB,IAAe,EAAE,GAAsB;IAC7D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;QACvD,IAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,QAAG,CAAC,CAAC,CAAC,QAAG,CAAC,EAAE,MAAM,CAAC,CAAC;KAC5F;SAAM;QACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KAChB;AACH,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/dataClean.d.ts b/node_modules/csvtojson/v2/dataClean.d.ts new file mode 100644 index 0000000..cbc69ec --- /dev/null +++ b/node_modules/csvtojson/v2/dataClean.d.ts @@ -0,0 +1,9 @@ +/// +import { ParseRuntime } from "./ParseRuntime"; +/** + * For each data chunk coming to parser: + * 1. append the data to the buffer that is left from last chunk + * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + * 3. stripBom + */ +export declare function prepareData(chunk: Buffer, runtime: ParseRuntime): string; diff --git a/node_modules/csvtojson/v2/dataClean.js b/node_modules/csvtojson/v2/dataClean.js new file mode 100644 index 0000000..53ad661 --- /dev/null +++ b/node_modules/csvtojson/v2/dataClean.js @@ -0,0 +1,72 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var strip_bom_1 = __importDefault(require("strip-bom")); +/** + * For each data chunk coming to parser: + * 1. append the data to the buffer that is left from last chunk + * 2. check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + * 3. stripBom + */ +function prepareData(chunk, runtime) { + var workChunk = concatLeftChunk(chunk, runtime); + runtime.csvLineBuffer = undefined; + var cleanCSVString = cleanUtf8Split(workChunk, runtime).toString("utf8"); + if (runtime.started === false) { + return strip_bom_1.default(cleanCSVString); + } + else { + return cleanCSVString; + } +} +exports.prepareData = prepareData; +/** + * append data to buffer that is left form last chunk + */ +function concatLeftChunk(chunk, runtime) { + if (runtime.csvLineBuffer && runtime.csvLineBuffer.length > 0) { + return Buffer.concat([runtime.csvLineBuffer, chunk]); + } + else { + return chunk; + } +} +/** + * check if utf8 chars being split, if does, stripe the bytes and add to left buffer. + */ +function cleanUtf8Split(chunk, runtime) { + var idx = chunk.length - 1; + /** + * From Keyang: + * The code below is to check if a single utf8 char (which could be multiple bytes) being split. + * If the char being split, the buffer from two chunk needs to be concat + * check how utf8 being encoded to understand the code below. + * If anyone has any better way to do this, please let me know. + */ + if ((chunk[idx] & 1 << 7) != 0) { + while ((chunk[idx] & 3 << 6) === 128) { + idx--; + } + idx--; + } + if (idx != chunk.length - 1) { + runtime.csvLineBuffer = chunk.slice(idx + 1); + return chunk.slice(0, idx + 1); + // var _cb=cb; + // var self=this; + // cb=function(){ + // if (self._csvLineBuffer){ + // self._csvLineBuffer=Buffer.concat([bufFromString(self._csvLineBuffer,"utf8"),left]); + // }else{ + // self._csvLineBuffer=left; + // } + // _cb(); + // } + } + else { + return chunk; + } +} +//# sourceMappingURL=dataClean.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/dataClean.js.map b/node_modules/csvtojson/v2/dataClean.js.map new file mode 100644 index 0000000..0978e83 --- /dev/null +++ b/node_modules/csvtojson/v2/dataClean.js.map @@ -0,0 +1 @@ +{"version":3,"file":"dataClean.js","sourceRoot":"","sources":["../src/dataClean.ts"],"names":[],"mappings":";;;;;AACA,wDAAiC;AACjC;;;;;GAKG;AACH,qBAA4B,KAAa,EAAE,OAAqB;IAC9D,IAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IAClC,IAAM,cAAc,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;QAC7B,OAAO,mBAAQ,CAAC,cAAc,CAAC,CAAC;KACjC;SAAM;QACL,OAAO,cAAc,CAAC;KACvB;AACH,CAAC;AATD,kCASC;AACD;;GAEG;AACH,yBAAyB,KAAa,EAAE,OAAqB;IAC3D,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;KACtD;SAAM;QACL,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AACD;;GAEG;AACH,wBAAwB,KAAa,EAAE,OAAqB;IAC1D,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B;;;;;;OAMG;IACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE;YACpC,GAAG,EAAE,CAAC;SACP;QACD,GAAG,EAAE,CAAC;KACP;IACD,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3B,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QAC9B,cAAc;QACd,iBAAiB;QACjB,iBAAiB;QACjB,8BAA8B;QAC9B,2FAA2F;QAC3F,WAAW;QACX,gCAAgC;QAChC,MAAM;QACN,WAAW;QACX,IAAI;KACL;SAAM;QACL,OAAO,KAAK,CAAC;KACd;AACH,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/fileline.d.ts b/node_modules/csvtojson/v2/fileline.d.ts new file mode 100644 index 0000000..4f59060 --- /dev/null +++ b/node_modules/csvtojson/v2/fileline.d.ts @@ -0,0 +1,16 @@ +import { ParseRuntime } from "./ParseRuntime"; +/** + * convert data chunk to file lines array + * @param {string} data data chunk as utf8 string + * @param {object} param Converter param object + * @return {Object} {lines:[line1,line2...],partial:String} + */ +export declare function stringToLines(data: string, param: ParseRuntime): StringToLinesResult; +export interface StringToLinesResult { + lines: Fileline[]; + /** + * last line which could be incomplete line. + */ + partial: string; +} +export declare type Fileline = string; diff --git a/node_modules/csvtojson/v2/fileline.js b/node_modules/csvtojson/v2/fileline.js new file mode 100644 index 0000000..24ff51f --- /dev/null +++ b/node_modules/csvtojson/v2/fileline.js @@ -0,0 +1,22 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var getEol_1 = __importDefault(require("./getEol")); +// const getEol = require("./getEol"); +/** + * convert data chunk to file lines array + * @param {string} data data chunk as utf8 string + * @param {object} param Converter param object + * @return {Object} {lines:[line1,line2...],partial:String} + */ +function stringToLines(data, param) { + var eol = getEol_1.default(data, param); + var lines = data.split(eol); + var partial = lines.pop() || ""; + return { lines: lines, partial: partial }; +} +exports.stringToLines = stringToLines; +; +//# sourceMappingURL=fileline.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/fileline.js.map b/node_modules/csvtojson/v2/fileline.js.map new file mode 100644 index 0000000..1d24ef7 --- /dev/null +++ b/node_modules/csvtojson/v2/fileline.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fileline.js","sourceRoot":"","sources":["../src/fileline.ts"],"names":[],"mappings":";;;;;AACA,oDAA8B;AAC9B,sCAAsC;AACtC;;;;;GAKG;AACH,uBAA8B,IAAY,EAAE,KAAmB;IAC7D,IAAM,GAAG,GAAG,gBAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChC,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAClC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AALD,sCAKC;AAAA,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/getEol.d.ts b/node_modules/csvtojson/v2/getEol.d.ts new file mode 100644 index 0000000..1df27af --- /dev/null +++ b/node_modules/csvtojson/v2/getEol.d.ts @@ -0,0 +1,2 @@ +import { ParseRuntime } from "./ParseRuntime"; +export default function (data: string, param: ParseRuntime): string; diff --git a/node_modules/csvtojson/v2/getEol.js b/node_modules/csvtojson/v2/getEol.js new file mode 100644 index 0000000..ed2e121 --- /dev/null +++ b/node_modules/csvtojson/v2/getEol.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//return first eol found from a data chunk. +function default_1(data, param) { + if (!param.eol && data) { + for (var i = 0, len = data.length; i < len; i++) { + if (data[i] === "\r") { + if (data[i + 1] === "\n") { + param.eol = "\r\n"; + break; + } + else if (data[i + 1]) { + param.eol = "\r"; + break; + } + } + else if (data[i] === "\n") { + param.eol = "\n"; + break; + } + } + } + return param.eol || "\n"; +} +exports.default = default_1; +; +//# sourceMappingURL=getEol.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/getEol.js.map b/node_modules/csvtojson/v2/getEol.js.map new file mode 100644 index 0000000..0552626 --- /dev/null +++ b/node_modules/csvtojson/v2/getEol.js.map @@ -0,0 +1 @@ +{"version":3,"file":"getEol.js","sourceRoot":"","sources":["../src/getEol.ts"],"names":[],"mappings":";;AACA,2CAA2C;AAC3C,mBAAyB,IAAY,EAAE,KAAmB;IACxD,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;YAC/C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBACpB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;oBACxB,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;oBACnB,MAAM;iBACP;qBAAM,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;oBACtB,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;oBACjB,MAAM;iBACP;aACF;iBAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBAC3B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;gBACjB,MAAM;aACP;SACF;KACF;IACD,OAAO,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;AAC3B,CAAC;AAlBD,4BAkBC;AAAA,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/index.d.ts b/node_modules/csvtojson/v2/index.d.ts new file mode 100644 index 0000000..45ed75c --- /dev/null +++ b/node_modules/csvtojson/v2/index.d.ts @@ -0,0 +1,6 @@ +/// +import { TransformOptions } from "stream"; +import { CSVParseParam } from "./Parameters"; +import { Converter } from "./Converter"; +declare const helper: (param?: Partial | undefined, options?: TransformOptions | undefined) => Converter; +export = helper; diff --git a/node_modules/csvtojson/v2/index.js b/node_modules/csvtojson/v2/index.js new file mode 100644 index 0000000..97fb28e --- /dev/null +++ b/node_modules/csvtojson/v2/index.js @@ -0,0 +1,9 @@ +"use strict"; +var Converter_1 = require("./Converter"); +var helper = function (param, options) { + return new Converter_1.Converter(param, options); +}; +helper["csv"] = helper; +helper["Converter"] = Converter_1.Converter; +module.exports = helper; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/index.js.map b/node_modules/csvtojson/v2/index.js.map new file mode 100644 index 0000000..5997875 --- /dev/null +++ b/node_modules/csvtojson/v2/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,yCAAwC;AAExC,IAAM,MAAM,GAAG,UAAU,KAA8B,EAAE,OAA0B;IACjF,OAAO,IAAI,qBAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAA;AACD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;AACvB,MAAM,CAAC,WAAW,CAAC,GAAG,qBAAS,CAAC;AAChC,iBAAQ,MAAM,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/lineToJson.d.ts b/node_modules/csvtojson/v2/lineToJson.d.ts new file mode 100644 index 0000000..6b46f70 --- /dev/null +++ b/node_modules/csvtojson/v2/lineToJson.d.ts @@ -0,0 +1,5 @@ +import { Converter } from "./Converter"; +export default function (csvRows: string[][], conv: Converter): JSONResult[]; +export declare type JSONResult = { + [key: string]: any; +}; diff --git a/node_modules/csvtojson/v2/lineToJson.js b/node_modules/csvtojson/v2/lineToJson.js new file mode 100644 index 0000000..119f329 --- /dev/null +++ b/node_modules/csvtojson/v2/lineToJson.js @@ -0,0 +1,212 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var CSVError_1 = __importDefault(require("./CSVError")); +var set_1 = __importDefault(require("lodash/set")); +var numReg = /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/; +function default_1(csvRows, conv) { + var res = []; + for (var i = 0, len = csvRows.length; i < len; i++) { + var r = processRow(csvRows[i], conv, i); + if (r) { + res.push(r); + } + } + return res; +} +exports.default = default_1; +; +function processRow(row, conv, index) { + if (conv.parseParam.checkColumn && conv.parseRuntime.headers && row.length !== conv.parseRuntime.headers.length) { + throw (CSVError_1.default.column_mismatched(conv.parseRuntime.parsedLineNumber + index)); + } + var headRow = conv.parseRuntime.headers || []; + var resultRow = convertRowToJson(row, headRow, conv); + if (resultRow) { + return resultRow; + } + else { + return null; + } +} +function convertRowToJson(row, headRow, conv) { + var hasValue = false; + var resultRow = {}; + for (var i = 0, len = row.length; i < len; i++) { + var item = row[i]; + if (conv.parseParam.ignoreEmpty && item === '') { + continue; + } + hasValue = true; + var head = headRow[i]; + if (!head || head === "") { + head = headRow[i] = "field" + (i + 1); + } + var convFunc = getConvFunc(head, i, conv); + if (convFunc) { + var convRes = convFunc(item, head, resultRow, row, i); + if (convRes !== undefined) { + setPath(resultRow, head, convRes, conv, i); + } + } + else { + // var flag = getFlag(head, i, param); + // if (flag === 'omit') { + // continue; + // } + if (conv.parseParam.checkType) { + var convertFunc = checkType(item, head, i, conv); + item = convertFunc(item); + } + if (item !== undefined) { + setPath(resultRow, head, item, conv, i); + } + } + } + if (hasValue) { + return resultRow; + } + else { + return null; + } +} +var builtInConv = { + "string": stringType, + "number": numberType, + "omit": function () { } +}; +function getConvFunc(head, i, conv) { + if (conv.parseRuntime.columnConv[i] !== undefined) { + return conv.parseRuntime.columnConv[i]; + } + else { + var flag = conv.parseParam.colParser[head]; + if (flag === undefined) { + return conv.parseRuntime.columnConv[i] = null; + } + if (typeof flag === "object") { + flag = flag.cellParser || "string"; + } + if (typeof flag === "string") { + flag = flag.trim().toLowerCase(); + var builtInFunc = builtInConv[flag]; + if (builtInFunc) { + return conv.parseRuntime.columnConv[i] = builtInFunc; + } + else { + return conv.parseRuntime.columnConv[i] = null; + } + } + else if (typeof flag === "function") { + return conv.parseRuntime.columnConv[i] = flag; + } + else { + return conv.parseRuntime.columnConv[i] = null; + } + } +} +function setPath(resultJson, head, value, conv, headIdx) { + if (!conv.parseRuntime.columnValueSetter[headIdx]) { + if (conv.parseParam.flatKeys) { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + else { + if (head.indexOf(".") > -1) { + var headArr = head.split("."); + var jsonHead = true; + while (headArr.length > 0) { + var headCom = headArr.shift(); + if (headCom.length === 0) { + jsonHead = false; + break; + } + } + if (!jsonHead || conv.parseParam.colParser[head] && conv.parseParam.colParser[head].flat) { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + else { + conv.parseRuntime.columnValueSetter[headIdx] = jsonSetter; + } + } + else { + conv.parseRuntime.columnValueSetter[headIdx] = flatSetter; + } + } + } + if (conv.parseParam.nullObject === true && value === "null") { + value = null; + } + conv.parseRuntime.columnValueSetter[headIdx](resultJson, head, value); + // flatSetter(resultJson, head, value); +} +function flatSetter(resultJson, head, value) { + resultJson[head] = value; +} +function jsonSetter(resultJson, head, value) { + set_1.default(resultJson, head, value); +} +function checkType(item, head, headIdx, conv) { + if (conv.parseRuntime.headerType[headIdx]) { + return conv.parseRuntime.headerType[headIdx]; + } + else if (head.indexOf('number#!') > -1) { + return conv.parseRuntime.headerType[headIdx] = numberType; + } + else if (head.indexOf('string#!') > -1) { + return conv.parseRuntime.headerType[headIdx] = stringType; + } + else if (conv.parseParam.checkType) { + return conv.parseRuntime.headerType[headIdx] = dynamicType; + } + else { + return conv.parseRuntime.headerType[headIdx] = stringType; + } +} +function numberType(item) { + var rtn = parseFloat(item); + if (isNaN(rtn)) { + return item; + } + return rtn; +} +function stringType(item) { + return item.toString(); +} +function dynamicType(item) { + var trimed = item.trim(); + if (trimed === "") { + return stringType(item); + } + if (numReg.test(trimed)) { + return numberType(item); + } + else if (trimed.length === 5 && trimed.toLowerCase() === "false" || trimed.length === 4 && trimed.toLowerCase() === "true") { + return booleanType(item); + } + else if (trimed[0] === "{" && trimed[trimed.length - 1] === "}" || trimed[0] === "[" && trimed[trimed.length - 1] === "]") { + return jsonType(item); + } + else { + return stringType(item); + } +} +function booleanType(item) { + var trimed = item.trim(); + if (trimed.length === 5 && trimed.toLowerCase() === "false") { + return false; + } + else { + return true; + } +} +function jsonType(item) { + try { + return JSON.parse(item); + } + catch (e) { + return item; + } +} +//# sourceMappingURL=lineToJson.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/lineToJson.js.map b/node_modules/csvtojson/v2/lineToJson.js.map new file mode 100644 index 0000000..05d58c4 --- /dev/null +++ b/node_modules/csvtojson/v2/lineToJson.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lineToJson.js","sourceRoot":"","sources":["../src/lineToJson.ts"],"names":[],"mappings":";;;;;AACA,wDAAkC;AAElC,mDAA6B;AAG7B,IAAI,MAAM,GAAG,0CAA0C,CAAC;AAExD,mBAAyB,OAAmB,EAAE,IAAe;IAC3D,IAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QAClD,IAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACb;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AATD,4BASC;AAAA,CAAC;AAKF,oBAAoB,GAAa,EAAE,IAAe,EAAE,KAAK;IAEvD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE;QAC/G,MAAM,CAAC,kBAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAA;KAC/E;IAED,IAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;IAChD,IAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,SAAS,EAAE;QACb,OAAO,SAAS,CAAC;KAClB;SAAM;QACL,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED,0BAA0B,GAAa,EAAE,OAAiB,EAAE,IAAe;IACzE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAM,SAAS,GAAG,EAAE,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QAC9C,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,IAAI,KAAK,EAAE,EAAE;YAC9C,SAAS;SACV;QACD,QAAQ,GAAG,IAAI,CAAC;QAEhB,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE;YACxB,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACvC;QACD,IAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE;YACZ,IAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YACxD,IAAI,OAAO,KAAK,SAAS,EAAE;gBACzB,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;aAC3C;SACF;aAAM;YACL,sCAAsC;YACtC,yBAAyB;YACzB,cAAc;YACd,IAAI;YACJ,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;gBAC7B,IAAM,WAAW,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBACnD,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;aAC1B;YACD,IAAI,IAAI,KAAK,SAAS,EAAE;gBACtB,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;aACxC;SACF;KACF;IACD,IAAI,QAAQ,EAAE;QACZ,OAAO,SAAS,CAAC;KAClB;SAAM;QACL,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED,IAAM,WAAW,GAAkC;IACjD,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB,CAAA;AACD,qBAAqB,IAAY,EAAE,CAAS,EAAE,IAAe;IAC3D,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;QACjD,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;KACxC;SAAM;QACL,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;SAC/C;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,IAAI,GAAI,IAAoB,CAAC,UAAU,IAAI,QAAQ,CAAC;SACrD;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjC,IAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,WAAW,EAAE;gBACf,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;aACtD;iBAAM;gBACL,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;aAC/C;SACF;aAAM,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YACrC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;SAC/C;aAAM;YACL,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;SAC/C;KACF;AACH,CAAC;AACD,iBAAiB,UAAe,EAAE,IAAY,EAAE,KAAU,EAAE,IAAe,EAAC,OAAc;IACxF,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;QACjD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;SAC3D;aAAM;YAEL,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC1B,IAAM,OAAO,GAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,QAAQ,GAAC,IAAI,CAAC;gBAClB,OAAM,OAAO,CAAC,MAAM,GAAC,CAAC,EAAC;oBACrB,IAAM,OAAO,GAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC9B,IAAI,OAAQ,CAAC,MAAM,KAAG,CAAC,EAAC;wBACtB,QAAQ,GAAC,KAAK,CAAC;wBACf,MAAM;qBACP;iBACF;gBACD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAK,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAiB,CAAC,IAAI,EAAE;oBACzG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;iBAC3D;qBAAM;oBACL,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;iBAC3D;aACF;iBAAM;gBACL,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;aAC3D;SACF;KACF;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,KAAI,IAAI,IAAI,KAAK,KAAI,MAAM,EAAC;QACxD,KAAK,GAAC,IAAI,CAAC;KACZ;IACD,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtE,uCAAuC;AAEzC,CAAC;AACD,oBAAoB,UAAe,EAAE,IAAY,EAAE,KAAU;IAC3D,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAC3B,CAAC;AACD,oBAAoB,UAAe,EAAE,IAAY,EAAE,KAAU;IAC3D,aAAG,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAGD,mBAAmB,IAAY,EAAE,IAAY,EAAE,OAAe,EAAE,IAAe;IAC7E,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;KAC9C;SAAM,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;KAC3D;SAAM,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;KAC3D;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;KAC5D;SAAM;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;KAC3D;AACH,CAAC;AAED,oBAAoB,IAAI;IACtB,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;QACd,OAAO,IAAI,CAAC;KACb;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oBAAoB,IAAY;IAC9B,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC;AAED,qBAAqB,IAAI;IACvB,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,MAAM,KAAK,EAAE,EAAE;QACjB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;KACzB;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QACvB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;KACzB;SAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;QAC5H,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;KAC1B;SAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;QAC3H,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;KACvB;SAAM;QACL,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;KACzB;AACH,CAAC;AAED,qBAAqB,IAAI;IACvB,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;QAC3D,OAAO,KAAK,CAAC;KACd;SAAM;QACL,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED,kBAAkB,IAAI;IACpB,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACzB;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,IAAI,CAAC;KACb;AACH,CAAC"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/rowSplit.d.ts b/node_modules/csvtojson/v2/rowSplit.d.ts new file mode 100644 index 0000000..4bb49d0 --- /dev/null +++ b/node_modules/csvtojson/v2/rowSplit.d.ts @@ -0,0 +1,34 @@ +import { Converter } from "./Converter"; +import { Fileline } from "./fileline"; +export declare class RowSplit { + private conv; + private quote; + private trim; + private escape; + private cachedRegExp; + private delimiterEmitted; + private _needEmitDelimiter?; + private readonly needEmitDelimiter; + constructor(conv: Converter); + parse(fileline: Fileline): RowSplitResult; + private toCSVRow(rowArr, trim, quote, delimiter); + private getDelimiter(fileline); + private isQuoteOpen(str); + private isQuoteClose(str); + private escapeQuote(segment); + parseMultiLines(lines: Fileline[]): MultipleRowResult; +} +export interface MultipleRowResult { + rowsCells: string[][]; + partial: string; +} +export interface RowSplitResult { + /** + * csv row array. ["a","b","c"] + */ + cells: string[]; + /** + * if the passed fileline is a complete row + */ + closed: boolean; +} diff --git a/node_modules/csvtojson/v2/rowSplit.js b/node_modules/csvtojson/v2/rowSplit.js new file mode 100644 index 0000000..a7ec301 --- /dev/null +++ b/node_modules/csvtojson/v2/rowSplit.js @@ -0,0 +1,230 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var getEol_1 = __importDefault(require("./getEol")); +var util_1 = require("./util"); +var defaulDelimiters = [",", "|", "\t", ";", ":"]; +var RowSplit = /** @class */ (function () { + function RowSplit(conv) { + this.conv = conv; + this.cachedRegExp = {}; + this.delimiterEmitted = false; + this._needEmitDelimiter = undefined; + this.quote = conv.parseParam.quote; + this.trim = conv.parseParam.trim; + this.escape = conv.parseParam.escape; + } + Object.defineProperty(RowSplit.prototype, "needEmitDelimiter", { + get: function () { + if (this._needEmitDelimiter === undefined) { + this._needEmitDelimiter = this.conv.listeners("delimiter").length > 0; + } + return this._needEmitDelimiter; + }, + enumerable: true, + configurable: true + }); + RowSplit.prototype.parse = function (fileline) { + if (fileline.length === 0 || (this.conv.parseParam.ignoreEmpty && fileline.trim().length === 0)) { + return { cells: [], closed: true }; + } + var quote = this.quote; + var trim = this.trim; + var escape = this.escape; + if (this.conv.parseRuntime.delimiter instanceof Array || this.conv.parseRuntime.delimiter.toLowerCase() === "auto") { + this.conv.parseRuntime.delimiter = this.getDelimiter(fileline); + } + if (this.needEmitDelimiter && !this.delimiterEmitted) { + this.conv.emit("delimiter", this.conv.parseRuntime.delimiter); + this.delimiterEmitted = true; + } + var delimiter = this.conv.parseRuntime.delimiter; + var rowArr = fileline.split(delimiter); + if (quote === "off") { + if (trim) { + for (var i = 0; i < rowArr.length; i++) { + rowArr[i] = rowArr[i].trim(); + } + } + return { cells: rowArr, closed: true }; + } + else { + return this.toCSVRow(rowArr, trim, quote, delimiter); + } + }; + RowSplit.prototype.toCSVRow = function (rowArr, trim, quote, delimiter) { + var row = []; + var inquote = false; + var quoteBuff = ''; + for (var i = 0, rowLen = rowArr.length; i < rowLen; i++) { + var e = rowArr[i]; + if (!inquote && trim) { + e = util_1.trimLeft(e); + } + var len = e.length; + if (!inquote) { + if (len === 2 && e === this.quote + this.quote) { + row.push(""); + continue; + } + else if (this.isQuoteOpen(e)) { //quote open + e = e.substr(1); + if (this.isQuoteClose(e)) { //quote close + e = e.substring(0, e.lastIndexOf(quote)); + e = this.escapeQuote(e); + row.push(e); + continue; + } + else if (e.indexOf(quote) !== -1) { + var count = 0; + var prev = ""; + for (var _i = 0, e_1 = e; _i < e_1.length; _i++) { + var c = e_1[_i]; + // count quotes only if previous character is not escape char + if (c === quote && prev !== this.escape) { + count++; + prev = ""; + } + else { + // save previous char to temp variable + prev = c; + } + } + if (count % 2 === 1) { + if (trim) { + e = util_1.trimRight(e); + } + row.push(quote + e); + continue; + } + else { + inquote = true; + quoteBuff += e; + continue; + } + } + else { + inquote = true; + quoteBuff += e; + continue; + } + } + else { + if (trim) { + e = util_1.trimRight(e); + } + row.push(e); + continue; + } + } + else { //previous quote not closed + if (this.isQuoteClose(e)) { //close double quote + inquote = false; + e = e.substr(0, len - 1); + quoteBuff += delimiter + e; + quoteBuff = this.escapeQuote(quoteBuff); + if (trim) { + quoteBuff = util_1.trimRight(quoteBuff); + } + row.push(quoteBuff); + quoteBuff = ""; + } + else { + quoteBuff += delimiter + e; + } + } + } + // if (!inquote && param._needFilterRow) { + // row = filterRow(row, param); + // } + return { cells: row, closed: !inquote }; + }; + RowSplit.prototype.getDelimiter = function (fileline) { + var checker; + if (this.conv.parseParam.delimiter === "auto") { + checker = defaulDelimiters; + } + else if (this.conv.parseParam.delimiter instanceof Array) { + checker = this.conv.parseParam.delimiter; + } + else { + return this.conv.parseParam.delimiter; + } + var count = 0; + var rtn = ","; + checker.forEach(function (delim) { + var delimCount = fileline.split(delim).length; + if (delimCount > count) { + rtn = delim; + count = delimCount; + } + }); + return rtn; + }; + RowSplit.prototype.isQuoteOpen = function (str) { + var quote = this.quote; + var escape = this.escape; + return str[0] === quote && (str[1] !== quote || + str[1] === escape && (str[2] === quote || str.length === 2)); + }; + RowSplit.prototype.isQuoteClose = function (str) { + var quote = this.quote; + var escape = this.escape; + if (this.conv.parseParam.trim) { + str = util_1.trimRight(str); + } + var count = 0; + var idx = str.length - 1; + while (str[idx] === quote || str[idx] === escape) { + idx--; + count++; + } + return count % 2 !== 0; + }; + // private twoDoubleQuote(str: string): string { + // var twoQuote = this.quote + this.quote; + // var curIndex = -1; + // while ((curIndex = str.indexOf(twoQuote, curIndex)) > -1) { + // str = str.substring(0, curIndex) + str.substring(++curIndex); + // } + // return str; + // } + RowSplit.prototype.escapeQuote = function (segment) { + var key = "es|" + this.quote + "|" + this.escape; + if (this.cachedRegExp[key] === undefined) { + this.cachedRegExp[key] = new RegExp('\\' + this.escape + '\\' + this.quote, 'g'); + } + var regExp = this.cachedRegExp[key]; + // console.log(regExp,segment); + return segment.replace(regExp, this.quote); + }; + RowSplit.prototype.parseMultiLines = function (lines) { + var csvLines = []; + var left = ""; + while (lines.length) { + var line = left + lines.shift(); + var row = this.parse(line); + if (row.cells.length === 0 && this.conv.parseParam.ignoreEmpty) { + continue; + } + if (row.closed || this.conv.parseParam.alwaysSplitAtEOL) { + if (this.conv.parseRuntime.selectedColumns) { + csvLines.push(util_1.filterArray(row.cells, this.conv.parseRuntime.selectedColumns)); + } + else { + csvLines.push(row.cells); + } + left = ""; + } + else { + left = line + (getEol_1.default(line, this.conv.parseRuntime) || "\n"); + } + } + return { rowsCells: csvLines, partial: left }; + }; + return RowSplit; +}()); +exports.RowSplit = RowSplit; +//# sourceMappingURL=rowSplit.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/rowSplit.js.map b/node_modules/csvtojson/v2/rowSplit.js.map new file mode 100644 index 0000000..19f8091 --- /dev/null +++ b/node_modules/csvtojson/v2/rowSplit.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rowSplit.js","sourceRoot":"","sources":["../src/rowSplit.ts"],"names":[],"mappings":";;;;;AAGA,oDAA8B;AAC9B,+BAA0D;AAE1D,IAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACpD;IAaE,kBAAoB,IAAe;QAAf,SAAI,GAAJ,IAAI,CAAW;QAT3B,iBAAY,GAA8B,EAAE,CAAC;QAC7C,qBAAgB,GAAG,KAAK,CAAC;QACzB,uBAAkB,GAAa,SAAS,CAAC;QAQ/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IACvC,CAAC;IAVD,sBAAY,uCAAiB;aAA7B;YACE,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE;gBACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACvE;YACD,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACjC,CAAC;;;OAAA;IAMD,wBAAK,GAAL,UAAM,QAAkB;QACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;YAC/F,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACpC;QACD,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,YAAY,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;YAClH,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;SAEhE;QACD,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SAC9B;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QACnD,IAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,KAAK,EAAE;YACnB,IAAI,IAAI,EAAE;gBACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACtC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC9B;aACF;YACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACxC;aAAM;YACL,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;SACtD;IAEH,CAAC;IACO,2BAAQ,GAAhB,UAAiB,MAAgB,EAAE,IAAa,EAAE,KAAa,EAAE,SAAiB;QAChF,IAAM,GAAG,GAAa,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YACvD,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE;gBACpB,CAAC,GAAG,eAAQ,CAAC,CAAC,CAAC,CAAC;aACjB;YACD,IAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE;gBACZ,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;oBAC9C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACb,SAAS;iBACV;qBAAM,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,YAAY;oBAC5C,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAChB,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,aAAa;wBACvC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;wBACzC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;wBACxB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACZ,SAAS;qBACV;yBAAM,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE;wBAClC,IAAI,KAAK,GAAG,CAAC,CAAC;wBACd,IAAI,IAAI,GAAG,EAAE,CAAC;wBACd,KAAgB,UAAC,EAAD,OAAC,EAAD,eAAC,EAAD,IAAC;4BAAZ,IAAM,CAAC,UAAA;4BACV,6DAA6D;4BAC7D,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE;gCACvC,KAAK,EAAE,CAAC;gCACR,IAAI,GAAG,EAAE,CAAC;6BACX;iCAAM;gCACL,sCAAsC;gCACtC,IAAI,GAAG,CAAC,CAAC;6BACV;yBACF;wBACD,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE;4BACnB,IAAI,IAAI,EAAE;gCACR,CAAC,GAAG,gBAAS,CAAC,CAAC,CAAC,CAAC;6BAClB;4BACD,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;4BACpB,SAAS;yBACV;6BAAI;4BACH,OAAO,GAAG,IAAI,CAAC;4BACf,SAAS,IAAI,CAAC,CAAC;4BACf,SAAS;yBACV;qBACF;yBACI;wBACH,OAAO,GAAG,IAAI,CAAC;wBACf,SAAS,IAAI,CAAC,CAAC;wBACf,SAAS;qBACV;iBACF;qBAAM;oBACL,IAAI,IAAI,EAAE;wBACR,CAAC,GAAG,gBAAS,CAAC,CAAC,CAAC,CAAC;qBAClB;oBACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACZ,SAAS;iBACV;aACF;iBAAM,EAAE,2BAA2B;gBAClC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,oBAAoB;oBAC9C,OAAO,GAAG,KAAK,CAAC;oBAChB,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;oBACzB,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC;oBAC3B,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;oBACxC,IAAI,IAAI,EAAE;wBACR,SAAS,GAAG,gBAAS,CAAC,SAAS,CAAC,CAAC;qBAClC;oBACD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBACpB,SAAS,GAAG,EAAE,CAAC;iBAChB;qBAAM;oBACL,SAAS,IAAI,SAAS,GAAG,CAAC,CAAC;iBAC5B;aACF;SACF;QAED,0CAA0C;QAC1C,iCAAiC;QACjC,IAAI;QAEJ,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;IAC1C,CAAC;IACO,+BAAY,GAApB,UAAqB,QAAkB;QACrC,IAAI,OAAO,CAAC;QACZ,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,KAAK,MAAM,EAAE;YAC7C,OAAO,GAAG,gBAAgB,CAAC;SAC5B;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,YAAY,KAAK,EAAE;YAC1D,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;SAC1C;aAAM;YACL,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;SACvC;QACD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,GAAG,CAAC;QACd,OAAO,CAAC,OAAO,CAAC,UAAU,KAAK;YAC7B,IAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YAChD,IAAI,UAAU,GAAG,KAAK,EAAE;gBACtB,GAAG,GAAG,KAAK,CAAC;gBACZ,KAAK,GAAG,UAAU,CAAC;aACpB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IACO,8BAAW,GAAnB,UAAoB,GAAW;QAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CACzB,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK;YAChB,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IACO,+BAAY,GAApB,UAAqB,GAAW;QAC9B,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAC7B,GAAG,GAAG,gBAAS,CAAC,GAAG,CAAC,CAAC;SACtB;QACD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE;YAChD,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;SACT;QACD,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,gDAAgD;IAChD,4CAA4C;IAC5C,uBAAuB;IACvB,gEAAgE;IAChE,oEAAoE;IACpE,MAAM;IACN,gBAAgB;IAChB,IAAI;IAGI,8BAAW,GAAnB,UAAoB,OAAe;QACjC,IAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACnD,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SAClF;QACD,IAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtC,+BAA+B;QAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,kCAAe,GAAf,UAAgB,KAAiB;QAC/B,IAAM,QAAQ,GAAe,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,KAAK,CAAC,MAAM,EAAE;YACnB,IAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAClC,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;gBAC9D,SAAS;aACV;YACD,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;gBACvD,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE;oBAC1C,QAAQ,CAAC,IAAI,CAAC,kBAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;iBAC/E;qBAAM;oBACL,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBAC1B;gBAED,IAAI,GAAG,EAAE,CAAC;aACX;iBAAM;gBACL,IAAI,GAAG,IAAI,GAAG,CAAC,gBAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,CAAC;aAC9D;SACF;QACD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IACH,eAAC;AAAD,CAAC,AApND,IAoNC;AApNY,4BAAQ"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/util.d.ts b/node_modules/csvtojson/v2/util.d.ts new file mode 100644 index 0000000..12cda58 --- /dev/null +++ b/node_modules/csvtojson/v2/util.d.ts @@ -0,0 +1,6 @@ +/// +export declare function bufFromString(str: string): Buffer; +export declare function emptyBuffer(): Buffer; +export declare function filterArray(arr: any[], filter: number[]): any[]; +export declare const trimLeft: (str: string) => string; +export declare const trimRight: (str: string) => string; diff --git a/node_modules/csvtojson/v2/util.js b/node_modules/csvtojson/v2/util.js new file mode 100644 index 0000000..02ea1cb --- /dev/null +++ b/node_modules/csvtojson/v2/util.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function bufFromString(str) { + var length = Buffer.byteLength(str); + var buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(length) + : new Buffer(length); + buffer.write(str); + return buffer; +} +exports.bufFromString = bufFromString; +function emptyBuffer() { + var buffer = Buffer.allocUnsafe + ? Buffer.allocUnsafe(0) + : new Buffer(0); + return buffer; +} +exports.emptyBuffer = emptyBuffer; +function filterArray(arr, filter) { + var rtn = []; + for (var i = 0; i < arr.length; i++) { + if (filter.indexOf(i) > -1) { + rtn.push(arr[i]); + } + } + return rtn; +} +exports.filterArray = filterArray; +exports.trimLeft = String.prototype.trimLeft ? function trimLeftNative(str) { + return str.trimLeft(); +} : function trimLeftRegExp(str) { + return str.replace(/^\s+/, ""); +}; +exports.trimRight = String.prototype.trimRight ? function trimRightNative(str) { + return str.trimRight(); +} : function trimRightRegExp(str) { + return str.replace(/\s+$/, ""); +}; +//# sourceMappingURL=util.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/util.js.map b/node_modules/csvtojson/v2/util.js.map new file mode 100644 index 0000000..6e2d530 --- /dev/null +++ b/node_modules/csvtojson/v2/util.js.map @@ -0,0 +1 @@ +{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAAA,uBAA8B,GAAW;IACvC,IAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC,IAAM,MAAM,GAAG,MAAM,CAAC,WAAW;QAC/B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AAPD,sCAOC;AAED;IACE,IAAM,MAAM,GAAG,MAAM,CAAC,WAAW;QAC/B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AALD,kCAKC;AAED,qBAA4B,GAAU,EAAE,MAAgB;IACtD,IAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACnC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YAC1B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB;KACF;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AARD,kCAQC;AAEY,QAAA,QAAQ,GAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAA,CAAC,CAAA,wBAAwB,GAAU;IAChF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAA,CAAC,CAAA,wBAAwB,GAAU;IAClC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC,CAAA;AAEY,QAAA,SAAS,GAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAA,CAAC,CAAA,yBAAyB,GAAU;IACnF,OAAO,GAAG,CAAC,SAAS,EAAE,CAAC;AACzB,CAAC,CAAA,CAAC,CAAA,yBAAyB,GAAU;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC,CAAA"} \ No newline at end of file diff --git a/node_modules/csvtojson/v2/worker.d.ts b/node_modules/csvtojson/v2/worker.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/csvtojson/v2/worker.js b/node_modules/csvtojson/v2/worker.js new file mode 100644 index 0000000..498089b --- /dev/null +++ b/node_modules/csvtojson/v2/worker.js @@ -0,0 +1,72 @@ +"use strict"; +// import { Converter } from "./Converter"; +// import { Message, InitMessage, EOM } from "./ProcessFork"; +// import CSVError from "./CSVError"; +// import { CSVParseParam } from "./Parameters"; +// process.on("message", processMsg); +// let conv: Converter; +// function processMsg(msg: Message) { +// if (msg.cmd === "init") { +// const param = prepareParams((msg as InitMessage).params); +// param.fork = false; +// conv = new Converter(param); +// process.stdin.pipe(conv).pipe(process.stdout); +// conv.on("error", (err) => { +// if ((err as CSVError).line) { +// process.stderr.write(JSON.stringify({ +// err: (err as CSVError).err, +// line: (err as CSVError).line, +// extra: (err as CSVError).extra +// })) +// } else { +// process.stderr.write(JSON.stringify({ +// err: err.message, +// line: -1, +// extra: "Unknown error" +// })); +// } +// }); +// conv.on("eol", (eol) => { +// // console.log("eol!!!",eol); +// if (process.send) +// process.send({ cmd: "eol", "value": eol }); +// }) +// conv.on("header", (header) => { +// if (process.send) +// process.send({ cmd: "header", "value": header }); +// }) +// conv.on("done", () => { +// const drained = process.stdout.write("", () => { +// if (drained) { +// gracelyExit(); +// } +// }); +// if (!drained) { +// process.stdout.on("drain", gracelyExit) +// } +// // process.stdout.write(EOM); +// }) +// if (process.send) { +// process.send({ cmd: "inited" }); +// } +// } +// } +// function gracelyExit(){ +// setTimeout(()=>{ +// conv.removeAllListeners(); +// process.removeAllListeners(); +// },50); +// } +// function prepareParams(p: any): CSVParseParam { +// if (p.ignoreColumns) { +// p.ignoreColumns = new RegExp(p.ignoreColumns.source, p.ignoreColumns.flags) +// } +// if (p.includeColumns) { +// p.includeColumns = new RegExp(p.includeColumns.source, p.includeColumns.flags) +// } +// return p; +// } +// process.on("disconnect", () => { +// process.exit(-1); +// }); +//# sourceMappingURL=worker.js.map \ No newline at end of file diff --git a/node_modules/csvtojson/v2/worker.js.map b/node_modules/csvtojson/v2/worker.js.map new file mode 100644 index 0000000..0ac0976 --- /dev/null +++ b/node_modules/csvtojson/v2/worker.js.map @@ -0,0 +1 @@ +{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C,6DAA6D;AAC7D,qCAAqC;AACrC,gDAAgD;AAChD,qCAAqC;AACrC,uBAAuB;AACvB,sCAAsC;AACtC,8BAA8B;AAC9B,gEAAgE;AAChE,0BAA0B;AAC1B,mCAAmC;AACnC,qDAAqD;AACrD,kCAAkC;AAClC,sCAAsC;AACtC,gDAAgD;AAChD,wCAAwC;AACxC,0CAA0C;AAC1C,2CAA2C;AAC3C,cAAc;AACd,iBAAiB;AACjB,gDAAgD;AAChD,8BAA8B;AAC9B,sBAAsB;AACtB,mCAAmC;AACnC,eAAe;AACf,UAAU;AAEV,UAAU;AACV,gCAAgC;AAChC,sCAAsC;AACtC,0BAA0B;AAC1B,sDAAsD;AACtD,SAAS;AACT,sCAAsC;AACtC,0BAA0B;AAC1B,4DAA4D;AAC5D,SAAS;AACT,8BAA8B;AAC9B,yDAAyD;AACzD,yBAAyB;AACzB,2BAA2B;AAC3B,YAAY;AACZ,YAAY;AACZ,wBAAwB;AACxB,kDAAkD;AAClD,UAAU;AAGV,sCAAsC;AACtC,SAAS;AACT,0BAA0B;AAC1B,yCAAyC;AACzC,QAAQ;AAGR,MAAM;AACN,IAAI;AACJ,0BAA0B;AAC1B,qBAAqB;AACrB,iCAAiC;AACjC,oCAAoC;AACpC,WAAW;AACX,IAAI;AACJ,kDAAkD;AAClD,2BAA2B;AAC3B,kFAAkF;AAClF,MAAM;AACN,4BAA4B;AAC5B,qFAAqF;AACrF,MAAM;AACN,cAAc;AACd,IAAI;AAEJ,mCAAmC;AACnC,sBAAsB;AACtB,MAAM"} \ No newline at end of file diff --git a/node_modules/csvtojson/webpack.config.js b/node_modules/csvtojson/webpack.config.js new file mode 100644 index 0000000..212cb7b --- /dev/null +++ b/node_modules/csvtojson/webpack.config.js @@ -0,0 +1,66 @@ +var webpack = require('webpack') +var path = require('path') + + + + +/* + * SplitChunksPlugin is enabled by default and replaced + * deprecated CommonsChunkPlugin. It automatically identifies modules which + * should be splitted of chunk by heuristics using module duplication count and + * module category (i. e. node_modules). And splits the chunks… + * + * It is safe to remove "splitChunks" from the generated configuration + * and was added as an educational example. + * + * https://webpack.js.org/plugins/split-chunks-plugin/ + * + */ + +/* + * We've enabled UglifyJSPlugin for you! This minifies your app + * in order to load faster and run less javascript. + * + * https://github.com/webpack-contrib/uglifyjs-webpack-plugin + * + */ + +var UglifyJSPlugin = require('uglifyjs-webpack-plugin'); + + + + +module.exports = { + module: { + rules: [] + }, + + entry: "./index.js", + + output: { + filename: 'browser.js', + path: path.resolve(__dirname, 'browser'), + libraryTarget: "commonjs2" + }, + + mode: 'production', + plugins: [ + new UglifyJSPlugin(), + new webpack.IgnorePlugin(/fs/), + ], + optimization: { + splitChunks: { + cacheGroups: { + vendors: { + priority: -10, + test: /[\\/]node_modules[\\/]/ + } + }, + + chunks: 'async', + minChunks: 1, + minSize: 30000, + name: true + } + } +} \ No newline at end of file diff --git a/node_modules/is-utf8/LICENSE b/node_modules/is-utf8/LICENSE new file mode 100644 index 0000000..2c8d4b9 --- /dev/null +++ b/node_modules/is-utf8/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (C) 2014 Wei Fanzhe + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +   +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/is-utf8/README.md b/node_modules/is-utf8/README.md new file mode 100644 index 0000000..b62ddde --- /dev/null +++ b/node_modules/is-utf8/README.md @@ -0,0 +1,16 @@ +#utf8 detector + +Detect if a Buffer is utf8 encoded. +It need The minimum amount of bytes is 4. + + +```javascript + var fs = require('fs'); + var isUtf8 = require('is-utf8'); + var ansi = fs.readFileSync('ansi.txt'); + var utf8 = fs.readFileSync('utf8.txt'); + + console.log('ansi.txt is utf8: '+isUtf8(ansi)); //false + console.log('utf8.txt is utf8: '+isUtf8(utf8)); //true +``` + diff --git a/node_modules/is-utf8/is-utf8.js b/node_modules/is-utf8/is-utf8.js new file mode 100644 index 0000000..8a5f15d --- /dev/null +++ b/node_modules/is-utf8/is-utf8.js @@ -0,0 +1,76 @@ + +exports = module.exports = function(bytes) +{ + var i = 0; + while(i < bytes.length) + { + if( (// ASCII + bytes[i] == 0x09 || + bytes[i] == 0x0A || + bytes[i] == 0x0D || + (0x20 <= bytes[i] && bytes[i] <= 0x7E) + ) + ) { + i += 1; + continue; + } + + if( (// non-overlong 2-byte + (0xC2 <= bytes[i] && bytes[i] <= 0xDF) && + (0x80 <= bytes[i+1] && bytes[i+1] <= 0xBF) + ) + ) { + i += 2; + continue; + } + + if( (// excluding overlongs + bytes[i] == 0xE0 && + (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && + (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) + ) || + (// straight 3-byte + ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) || + bytes[i] == 0xEE || + bytes[i] == 0xEF) && + (0x80 <= bytes[i + 1] && bytes[i+1] <= 0xBF) && + (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF) + ) || + (// excluding surrogates + bytes[i] == 0xED && + (0x80 <= bytes[i+1] && bytes[i+1] <= 0x9F) && + (0x80 <= bytes[i+2] && bytes[i+2] <= 0xBF) + ) + ) { + i += 3; + continue; + } + + if( (// planes 1-3 + bytes[i] == 0xF0 && + (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && + (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && + (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) + ) || + (// planes 4-15 + (0xF1 <= bytes[i] && bytes[i] <= 0xF3) && + (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) && + (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && + (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) + ) || + (// plane 16 + bytes[i] == 0xF4 && + (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) && + (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) && + (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF) + ) + ) { + i += 4; + continue; + } + + return false; + } + + return true; +} diff --git a/node_modules/is-utf8/package.json b/node_modules/is-utf8/package.json new file mode 100644 index 0000000..dab1234 --- /dev/null +++ b/node_modules/is-utf8/package.json @@ -0,0 +1,19 @@ +{ + "name": "is-utf8", + "version": "0.2.1", + "description": "Detect if a buffer is utf8 encoded.", + "main": "is-utf8.js", + "scripts": { + "test": "node test.js" + }, + "repository": "https://github.com/wayfind/is-utf8.git", + "keywords": [ + "utf8", + "charset" + ], + "files": [ + "is-utf8.js" + ], + "author": "wayfind", + "license": "MIT" +} diff --git a/node_modules/json2csv/.eslintrc b/node_modules/json2csv/.eslintrc new file mode 100644 index 0000000..da0a550 --- /dev/null +++ b/node_modules/json2csv/.eslintrc @@ -0,0 +1,10 @@ +{ + "env": { + "node": true, + "es6": true + }, + "parserOptions": { + "ecmaVersion": 8 + }, + "extends": "eslint:recommended" +} diff --git a/node_modules/json2csv/.gitattributes b/node_modules/json2csv/.gitattributes new file mode 100644 index 0000000..9834512 --- /dev/null +++ b/node_modules/json2csv/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +test/fixtures/csv/eol.csv text eol=crlf +test/fixtures/csv/escapeEOL.csv text eol=crlf diff --git a/node_modules/json2csv/CHANGELOG.md b/node_modules/json2csv/CHANGELOG.md new file mode 100644 index 0000000..5c22efa --- /dev/null +++ b/node_modules/json2csv/CHANGELOG.md @@ -0,0 +1,614 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [5.0.7](https://github.com/zemirco/json2csv/compare/v5.0.6...v5.0.7) (2022-02-23) + + +### Bug Fixes + +* unwind transform issue with nested arrays ([#549](https://github.com/zemirco/json2csv/issues/549)) ([485ea77](https://github.com/zemirco/json2csv/commit/485ea77886f1e09d768ed1cce0af6faeb06707cf)) + +### [5.0.6](https://github.com/zemirco/json2csv/compare/v5.0.5...v5.0.6) (2021-02-03) + + +### Bug Fixes + +* Escape quotes excel ([#512](https://github.com/zemirco/json2csv/issues/512)) ([ab3bf8a](https://github.com/zemirco/json2csv/commit/ab3bf8ad3ce64cff7d6149e1b70f92b71bebf6c7)) + +### [5.0.5](https://github.com/zemirco/json2csv/compare/v5.0.4...v5.0.5) (2020-11-16) + + +### Bug Fixes + +* don't mutate original object in unset ([#499](https://github.com/zemirco/json2csv/issues/499)) ([6e4ea5e](https://github.com/zemirco/json2csv/commit/6e4ea5ebdc263006ca6ff45879fbb7e0bd65bef2)) + +### [5.0.4](https://github.com/zemirco/json2csv/compare/v5.0.3...v5.0.4) (2020-11-10) + + +### Bug Fixes + +* Fix issue with unwind and empty arrays creating an extra column ([#496](https://github.com/zemirco/json2csv/issues/496)) ([0b331fc](https://github.com/zemirco/json2csv/commit/0b331fc3ad345f8062abe60f64cb3b43dad30fb0)) + +### [5.0.3](https://github.com/zemirco/json2csv/compare/v5.0.2...v5.0.3) (2020-09-24) + + +### Bug Fixes + +* audit dependencies fix ([d6d0fc7](https://github.com/zemirco/json2csv/commit/d6d0fc78128e01e021414aaf52a65cbcd09a1225)) +* update commander dep ([322e568](https://github.com/zemirco/json2csv/commit/322e568793ec4a64f43ec2ac82c9886177bcc4ed)) + +### [5.0.2](https://github.com/zemirco/json2csv/compare/v5.0.1...v5.0.2) (2020-09-24) + + +### Bug Fixes + +* **cli:** fix relative paths issue in CLI when not streaming ([#488](https://github.com/zemirco/json2csv/issues/488)) ([06079e8](https://github.com/zemirco/json2csv/commit/06079e840128030eacfecde66da11295eb162234)) + +### [5.0.1](https://github.com/zemirco/json2csv/compare/v5.0.0...v5.0.1) (2020-04-28) + + +### Bug Fixes + +* wrong call to processValue ([#454](https://github.com/zemirco/json2csv/issues/454)) ([66abd45](https://github.com/zemirco/json2csv/commit/66abd45)) + +## [5.0.0](https://github.com/zemirco/json2csv/compare/v4.5.2...v5.0.0) (2020-03-15) + + +### ⚠ BREAKING CHANGES + +* Node 8 and 9 no longer supported, use Node 10 or greater. It might still work, but it has reached End-Of-Life. +* module no longer takes `unwind`, `unwindBlank`, `flatten` or the `flattenSeparator` options, instead see the new `transforms` option. CLI options are unchanged from the callers side, but use the built in transforms under the hood. + +* Add support for transforms + +* Add documentation about transforms +* remove extra commonjs build, use starting point in package.json `main` field. +* Renamed `doubleQuote` to `escapedQuote` +* remove `stringify` option +* `--fields-config` option has been removed, use the new `--config` option for all configuration, not just fields. +* Drop node 6 and 7, and add node 11 and 12 + +### Bug Fixes + +* Always error asynchronously from parseAsync method ([#412](https://github.com/zemirco/json2csv/issues/412)) ([16cc044](https://github.com/zemirco/json2csv/commit/16cc044)) +* audit deps ([15992cf](https://github.com/zemirco/json2csv/commit/15992cf)) +* drop Node 8 and 9 ([7295465](https://github.com/zemirco/json2csv/commit/7295465)) +* Make some CLI options mandatory ([#433](https://github.com/zemirco/json2csv/issues/433)) ([bd51527](https://github.com/zemirco/json2csv/commit/bd51527)) +* Remove CommonJS build ([#422](https://github.com/zemirco/json2csv/issues/422)) ([5ce0089](https://github.com/zemirco/json2csv/commit/5ce0089)) +* Remove stringify option ([#419](https://github.com/zemirco/json2csv/issues/419)) ([39f303d](https://github.com/zemirco/json2csv/commit/39f303d)) +* Rename doubleQuote to escapedQuote ([#418](https://github.com/zemirco/json2csv/issues/418)) ([f99408c](https://github.com/zemirco/json2csv/commit/f99408c)) +* update CI node versions ([#413](https://github.com/zemirco/json2csv/issues/413)) ([6fd6c09](https://github.com/zemirco/json2csv/commit/6fd6c09)) +* update commander cli dep ([74aa40a](https://github.com/zemirco/json2csv/commit/74aa40a)) +* update commander dep ([272675b](https://github.com/zemirco/json2csv/commit/272675b)) +* **deps:** audit dependencies ([bf9877a](https://github.com/zemirco/json2csv/commit/bf9877a)) +* **deps:** update commander ([3f099f2](https://github.com/zemirco/json2csv/commit/3f099f2)) +* **security:** fix audit vulnerabilities ([b57715b](https://github.com/zemirco/json2csv/commit/b57715b)) + + +### Features + +* Add support for flattening arrays and change transforms arguments to an object. ([#432](https://github.com/zemirco/json2csv/issues/432)) ([916e448](https://github.com/zemirco/json2csv/commit/916e448)) +* Add support for transforms ([#431](https://github.com/zemirco/json2csv/issues/431)) ([f1d04d0](https://github.com/zemirco/json2csv/commit/f1d04d0)) +* Improve async promise to optionally not return ([#421](https://github.com/zemirco/json2csv/issues/421)) ([3e296f6](https://github.com/zemirco/json2csv/commit/3e296f6)) +* Improves the unwind transform so it unwinds all unwindable fields if … ([#434](https://github.com/zemirco/json2csv/issues/434)) ([ec1f301](https://github.com/zemirco/json2csv/commit/ec1f301)) +* replace fields config by a global config ([#338](https://github.com/zemirco/json2csv/issues/338)) ([d6c1c5f](https://github.com/zemirco/json2csv/commit/d6c1c5f)) + +## [4.5.2](https://github.com/zemirco/json2csv/compare/v4.5.1...v4.5.2) (2019-07-05) + + +### Bug Fixes + +* Improve the inference of the header name when using function as value ([#395](https://github.com/zemirco/json2csv/issues/395)) ([590d19a](https://github.com/zemirco/json2csv/commit/590d19a)) + + + + +## [4.4.0](https://github.com/zemirco/json2csv/compare/v4.3.5...v4.4.0) (2019-03-25) + + +### Features + +* Performance improvements and new async api ([#360](https://github.com/zemirco/json2csv/issues/360)) ([d59dea1](https://github.com/zemirco/json2csv/commit/d59dea1)) + + + +## [4.3.5](https://github.com/zemirco/json2csv/compare/v4.3.4...v4.3.5) (2019-02-22) + + +### Bug Fixes + +* audit deps ([3182707](https://github.com/zemirco/json2csv/commit/3182707)) +* unwind of nested fields ([#357](https://github.com/zemirco/json2csv/issues/357)) ([2d69281](https://github.com/zemirco/json2csv/commit/2d69281)) + + + + +## [4.3.4](https://github.com/zemirco/json2csv/compare/v4.3.3...v4.3.4) (2019-02-11) + + +### Bug Fixes + +* issue with fields.value function not receiving correct fields ([#353](https://github.com/zemirco/json2csv/issues/353)) ([851c02f](https://github.com/zemirco/json2csv/commit/851c02f)) + + + + +## [4.3.3](https://github.com/zemirco/json2csv/compare/v4.3.2...v4.3.3) (2019-01-11) + + +### Bug Fixes + +* audit dep fix ([1ef4bcd](https://github.com/zemirco/json2csv/commit/1ef4bcd)) +* Remove invalid reference to flat ([#347](https://github.com/zemirco/json2csv/issues/347)) ([130ef7d](https://github.com/zemirco/json2csv/commit/130ef7d)) +* Remove preferGlobal from package.json ([#346](https://github.com/zemirco/json2csv/issues/346)) ([2b6ad3a](https://github.com/zemirco/json2csv/commit/2b6ad3a)) + + + + +## [4.3.2](https://github.com/zemirco/json2csv/compare/v4.3.1...v4.3.2) (2018-12-08) + + +### Bug Fixes + +* Remove lodash.clonedeep dependency ([#339](https://github.com/zemirco/json2csv/issues/339)) ([d28955a](https://github.com/zemirco/json2csv/commit/d28955a)), closes [#333](https://github.com/zemirco/json2csv/issues/333) + + + + +## [4.3.1](https://github.com/zemirco/json2csv/compare/v4.3.0...v4.3.1) (2018-11-17) + + +### Bug Fixes + +* Return correct exit code on error ([#337](https://github.com/zemirco/json2csv/issues/337)) ([a793de5](https://github.com/zemirco/json2csv/commit/a793de5)) + + + + +# [4.3.0](https://github.com/zemirco/json2csv/compare/v4.2.1...v4.3.0) (2018-11-05) + + +### Bug Fixes + +* Optimize performance around the usage of fields ([#328](https://github.com/zemirco/json2csv/issues/328)) ([d9e4463](https://github.com/zemirco/json2csv/commit/d9e4463)) +* Remove wrong submodule ([#326](https://github.com/zemirco/json2csv/issues/326)) ([6486bb0](https://github.com/zemirco/json2csv/commit/6486bb0)) + + +### Features + +* Add support for objectMode in the stream API ([#325](https://github.com/zemirco/json2csv/issues/325)) ([8f0ae55](https://github.com/zemirco/json2csv/commit/8f0ae55)) + + + + +## [4.2.1](https://github.com/zemirco/json2csv/compare/v4.2.0...v4.2.1) (2018-08-06) + + +### Bug Fixes + +* bug that modifies opts after parsing an object/stream ([#318](https://github.com/zemirco/json2csv/issues/318)) ([f0a4830](https://github.com/zemirco/json2csv/commit/f0a4830)) +* Clean up the flattening separator feature ([#315](https://github.com/zemirco/json2csv/issues/315)) ([ee3d181](https://github.com/zemirco/json2csv/commit/ee3d181)) + + + + +# [4.2.0](https://github.com/zemirco/json2csv/compare/v4.1.6...v4.2.0) (2018-07-31) + + +### Features + +* Added flattenSeparator option ([#314](https://github.com/zemirco/json2csv/issues/314)) ([5c5de9f](https://github.com/zemirco/json2csv/commit/5c5de9f)) + + + + +## [4.1.6](https://github.com/zemirco/json2csv/compare/v4.1.5...v4.1.6) (2018-07-12) + + +### Bug Fixes + +* Update dependencies and remove cli-table2 dependency ([#312](https://github.com/zemirco/json2csv/issues/312)) ([5981ba3](https://github.com/zemirco/json2csv/commit/5981ba3)) + + + + +## [4.1.5](https://github.com/zemirco/json2csv/compare/v4.1.4...v4.1.5) (2018-06-26) + + +### Bug Fixes + +* Process stdin as a stream ([#308](https://github.com/zemirco/json2csv/issues/308)) ([2b186b6](https://github.com/zemirco/json2csv/commit/2b186b6)) + + + + +## [4.1.4](https://github.com/zemirco/json2csv/compare/v4.1.3...v4.1.4) (2018-06-23) + + +### Bug Fixes + +* don't escape tabs ([#305](https://github.com/zemirco/json2csv/issues/305)) ([a36c8e3](https://github.com/zemirco/json2csv/commit/a36c8e3)) + + + + +## [4.1.3](https://github.com/zemirco/json2csv/compare/v4.1.2...v4.1.3) (2018-05-23) + + +### Bug Fixes + +* Escape custom quotes correctly ([#301](https://github.com/zemirco/json2csv/issues/301)) ([7d57208](https://github.com/zemirco/json2csv/commit/7d57208)) + + + + +## [4.1.2](https://github.com/zemirco/json2csv/compare/v4.1.1...v4.1.2) (2018-04-16) + + +### Bug Fixes + +* **tests:** Skip bogus pretty print tests only in old node versions ([#290](https://github.com/zemirco/json2csv/issues/290)) ([0f3b885](https://github.com/zemirco/json2csv/commit/0f3b885)) + + + + +## [4.1.1](https://github.com/zemirco/json2csv/compare/v4.1.0...v4.1.1) (2018-04-16) + + +### Bug Fixes + +* readme CLI's info ([#289](https://github.com/zemirco/json2csv/issues/289)) ([9fe65b3](https://github.com/zemirco/json2csv/commit/9fe65b3)) +* Add tests and docs to unwind-blank feature ([#287](https://github.com/zemirco/json2csv/issues/287)) ([e3d4a05](https://github.com/zemirco/json2csv/commit/e3d4a05)) +* **perf:** Improve unwind performance and maintainability ([#288](https://github.com/zemirco/json2csv/issues/288)) ([80e496d](https://github.com/zemirco/json2csv/commit/80e496d)) + + + + +## [4.1.0](https://github.com/zemirco/json2csv/compare/v4.0.4...v4.1.0) (2018-04-16) + + +### Bug Fixes + +* Avoid redundant deep cloning when unwinding. ([#286](https://github.com/zemirco/json2csv/issues/286)) ([95a6ca9](https://github.com/zemirco/json2csv/commit/95a6ca9)) + + +### Features + +* Add ability to unwind by blanking out instead of repeating data ([#285](https://github.com/zemirco/json2csv/issues/285)) ([61d9808](https://github.com/zemirco/json2csv/commit/61d9808)) + + + + +## [4.0.4](https://github.com/zemirco/json2csv/compare/v4.0.3...v4.0.4) (2018-04-10) + + +### Bug Fixes + +* comment out failing tests ([#283](https://github.com/zemirco/json2csv/issues/283)) ([5b25eaa](https://github.com/zemirco/json2csv/commit/5b25eaa)) +* Support empty array with opts.fields ([#281](https://github.com/zemirco/json2csv/issues/281)) ([eccca89](https://github.com/zemirco/json2csv/commit/eccca89)) +* **tests:** emit correct lines from transform ([#282](https://github.com/zemirco/json2csv/issues/282)) ([2322ddf](https://github.com/zemirco/json2csv/commit/2322ddf)) + + + + +## [4.0.3](https://github.com/zemirco/json2csv/compare/v4.0.2...v4.0.3) (2018-04-09) + + +### Bug Fixes + +* error when a field is null and flatten is used ([#274](https://github.com/zemirco/json2csv/issues/274)) ([1349a94](https://github.com/zemirco/json2csv/commit/1349a94)) +* throw error for empty dataset only if fields not specified ([0d8534e](https://github.com/zemirco/json2csv/commit/0d8534e)) + + + + +## [4.0.2](https://github.com/zemirco/json2csv/compare/v4.0.1...v4.0.2) (2018-03-09) + + +### Bug Fixes + +* **parser:** RangeError ([#271](https://github.com/zemirco/json2csv/issues/271)) ([c8d5a87](https://github.com/zemirco/json2csv/commit/c8d5a87)) + + + + +## [4.0.1](https://github.com/zemirco/json2csv/compare/v4.0.0...v4.0.1) (2018-03-05) + + +### Bug Fixes + +* double quote escaping before new line ([#268](https://github.com/zemirco/json2csv/issues/268)) ([fa991cf](https://github.com/zemirco/json2csv/commit/fa991cf)) + + + + +# [4.0.0](https://github.com/zemirco/json2csv/compare/v4.0.0-alpha.2...v4.0.0) (2018-02-27) + + +### Bug Fixes + +* Replace webpack with rollup packaging ([#266](https://github.com/zemirco/json2csv/issues/266)) ([a9f8020](https://github.com/zemirco/json2csv/commit/a9f8020)) + + +### Features + +* Pass transform options through ([#262](https://github.com/zemirco/json2csv/issues/262)) ([650913f](https://github.com/zemirco/json2csv/commit/650913f)) + + + + +# [4.0.0-alpha.2](https://github.com/zemirco/json2csv/compare/v4.0.0-alpha.1...v4.0.0-alpha.2) (2018-02-25) + + +### Bug Fixes + +* flatten issue with toJSON ([#259](https://github.com/zemirco/json2csv/issues/259)) ([7006d2b](https://github.com/zemirco/json2csv/commit/7006d2b)) + + + + +# [4.0.0-alpha.1](https://github.com/zemirco/json2csv/compare/v4.0.0-alpha.0...v4.0.0-alpha.1) (2018-02-21) + + +### Bug Fixes + +* Remove TypeScript definition ([#256](https://github.com/zemirco/json2csv/issues/256)) ([4f09694](https://github.com/zemirco/json2csv/commit/4f09694)) + + + + +# [4.0.0-alpha.0](https://github.com/zemirco/json2csv/compare/v3.11.5...v4.0.0-alpha.0) (2018-02-21) + + +### Bug Fixes + +* Add CLI tests ([#247](https://github.com/zemirco/json2csv/issues/247)) ([bb8126f](https://github.com/zemirco/json2csv/commit/bb8126f)) +* Add excel string to cli and standardize ([#231](https://github.com/zemirco/json2csv/issues/231)) ([421baad](https://github.com/zemirco/json2csv/commit/421baad)) +* Allow passing ldjson input files ([#220](https://github.com/zemirco/json2csv/issues/220)) ([9c861ed](https://github.com/zemirco/json2csv/commit/9c861ed)) +* Avoid throwing an error on elements that can't be stringified (like functions) ([#223](https://github.com/zemirco/json2csv/issues/223)) ([679c687](https://github.com/zemirco/json2csv/commit/679c687)) +* backslash logic ([#222](https://github.com/zemirco/json2csv/issues/222)) ([29e9445](https://github.com/zemirco/json2csv/commit/29e9445)) +* broken stdin input ([#241](https://github.com/zemirco/json2csv/issues/241)) ([6cb407c](https://github.com/zemirco/json2csv/commit/6cb407c)) +* Combine EOL and newLine parameters ([#219](https://github.com/zemirco/json2csv/issues/219)) ([4668a8b](https://github.com/zemirco/json2csv/commit/4668a8b)) +* header flag ([#221](https://github.com/zemirco/json2csv/issues/221)) ([7f7338f](https://github.com/zemirco/json2csv/commit/7f7338f)) +* outdated jsdoc ([#243](https://github.com/zemirco/json2csv/issues/243)) ([efe9888](https://github.com/zemirco/json2csv/commit/efe9888)) +* pretty print issues ([#242](https://github.com/zemirco/json2csv/issues/242)) ([3bd9655](https://github.com/zemirco/json2csv/commit/3bd9655)) +* Process header cells as any other cell ([#244](https://github.com/zemirco/json2csv/issues/244)) ([1fcde13](https://github.com/zemirco/json2csv/commit/1fcde13)) +* Remove callback support ([2096ade](https://github.com/zemirco/json2csv/commit/2096ade)) +* Remove fieldNames ([#232](https://github.com/zemirco/json2csv/issues/232)) ([6cc74b2](https://github.com/zemirco/json2csv/commit/6cc74b2)) +* Remove path-is-absolute dependency ([#225](https://github.com/zemirco/json2csv/issues/225)) ([f71a3df](https://github.com/zemirco/json2csv/commit/f71a3df)) +* Rename hasCSVColumnTitle to noHeader ([#216](https://github.com/zemirco/json2csv/issues/216)) ([f053c8b](https://github.com/zemirco/json2csv/commit/f053c8b)) +* Rename ld-json to ndjson ([#240](https://github.com/zemirco/json2csv/issues/240)) ([24a7893](https://github.com/zemirco/json2csv/commit/24a7893)) +* Rename unwindPath to unwind ([#230](https://github.com/zemirco/json2csv/issues/230)) ([7143bc7](https://github.com/zemirco/json2csv/commit/7143bc7)) +* Streamify pretty print ([#248](https://github.com/zemirco/json2csv/issues/248)) ([fb7ad53](https://github.com/zemirco/json2csv/commit/fb7ad53)) + + +### Chores + +* Refactor the entire library to ES6 ([#233](https://github.com/zemirco/json2csv/issues/233)) ([dce4d33](https://github.com/zemirco/json2csv/commit/dce4d33)) + + +### Features + +* add doubleQuote to cli, rename other options to line up with the cli ([5e402dc](https://github.com/zemirco/json2csv/commit/5e402dc)) +* Add fields config option to CLI ([#245](https://github.com/zemirco/json2csv/issues/245)) ([74ef666](https://github.com/zemirco/json2csv/commit/74ef666)) +* Add streaming API ([#235](https://github.com/zemirco/json2csv/issues/235)) ([01ca93e](https://github.com/zemirco/json2csv/commit/01ca93e)) +* Split tests in multiple files ([#246](https://github.com/zemirco/json2csv/issues/246)) ([839de77](https://github.com/zemirco/json2csv/commit/839de77)) + + +### BREAKING CHANGES + +* Replaces field-list with field-config +* Remove `preserveNewLinesInValues` option, preserve by default + +* Refactor the entire library to ES6 + +* Fix PR issues + +* Add strict mode for node 4.X +* Remove fieldNames + +* Increase coverage back to 100% +* callback is no longer available, just return the csv from the json2csv. + +- updated tests +- updated readme +* * Rename unwindPath to unwind + +* Fix field-list in CLI +* newLine removed, eol kept. +* Rename del to delimiter to match the cli flag +* Rename quotes to quote to match the cli flag + +* Remove unused double quotes comment + +* Fix noHeader in CLI + +* Revert "Remove unused double quotes comment" + +This reverts commit 250d3e6ddf3062cbdc1e0174493a37fa21197d8e. + +* Add doubleQuote to CLI +* Rename hasCSVColumnTitle to noHeader to keep in line with the CLI + + + + +## [3.11.5](https://github.com/zemirco/json2csv/compare/v3.11.4...v3.11.5) (2017-10-23) + + +### Bug Fixes + +* backslash value not escaped properly ([#202](https://github.com/zemirco/json2csv/issues/202)) ([#204](https://github.com/zemirco/json2csv/issues/204)) ([2cf50f1](https://github.com/zemirco/json2csv/commit/2cf50f1)) + + + + +## [3.11.4](https://github.com/zemirco/json2csv/compare/v3.11.3...v3.11.4) (2017-10-09) + + +### Bug Fixes + +* **security:** Update debug to 3.1.0 for security reasons ([9c7cfaa](https://github.com/zemirco/json2csv/commit/9c7cfaa)) + + + + +## [3.11.3](https://github.com/zemirco/json2csv/compare/v3.11.2...v3.11.3) (2017-10-09) + + + + +## [3.11.2](https://github.com/zemirco/json2csv/compare/v3.11.1...v3.11.2) (2017-09-13) + + +### Bug Fixes + +* Remove extra space character in mode withBOM: true [#190](https://github.com/zemirco/json2csv/issues/190) ([#194](https://github.com/zemirco/json2csv/issues/194)) ([e8b6f6b](https://github.com/zemirco/json2csv/commit/e8b6f6b)) + + + + +## [3.11.1](https://github.com/zemirco/json2csv/compare/v3.11.0...v3.11.1) (2017-08-11) + + +### Bug Fixes + +* **cli:** pass BOM cli option to function ([#193](https://github.com/zemirco/json2csv/issues/193)) ([70cfdfe](https://github.com/zemirco/json2csv/commit/70cfdfe)) + + + + +# [3.11.0](https://github.com/zemirco/json2csv/compare/v3.10.0...v3.11.0) (2017-08-02) + + +### Bug Fixes + +* Handle dates without double-escaping ([#189](https://github.com/zemirco/json2csv/issues/189)) ([ff514ba](https://github.com/zemirco/json2csv/commit/ff514ba)) +* unwind parameter in command line mode ([#191](https://github.com/zemirco/json2csv/issues/191)) ([e706c25](https://github.com/zemirco/json2csv/commit/e706c25)) + + +### Features + +* Added flag to signal if resulting function value should be stringified or not ([#192](https://github.com/zemirco/json2csv/issues/192)) ([aaa6b05](https://github.com/zemirco/json2csv/commit/aaa6b05)) + + + + +# [3.10.0](https://github.com/zemirco/json2csv/compare/v3.9.1...v3.10.0) (2017-07-24) + + +### Features + +* Add BOM character option ([#187](https://github.com/zemirco/json2csv/issues/187)) ([0c799ca](https://github.com/zemirco/json2csv/commit/0c799ca)) + + + + +## [3.9.1](https://github.com/zemirco/json2csv/compare/v3.9.0...v3.9.1) (2017-07-14) + + + + +# [3.9.0](https://github.com/zemirco/json2csv/compare/v3.8.0...v3.9.0) (2017-07-11) + + +### Features + +* Parameter unwindPath for multiple fields ([#174](https://github.com/zemirco/json2csv/issues/174)) ([#183](https://github.com/zemirco/json2csv/issues/183)) ([fbcaa10](https://github.com/zemirco/json2csv/commit/fbcaa10)) + + + + +# [3.8.0](https://github.com/zemirco/json2csv/compare/v3.7.3...v3.8.0) (2017-07-03) + + +### Bug Fixes + +* **docs:** Add a coma in the ReadMe example ([#181](https://github.com/zemirco/json2csv/issues/181)) ([abeb820](https://github.com/zemirco/json2csv/commit/abeb820)) + + +### Features + +* Preserve new lines in cells with option `preserveNewLinesInValues` ([#91](https://github.com/zemirco/json2csv/issues/91)) ([#171](https://github.com/zemirco/json2csv/issues/171)) ([187b701](https://github.com/zemirco/json2csv/commit/187b701)) + + + + +## [3.7.3](https://github.com/zemirco/json2csv/compare/v3.7.1...v3.7.3) (2016-12-08) + + +### Bug Fixes + +* **jsdoc:** JSDoc Editting ([#155](https://github.com/zemirco/json2csv/issues/155)) ([76075d6](https://github.com/zemirco/json2csv/commit/76075d6)) +* **ts:** Fix type definition ([#154](https://github.com/zemirco/json2csv/issues/154)) ([fae53a1](https://github.com/zemirco/json2csv/commit/fae53a1)) + + + +## 3.6.3 / 2016-08-17 + + * Fix crashing on EPIPE error [#134](https://github.com/zemirco/json2csv/pull/134) + * Add UMD build for browser usage [#136](https://github.com/zemirco/json2csv/pull/136) + * Add docs during prepublish + +## 3.6.2 / 2016-07-22 + + * Remove debugger, see [#132](https://github.com/zemirco/json2csv/pull/132) + * Fix changelog typo + +## 3.6.1 / 2016-07-12 + + * Fix auto-fields returning all available fields, even if not available on the first object, see #104 + +## 3.6.0 / 2016-07-07 + + * Make callback optional + * Make callback use `process.nextTick`, so it's not sync + + Thanks @STRML! + +## 3.5.1 / 2016-06-29 + + * Revert [#114](https://github.com/zemirco/json2csv/pull/114), due to more issues + * Update npmignore + * Add a changelog + * Updatee readme + +## 3.5.0 / 2016-06-21 + + * `includeEmptyRows` options added, see [#122](https://github.com/zemirco/json2csv/pull/122) (Thanks @glutentag) + * `-a` or `--include-empty-rows` added for the CLI. + +## 2.2.1 / 2013-11-10 + + * mainly for development e.g. adding code format, update readme.. + +## 2.2.0 / 2013-11-08 + + * not create CSV column title by passing hasCSVColumnTitle: false, into params. + * if field is not exist in object then the field value in CSV will be empty. + * fix data in object format - {...} + +## 2.1.0 / 2013-06-11 + + * quote titles in the first row + +## 2.0.0 / 2013-03-04 + + * err in callback function + +## 1.3.1 / 2013-02-20 + + * fix stdin encoding + +## 1.3.0 / 2013-02-20 + + * support reading from stdin [#9](https://github.com/zeMirco/json2csv/pull/9) + +## 1.2.0 / 2013-02-20 + + * support custom field names [#8](https://github.com/zeMirco/json2csv/pull/8) + +## 1.1.0 / 2013-01-19 + + * add optional custom delimiter diff --git a/node_modules/json2csv/LICENSE.md b/node_modules/json2csv/LICENSE.md new file mode 100644 index 0000000..0054f10 --- /dev/null +++ b/node_modules/json2csv/LICENSE.md @@ -0,0 +1,14 @@ +Copyright (C) 2012 [Mirco Zeiss](mailto: mirco.zeiss@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and +to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/json2csv/README.md b/node_modules/json2csv/README.md new file mode 100644 index 0000000..b6c55f4 --- /dev/null +++ b/node_modules/json2csv/README.md @@ -0,0 +1,970 @@ +# json2csv + +Converts json into csv with column titles and proper line endings. +Can be used as a module and from the command line. + +[![npm version][npm-badge]][npm-badge-url] +[![Build Status][travis-badge]][travis-badge-url] +[![Coverage Status][coveralls-badge]][coveralls-badge-url] + +See the [CHANGELOG] for details about the latest release. + +## Features + +- Fast and lightweight +- Scalable to infinitely large datasets (using stream processing) +- Support for standard JSON as well as NDJSON +- Advanced data selection (automatic field discovery, underscore-like selectors, custom data getters, default values for missing fields, transforms, etc.) +- Highly customizable (supportting custom quotation marks, delimiters, eol values, etc.) +- Automatic escaping (preserving new lines, quotes, etc. in them) +- Optional headers +- Unicode encoding support +- Pretty printing in table format to stdout + +## How to install + +You can install json2csv as a dependency using NPM. +Requires **Node v10** or higher. + +```sh +# Global so it can be called from anywhere +$ npm install -g json2csv +# or as a dependency of a project +$ npm install json2csv --save +``` + +Also, if you are loading json2csv directly to the browser you can pull it directly from the CDN. + +```html + +``` + +By default, the above script will get the latest release of json2csv. You can also specify a specific version: + +```html + +``` + +## Command Line Interface + +`json2csv` can be called from the command line if installed globally (using the `-g` flag). + +```bash +Usage: json2csv [options] + +Options: + -V, --version output the version number + -i, --input Path and name of the incoming json file. Defaults to stdin. + -o, --output Path and name of the resulting csv file. Defaults to stdout. + -c, --config Specify a file with a valid JSON configuration. + -n, --ndjson Treat the input as NewLine-Delimited JSON. + -s, --no-streaming Process the whole JSON array in memory instead of doing it line by line. + -f, --fields List of fields to process. Defaults to field auto-detection. + -v, --default-value Default value to use for missing fields. + -q, --quote Character(s) to use as quote mark. Defaults to '"'. + -Q, --escaped-quote Character(s) to use as a escaped quote. Defaults to a double `quote`, '""'. + -d, --delimiter Character(s) to use as delimiter. Defaults to ','. (default: ",") + -e, --eol Character(s) to use as End-of-Line for separating rows. Defaults to '\n'. (default: "\n") + -E, --excel-strings Wraps string data to force Excel to interpret it as string even if it contains a number. + -H, --no-header Disable the column name header. + -a, --include-empty-rows Includes empty rows in the resulting CSV output. + -b, --with-bom Includes BOM character at the beginning of the CSV. + -p, --pretty Print output as a pretty table. Use only when printing to console. + --unwind [paths] Creates multiple rows from a single JSON document similar to MongoDB unwind. + --unwind-blank When unwinding, blank out instead of repeating data. Defaults to false. (default: false) + --flatten-objects Flatten nested objects. Defaults to false. (default: false) + --flatten-arrays Flatten nested arrays. Defaults to false. (default: false) + --flatten-separator Flattened keys separator. Defaults to '.'. (default: ".") + -h, --help output usage information +``` + +If no input `-i` is specified the result is expected from to the console standard input. +If no output `-o` is specified the result is printed to the console standard output. +If no fields `-f` or config `-c` are passed the fields of the first element are used since json2csv CLI process the items one at a time. You can use the `--no-streaming` flag to load the entire JSON in memory and get all the headers. However, keep in mind that this is slower and requires much more memory. +Use `-p` to show the result as a table in the console. + +Any option passed through the config file `-c` will be overriden if a specific flag is passed as well. For example, the fields option of the config will be overriden if the fields flag `-f` is used. + +### CLI examples + +All examples use this example [input file](https://github.com/zemirco/json2csv/blob/master/test/fixtures/json/default.json). + +#### Input file and specify fields + +```sh +$ json2csv -i input.json -f carModel,price,color +carModel,price,color +"Audi",10000,"blue" +"BMW",15000,"red" +"Mercedes",20000,"yellow" +"Porsche",30000,"green" +``` + +#### Input file, specify fields and use pretty logging + +```sh +$ json2csv -i input.json -f carModel,price,color -p +``` + +![Screenshot](https://s3.amazonaws.com/zeMirco/github/json2csv/json2csv-pretty.png) + +#### Generating CSV containing only specific fields + +```sh +$ json2csv -i input.json -f carModel,price,color -o out.csv +$ cat out.csv +carModel,price,color +"Audi",10000,"blue" +"BMW",15000,"red" +"Mercedes",20000,"yellow" +"Porsche",30000,"green" +``` + +Same result will be obtained passing the fields config as a file. + +```sh +$ json2csv -i input.json -c fieldsConfig.json -o out.csv +``` + +where the file `fieldsConfig.json` contains + +```json +[ + "carModel", + "price", + "color" +] +``` + +#### Read input from stdin + +```sh +$ json2csv -f price +[{"price":1000},{"price":2000}] +``` + +Hit Enter and afterwards CTRL + D to end reading from stdin. The terminal should show + +``` +price +1000 +2000 +``` + +#### Appending to existing CSV + +Sometimes you want to add some additional rows with the same columns. +This is how you can do that. + +```sh +# Initial creation of csv with headings +$ json2csv -i test.json -f name,version > test.csv +# Append additional rows +$ json2csv -i test.json -f name,version --no-header >> test.csv +``` + +## Javascript module + +`json2csv` can also be use programatically from you javascript codebase. + +### Available Options + +The programatic APIs take a configuration object very equivalent to the CLI options. + +- `fields` - Array of Objects/Strings. Defaults to toplevel JSON attributes. See example below. +- `ndjson` - Only effective on the streaming API. Indicates that data coming through the stream is NDJSON. +- `transforms` - Array of transforms to be applied to each data item. A transform is simply a function that receives a data item and returns the transformed item. +- `defaultValue` - String, default value to use when missing data. Defaults to `` if not specified. (Overridden by `fields[].default`) +- `quote` - String, quote around cell values and column names. Defaults to `"` if not specified. +- `escapedQuote` - String, the value to replace escaped quotes in strings. Defaults to 2x`quotes` (for example `""`) if not specified. +- `delimiter` - String, delimiter of columns. Defaults to `,` if not specified. +- `eol` - String, overrides the default OS line ending (i.e. `\n` on Unix and `\r\n` on Windows). +- `excelStrings` - Boolean, converts string data into normalized Excel style data. +- `header` - Boolean, determines whether or not CSV file will contain a title column. Defaults to `true` if not specified. +- `includeEmptyRows` - Boolean, includes empty rows. Defaults to `false`. +- `withBOM` - Boolean, with BOM character. Defaults to `false`. + +### json2csv parser (Synchronous API) + +`json2csv` can also be used programatically as a synchronous converter using its `parse` method. +```js +const { Parser } = require('json2csv'); + +const fields = ['field1', 'field2', 'field3']; +const opts = { fields }; + +try { + const parser = new Parser(opts); + const csv = parser.parse(myData); + console.log(csv); +} catch (err) { + console.error(err); +} +``` + +you can also use the convenience method `parse` + +```js +const { parse } = require('json2csv'); + +const fields = ['field1', 'field2', 'field3']; +const opts = { fields }; + +try { + const csv = parse(myData, opts); + console.log(csv); +} catch (err) { + console.error(err); +} +``` + +Both of the methods above load the entire JSON in memory and do the whole processing in-memory while blocking Javascript event loop. For that reason is rarely a good reason to use it until your data is very small or your application doesn't do anything else. + +### json2csv async parser (Streaming API) + +The synchronous API has the downside of loading the entire JSON array in memory and blocking javascript's event loop while processing the data. This means that your server won't be able to process more request or your UI will become irresponsive while data is being processed. For those reasons, is rarely a good reason to use it unless your data is very small or your application doesn't do anything else. + +The async parser process the data as a non-blocking stream. This approach ensures a consistent memory footprint and avoid blocking javascript's event loop. Thus, it's better suited for large datasets or system with high concurrency. + +One very important difference between the asynchronous and the synchronous APIs is that using the asynchronous API json objects are processed one by one. In practice, this means that only the fields in the first object of the array are automatically detected and other fields are just ignored. To avoid this, it's advisable to ensure that all the objects contain exactly the same fields or provide the list of fields using the `fields` option. + +The async API uses takes a second options arguments that's directly passed to the underlying streams and accept the same options as the standard [Node.js streams](https://nodejs.org/api/stream.html#stream_new_stream_duplex_options). + +Instances of `AsyncParser` expose three objects: +* *input:* Which allows to push more data +* *processor:* A readable string representing the whole data processing. You can listen to all the standard events of Node.js streams. +* *transform:* The json2csv transform. See bellow for more details. + +```js +const { AsyncParser } = require('json2csv'); + +const fields = ['field1', 'field2', 'field3']; +const opts = { fields }; +const transformOpts = { highWaterMark: 8192 }; + +const asyncParser = new AsyncParser(opts, transformOpts); + +let csv = ''; +asyncParser.processor + .on('data', chunk => (csv += chunk.toString())) + .on('end', () => console.log(csv)) + .on('error', err => console.error(err)); + +// You can also listen for events on the conversion and see how the header or the lines are coming out. +asyncParser.transform + .on('header', header => console.log(header)) + .on('line', line => console.log(line)) + .on('error', err => console.log(err)); + +asyncParser.input.push(data); // This data might come from an HTTP request, etc. +asyncParser.input.push(null); // Sending `null` to a stream signal that no more data is expected and ends it. +``` + +`AsyncParser` also exposes some convenience methods: +* `fromInput` allows you to set the input stream. +* `throughTransform` allows you to add transforms to the stream. +* `toOutput` allows you to set the output stream. +* `promise` returns a promise that resolves when the stream ends or errors. Takes a boolean parameter to indicate if the resulting CSV should be kept in-memory and be resolved by the promise. + +```js +const { createReadStream, createWriteStream } = require('fs'); +const { AsyncParser } = require('json2csv'); + +const fields = ['field1', 'field2', 'field3']; +const opts = { fields }; +const transformOpts = { highWaterMark: 8192 }; + +// Using the promise API +const input = createReadStream(inputPath, { encoding: 'utf8' }); +const asyncParser = new JSON2CSVAsyncParser(opts, transformOpts); +const parsingProcessor = asyncParser.fromInput(input); + +parsingProcessor.promise() + .then(csv => console.log(csv)) + .catch(err => console.error(err)); + +// Using the promise API just to know when the process finnish +// but not actually load the CSV in memory +const input = createReadStream(inputPath, { encoding: 'utf8' }); +const output = createWriteStream(outputPath, { encoding: 'utf8' }); +const asyncParser = new JSON2CSVAsyncParser(opts, transformOpts); +const parsingProcessor = asyncParser.fromInput(input).toOutput(output); + +parsingProcessor.promise(false).catch(err => console.error(err)); +``` + +you can also use the convenience method `parseAsync` which accept both JSON arrays/objects and readable streams and returns a promise. + +```js +const { parseAsync } = require('json2csv'); + +const fields = ['field1', 'field2', 'field3']; +const opts = { fields }; + +parseAsync(myData, opts) + .then(csv => console.log(csv)) + .catch(err => console.error(err)); +``` + +### json2csv transform (Streaming API) + +json2csv also exposes the raw stream transform so you can pipe your json content into it. This is the same Transform that `AsyncParser` uses under the hood. + +```js +const { createReadStream, createWriteStream } = require('fs'); +const { Transform } = require('json2csv'); + +const fields = ['field1', 'field2', 'field3']; +const opts = { fields }; +const transformOpts = { highWaterMark: 16384, encoding: 'utf-8' }; + +const input = createReadStream(inputPath, { encoding: 'utf8' }); +const output = createWriteStream(outputPath, { encoding: 'utf8' }); +const json2csv = new Transform(opts, transformOpts); + +const processor = input.pipe(json2csv).pipe(output); + +// You can also listen for events on the conversion and see how the header or the lines are coming out. +json2csv + .on('header', header => console.log(header)) + .on('line', line => console.log(line)) + .on('error', err => console.log(err)); +``` + +The stream API can also work on object mode. This is useful when you have an input stream in object mode or if you are getting JSON objects one by one and want to convert them to CSV as they come. + +```js +const { Transform } = require("json2csv"); +const { Readable } = require('stream'); + +const input = new Readable({ objectMode: true }); +input._read = () => {}; +// myObjectEmitter is just a fake example representing anything that emit objects. +myObjectEmitter.on('object', obj => input.push(obj)); +// Pushing a null close the stream +myObjectEmitter.end(() => input.push(null)); + +const output = process.stdout; + +const opts = {}; +const transformOpts = { objectMode: true }; + +const json2csv = new Transform(opts, transformOpts); +const processor = input.pipe(json2csv).pipe(output); +``` + +### Data transforms + +json2csv supports data transforms. A transform is simply a function that receives a data item and returns the transformed item. + + +#### Custom transforms + +```js +function (item) { + // apply tranformations or create new object + return transformedItem; +} +``` +or using ES6 +```js +(item) => { + // apply tranformations or create new object + return transformedItem; +} +``` + +For example, let's add a line counter to our CSV, capitalize the car field and change the price to be in Ks (1000s). +```js +let counter = 1; +(item) => ({ counter: counter++, ...item, car: item.car.toUpperCase(), price: item.price / 1000 }); +``` + +#### Built-in transforms + +There is a number of built-in transform provider by the library. + +```js +const { transforms: { unwind, flatten } } = require('json2csv'); +``` + +##### Unwind + +The unwind transform deconstructs an array field from the input item to output a row for each element. Is's similar to MongoDB's $unwind aggregation. + +The transform needs to be instantiated and takes an options object as arguments containing: +- `paths` - Array of String, list the paths to the fields to be unwound. It's mandatory and should not be empty. +- `blankOut` - Boolean, unwind using blank values instead of repeating data. Defaults to `false`. + +```js +// Default +unwind({ paths: ['fieldToUnwind'] }); + +// Blanking out repeated data +unwind({ paths: ['fieldToUnwind'], blankOut: true }); +``` + +##### Flatten +Flatten nested javascript objects into a single level object. + +The transform needs to be instantiated and takes an options object as arguments containing: +- `objects` - Boolean, whether to flatten JSON objects or not. Defaults to `true`. +- `arrays`- Boolean, whether to flatten Arrays or not. Defaults to `false`. +- `separator` - String, separator to use between nested JSON keys when flattening a field. Defaults to `.`. + +```js +// Default +flatten(); + +// Custom separator '__' +flatten({ separator: '_' }); + +// Flatten only arrays +flatten({ objects: false, arrays: true }); +``` + +### Javascript module examples + +#### Example `fields` option +```js +{ + fields: [ + // Supports pathname -> pathvalue + 'simplepath', // equivalent to {value:'simplepath'} + 'path.to.value' // also equivalent to {value:'path.to.value'} + + // Supports label -> simple path + { + label: 'some label', // Optional, column will be labeled 'path.to.something' if not defined) + value: 'path.to.something', // data.path.to.something + default: 'NULL' // default if value is not found (Optional, overrides `defaultValue` for column) + }, + + // Supports label -> derived value + { + label: 'some label', // Optional, column will be labeled with the function name or empty if the function is anonymous + value: (row, field) => row[field.label].toLowerCase() ||field.default, + default: 'NULL' // default if value function returns null or undefined + }, + + // Supports label -> derived value + { + value: (row) => row.arrayField.join(',') + }, + + // Supports label -> derived value + { + value: (row) => `"${row.arrayField.join(',')}"` + }, + ] +} +``` + +#### Example 1 + +```js +const { Parser } = require('json2csv'); + +const myCars = [ + { + "car": "Audi", + "price": 40000, + "color": "blue" + }, { + "car": "BMW", + "price": 35000, + "color": "black" + }, { + "car": "Porsche", + "price": 60000, + "color": "green" + } +]; + +const json2csvParser = new Parser(); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"car", "price", "color" +"Audi", 40000, "blue" +"BMW", 35000, "black" +"Porsche", 60000, "green" +``` + +#### Example 2 + +You can choose which fields to include in the CSV. + +```js +const { Parser } = require('json2csv'); +const fields = ['car', 'color']; + +const json2csvParser = new Parser({ fields }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"car", "color" +"Audi", "blue" +"BMW", "black" +"Porsche", "green" +``` + +#### Example 3 + +You can choose custom column names for the exported file. + +```js +const { Parser } = require('json2csv'); + +const fields = [{ + label: 'Car Name', + value: 'car' +},{ + label: 'Price USD', + value: 'price' +}]; + +const json2csvParser = new Parser({ fields }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"Car Name", "Price USD" +"Audi", 40000 +"BMW", 35000 +"Porsche", 60000 +``` + +#### Example 4 + +You can also specify nested properties using dot notation. + +```js +const { Parser } = require('json2csv'); + +const myCars = [ + { + "car": { "make": "Audi", "model": "A3" }, + "price": 40000, + "color": "blue" + }, { + "car": { "make": "BMW", "model": "F20" }, + "price": 35000, + "color": "black" + }, { + "car": { "make": "Porsche", "model": "9PA AF1" }, + "price": 60000, + "color": "green" + } +]; + +const fields = ['car.make', 'car.model', 'price', 'color']; + +const json2csvParser = new Parser({ fields }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"car.make", "car.model", "price", "color" +"Audi", "A3", 40000, "blue" +"BMW", "F20", 35000, "black" +"Porsche", "9PA AF1", 60000, "green" +``` + +#### Example 5 + +Use a custom delimiter to create tsv files using the delimiter option: + +```js +const { Parser } = require('json2csv'); + +const json2csvParser = new Parser({ delimiter: '\t' }); +const tsv = json2csvParser.parse(myCars); + +console.log(tsv); +``` + +will output to console + +``` +"car" "price" "color" +"Audi" 10000 "blue" +"BMW" 15000 "red" +"Mercedes" 20000 "yellow" +"Porsche" 30000 "green" +``` + +If no delimiter is specified, the default `,` is used. + +#### Example 6 + +You can choose custom quotation marks. + +```js +const { Parser } = require('json2csv'); + +const json2csvParser = new Parser({ quote: '' }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +car, price, color +Audi, 40000, blue +BMW", 35000, black +Porsche", 60000, green +``` + +#### Example 7 + +You can unwind arrays similar to MongoDB's $unwind operation using the `unwind` transform. + +```js +const { Parser, transforms: { unwind } } = require('json2csv'); + +const myCars = [ + { + "carModel": "Audi", + "price": 0, + "colors": ["blue","green","yellow"] + }, { + "carModel": "BMW", + "price": 15000, + "colors": ["red","blue"] + }, { + "carModel": "Mercedes", + "price": 20000, + "colors": "yellow" + }, { + "carModel": "Porsche", + "price": 30000, + "colors": ["green","teal","aqua"] + } +]; + +const fields = ['carModel', 'price', 'colors']; +const transforms = [unwind({ paths: ['colors'] })]; + +const json2csvParser = new Parser({ fields, transforms }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"carModel","price","colors" +"Audi",0,"blue" +"Audi",0,"green" +"Audi",0,"yellow" +"BMW",15000,"red" +"BMW",15000,"blue" +"Mercedes",20000,"yellow" +"Porsche",30000,"green" +"Porsche",30000,"teal" +"Porsche",30000,"aqua" +``` + +#### Example 8 + +You can also unwind arrays multiple times or with nested objects. + +```js +const { Parser, transforms: { unwind } } = require('json2csv'); + +const myCars = [ + { + "carModel": "BMW", + "price": 15000, + "items": [ + { + "name": "airbag", + "color": "white" + }, { + "name": "dashboard", + "color": "black" + } + ] + }, { + "carModel": "Porsche", + "price": 30000, + "items": [ + { + "name": "airbag", + "items": [ + { + "position": "left", + "color": "white" + }, { + "position": "right", + "color": "gray" + } + ] + }, { + "name": "dashboard", + "items": [ + { + "position": "left", + "color": "gray" + }, { + "position": "right", + "color": "black" + } + ] + } + ] + } +]; + +const fields = ['carModel', 'price', 'items.name', 'items.color', 'items.items.position', 'items.items.color']; +const transforms = [unwind({ paths: ['items', 'items.items'] })]; +const json2csvParser = new Parser({ fields, transforms }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"carModel","price","items.name","items.color","items.items.position","items.items.color" +"BMW",15000,"airbag","white",, +"BMW",15000,"dashboard","black",, +"Porsche",30000,"airbag",,"left","white" +"Porsche",30000,"airbag",,"right","gray" +"Porsche",30000,"dashboard",,"left","gray" +"Porsche",30000,"dashboard",,"right","black" +``` + +#### Example 9 + +You can also unwind arrays blanking the repeated fields. + +```js +const { Parser, transforms: { unwind } } = require('json2csv'); + +const myCars = [ + { + "carModel": "BMW", + "price": 15000, + "items": [ + { + "name": "airbag", + "color": "white" + }, { + "name": "dashboard", + "color": "black" + } + ] + }, { + "carModel": "Porsche", + "price": 30000, + "items": [ + { + "name": "airbag", + "items": [ + { + "position": "left", + "color": "white" + }, { + "position": "right", + "color": "gray" + } + ] + }, { + "name": "dashboard", + "items": [ + { + "position": "left", + "color": "gray" + }, { + "position": "right", + "color": "black" + } + ] + } + ] + } +]; + +const fields = ['carModel', 'price', 'items.name', 'items.color', 'items.items.position', 'items.items.color']; +const transforms = [unwind({ paths: ['items', 'items.items'], blankOut: true })]; + +const json2csvParser = new Parser({ fields, transforms }); +const csv = json2csvParser.parse(myCars); + +console.log(csv); +``` + +will output to console + +``` +"carModel","price","items.name","items.color","items.items.position","items.items.color" +"BMW",15000,"airbag","white",, +,,"dashboard","black",, +"Porsche",30000,"airbag",,"left","white" +,,,,"right","gray" +,,"dashboard",,"left","gray" +,,,,"right","black" +``` + +### Migrations + +#### Migrating from 3.X to 4.X + +What in 3.X used to be +```js +const json2csv = require('json2csv'); +const csv = json2csv({ data: myData, fields: myFields, unwindPath: paths, ... }); +``` + +should be replaced by +```js +const { Parser } = require('json2csv'); +const json2csvParser = new Parser({ fields: myFields, unwind: paths, ... }); +const csv = json2csvParser.parse(myData); +``` + +or the convenience method +```js +const json2csv = require('json2csv'); +const csv = json2csv.parse(myData, { fields: myFields, unwind: paths, ... }); +``` + +Please note that many of the configuration parameters have been slightly renamed. Please check one by one that all your parameters are correct. +You can se the documentation for json2csv 3.11.5 [here](https://github.com/zemirco/json2csv/blob/v3.11.5/README.md). + +#### Migrating from 4.X to 5.X + +In the CLI, the config file option, `-c`, used to be a list of fields and now it's expected to be a full configuration object. + +The `stringify` option hass been removed. + +`doubleQuote` has been renamed to `escapedQuote`. + +The `unwind` and `flatten` -related options has been moved to their own transforms. + +What used to be +```js +const { Parser } = require('json2csv'); +const json2csvParser = new Parser({ unwind: paths, unwindBlank: true, flatten: true, flattenSeparator: '__' }); +const csv = json2csvParser.parse(myData); +``` + +should be replaced by +```js +const { Parser, transforms: { unwind, flatten } } = require('json2csv'); +const json2csvParser = new Parser({ transforms: [unwind({ paths, blankOut: true }), flatten('__')] }); +const csv = json2csvParser.parse(myData); +``` + +You can se the documentation for json2csv v4.X.X [here](https://github.com/zemirco/json2csv/blob/v4/README.md). + +## Known Gotchas + +### Excel support + +#### Avoiding excel autoformatting + +Excel tries to automatically detect the format of every field (number, date, string, etc.) regardless of whether the field is quoted or not. + +This might produce few undesired effects with, for example, serial numbers: +- Large numbers are displayed using scientific notation +- Leading zeros are stripped. + +Enabling the `excelString` option produces an Excel-specific CSV file that forces Excel to interpret string fields as strings. Please note that the CSV will look incorrect if viewing it somewhere else than Excel. + +#### Avoiding CSV injection + +As part of Excel automatically format detection, fields regarded as formulas (starting with `=`, `+`, `-` or `@`) are interpreted regardless of whether the field is quoted or not, creating a security risk (see [CSV Injection](https://www.owasp.org/index.php/CSV_Injection). + +This issue has nothing to do with the CSV format, since CSV knows nothing about formulas, but with how Excel parses CSV files. + +Enabling the `excelString` option produces an Excel-specific CSV file that forces Excel to interpret string fields as strings. Please note that the CSV will look incorrect if viewing it somewhere else than Excel. + +#### Preserving new lines + +Excel only recognizes `\r\n` as valid new line inside a cell. + +#### Unicode Support + +Excel can display Unicode correctly (just setting the `withBOM` option to true). However, Excel can't save unicode so, if you perform any changes to the CSV and save it from Excel, the Unicode characters will not be displayed correctly. + + +### PowerShell escaping + +PowerShell do some estrange double quote escaping escaping which results on each line of the CSV missing the first and last quote if outputting the result directly to stdout. Instead of that, it's advisable that you write the result directly to a file. + +## Building + +json2csv is packaged using `rollup`. You can generate the packages running: + +```sh +npm run build +``` +which generates 3 files under the `dist folder`: + +* `json2csv.umd.js` UMD module transpiled to ES5 +* `json2csv.esm.js` ES5 module (import/export) +* `json2csv.cjs.js` CommonJS module + +When you use packaging tools like webpack and such, they know which version to use depending on your configuration. + +## Testing + +Run the folowing command to check the code style. + +```sh +$ npm run lint +``` + +Run the following command to run the tests and return coverage + +```sh +$ npm run test-with-coverage +``` + +## Contributors + +After you clone the repository you just need to install the required packages for development by runnning following command under json2csv dir. + +```sh +$ npm install +``` + +Before making any pull request please ensure sure that your code is formatted, test are passing and test coverage haven't decreased. (See [Testing](#testing)) + +## License + +See [LICENSE.md]. + +[npm-badge]: https://badge.fury.io/js/json2csv.svg +[npm-badge-url]: http://badge.fury.io/js/json2csv +[travis-badge]: https://travis-ci.org/zemirco/json2csv.svg +[travis-badge-url]: https://travis-ci.org/zemirco/json2csv +[coveralls-badge]: https://coveralls.io/repos/zemirco/json2csv/badge.svg?branch=master +[coveralls-badge-url]: https://coveralls.io/r/zemirco/json2csv?branch=master +[CHANGELOG]: https://github.com/zemirco/json2csv/blob/master/CHANGELOG.md +[LICENSE.md]: https://github.com/zemirco/json2csv/blob/master/LICENSE.md diff --git a/node_modules/json2csv/bin/json2csv.js b/node_modules/json2csv/bin/json2csv.js new file mode 100755 index 0000000..c41aa37 --- /dev/null +++ b/node_modules/json2csv/bin/json2csv.js @@ -0,0 +1,183 @@ +#!/usr/bin/env node + +'use strict'; + +const { promisify } = require('util'); +const { createReadStream, createWriteStream, readFile: readFileOrig, writeFile: writeFileOrig } = require('fs'); +const os = require('os'); +const { isAbsolute, join } = require('path'); +const program = require('commander'); +const pkg = require('../package'); +const json2csv = require('../lib/json2csv'); +const parseNdJson = require('./utils/parseNdjson'); +const TablePrinter = require('./utils/TablePrinter'); + +const readFile = promisify(readFileOrig); +const writeFile = promisify(writeFileOrig); + +const { unwind, flatten } = json2csv.transforms; +const JSON2CSVParser = json2csv.Parser; +const Json2csvTransform = json2csv.Transform; + +program + .version(pkg.version) + .option('-i, --input ', 'Path and name of the incoming json file. Defaults to stdin.') + .option('-o, --output ', 'Path and name of the resulting csv file. Defaults to stdout.') + .option('-c, --config ', 'Specify a file with a valid JSON configuration.') + .option('-n, --ndjson', 'Treat the input as NewLine-Delimited JSON.') + .option('-s, --no-streaming', 'Process the whole JSON array in memory instead of doing it line by line.') + .option('-f, --fields ', 'List of fields to process. Defaults to field auto-detection.') + .option('-v, --default-value ', 'Default value to use for missing fields.') + .option('-q, --quote ', 'Character(s) to use as quote mark. Defaults to \'"\'.') + .option('-Q, --escaped-quote ', 'Character(s) to use as a escaped quote. Defaults to a double `quote`, \'""\'.') + .option('-d, --delimiter ', 'Character(s) to use as delimiter. Defaults to \',\'.', ',') + .option('-e, --eol ', 'Character(s) to use as End-of-Line for separating rows. Defaults to \'\\n\'.', os.EOL) + .option('-E, --excel-strings','Wraps string data to force Excel to interpret it as string even if it contains a number.') + .option('-H, --no-header', 'Disable the column name header.') + .option('-a, --include-empty-rows', 'Includes empty rows in the resulting CSV output.') + .option('-b, --with-bom', 'Includes BOM character at the beginning of the CSV.') + .option('-p, --pretty', 'Print output as a pretty table. Use only when printing to console.') + // Built-in transforms + .option('--unwind [paths]', 'Creates multiple rows from a single JSON document similar to MongoDB unwind.') + .option('--unwind-blank', 'When unwinding, blank out instead of repeating data. Defaults to false.', false) + .option('--flatten-objects', 'Flatten nested objects. Defaults to false.', false) + .option('--flatten-arrays', 'Flatten nested arrays. Defaults to false.', false) + .option('--flatten-separator ', 'Flattened keys separator. Defaults to \'.\'.', '.') + .parse(process.argv); + +function makePathAbsolute(filePath) { + return (filePath && !isAbsolute(filePath)) + ? join(process.cwd(), filePath) + : filePath; +} + +program.input = makePathAbsolute(program.input); +program.output = makePathAbsolute(program.output); +program.config = makePathAbsolute(program.config); + +// don't fail if piped to e.g. head +/* istanbul ignore next */ +process.stdout.on('error', (error) => { + if (error.code === 'EPIPE') process.exit(1); +}); + +function getInputStream(inputPath) { + if (inputPath) return createReadStream(inputPath, { encoding: 'utf8' }); + + process.stdin.resume(); + process.stdin.setEncoding('utf8'); + return process.stdin; +} + +function getOutputStream(outputPath, config) { + if (outputPath) return createWriteStream(outputPath, { encoding: 'utf8' }); + if (config.pretty) return new TablePrinter(config).writeStream(); + return process.stdout; +} + +async function getInput(inputPath, ndjson) { + if (!inputPath) return getInputFromStdin(); + if (ndjson) return parseNdJson(await readFile(inputPath, 'utf8')); + return require(inputPath); +} + +async function getInputFromStdin() { + return new Promise((resolve, reject) => { + process.stdin.resume(); + process.stdin.setEncoding('utf8'); + + let inputData = ''; + process.stdin.on('data', chunk => (inputData += chunk)); + /* istanbul ignore next */ + process.stdin.on('error', err => reject(new Error('Could not read from stdin', err))); + process.stdin.on('end', () => { + try { + resolve(program.ndjson ? parseNdJson(inputData) : JSON.parse(inputData)); + } catch (err) { + reject(new Error('Invalid data received from stdin', err)); + } + }); + }); +} + +async function processOutput(outputPath, csv, config) { + if (!outputPath) { + // eslint-disable-next-line no-console + config.pretty ? (new TablePrinter(config)).printCSV(csv) : console.log(csv); + return; + } + + await writeFile(outputPath, csv); +} + +async function processInMemory(config, opts) { + const input = await getInput(program.input, config.ndjson); + const output = new JSON2CSVParser(opts).parse(input); + await processOutput(program.output, output, config); +} + +async function processStream(config, opts) { + const input = getInputStream(program.input); + const transform = new Json2csvTransform(opts); + const output = getOutputStream(program.output, config); + + await new Promise((resolve, reject) => { + input.pipe(transform).pipe(output); + input.on('error', reject); + transform.on('error', reject); + output.on('error', reject) + .on('finish', resolve); + }); +} + +(async (program) => { + try { + const config = Object.assign({}, program.config ? require(program.config) : {}, program); + + const transforms = []; + if (config.unwind) { + transforms.push(unwind({ + paths: config.unwind === true ? undefined : config.unwind.split(','), + blankOut: config.unwindBlank + })); + } + + if (config.flattenObjects || config.flattenArrays) { + transforms.push(flatten({ + objects: config.flattenObjects, + arrays: config.flattenArrays, + separator: config.flattenSeparator + })); + } + + const opts = { + transforms, + fields: config.fields + ? (Array.isArray(config.fields) ? config.fields : config.fields.split(',')) + : config.fields, + defaultValue: config.defaultValue, + quote: config.quote, + escapedQuote: config.escapedQuote, + delimiter: config.delimiter, + eol: config.eol, + excelStrings: config.excelStrings, + header: config.header, + includeEmptyRows: config.includeEmptyRows, + withBOM: config.withBom + }; + + await (config.streaming ? processStream : processInMemory)(config, opts); + } catch(err) { + let processedError = err; + if (program.input && err.message.includes(program.input)) { + processedError = new Error(`Invalid input file. (${err.message})`); + } else if (program.output && err.message.includes(program.output)) { + processedError = new Error(`Invalid output file. (${err.message})`); + } else if (program.config && err.message.includes(program.config)) { + processedError = new Error(`Invalid config file. (${err.message})`); + } + // eslint-disable-next-line no-console + console.error(processedError); + process.exit(1); + } +})(program); diff --git a/node_modules/json2csv/bin/utils/TablePrinter.js b/node_modules/json2csv/bin/utils/TablePrinter.js new file mode 100644 index 0000000..057463a --- /dev/null +++ b/node_modules/json2csv/bin/utils/TablePrinter.js @@ -0,0 +1,117 @@ +'use strict'; + +const { Writable } = require('stream'); + +const MIN_CELL_WIDTH = 15; + +class TablePrinter { + constructor(opts) { + this.opts = opts; + this._hasWritten = false; + } + + push(csv) { + const lines = csv.split(this.opts.eol); + + if (!lines.length) return; + + if (!this._hasWritten) this.setColumnWidths(lines[0]); + + const top = this._hasWritten ? this.middleLine : this.topLine; + this.print(top, lines); + this._hasWritten = true; + } + + end(csv) { + let lines = csv.split(this.opts.eol); + if (!this._hasWritten) this.setColumnWidths(lines[0]); + const top = this._hasWritten ? this.middleLine : this.topLine; + this.print(top, lines, this.bottomLine); + } + + printCSV(csv) { + this.end(csv); + } + + setColumnWidths(line) { + this.colWidths = line + .split(this.opts.delimiter) + .map(elem => Math.max(elem.length * 2, MIN_CELL_WIDTH)); + + this.topLine = `┌${this.colWidths.map(i => '─'.repeat(i)).join('┬')}┐`; + this.middleLine = `├${this.colWidths.map(i => '─'.repeat(i)).join('┼')}┤`; + this.bottomLine = `└${this.colWidths.map(i => '─'.repeat(i)).join('┴')}┘`; + } + + print(top, lines, bottom) { + const table = `${top}\n` + + lines + .map(row => this.formatRow(row)) + .join(`\n${this.middleLine}\n`) + + (bottom ? `\n${bottom}` : ''); + + // eslint-disable-next-line no-console + console.log(table); + } + + formatRow(row) { + const wrappedRow = row + .split(this.opts.delimiter) + .map((cell, i) => cell.match(new RegExp(`(.{1,${this.colWidths[i] - 2}})`, 'g')) || []); + + const height = wrappedRow.reduce((acc, cell) => Math.max(acc, cell.length), 0); + + const processedCells = wrappedRow + .map((cell, i) => this.formatCell(cell, height, this.colWidths[i])); + + return Array(height).fill('') + .map((_, i) => `│${processedCells.map(cell => cell[i]).join('│')}│`) + .join('\n'); + } + + formatCell(content, heigth, width) { + const paddedContent = this.padCellHorizontally(content, width); + return this.padCellVertically(paddedContent, heigth, width); + } + + padCellVertically(content, heigth, width) { + const vertPad = heigth - content.length; + const vertPadTop = Math.ceil(vertPad / 2); + const vertPadBottom = vertPad - vertPadTop; + const emptyLine = ' '.repeat(width); + + return [ + ...Array(vertPadTop).fill(emptyLine), + ...content, + ...Array(vertPadBottom).fill(emptyLine) + ]; + } + + padCellHorizontally(content, width) { + return content.map((line) => { + const horPad = width - line.length - 2; + return ` ${line}${' '.repeat(horPad)} `; + }); + } + + writeStream() { + let csv = ''; + const table = this; + return new Writable({ + write(chunk, encoding, callback) { + csv += chunk.toString(); + const index = csv.lastIndexOf(table.opts.eol); + let lines = csv.substring(0, index); + csv = csv.substring(index + 1); + + if (lines) table.push(lines); + callback(); + }, + final() { + table.end(csv); + } + }); + } +} + +module.exports = TablePrinter; diff --git a/node_modules/json2csv/bin/utils/parseNdjson.js b/node_modules/json2csv/bin/utils/parseNdjson.js new file mode 100644 index 0000000..dbc9c67 --- /dev/null +++ b/node_modules/json2csv/bin/utils/parseNdjson.js @@ -0,0 +1,11 @@ +'use strict'; + +function parseNdJson(input) { + return input + .split('\n') + .map(line => line.trim()) + .filter(line => line !== '') + .map(line=> JSON.parse(line)); +} + +module.exports = parseNdJson; diff --git a/node_modules/json2csv/dist/json2csv.esm.js b/node_modules/json2csv/dist/json2csv.esm.js new file mode 100644 index 0000000..5a88eae --- /dev/null +++ b/node_modules/json2csv/dist/json2csv.esm.js @@ -0,0 +1,2361 @@ +import stream from 'stream'; +import os from 'os'; + +function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } + + return _assertThisInitialized(self); +} + +function _toArray(arr) { + return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); +} + +function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); +} + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } +} + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); +} + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); +} + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); +} + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** `Object#toString` result references. */ +var funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + symbolTag = '[object Symbol]'; + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Symbol$1 = root.Symbol, + splice = arrayProto.splice; + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value) { + return isArray(value) ? value : stringToPath(value); +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoize(function(string) { + string = toString(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} + +// Assign cache to `_.memoize`. +memoize.Cache = MapCache; + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); +} + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +var lodash_get = get; + +function getProp(obj, path, defaultValue) { + return obj[path] === undefined ? defaultValue : obj[path]; +} + +function setProp(obj, path, value) { + var pathArray = Array.isArray(path) ? path : path.split('.'); + + var _pathArray = _toArray(pathArray), + key = _pathArray[0], + restPath = _pathArray.slice(1); + + return _objectSpread({}, obj, _defineProperty({}, key, pathArray.length > 1 ? setProp(obj[key] || {}, restPath, value) : value)); +} + +function unsetProp(obj, path) { + var pathArray = Array.isArray(path) ? path : path.split('.'); + + var _pathArray2 = _toArray(pathArray), + key = _pathArray2[0], + restPath = _pathArray2.slice(1); + + if (_typeof(obj[key]) !== 'object') { + // This will never be hit in the current code because unwind does the check before calling unsetProp + + /* istanbul ignore next */ + return obj; + } + + if (pathArray.length === 1) { + return Object.keys(obj).filter(function (prop) { + return prop !== key; + }).reduce(function (acc, prop) { + return Object.assign(acc, _defineProperty({}, prop, obj[prop])); + }, {}); + } + + return Object.keys(obj).reduce(function (acc, prop) { + return _objectSpread({}, acc, _defineProperty({}, prop, prop !== key ? obj[prop] : unsetProp(obj[key], restPath))); + }, {}); +} + +function flattenReducer(acc, arr) { + try { + // This is faster but susceptible to `RangeError: Maximum call stack size exceeded` + acc.push.apply(acc, _toConsumableArray(arr)); + return acc; + } catch (err) { + // Fallback to a slower but safer option + return acc.concat(arr); + } +} + +function fastJoin(arr, separator) { + var isFirst = true; + return arr.reduce(function (acc, elem) { + if (elem === null || elem === undefined) { + elem = ''; + } + + if (isFirst) { + isFirst = false; + return "".concat(elem); + } + + return "".concat(acc).concat(separator).concat(elem); + }, ''); +} + +var utils = { + getProp: getProp, + setProp: setProp, + unsetProp: unsetProp, + fastJoin: fastJoin, + flattenReducer: flattenReducer +}; + +var getProp$1 = utils.getProp, + fastJoin$1 = utils.fastJoin, + flattenReducer$1 = utils.flattenReducer; + +var JSON2CSVBase = +/*#__PURE__*/ +function () { + function JSON2CSVBase(opts) { + _classCallCheck(this, JSON2CSVBase); + + this.opts = this.preprocessOpts(opts); + } + /** + * Check passing opts and set defaults. + * + * @param {Json2CsvOptions} opts Options object containing fields, + * delimiter, default value, quote mark, header, etc. + */ + + + _createClass(JSON2CSVBase, [{ + key: "preprocessOpts", + value: function preprocessOpts(opts) { + var processedOpts = Object.assign({}, opts); + processedOpts.transforms = !Array.isArray(processedOpts.transforms) ? processedOpts.transforms ? [processedOpts.transforms] : [] : processedOpts.transforms; + processedOpts.delimiter = processedOpts.delimiter || ','; + processedOpts.eol = processedOpts.eol || os.EOL; + processedOpts.quote = typeof processedOpts.quote === 'string' ? processedOpts.quote : '"'; + processedOpts.escapedQuote = typeof processedOpts.escapedQuote === 'string' ? processedOpts.escapedQuote : "".concat(processedOpts.quote).concat(processedOpts.quote); + processedOpts.header = processedOpts.header !== false; + processedOpts.includeEmptyRows = processedOpts.includeEmptyRows || false; + processedOpts.withBOM = processedOpts.withBOM || false; + return processedOpts; + } + /** + * Check and normalize the fields configuration. + * + * @param {(string|object)[]} fields Fields configuration provided by the user + * or inferred from the data + * @returns {object[]} preprocessed FieldsInfo array + */ + + }, { + key: "preprocessFieldsInfo", + value: function preprocessFieldsInfo(fields) { + var _this = this; + + return fields.map(function (fieldInfo) { + if (typeof fieldInfo === 'string') { + return { + label: fieldInfo, + value: fieldInfo.includes('.') || fieldInfo.includes('[') ? function (row) { + return lodash_get(row, fieldInfo, _this.opts.defaultValue); + } : function (row) { + return getProp$1(row, fieldInfo, _this.opts.defaultValue); + } + }; + } + + if (_typeof(fieldInfo) === 'object') { + var defaultValue = 'default' in fieldInfo ? fieldInfo.default : _this.opts.defaultValue; + + if (typeof fieldInfo.value === 'string') { + return { + label: fieldInfo.label || fieldInfo.value, + value: fieldInfo.value.includes('.') || fieldInfo.value.includes('[') ? function (row) { + return lodash_get(row, fieldInfo.value, defaultValue); + } : function (row) { + return getProp$1(row, fieldInfo.value, defaultValue); + } + }; + } + + if (typeof fieldInfo.value === 'function') { + var label = fieldInfo.label || fieldInfo.value.name || ''; + var field = { + label: label, + default: defaultValue + }; + return { + label: label, + value: function value(row) { + var value = fieldInfo.value(row, field); + return value === null || value === undefined ? defaultValue : value; + } + }; + } + } + + throw new Error('Invalid field info option. ' + JSON.stringify(fieldInfo)); + }); + } + /** + * Create the title row with all the provided fields as column headings + * + * @returns {String} titles as a string + */ + + }, { + key: "getHeader", + value: function getHeader() { + var _this2 = this; + + return fastJoin$1(this.opts.fields.map(function (fieldInfo) { + return _this2.processValue(fieldInfo.label); + }), this.opts.delimiter); + } + /** + * Preprocess each object according to the given transforms (unwind, flatten, etc.). + * @param {Object} row JSON object to be converted in a CSV row + */ + + }, { + key: "preprocessRow", + value: function preprocessRow(row) { + return this.opts.transforms.reduce(function (rows, transform) { + return rows.map(function (row) { + return transform(row); + }).reduce(flattenReducer$1, []); + }, [row]); + } + /** + * Create the content of a specific CSV row + * + * @param {Object} row JSON object to be converted in a CSV row + * @returns {String} CSV string (row) + */ + + }, { + key: "processRow", + value: function processRow(row) { + var _this3 = this; + + if (!row) { + return undefined; + } + + var processedRow = this.opts.fields.map(function (fieldInfo) { + return _this3.processCell(row, fieldInfo); + }); + + if (!this.opts.includeEmptyRows && processedRow.every(function (field) { + return field === undefined; + })) { + return undefined; + } + + return fastJoin$1(processedRow, this.opts.delimiter); + } + /** + * Create the content of a specfic CSV row cell + * + * @param {Object} row JSON object representing the CSV row that the cell belongs to + * @param {FieldInfo} fieldInfo Details of the field to process to be a CSV cell + * @returns {String} CSV string (cell) + */ + + }, { + key: "processCell", + value: function processCell(row, fieldInfo) { + return this.processValue(fieldInfo.value(row)); + } + /** + * Create the content of a specfic CSV row cell + * + * @param {Any} value Value to be included in a CSV cell + * @returns {String} Value stringified and processed + */ + + }, { + key: "processValue", + value: function processValue(value) { + if (value === null || value === undefined) { + return undefined; + } + + var valueType = _typeof(value); + + if (valueType !== 'boolean' && valueType !== 'number' && valueType !== 'string') { + value = JSON.stringify(value); + + if (value === undefined) { + return undefined; + } + + if (value[0] === '"') { + value = value.replace(/^"(.+)"$/, '$1'); + } + } + + if (typeof value === 'string') { + if (this.opts.excelStrings) { + if (value.includes(this.opts.quote)) { + value = value.replace(new RegExp(this.opts.quote, 'g'), "".concat(this.opts.escapedQuote).concat(this.opts.escapedQuote)); + } + + value = "\"=\"\"".concat(value, "\"\"\""); + } else { + if (value.includes(this.opts.quote)) { + value = value.replace(new RegExp(this.opts.quote, 'g'), this.opts.escapedQuote); + } + + value = "".concat(this.opts.quote).concat(value).concat(this.opts.quote); + } + } + + return value; + } + }]); + + return JSON2CSVBase; +}(); + +var JSON2CSVBase_1 = JSON2CSVBase; + +var fastJoin$2 = utils.fastJoin, + flattenReducer$2 = utils.flattenReducer; + +var JSON2CSVParser = +/*#__PURE__*/ +function (_JSON2CSVBase) { + _inherits(JSON2CSVParser, _JSON2CSVBase); + + function JSON2CSVParser(opts) { + var _this; + + _classCallCheck(this, JSON2CSVParser); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(JSON2CSVParser).call(this, opts)); + + if (_this.opts.fields) { + _this.opts.fields = _this.preprocessFieldsInfo(_this.opts.fields); + } + + return _this; + } + /** + * Main function that converts json to csv. + * + * @param {Array|Object} data Array of JSON objects to be converted to CSV + * @returns {String} The CSV formated data as a string + */ + + + _createClass(JSON2CSVParser, [{ + key: "parse", + value: function parse(data) { + var processedData = this.preprocessData(data); + + if (!this.opts.fields) { + this.opts.fields = processedData.reduce(function (fields, item) { + Object.keys(item).forEach(function (field) { + if (!fields.includes(field)) { + fields.push(field); + } + }); + return fields; + }, []); + this.opts.fields = this.preprocessFieldsInfo(this.opts.fields); + } + + var header = this.opts.header ? this.getHeader() : ''; + var rows = this.processData(processedData); + var csv = (this.opts.withBOM ? "\uFEFF" : '') + header + (header && rows ? this.opts.eol : '') + rows; + return csv; + } + /** + * Preprocess the data according to the give opts (unwind, flatten, etc.) + and calculate the fields and field names if they are not provided. + * + * @param {Array|Object} data Array or object to be converted to CSV + */ + + }, { + key: "preprocessData", + value: function preprocessData(data) { + var _this2 = this; + + var processedData = Array.isArray(data) ? data : [data]; + + if (!this.opts.fields && (processedData.length === 0 || _typeof(processedData[0]) !== 'object')) { + throw new Error('Data should not be empty or the "fields" option should be included'); + } + + if (this.opts.transforms.length === 0) return processedData; + return processedData.map(function (row) { + return _this2.preprocessRow(row); + }).reduce(flattenReducer$2, []); + } + /** + * Create the content row by row below the header + * + * @param {Array} data Array of JSON objects to be converted to CSV + * @returns {String} CSV string (body) + */ + + }, { + key: "processData", + value: function processData(data) { + var _this3 = this; + + return fastJoin$2(data.map(function (row) { + return _this3.processRow(row); + }).filter(function (row) { + return row; + }), // Filter empty rows + this.opts.eol); + } + }]); + + return JSON2CSVParser; +}(JSON2CSVBase_1); + +var JSON2CSVParser_1 = JSON2CSVParser; + +/*global Buffer*/ +// Named constants with unique integer values +var C = {}; +// Tokens +var LEFT_BRACE = C.LEFT_BRACE = 0x1; +var RIGHT_BRACE = C.RIGHT_BRACE = 0x2; +var LEFT_BRACKET = C.LEFT_BRACKET = 0x3; +var RIGHT_BRACKET = C.RIGHT_BRACKET = 0x4; +var COLON = C.COLON = 0x5; +var COMMA = C.COMMA = 0x6; +var TRUE = C.TRUE = 0x7; +var FALSE = C.FALSE = 0x8; +var NULL = C.NULL = 0x9; +var STRING = C.STRING = 0xa; +var NUMBER = C.NUMBER = 0xb; +// Tokenizer States +var START = C.START = 0x11; +var STOP = C.STOP = 0x12; +var TRUE1 = C.TRUE1 = 0x21; +var TRUE2 = C.TRUE2 = 0x22; +var TRUE3 = C.TRUE3 = 0x23; +var FALSE1 = C.FALSE1 = 0x31; +var FALSE2 = C.FALSE2 = 0x32; +var FALSE3 = C.FALSE3 = 0x33; +var FALSE4 = C.FALSE4 = 0x34; +var NULL1 = C.NULL1 = 0x41; +var NULL2 = C.NULL2 = 0x42; +var NULL3 = C.NULL3 = 0x43; +var NUMBER1 = C.NUMBER1 = 0x51; +var NUMBER3 = C.NUMBER3 = 0x53; +var STRING1 = C.STRING1 = 0x61; +var STRING2 = C.STRING2 = 0x62; +var STRING3 = C.STRING3 = 0x63; +var STRING4 = C.STRING4 = 0x64; +var STRING5 = C.STRING5 = 0x65; +var STRING6 = C.STRING6 = 0x66; +// Parser States +var VALUE = C.VALUE = 0x71; +var KEY = C.KEY = 0x72; +// Parser Modes +var OBJECT = C.OBJECT = 0x81; +var ARRAY = C.ARRAY = 0x82; +// Character constants +var BACK_SLASH = "\\".charCodeAt(0); +var FORWARD_SLASH = "\/".charCodeAt(0); +var BACKSPACE = "\b".charCodeAt(0); +var FORM_FEED = "\f".charCodeAt(0); +var NEWLINE = "\n".charCodeAt(0); +var CARRIAGE_RETURN = "\r".charCodeAt(0); +var TAB = "\t".charCodeAt(0); + +var STRING_BUFFER_SIZE = 64 * 1024; + +function Parser() { + this.tState = START; + this.value = undefined; + + this.string = undefined; // string data + this.stringBuffer = Buffer.alloc ? Buffer.alloc(STRING_BUFFER_SIZE) : new Buffer(STRING_BUFFER_SIZE); + this.stringBufferOffset = 0; + this.unicode = undefined; // unicode escapes + this.highSurrogate = undefined; + + this.key = undefined; + this.mode = undefined; + this.stack = []; + this.state = VALUE; + this.bytes_remaining = 0; // number of bytes remaining in multi byte utf8 char to read after split boundary + this.bytes_in_sequence = 0; // bytes in multi byte utf8 char to read + this.temp_buffs = { "2": new Buffer(2), "3": new Buffer(3), "4": new Buffer(4) }; // for rebuilding chars split before boundary is reached + + // Stream offset + this.offset = -1; +} + +// Slow code to string converter (only used when throwing syntax errors) +Parser.toknam = function (code) { + var keys = Object.keys(C); + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + if (C[key] === code) { return key; } + } + return code && ("0x" + code.toString(16)); +}; + +var proto = Parser.prototype; +proto.onError = function (err) { throw err; }; +proto.charError = function (buffer, i) { + this.tState = STOP; + this.onError(new Error("Unexpected " + JSON.stringify(String.fromCharCode(buffer[i])) + " at position " + i + " in state " + Parser.toknam(this.tState))); +}; +proto.appendStringChar = function (char) { + if (this.stringBufferOffset >= STRING_BUFFER_SIZE) { + this.string += this.stringBuffer.toString('utf8'); + this.stringBufferOffset = 0; + } + + this.stringBuffer[this.stringBufferOffset++] = char; +}; +proto.appendStringBuf = function (buf, start, end) { + var size = buf.length; + if (typeof start === 'number') { + if (typeof end === 'number') { + if (end < 0) { + // adding a negative end decreeses the size + size = buf.length - start + end; + } else { + size = end - start; + } + } else { + size = buf.length - start; + } + } + + if (size < 0) { + size = 0; + } + + if (this.stringBufferOffset + size > STRING_BUFFER_SIZE) { + this.string += this.stringBuffer.toString('utf8', 0, this.stringBufferOffset); + this.stringBufferOffset = 0; + } + + buf.copy(this.stringBuffer, this.stringBufferOffset, start, end); + this.stringBufferOffset += size; +}; +proto.write = function (buffer) { + if (typeof buffer === "string") buffer = new Buffer(buffer); + var n; + for (var i = 0, l = buffer.length; i < l; i++) { + if (this.tState === START){ + n = buffer[i]; + this.offset++; + if(n === 0x7b){ this.onToken(LEFT_BRACE, "{"); // { + }else if(n === 0x7d){ this.onToken(RIGHT_BRACE, "}"); // } + }else if(n === 0x5b){ this.onToken(LEFT_BRACKET, "["); // [ + }else if(n === 0x5d){ this.onToken(RIGHT_BRACKET, "]"); // ] + }else if(n === 0x3a){ this.onToken(COLON, ":"); // : + }else if(n === 0x2c){ this.onToken(COMMA, ","); // , + }else if(n === 0x74){ this.tState = TRUE1; // t + }else if(n === 0x66){ this.tState = FALSE1; // f + }else if(n === 0x6e){ this.tState = NULL1; // n + }else if(n === 0x22){ // " + this.string = ""; + this.stringBufferOffset = 0; + this.tState = STRING1; + }else if(n === 0x2d){ this.string = "-"; this.tState = NUMBER1; // - + }else{ + if (n >= 0x30 && n < 0x40) { // 1-9 + this.string = String.fromCharCode(n); this.tState = NUMBER3; + } else if (n === 0x20 || n === 0x09 || n === 0x0a || n === 0x0d) ; else { + return this.charError(buffer, i); + } + } + }else if (this.tState === STRING1){ // After open quote + n = buffer[i]; // get current byte from buffer + // check for carry over of a multi byte char split between data chunks + // & fill temp buffer it with start of this data chunk up to the boundary limit set in the last iteration + if (this.bytes_remaining > 0) { + for (var j = 0; j < this.bytes_remaining; j++) { + this.temp_buffs[this.bytes_in_sequence][this.bytes_in_sequence - this.bytes_remaining + j] = buffer[j]; + } + + this.appendStringBuf(this.temp_buffs[this.bytes_in_sequence]); + this.bytes_in_sequence = this.bytes_remaining = 0; + i = i + j - 1; + } else if (this.bytes_remaining === 0 && n >= 128) { // else if no remainder bytes carried over, parse multi byte (>=128) chars one at a time + if (n <= 193 || n > 244) { + return this.onError(new Error("Invalid UTF-8 character at position " + i + " in state " + Parser.toknam(this.tState))); + } + if ((n >= 194) && (n <= 223)) this.bytes_in_sequence = 2; + if ((n >= 224) && (n <= 239)) this.bytes_in_sequence = 3; + if ((n >= 240) && (n <= 244)) this.bytes_in_sequence = 4; + if ((this.bytes_in_sequence + i) > buffer.length) { // if bytes needed to complete char fall outside buffer length, we have a boundary split + for (var k = 0; k <= (buffer.length - 1 - i); k++) { + this.temp_buffs[this.bytes_in_sequence][k] = buffer[i + k]; // fill temp buffer of correct size with bytes available in this chunk + } + this.bytes_remaining = (i + this.bytes_in_sequence) - buffer.length; + i = buffer.length - 1; + } else { + this.appendStringBuf(buffer, i, i + this.bytes_in_sequence); + i = i + this.bytes_in_sequence - 1; + } + } else if (n === 0x22) { + this.tState = START; + this.string += this.stringBuffer.toString('utf8', 0, this.stringBufferOffset); + this.stringBufferOffset = 0; + this.onToken(STRING, this.string); + this.offset += Buffer.byteLength(this.string, 'utf8') + 1; + this.string = undefined; + } + else if (n === 0x5c) { + this.tState = STRING2; + } + else if (n >= 0x20) { this.appendStringChar(n); } + else { + return this.charError(buffer, i); + } + }else if (this.tState === STRING2){ // After backslash + n = buffer[i]; + if(n === 0x22){ this.appendStringChar(n); this.tState = STRING1; + }else if(n === 0x5c){ this.appendStringChar(BACK_SLASH); this.tState = STRING1; + }else if(n === 0x2f){ this.appendStringChar(FORWARD_SLASH); this.tState = STRING1; + }else if(n === 0x62){ this.appendStringChar(BACKSPACE); this.tState = STRING1; + }else if(n === 0x66){ this.appendStringChar(FORM_FEED); this.tState = STRING1; + }else if(n === 0x6e){ this.appendStringChar(NEWLINE); this.tState = STRING1; + }else if(n === 0x72){ this.appendStringChar(CARRIAGE_RETURN); this.tState = STRING1; + }else if(n === 0x74){ this.appendStringChar(TAB); this.tState = STRING1; + }else if(n === 0x75){ this.unicode = ""; this.tState = STRING3; + }else{ + return this.charError(buffer, i); + } + }else if (this.tState === STRING3 || this.tState === STRING4 || this.tState === STRING5 || this.tState === STRING6){ // unicode hex codes + n = buffer[i]; + // 0-9 A-F a-f + if ((n >= 0x30 && n < 0x40) || (n > 0x40 && n <= 0x46) || (n > 0x60 && n <= 0x66)) { + this.unicode += String.fromCharCode(n); + if (this.tState++ === STRING6) { + var intVal = parseInt(this.unicode, 16); + this.unicode = undefined; + if (this.highSurrogate !== undefined && intVal >= 0xDC00 && intVal < (0xDFFF + 1)) { //<56320,57343> - lowSurrogate + this.appendStringBuf(new Buffer(String.fromCharCode(this.highSurrogate, intVal))); + this.highSurrogate = undefined; + } else if (this.highSurrogate === undefined && intVal >= 0xD800 && intVal < (0xDBFF + 1)) { //<55296,56319> - highSurrogate + this.highSurrogate = intVal; + } else { + if (this.highSurrogate !== undefined) { + this.appendStringBuf(new Buffer(String.fromCharCode(this.highSurrogate))); + this.highSurrogate = undefined; + } + this.appendStringBuf(new Buffer(String.fromCharCode(intVal))); + } + this.tState = STRING1; + } + } else { + return this.charError(buffer, i); + } + } else if (this.tState === NUMBER1 || this.tState === NUMBER3) { + n = buffer[i]; + + switch (n) { + case 0x30: // 0 + case 0x31: // 1 + case 0x32: // 2 + case 0x33: // 3 + case 0x34: // 4 + case 0x35: // 5 + case 0x36: // 6 + case 0x37: // 7 + case 0x38: // 8 + case 0x39: // 9 + case 0x2e: // . + case 0x65: // e + case 0x45: // E + case 0x2b: // + + case 0x2d: // - + this.string += String.fromCharCode(n); + this.tState = NUMBER3; + break; + default: + this.tState = START; + var result = Number(this.string); + + if (isNaN(result)){ + return this.charError(buffer, i); + } + + if ((this.string.match(/[0-9]+/) == this.string) && (result.toString() != this.string)) { + // Long string of digits which is an ID string and not valid and/or safe JavaScript integer Number + this.onToken(STRING, this.string); + } else { + this.onToken(NUMBER, result); + } + + this.offset += this.string.length - 1; + this.string = undefined; + i--; + break; + } + }else if (this.tState === TRUE1){ // r + if (buffer[i] === 0x72) { this.tState = TRUE2; } + else { return this.charError(buffer, i); } + }else if (this.tState === TRUE2){ // u + if (buffer[i] === 0x75) { this.tState = TRUE3; } + else { return this.charError(buffer, i); } + }else if (this.tState === TRUE3){ // e + if (buffer[i] === 0x65) { this.tState = START; this.onToken(TRUE, true); this.offset+= 3; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE1){ // a + if (buffer[i] === 0x61) { this.tState = FALSE2; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE2){ // l + if (buffer[i] === 0x6c) { this.tState = FALSE3; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE3){ // s + if (buffer[i] === 0x73) { this.tState = FALSE4; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE4){ // e + if (buffer[i] === 0x65) { this.tState = START; this.onToken(FALSE, false); this.offset+= 4; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL1){ // u + if (buffer[i] === 0x75) { this.tState = NULL2; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL2){ // l + if (buffer[i] === 0x6c) { this.tState = NULL3; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL3){ // l + if (buffer[i] === 0x6c) { this.tState = START; this.onToken(NULL, null); this.offset += 3; } + else { return this.charError(buffer, i); } + } + } +}; +proto.onToken = function (token, value) { + // Override this to get events +}; + +proto.parseError = function (token, value) { + this.tState = STOP; + this.onError(new Error("Unexpected " + Parser.toknam(token) + (value ? ("(" + JSON.stringify(value) + ")") : "") + " in state " + Parser.toknam(this.state))); +}; +proto.push = function () { + this.stack.push({value: this.value, key: this.key, mode: this.mode}); +}; +proto.pop = function () { + var value = this.value; + var parent = this.stack.pop(); + this.value = parent.value; + this.key = parent.key; + this.mode = parent.mode; + this.emit(value); + if (!this.mode) { this.state = VALUE; } +}; +proto.emit = function (value) { + if (this.mode) { this.state = COMMA; } + this.onValue(value); +}; +proto.onValue = function (value) { + // Override me +}; +proto.onToken = function (token, value) { + if(this.state === VALUE){ + if(token === STRING || token === NUMBER || token === TRUE || token === FALSE || token === NULL){ + if (this.value) { + this.value[this.key] = value; + } + this.emit(value); + }else if(token === LEFT_BRACE){ + this.push(); + if (this.value) { + this.value = this.value[this.key] = {}; + } else { + this.value = {}; + } + this.key = undefined; + this.state = KEY; + this.mode = OBJECT; + }else if(token === LEFT_BRACKET){ + this.push(); + if (this.value) { + this.value = this.value[this.key] = []; + } else { + this.value = []; + } + this.key = 0; + this.mode = ARRAY; + this.state = VALUE; + }else if(token === RIGHT_BRACE){ + if (this.mode === OBJECT) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else if(token === RIGHT_BRACKET){ + if (this.mode === ARRAY) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else{ + return this.parseError(token, value); + } + }else if(this.state === KEY){ + if (token === STRING) { + this.key = value; + this.state = COLON; + } else if (token === RIGHT_BRACE) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else if(this.state === COLON){ + if (token === COLON) { this.state = VALUE; } + else { return this.parseError(token, value); } + }else if(this.state === COMMA){ + if (token === COMMA) { + if (this.mode === ARRAY) { this.key++; this.state = VALUE; } + else if (this.mode === OBJECT) { this.state = KEY; } + + } else if (token === RIGHT_BRACKET && this.mode === ARRAY || token === RIGHT_BRACE && this.mode === OBJECT) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else{ + return this.parseError(token, value); + } +}; + +Parser.C = C; + +var jsonparse = Parser; + +var Transform = stream.Transform; + +var JSON2CSVTransform = +/*#__PURE__*/ +function (_Transform) { + _inherits(JSON2CSVTransform, _Transform); + + function JSON2CSVTransform(opts, transformOpts) { + var _this; + + _classCallCheck(this, JSON2CSVTransform); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(JSON2CSVTransform).call(this, transformOpts)); // Inherit methods from JSON2CSVBase since extends doesn't + // allow multiple inheritance and manually preprocess opts + + Object.getOwnPropertyNames(JSON2CSVBase_1.prototype).forEach(function (key) { + return _this[key] = JSON2CSVBase_1.prototype[key]; + }); + _this.opts = _this.preprocessOpts(opts); + _this._data = ''; + _this._hasWritten = false; + + if (_this._readableState.objectMode) { + _this.initObjectModeParse(); + } else if (_this.opts.ndjson) { + _this.initNDJSONParse(); + } else { + _this.initJSONParser(); + } + + if (_this.opts.withBOM) { + _this.push("\uFEFF"); + } + + if (_this.opts.fields) { + _this.opts.fields = _this.preprocessFieldsInfo(_this.opts.fields); + + _this.pushHeader(); + } + + return _this; + } + /** + * Init the transform with a parser to process data in object mode. + * It receives JSON objects one by one and send them to `pushLine for processing. + */ + + + _createClass(JSON2CSVTransform, [{ + key: "initObjectModeParse", + value: function initObjectModeParse() { + var transform = this; + this.parser = { + write: function write(line) { + transform.pushLine(line); + }, + getPendingData: function getPendingData() { + return undefined; + } + }; + } + /** + * Init the transform with a parser to process NDJSON data. + * It maintains a buffer of received data, parses each line + * as JSON and send it to `pushLine for processing. + */ + + }, { + key: "initNDJSONParse", + value: function initNDJSONParse() { + var transform = this; + this.parser = { + _data: '', + write: function write(chunk) { + this._data += chunk.toString(); + + var lines = this._data.split('\n').map(function (line) { + return line.trim(); + }).filter(function (line) { + return line !== ''; + }); + + var pendingData = false; + lines.forEach(function (line, i) { + try { + transform.pushLine(JSON.parse(line)); + } catch (e) { + if (i === lines.length - 1) { + pendingData = true; + } else { + e.message = "Invalid JSON (".concat(line, ")"); + transform.emit('error', e); + } + } + }); + this._data = pendingData ? this._data.slice(this._data.lastIndexOf('\n')) : ''; + }, + getPendingData: function getPendingData() { + return this._data; + } + }; + } + /** + * Init the transform with a parser to process JSON data. + * It maintains a buffer of received data, parses each as JSON + * item if the data is an array or the data itself otherwise + * and send it to `pushLine` for processing. + */ + + }, { + key: "initJSONParser", + value: function initJSONParser() { + var transform = this; + this.parser = new jsonparse(); + + this.parser.onValue = function (value) { + if (this.stack.length !== this.depthToEmit) return; + transform.pushLine(value); + }; + + this.parser._onToken = this.parser.onToken; + + this.parser.onToken = function (token, value) { + transform.parser._onToken(token, value); + + if (this.stack.length === 0 && !transform.opts.fields && this.mode !== jsonparse.C.ARRAY && this.mode !== jsonparse.C.OBJECT) { + this.onError(new Error('Data should not be empty or the "fields" option should be included')); + } + + if (this.stack.length === 1) { + if (this.depthToEmit === undefined) { + // If Array emit its content, else emit itself + this.depthToEmit = this.mode === jsonparse.C.ARRAY ? 1 : 0; + } + + if (this.depthToEmit !== 0 && this.stack.length === 1) { + // No need to store the whole root array in memory + this.value = undefined; + } + } + }; + + this.parser.getPendingData = function () { + return this.value; + }; + + this.parser.onError = function (err) { + if (err.message.includes('Unexpected')) { + err.message = "Invalid JSON (".concat(err.message, ")"); + } + + transform.emit('error', err); + }; + } + /** + * Main function that send data to the parse to be processed. + * + * @param {Buffer} chunk Incoming data + * @param {String} encoding Encoding of the incoming data. Defaults to 'utf8' + * @param {Function} done Called when the proceesing of the supplied chunk is done + */ + + }, { + key: "_transform", + value: function _transform(chunk, encoding, done) { + this.parser.write(chunk); + done(); + } + }, { + key: "_flush", + value: function _flush(done) { + if (this.parser.getPendingData()) { + done(new Error('Invalid data received from stdin', this.parser.getPendingData())); + } + + done(); + } + /** + * Generate the csv header and pushes it downstream. + */ + + }, { + key: "pushHeader", + value: function pushHeader() { + if (this.opts.header) { + var header = this.getHeader(); + this.emit('header', header); + this.push(header); + this._hasWritten = true; + } + } + /** + * Transforms an incoming json data to csv and pushes it downstream. + * + * @param {Object} data JSON object to be converted in a CSV row + */ + + }, { + key: "pushLine", + value: function pushLine(data) { + var _this2 = this; + + var processedData = this.preprocessRow(data); + + if (!this._hasWritten) { + this.opts.fields = this.opts.fields || this.preprocessFieldsInfo(Object.keys(processedData[0])); + this.pushHeader(); + } + + processedData.forEach(function (row) { + var line = _this2.processRow(row, _this2.opts); + + if (line === undefined) return; + + _this2.emit('line', line); + + _this2.push(_this2._hasWritten ? _this2.opts.eol + line : line); + + _this2._hasWritten = true; + }); + } + }]); + + return JSON2CSVTransform; +}(Transform); + +var JSON2CSVTransform_1 = JSON2CSVTransform; + +var Transform$1 = stream.Transform; +var fastJoin$3 = utils.fastJoin; + +var JSON2CSVAsyncParser = +/*#__PURE__*/ +function () { + function JSON2CSVAsyncParser(opts, transformOpts) { + _classCallCheck(this, JSON2CSVAsyncParser); + + this.input = new Transform$1(transformOpts); + + this.input._read = function () {}; + + this.transform = new JSON2CSVTransform_1(opts, transformOpts); + this.processor = this.input.pipe(this.transform); + } + + _createClass(JSON2CSVAsyncParser, [{ + key: "fromInput", + value: function fromInput(input) { + if (this._input) { + throw new Error('Async parser already has an input.'); + } + + this._input = input; + this.input = this._input.pipe(this.processor); + return this; + } + }, { + key: "throughTransform", + value: function throughTransform(transform) { + if (this._output) { + throw new Error('Can\'t add transforms once an output has been added.'); + } + + this.processor = this.processor.pipe(transform); + return this; + } + }, { + key: "toOutput", + value: function toOutput(output) { + if (this._output) { + throw new Error('Async parser already has an output.'); + } + + this._output = output; + this.processor = this.processor.pipe(output); + return this; + } + }, { + key: "promise", + value: function promise() { + var _this = this; + + var returnCSV = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + return new Promise(function (resolve, reject) { + if (!returnCSV) { + _this.processor.on('finish', function () { + return resolve(); + }).on('error', function (err) { + return reject(err); + }); + + return; + } + + var csvBuffer = []; + + _this.processor.on('data', function (chunk) { + return csvBuffer.push(chunk.toString()); + }).on('finish', function () { + return resolve(fastJoin$3(csvBuffer, '')); + }).on('error', function (err) { + return reject(err); + }); + }); + } + }]); + + return JSON2CSVAsyncParser; +}(); + +var JSON2CSVAsyncParser_1 = JSON2CSVAsyncParser; + +/** + * Performs the flattening of a data row recursively + * + * @param {String} separator Separator to be used as the flattened field name + * @returns {Object => Object} Flattened object + */ +function flatten() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$objects = _ref.objects, + objects = _ref$objects === void 0 ? true : _ref$objects, + _ref$arrays = _ref.arrays, + arrays = _ref$arrays === void 0 ? false : _ref$arrays, + _ref$separator = _ref.separator, + separator = _ref$separator === void 0 ? '.' : _ref$separator; + + function step(obj, flatDataRow, currentPath) { + Object.keys(obj).forEach(function (key) { + var newPath = currentPath ? "".concat(currentPath).concat(separator).concat(key) : key; + var value = obj[key]; + + if (objects && _typeof(value) === 'object' && value !== null && !Array.isArray(value) && Object.prototype.toString.call(value.toJSON) !== '[object Function]' && Object.keys(value).length) { + step(value, flatDataRow, newPath); + return; + } + + if (arrays && Array.isArray(value)) { + step(value, flatDataRow, newPath); + return; + } + + flatDataRow[newPath] = value; + }); + return flatDataRow; + } + + return function (dataRow) { + return step(dataRow, {}); + }; +} + +var flatten_1 = flatten; + +var setProp$1 = utils.setProp, + unsetProp$1 = utils.unsetProp, + flattenReducer$3 = utils.flattenReducer; + +function getUnwindablePaths(obj, currentPath) { + return Object.keys(obj).reduce(function (unwindablePaths, key) { + var newPath = currentPath ? "".concat(currentPath, ".").concat(key) : key; + var value = obj[key]; + + if (_typeof(value) === 'object' && value !== null && !Array.isArray(value) && Object.prototype.toString.call(value.toJSON) !== '[object Function]' && Object.keys(value).length) { + unwindablePaths = unwindablePaths.concat(getUnwindablePaths(value, newPath)); + } else if (Array.isArray(value)) { + unwindablePaths.push(newPath); + unwindablePaths = unwindablePaths.concat(value.map(function (arrObj) { + return getUnwindablePaths(arrObj, newPath); + }).reduce(flattenReducer$3, []).filter(function (item, index, arr) { + return arr.indexOf(item) !== index; + })); + } + + return unwindablePaths; + }, []); +} +/** + * Performs the unwind recursively in specified sequence + * + * @param {String[]} unwindPaths The paths as strings to be used to deconstruct the array + * @returns {Object => Array} Array of objects containing all rows after unwind of chosen paths +*/ + + +function unwind() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$paths = _ref.paths, + paths = _ref$paths === void 0 ? undefined : _ref$paths, + _ref$blankOut = _ref.blankOut, + blankOut = _ref$blankOut === void 0 ? false : _ref$blankOut; + + function unwindReducer(rows, unwindPath) { + return rows.map(function (row) { + var unwindArray = lodash_get(row, unwindPath); + + if (!Array.isArray(unwindArray)) { + return row; + } + + if (!unwindArray.length) { + return unsetProp$1(row, unwindPath); + } + + return unwindArray.map(function (unwindRow, index) { + var clonedRow = blankOut && index > 0 ? {} : row; + return setProp$1(clonedRow, unwindPath, unwindRow); + }); + }).reduce(flattenReducer$3, []); + } + + paths = Array.isArray(paths) ? paths : paths ? [paths] : undefined; + return function (dataRow) { + return (paths || getUnwindablePaths(dataRow)).reduce(unwindReducer, [dataRow]); + }; +} + +var unwind_1 = unwind; + +var Readable = stream.Readable; +var Parser$1 = JSON2CSVParser_1; +var AsyncParser = JSON2CSVAsyncParser_1; +var Transform$2 = JSON2CSVTransform_1; // Convenience method to keep the API similar to version 3.X + +var parse = function parse(data, opts) { + return new JSON2CSVParser_1(opts).parse(data); +}; + +var parseAsync = function parseAsync(data, opts, transformOpts) { + try { + if (!(data instanceof Readable)) { + transformOpts = Object.assign({}, transformOpts, { + objectMode: true + }); + } + + var asyncParser = new JSON2CSVAsyncParser_1(opts, transformOpts); + var promise = asyncParser.promise(); + + if (Array.isArray(data)) { + data.forEach(function (item) { + return asyncParser.input.push(item); + }); + asyncParser.input.push(null); + } else if (data instanceof Readable) { + asyncParser.fromInput(data); + } else { + asyncParser.input.push(data); + asyncParser.input.push(null); + } + + return promise; + } catch (err) { + return Promise.reject(err); + } +}; + +var transforms = { + flatten: flatten_1, + unwind: unwind_1 +}; +var json2csv = { + Parser: Parser$1, + AsyncParser: AsyncParser, + Transform: Transform$2, + parse: parse, + parseAsync: parseAsync, + transforms: transforms +}; + +export default json2csv; +export { AsyncParser, Parser$1 as Parser, Transform$2 as Transform, parse, parseAsync, transforms }; diff --git a/node_modules/json2csv/dist/json2csv.umd.js b/node_modules/json2csv/dist/json2csv.umd.js new file mode 100644 index 0000000..eea46da --- /dev/null +++ b/node_modules/json2csv/dist/json2csv.umd.js @@ -0,0 +1,7448 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.json2csv = {})); +}(this, function (exports) { 'use strict'; + + var domain; + + // This constructor is used to store event handlers. Instantiating this is + // faster than explicitly calling `Object.create(null)` to get a "clean" empty + // object (tested with v8 v4.9). + function EventHandlers() {} + EventHandlers.prototype = Object.create(null); + + function EventEmitter() { + EventEmitter.init.call(this); + } + + // nodejs oddity + // require('events') === require('events').EventEmitter + EventEmitter.EventEmitter = EventEmitter; + + EventEmitter.usingDomains = false; + + EventEmitter.prototype.domain = undefined; + EventEmitter.prototype._events = undefined; + EventEmitter.prototype._maxListeners = undefined; + + // By default EventEmitters will print a warning if more than 10 listeners are + // added to it. This is a useful default which helps finding memory leaks. + EventEmitter.defaultMaxListeners = 10; + + EventEmitter.init = function() { + this.domain = null; + if (EventEmitter.usingDomains) { + // if there is an active domain, then attach to it. + if (domain.active && !(this instanceof domain.Domain)) ; + } + + if (!this._events || this._events === Object.getPrototypeOf(this)._events) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; + }; + + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; + }; + + function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; + } + + EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); + }; + + // These standalone emit* functions are used to optimize calling of event + // handlers for fast cases because emit() itself often has a variable number of + // arguments and can be deoptimized because of that. These functions always have + // the same number of arguments and thus do not get deoptimized, so the code + // inside them can execute faster. + function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } + } + function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } + } + function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } + } + function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } + } + + function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } + } + + EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events, domain; + var doError = (type === 'error'); + + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; + + domain = this.domain; + + // If there is no 'error' event listener then throw. + if (doError) { + er = arguments[1]; + if (domain) { + if (!er) + er = new Error('Uncaught, unspecified "error" event'); + er.domainEmitter = this; + er.domain = domain; + er.domainThrown = false; + domain.emit('error', er); + } else if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) + return false; + + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; + }; + + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = new EventHandlers(); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend ? [listener, existing] : + [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' ' + type + ' listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + emitWarning(w); + } + } + } + + return target; + } + function emitWarning(e) { + typeof console.warn === 'function' ? console.warn(e) : console.log(e); + } + EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); + }; + + EventEmitter.prototype.on = EventEmitter.prototype.addListener; + + EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + + function _onceWrap(target, type, listener) { + var fired = false; + function g() { + target.removeListener(type, g); + if (!fired) { + fired = true; + listener.apply(target, arguments); + } + } + g.listener = listener; + return g; + } + + EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + + EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + + // emits a 'removeListener' event iff the listener was removed + EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) + return this; + + list = events[type]; + if (!list) + return this; + + if (list === listener || (list.listener && list.listener === listener)) { + if (--this._eventsCount === 0) + this._events = new EventHandlers(); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list[0] = undefined; + if (--this._eventsCount === 0) { + this._events = new EventHandlers(); + return this; + } else { + delete events[type]; + } + } else { + spliceOne(list, position); + } + + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + + EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events; + + events = this._events; + if (!events) + return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = new EventHandlers(); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = new EventHandlers(); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + for (var i = 0, key; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = new EventHandlers(); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + do { + this.removeListener(type, listeners[listeners.length - 1]); + } while (listeners[0]); + } + + return this; + }; + + EventEmitter.prototype.listeners = function listeners(type) { + var evlistener; + var ret; + var events = this._events; + + if (!events) + ret = []; + else { + evlistener = events[type]; + if (!evlistener) + ret = []; + else if (typeof evlistener === 'function') + ret = [evlistener.listener || evlistener]; + else + ret = unwrapListeners(evlistener); + } + + return ret; + }; + + EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } + }; + + EventEmitter.prototype.listenerCount = listenerCount; + function listenerCount(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; + } + + EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; + }; + + // About 1.5x faster than the two-arg version of Array#splice(). + function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); + } + + function arrayClone(arr, i) { + var copy = new Array(i); + while (i--) + copy[i] = arr[i]; + return copy; + } + + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + + var global$1 = (typeof global !== "undefined" ? global : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {}); + + var lookup = []; + var revLookup = []; + var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array; + var inited = false; + function init () { + inited = true; + var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i]; + revLookup[code.charCodeAt(i)] = i; + } + + revLookup['-'.charCodeAt(0)] = 62; + revLookup['_'.charCodeAt(0)] = 63; + } + + function toByteArray (b64) { + if (!inited) { + init(); + } + var i, j, l, tmp, placeHolders, arr; + var len = b64.length; + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; + + // base64 is 4/3 + up to two characters of the original data + arr = new Arr(len * 3 / 4 - placeHolders); + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len; + + var L = 0; + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]; + arr[L++] = (tmp >> 16) & 0xFF; + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4); + arr[L++] = tmp & 0xFF; + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2); + arr[L++] = (tmp >> 8) & 0xFF; + arr[L++] = tmp & 0xFF; + } + + return arr + } + + function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] + } + + function encodeChunk (uint8, start, end) { + var tmp; + var output = []; + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]); + output.push(tripletToBase64(tmp)); + } + return output.join('') + } + + function fromByteArray (uint8) { + if (!inited) { + init(); + } + var tmp; + var len = uint8.length; + var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes + var output = ''; + var parts = []; + var maxChunkLength = 16383; // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))); + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1]; + output += lookup[tmp >> 2]; + output += lookup[(tmp << 4) & 0x3F]; + output += '=='; + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]); + output += lookup[tmp >> 10]; + output += lookup[(tmp >> 4) & 0x3F]; + output += lookup[(tmp << 2) & 0x3F]; + output += '='; + } + + parts.push(output); + + return parts.join('') + } + + function read (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) + } + + function write (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; + } + + var toString = {}.toString; + + var isArray = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; + }; + + var INSPECT_MAX_BYTES = 50; + + /** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Use Object implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * Due to various browser bugs, sometimes the Object implementation will be used even + * when the browser supports typed arrays. + * + * Note: + * + * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, + * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. + * + * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. + * + * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of + * incorrect length in some situations. + + * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they + * get the Object implementation, which is slower but behaves correctly. + */ + Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined + ? global$1.TYPED_ARRAY_SUPPORT + : true; + + function kMaxLength () { + return Buffer.TYPED_ARRAY_SUPPORT + ? 0x7fffffff + : 0x3fffffff + } + + function createBuffer (that, length) { + if (kMaxLength() < length) { + throw new RangeError('Invalid typed array length') + } + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = new Uint8Array(length); + that.__proto__ = Buffer.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + if (that === null) { + that = new Buffer(length); + } + that.length = length; + } + + return that + } + + /** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + + function Buffer (arg, encodingOrOffset, length) { + if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { + return new Buffer(arg, encodingOrOffset, length) + } + + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new Error( + 'If encoding is specified then the first argument must be a string' + ) + } + return allocUnsafe(this, arg) + } + return from(this, arg, encodingOrOffset, length) + } + + Buffer.poolSize = 8192; // not used by this implementation + + // TODO: Legacy, not needed anymore. Remove in next major version. + Buffer._augment = function (arr) { + arr.__proto__ = Buffer.prototype; + return arr + }; + + function from (that, value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('"value" argument must not be a number') + } + + if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { + return fromArrayBuffer(that, value, encodingOrOffset, length) + } + + if (typeof value === 'string') { + return fromString(that, value, encodingOrOffset) + } + + return fromObject(that, value) + } + + /** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ + Buffer.from = function (value, encodingOrOffset, length) { + return from(null, value, encodingOrOffset, length) + }; + + if (Buffer.TYPED_ARRAY_SUPPORT) { + Buffer.prototype.__proto__ = Uint8Array.prototype; + Buffer.__proto__ = Uint8Array; + } + + function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be a number') + } else if (size < 0) { + throw new RangeError('"size" argument must not be negative') + } + } + + function alloc (that, size, fill, encoding) { + assertSize(size); + if (size <= 0) { + return createBuffer(that, size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(that, size).fill(fill, encoding) + : createBuffer(that, size).fill(fill) + } + return createBuffer(that, size) + } + + /** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ + Buffer.alloc = function (size, fill, encoding) { + return alloc(null, size, fill, encoding) + }; + + function allocUnsafe (that, size) { + assertSize(size); + that = createBuffer(that, size < 0 ? 0 : checked(size) | 0); + if (!Buffer.TYPED_ARRAY_SUPPORT) { + for (var i = 0; i < size; ++i) { + that[i] = 0; + } + } + return that + } + + /** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ + Buffer.allocUnsafe = function (size) { + return allocUnsafe(null, size) + }; + /** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ + Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(null, size) + }; + + function fromString (that, string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8'; + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('"encoding" must be a valid string encoding') + } + + var length = byteLength(string, encoding) | 0; + that = createBuffer(that, length); + + var actual = that.write(string, encoding); + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + that = that.slice(0, actual); + } + + return that + } + + function fromArrayLike (that, array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0; + that = createBuffer(that, length); + for (var i = 0; i < length; i += 1) { + that[i] = array[i] & 255; + } + return that + } + + function fromArrayBuffer (that, array, byteOffset, length) { + array.byteLength; // this throws if `array` is not a valid ArrayBuffer + + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('\'offset\' is out of bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('\'length\' is out of bounds') + } + + if (byteOffset === undefined && length === undefined) { + array = new Uint8Array(array); + } else if (length === undefined) { + array = new Uint8Array(array, byteOffset); + } else { + array = new Uint8Array(array, byteOffset, length); + } + + if (Buffer.TYPED_ARRAY_SUPPORT) { + // Return an augmented `Uint8Array` instance, for best performance + that = array; + that.__proto__ = Buffer.prototype; + } else { + // Fallback: Return an object instance of the Buffer class + that = fromArrayLike(that, array); + } + return that + } + + function fromObject (that, obj) { + if (internalIsBuffer(obj)) { + var len = checked(obj.length) | 0; + that = createBuffer(that, len); + + if (that.length === 0) { + return that + } + + obj.copy(that, 0, 0, len); + return that + } + + if (obj) { + if ((typeof ArrayBuffer !== 'undefined' && + obj.buffer instanceof ArrayBuffer) || 'length' in obj) { + if (typeof obj.length !== 'number' || isnan(obj.length)) { + return createBuffer(that, 0) + } + return fromArrayLike(that, obj) + } + + if (obj.type === 'Buffer' && isArray(obj.data)) { + return fromArrayLike(that, obj.data) + } + } + + throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') + } + + function checked (length) { + // Note: cannot use `length < kMaxLength()` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= kMaxLength()) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + kMaxLength().toString(16) + ' bytes') + } + return length | 0 + } + Buffer.isBuffer = isBuffer; + function internalIsBuffer (b) { + return !!(b != null && b._isBuffer) + } + + Buffer.compare = function compare (a, b) { + if (!internalIsBuffer(a) || !internalIsBuffer(b)) { + throw new TypeError('Arguments must be Buffers') + } + + if (a === b) return 0 + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } + }; + + Buffer.concat = function concat (list, length) { + if (!isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i; + if (length === undefined) { + length = 0; + for (i = 0; i < list.length; ++i) { + length += list[i].length; + } + } + + var buffer = Buffer.allocUnsafe(length); + var pos = 0; + for (i = 0; i < list.length; ++i) { + var buf = list[i]; + if (!internalIsBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos); + pos += buf.length; + } + return buffer + }; + + function byteLength (string, encoding) { + if (internalIsBuffer(string)) { + return string.length + } + if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && + (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + string = '' + string; + } + + var len = string.length; + if (len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + case undefined: + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) return utf8ToBytes(string).length // assume utf8 + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + } + Buffer.byteLength = byteLength; + + function slowToString (encoding, start, end) { + var loweredCase = false; + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0; + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length; + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0; + start >>>= 0; + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8'; + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase(); + loweredCase = true; + } + } + } + + // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect + // Buffer instances. + Buffer.prototype._isBuffer = true; + + function swap (b, n, m) { + var i = b[n]; + b[n] = b[m]; + b[m] = i; + } + + Buffer.prototype.swap16 = function swap16 () { + var len = this.length; + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1); + } + return this + }; + + Buffer.prototype.swap32 = function swap32 () { + var len = this.length; + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3); + swap(this, i + 1, i + 2); + } + return this + }; + + Buffer.prototype.swap64 = function swap64 () { + var len = this.length; + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7); + swap(this, i + 1, i + 6); + swap(this, i + 2, i + 5); + swap(this, i + 3, i + 4); + } + return this + }; + + Buffer.prototype.toString = function toString () { + var length = this.length | 0; + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) + }; + + Buffer.prototype.equals = function equals (b) { + if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 + }; + + Buffer.prototype.inspect = function inspect () { + var str = ''; + var max = INSPECT_MAX_BYTES; + if (this.length > 0) { + str = this.toString('hex', 0, max).match(/.{2}/g).join(' '); + if (this.length > max) str += ' ... '; + } + return '' + }; + + Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (!internalIsBuffer(target)) { + throw new TypeError('Argument must be a Buffer') + } + + if (start === undefined) { + start = 0; + } + if (end === undefined) { + end = target ? target.length : 0; + } + if (thisStart === undefined) { + thisStart = 0; + } + if (thisEnd === undefined) { + thisEnd = this.length; + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0; + end >>>= 0; + thisStart >>>= 0; + thisEnd >>>= 0; + + if (this === target) return 0 + + var x = thisEnd - thisStart; + var y = end - start; + var len = Math.min(x, y); + + var thisCopy = this.slice(thisStart, thisEnd); + var targetCopy = target.slice(start, end); + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i]; + y = targetCopy[i]; + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 + }; + + // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, + // OR the last index of `val` in `buffer` at offset <= `byteOffset`. + // + // Arguments: + // - buffer - a Buffer to search + // - val - a string, Buffer, or number + // - byteOffset - an index into `buffer`; will be clamped to an int32 + // - encoding - an optional encoding, relevant is val is a string + // - dir - true for indexOf, false for lastIndexOf + function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset; + byteOffset = 0; + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff; + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000; + } + byteOffset = +byteOffset; // Coerce to Number. + if (isNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1); + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset; + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1; + } else if (byteOffset < 0) { + if (dir) byteOffset = 0; + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding); + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (internalIsBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF; // Search for a byte value [0-255] + if (Buffer.TYPED_ARRAY_SUPPORT && + typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') + } + + function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1; + var arrLength = arr.length; + var valLength = val.length; + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase(); + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2; + arrLength /= 2; + valLength /= 2; + byteOffset /= 2; + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i; + if (dir) { + var foundIndex = -1; + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i; + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex; + foundIndex = -1; + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength; + for (i = byteOffset; i >= 0; i--) { + var found = true; + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false; + break + } + } + if (found) return i + } + } + + return -1 + } + + Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 + }; + + Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) + }; + + Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) + }; + + function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0; + var remaining = buf.length - offset; + if (!length) { + length = remaining; + } else { + length = Number(length); + if (length > remaining) { + length = remaining; + } + } + + // must be an even number of digits + var strLen = string.length; + if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') + + if (length > strLen / 2) { + length = strLen / 2; + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16); + if (isNaN(parsed)) return i + buf[offset + i] = parsed; + } + return i + } + + function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) + } + + function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) + } + + function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) + } + + function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) + } + + function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) + } + + Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8'; + length = this.length; + offset = 0; + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset; + length = this.length; + offset = 0; + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset | 0; + if (isFinite(length)) { + length = length | 0; + if (encoding === undefined) encoding = 'utf8'; + } else { + encoding = length; + length = undefined; + } + // legacy write(string, encoding, offset, length) - remove in v0.13 + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset; + if (length === undefined || length > remaining) length = remaining; + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8'; + + var loweredCase = false; + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase(); + loweredCase = true; + } + } + }; + + Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } + }; + + function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return fromByteArray(buf) + } else { + return fromByteArray(buf.slice(start, end)) + } + } + + function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end); + var res = []; + + var i = start; + while (i < end) { + var firstByte = buf[i]; + var codePoint = null; + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1; + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint; + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte; + } + break + case 2: + secondByte = buf[i + 1]; + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F); + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint; + } + } + break + case 3: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F); + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint; + } + } + break + case 4: + secondByte = buf[i + 1]; + thirdByte = buf[i + 2]; + fourthByte = buf[i + 3]; + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F); + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint; + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD; + bytesPerSequence = 1; + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000; + res.push(codePoint >>> 10 & 0x3FF | 0xD800); + codePoint = 0xDC00 | codePoint & 0x3FF; + } + + res.push(codePoint); + i += bytesPerSequence; + } + + return decodeCodePointsArray(res) + } + + // Based on http://stackoverflow.com/a/22747272/680742, the browser with + // the lowest limit is Chrome, with 0x10000 args. + // We go 1 magnitude less, for safety + var MAX_ARGUMENTS_LENGTH = 0x1000; + + function decodeCodePointsArray (codePoints) { + var len = codePoints.length; + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = ''; + var i = 0; + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ); + } + return res + } + + function asciiSlice (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F); + } + return ret + } + + function latin1Slice (buf, start, end) { + var ret = ''; + end = Math.min(buf.length, end); + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]); + } + return ret + } + + function hexSlice (buf, start, end) { + var len = buf.length; + + if (!start || start < 0) start = 0; + if (!end || end < 0 || end > len) end = len; + + var out = ''; + for (var i = start; i < end; ++i) { + out += toHex(buf[i]); + } + return out + } + + function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end); + var res = ''; + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256); + } + return res + } + + Buffer.prototype.slice = function slice (start, end) { + var len = this.length; + start = ~~start; + end = end === undefined ? len : ~~end; + + if (start < 0) { + start += len; + if (start < 0) start = 0; + } else if (start > len) { + start = len; + } + + if (end < 0) { + end += len; + if (end < 0) end = 0; + } else if (end > len) { + end = len; + } + + if (end < start) end = start; + + var newBuf; + if (Buffer.TYPED_ARRAY_SUPPORT) { + newBuf = this.subarray(start, end); + newBuf.__proto__ = Buffer.prototype; + } else { + var sliceLen = end - start; + newBuf = new Buffer(sliceLen, undefined); + for (var i = 0; i < sliceLen; ++i) { + newBuf[i] = this[i + start]; + } + } + + return newBuf + }; + + /* + * Need to make sure that buffer isn't trying to write out of bounds. + */ + function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') + } + + Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + + return val + }; + + Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + checkOffset(offset, byteLength, this.length); + } + + var val = this[offset + --byteLength]; + var mul = 1; + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul; + } + + return val + }; + + Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length); + return this[offset] + }; + + Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + return this[offset] | (this[offset + 1] << 8) + }; + + Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + return (this[offset] << 8) | this[offset + 1] + }; + + Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) + }; + + Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) + }; + + Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var val = this[offset]; + var mul = 1; + var i = 0; + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) checkOffset(offset, byteLength, this.length); + + var i = byteLength; + var mul = 1; + var val = this[offset + --i]; + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul; + } + mul *= 0x80; + + if (val >= mul) val -= Math.pow(2, 8 * byteLength); + + return val + }; + + Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + if (!noAssert) checkOffset(offset, 1, this.length); + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) + }; + + Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset] | (this[offset + 1] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 2, this.length); + var val = this[offset + 1] | (this[offset] << 8); + return (val & 0x8000) ? val | 0xFFFF0000 : val + }; + + Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) + }; + + Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) + }; + + Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + return read(this, offset, true, 23, 4) + }; + + Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 4, this.length); + return read(this, offset, false, 23, 4) + }; + + Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length); + return read(this, offset, true, 52, 8) + }; + + Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + if (!noAssert) checkOffset(offset, 8, this.length); + return read(this, offset, false, 52, 8) + }; + + function checkInt (buf, value, offset, ext, max, min) { + if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') + } + + Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var mul = 1; + var i = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + byteLength = byteLength | 0; + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1; + checkInt(this, value, offset, byteLength, maxBytes, 0); + } + + var i = byteLength - 1; + var mul = 1; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0); + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + this[offset] = (value & 0xff); + return offset + 1 + }; + + function objectWriteUInt16 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { + buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> + (littleEndian ? i : 1 - i) * 8; + } + } + + Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16(this, value, offset, true); + } + return offset + 2 + }; + + Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16(this, value, offset, false); + } + return offset + 2 + }; + + function objectWriteUInt32 (buf, value, offset, littleEndian) { + if (value < 0) value = 0xffffffff + value + 1; + for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { + buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff; + } + } + + Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset + 3] = (value >>> 24); + this[offset + 2] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, true); + } + return offset + 4 + }; + + Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, false); + } + return offset + 4 + }; + + Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = 0; + var mul = 1; + var sub = 0; + this[offset] = value & 0xFF; + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) { + var limit = Math.pow(2, 8 * byteLength - 1); + + checkInt(this, value, offset, byteLength, limit - 1, -limit); + } + + var i = byteLength - 1; + var mul = 1; + var sub = 0; + this[offset + i] = value & 0xFF; + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1; + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF; + } + + return offset + byteLength + }; + + Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80); + if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value); + if (value < 0) value = 0xff + value + 1; + this[offset] = (value & 0xff); + return offset + 1 + }; + + Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + } else { + objectWriteUInt16(this, value, offset, true); + } + return offset + 2 + }; + + Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 8); + this[offset + 1] = (value & 0xff); + } else { + objectWriteUInt16(this, value, offset, false); + } + return offset + 2 + }; + + Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value & 0xff); + this[offset + 1] = (value >>> 8); + this[offset + 2] = (value >>> 16); + this[offset + 3] = (value >>> 24); + } else { + objectWriteUInt32(this, value, offset, true); + } + return offset + 4 + }; + + Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value; + offset = offset | 0; + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000); + if (value < 0) value = 0xffffffff + value + 1; + if (Buffer.TYPED_ARRAY_SUPPORT) { + this[offset] = (value >>> 24); + this[offset + 1] = (value >>> 16); + this[offset + 2] = (value >>> 8); + this[offset + 3] = (value & 0xff); + } else { + objectWriteUInt32(this, value, offset, false); + } + return offset + 4 + }; + + function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') + } + + function writeFloat (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 4); + } + write(buf, value, offset, littleEndian, 23, 4); + return offset + 4 + } + + Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) + }; + + Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) + }; + + function writeDouble (buf, value, offset, littleEndian, noAssert) { + if (!noAssert) { + checkIEEE754(buf, value, offset, 8); + } + write(buf, value, offset, littleEndian, 52, 8); + return offset + 8 + } + + Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) + }; + + Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) + }; + + // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) + Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!start) start = 0; + if (!end && end !== 0) end = this.length; + if (targetStart >= target.length) targetStart = target.length; + if (!targetStart) targetStart = 0; + if (end > 0 && end < start) end = start; + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length; + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start; + } + + var len = end - start; + var i; + + if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start]; + } + } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { + // ascending copy from start + for (i = 0; i < len; ++i) { + target[i + targetStart] = this[i + start]; + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, start + len), + targetStart + ); + } + + return len + }; + + // Usage: + // buffer.fill(number[, offset[, end]]) + // buffer.fill(buffer[, offset[, end]]) + // buffer.fill(string[, offset[, end]][, encoding]) + Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start; + start = 0; + end = this.length; + } else if (typeof end === 'string') { + encoding = end; + end = this.length; + } + if (val.length === 1) { + var code = val.charCodeAt(0); + if (code < 256) { + val = code; + } + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + } else if (typeof val === 'number') { + val = val & 255; + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0; + end = end === undefined ? this.length : end >>> 0; + + if (!val) val = 0; + + var i; + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val; + } + } else { + var bytes = internalIsBuffer(val) + ? val + : utf8ToBytes(new Buffer(val, encoding).toString()); + var len = bytes.length; + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len]; + } + } + + return this + }; + + // HELPER FUNCTIONS + // ================ + + var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g; + + function base64clean (str) { + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = stringtrim(str).replace(INVALID_BASE64_RE, ''); + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '='; + } + return str + } + + function stringtrim (str) { + if (str.trim) return str.trim() + return str.replace(/^\s+|\s+$/g, '') + } + + function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) + } + + function utf8ToBytes (string, units) { + units = units || Infinity; + var codePoint; + var length = string.length; + var leadSurrogate = null; + var bytes = []; + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i); + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + continue + } + + // valid lead + leadSurrogate = codePoint; + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + leadSurrogate = codePoint; + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000; + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD); + } + + leadSurrogate = null; + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint); + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ); + } else { + throw new Error('Invalid code point') + } + } + + return bytes + } + + function asciiToBytes (str) { + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF); + } + return byteArray + } + + function utf16leToBytes (str, units) { + var c, hi, lo; + var byteArray = []; + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i); + hi = c >> 8; + lo = c % 256; + byteArray.push(lo); + byteArray.push(hi); + } + + return byteArray + } + + + function base64ToBytes (str) { + return toByteArray(base64clean(str)) + } + + function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i]; + } + return i + } + + function isnan (val) { + return val !== val // eslint-disable-line no-self-compare + } + + + // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence + // The _isBuffer check is for Safari 5-7 support, because it's missing + // Object.prototype.constructor. Remove this eventually + function isBuffer(obj) { + return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj)) + } + + function isFastBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) + } + + // For Node v0.10 support. Remove this eventually. + function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0)) + } + + // shim for using process in browser + // based off https://github.com/defunctzombie/node-process/blob/master/browser.js + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + var cachedSetTimeout = defaultSetTimout; + var cachedClearTimeout = defaultClearTimeout; + if (typeof global$1.setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } + if (typeof global$1.clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } + + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + function nextTick(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + } + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + + // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + var performance = global$1.performance || {}; + var performanceNow = + performance.now || + performance.mozNow || + performance.msNow || + performance.oNow || + performance.webkitNow || + function(){ return (new Date()).getTime() }; + + var inherits; + if (typeof Object.create === 'function'){ + inherits = function inherits(ctor, superCtor) { + // implementation from standard node.js 'util' module + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; + } else { + inherits = function inherits(ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + }; + } + var inherits$1 = inherits; + + var formatRegExp = /%[sdj%]/g; + function format(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; + } + + // Mark that a method should not be used. + // Returns a modified function which warns once by default. + // If --no-deprecation is set, then it is a no-op. + function deprecate(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global$1.process)) { + return function() { + return deprecate(fn, msg).apply(this, arguments); + }; + } + + var warned = false; + function deprecated() { + if (!warned) { + { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; + } + + var debugs = {}; + var debugEnviron; + function debuglog(set) { + if (isUndefined(debugEnviron)) + debugEnviron = ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = 0; + debugs[set] = function() { + var msg = format.apply(null, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; + } + + /** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ + /* legacy: obj, showHidden, depth, colors*/ + function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + _extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); + } + + // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics + inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] + }; + + // Don't use 'blue' not visible on cmd.exe + inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' + }; + + + function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } + } + + + function stylizeNoColor(str, styleType) { + return str; + } + + + function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; + } + + + function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray$1(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); + } + + + function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); + } + + + function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; + } + + + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; + } + + + function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; + } + + + function reduceToSingleString(output, base, braces) { + var length = output.reduce(function(prev, cur) { + if (cur.indexOf('\n') >= 0) ; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + } + + + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray$1(ar) { + return Array.isArray(ar); + } + + function isBoolean(arg) { + return typeof arg === 'boolean'; + } + + function isNull(arg) { + return arg === null; + } + + function isNumber(arg) { + return typeof arg === 'number'; + } + + function isString(arg) { + return typeof arg === 'string'; + } + + function isUndefined(arg) { + return arg === void 0; + } + + function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; + } + + function isObject(arg) { + return typeof arg === 'object' && arg !== null; + } + + function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; + } + + function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); + } + + function isFunction(arg) { + return typeof arg === 'function'; + } + + function objectToString(o) { + return Object.prototype.toString.call(o); + } + + function _extend(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; + } + function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + + function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function (v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function (v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function (n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + // Copyright Joyent, Inc. and other Node contributors. + var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + }; + + + function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } + } + + // StringDecoder provides an interface for efficiently splitting a series of + // buffers into a series of JS strings without breaking apart multi-byte + // characters. CESU-8 is handled as part of the UTF-8 encoding. + // + // @TODO Handling all encodings inside a single object makes it very difficult + // to reason about this code, so it should be split up in the future. + // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code + // points as used by CESU-8. + function StringDecoder(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; + } + + // write decodes the given buffer and returns it as JS string that is + // guaranteed to not contain any partial multi-byte characters. Any partial + // character found at the end of the buffer is buffered up, and will be + // returned when calling write again with the remaining bytes. + // + // Note: Converting a Buffer containing an orphan surrogate to a String + // currently works, but converting a String to a Buffer (via `new Buffer`, or + // Buffer#write) will replace incomplete surrogates with the unicode + // replacement character. See https://codereview.chromium.org/121173009/ . + StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; + }; + + // detectIncompleteChar determines if there is an incomplete UTF-8 character at + // the end of the given buffer. If so, it sets this.charLength to the byte + // length that character, and sets this.charReceived to the number of bytes + // that are available for this character. + StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; + }; + + StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; + }; + + function passThroughWrite(buffer) { + return buffer.toString(this.encoding); + } + + function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; + } + + function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; + } + + Readable.ReadableState = ReadableState; + + var debug = debuglog('stream'); + inherits$1(Readable, EventEmitter); + + function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) + emitter.on(event, fn); + else if (Array.isArray(emitter._events[event])) + emitter._events[event].unshift(fn); + else + emitter._events[event] = [fn, emitter._events[event]]; + } + } + function listenerCount$1 (emitter, type) { + return emitter.listeners(type).length; + } + function ReadableState(options, stream) { + + options = options || {}; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } + } + function Readable(options) { + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') this._read = options.read; + + EventEmitter.call(this); + } + + // Manually shove something into the read() buffer. + // This returns true if the highWaterMark has not been hit yet, + // similar to how Writable.write() returns true if you should + // write() some more. + Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); + }; + + // Unshift should *always* be something directly out of read() + Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); + }; + + Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; + }; + + function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); + } + + // if it's past the high water mark, we can push in some more. + // Also, if we have no data yet, we can stand some + // more bytes. This is to work around cases where hwm=0, + // such as the repl. Also, if the push() triggered a + // readable event, and the user called read(largeNumber) such that + // needReadable was set, then we ought to push more, so that another + // 'readable' event will be triggered. + function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + } + + // backwards compatibility. + Readable.prototype.setEncoding = function (enc) { + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; + }; + + // Don't raise the hwm > 8MB + var MAX_HWM = 0x800000; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; + } + + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; + } + + // you can override either this method, or the async _read(n) below. + Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; + }; + + function chunkInvalid(state, chunk) { + var er = null; + if (!isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; + } + + function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); + } + + // Don't emit readable right away in sync mode, because this can trigger + // another read() call => stack overflow. This way, it might trigger + // a nextTick recursion warning, but that's not so bad. + function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream); + } + } + + function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); + } + + // at this point, the user has presumably seen the 'readable' event, + // and called read() to consume some data. that may have triggered + // in turn another _read(n) call, in which case reading = true if + // it's in progress. + // However, if we're not ended, or reading, and the length < hwm, + // then go ahead and try to read some more preemptively. + function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + nextTick(maybeReadMore_, stream, state); + } + } + + function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; + } + + // abstract method. to be overridden in specific implementation classes. + // call cb(er, data) where data is <= n in length. + // for virtual (non-string, non-buffer) streams, "length" is somewhat + // arbitrary, and perhaps not very meaningful. + Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); + }; + + Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false); + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (listenerCount$1(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; + }; + + function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && src.listeners('data').length) { + state.flowing = true; + flow(src); + } + }; + } + + Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; + }; + + // set up data events if they are asked for + // Ensure readable listeners eventually get something + Readable.prototype.on = function (ev, fn) { + var res = EventEmitter.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + + function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); + } + + // pause() and resume() are remnants of the legacy readable stream API + // If the user uses them, then switch into old mode. + Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; + }; + + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + nextTick(resume_, stream, state); + } + } + + function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); + } + + Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; + }; + + function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} + } + + // wrap an old-style stream as the async data source. + // This is *not* part of the readable stream interface. + // It is an ugly unfortunate mess of history. + Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; + }; + + // exposed for testing purposes only. + Readable._fromList = fromList; + + // Pluck off n bytes from an array of buffers. + // Length is the combined lengths of all the buffers in the list. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; + } + + // Extracts only enough buffered data to satisfy the amount requested. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; + } + + // Copies a specified amount of characters from the list of buffered data + // chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + + // Copies a specified amount of bytes from the list of buffered data chunks. + // This function is designed to be inlinable, so please take care when making + // changes to the function body. + function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + + function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + nextTick(endReadableNT, state, stream); + } + } + + function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + } + + function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } + } + + function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; + } + + // A bit simpler than readable streams. + Writable.WritableState = WritableState; + inherits$1(Writable, EventEmitter); + + function nop() {} + + function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; + } + + function WritableState(options, stream) { + Object.defineProperty(this, 'buffer', { + get: deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); + } + + WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; + }; + function Writable(options) { + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + + EventEmitter.call(this); + } + + // Otherwise people can pipe Writable streams, which is just wrong. + Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); + }; + + function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + nextTick(cb, er); + } + + // If we get something that is not a buffer, string, null, or undefined, + // and we're not in objectMode, then that's an error. + // Otherwise stream chunks are all considered to be of length=1, and the + // watermarks determine how many objects to keep in the buffer, rather than + // how many bytes or characters. + function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + nextTick(cb, er); + valid = false; + } + return valid; + } + + Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; + }; + + Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; + }; + + Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } + }; + + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; + }; + + function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; + } + + // if we're already writing something, then just put this + // in the queue, and wait our turn. Otherwise, call _write + // If we return false, then we need a drain event, so set that flag. + function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; + } + + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + + function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) nextTick(cb, er);else cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } + + function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + } + + function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + nextTick(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } + } + + function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); + } + + // Must force callback to be called on nextTick, so that we don't + // emit 'drain' before the write() consumer gets the 'false' return + // value, and has a chance to attach a 'drain' listener. + function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } + } + + // if there's something in the buffer waiting, then process it + function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; + } + + Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); + }; + + Writable.prototype._writev = null; + + Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); + }; + + function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; + } + + function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } + } + + function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; + } + + function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; + } + + // It seems a linked list but it is not + // there will be only 2 of these for each stream + function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; + } + + inherits$1(Duplex, Readable); + + var keys = Object.keys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } + function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); + } + + // the no-half-open enforcer + function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + nextTick(onEndNT, this); + } + + function onEndNT(self) { + self.end(); + } + + // a transform stream is a readable/writable stream where you do + inherits$1(Transform, Duplex); + + function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; + } + + function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } + } + function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); + } + + Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); + }; + + // This is the part where you do stuff! + // override this function in implementation classes. + // 'chunk' is an input chunk. + // + // Call `push(newChunk)` to pass along transformed output + // to the readable side. You may call 'push' zero or more times. + // + // Call `cb(err)` when you are done with this chunk. If you pass + // an error, then that'll put the hurt on the whole operation. If you + // never call cb(), then you'll never get another chunk. + Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('Not implemented'); + }; + + Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } + }; + + // Doesn't matter what the args are here. + // _transform does all the work. + // That we got here means that the readable side wants more data. + Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } + }; + + function done(stream, er) { + if (er) return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); + } + + inherits$1(PassThrough, Transform); + function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); + } + + PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); + }; + + inherits$1(Stream, EventEmitter); + Stream.Readable = Readable; + Stream.Writable = Writable; + Stream.Duplex = Duplex; + Stream.Transform = Transform; + Stream.PassThrough = PassThrough; + + // Backwards-compat with node 0.4.x + Stream.Stream = Stream; + + // old-style streams. Note that the pipe method (the only relevant + // part of this class) is overridden in the Readable class. + + function Stream() { + EventEmitter.call(this); + } + + Stream.prototype.pipe = function(dest, options) { + var source = this; + + function ondata(chunk) { + if (dest.writable) { + if (false === dest.write(chunk) && source.pause) { + source.pause(); + } + } + } + + source.on('data', ondata); + + function ondrain() { + if (source.readable && source.resume) { + source.resume(); + } + } + + dest.on('drain', ondrain); + + // If the 'end' option is not supplied, dest.end() will be called when + // source gets the 'end' or 'close' events. Only dest.end() once. + if (!dest._isStdio && (!options || options.end !== false)) { + source.on('end', onend); + source.on('close', onclose); + } + + var didOnEnd = false; + function onend() { + if (didOnEnd) return; + didOnEnd = true; + + dest.end(); + } + + + function onclose() { + if (didOnEnd) return; + didOnEnd = true; + + if (typeof dest.destroy === 'function') dest.destroy(); + } + + // don't leave dangling pipes when there are errors. + function onerror(er) { + cleanup(); + if (EventEmitter.listenerCount(this, 'error') === 0) { + throw er; // Unhandled stream error in pipe. + } + } + + source.on('error', onerror); + dest.on('error', onerror); + + // remove all the event listeners that were added. + function cleanup() { + source.removeListener('data', ondata); + dest.removeListener('drain', ondrain); + + source.removeListener('end', onend); + source.removeListener('close', onclose); + + source.removeListener('error', onerror); + dest.removeListener('error', onerror); + + source.removeListener('end', cleanup); + source.removeListener('close', cleanup); + + dest.removeListener('close', cleanup); + } + + source.on('end', cleanup); + source.on('close', cleanup); + + dest.on('close', cleanup); + + dest.emit('pipe', source); + + // Allow for unix-like usage: A.pipe(B).pipe(C) + return dest; + }; + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } + + return _assertThisInitialized(self); + } + + function _toArray(arr) { + return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + /* + The MIT License (MIT) + + Copyright (c) 2016 CoderPuppy + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + */ + var _endianness; + function endianness() { + if (typeof _endianness === 'undefined') { + var a = new ArrayBuffer(2); + var b = new Uint8Array(a); + var c = new Uint16Array(a); + b[0] = 1; + b[1] = 2; + if (c[0] === 258) { + _endianness = 'BE'; + } else if (c[0] === 513){ + _endianness = 'LE'; + } else { + throw new Error('unable to figure out endianess'); + } + } + return _endianness; + } + + function hostname() { + if (typeof global$1.location !== 'undefined') { + return global$1.location.hostname + } else return ''; + } + + function loadavg() { + return []; + } + + function uptime() { + return 0; + } + + function freemem() { + return Number.MAX_VALUE; + } + + function totalmem() { + return Number.MAX_VALUE; + } + + function cpus() { + return []; + } + + function type() { + return 'Browser'; + } + + function release () { + if (typeof global$1.navigator !== 'undefined') { + return global$1.navigator.appVersion; + } + return ''; + } + + function networkInterfaces(){} + function getNetworkInterfaces(){} + + function tmpDir() { + return '/tmp'; + } + var tmpdir = tmpDir; + + var EOL = '\n'; + var os = { + EOL: EOL, + tmpdir: tmpdir, + tmpDir: tmpDir, + networkInterfaces:networkInterfaces, + getNetworkInterfaces: getNetworkInterfaces, + release: release, + type: type, + cpus: cpus, + totalmem: totalmem, + freemem: freemem, + uptime: uptime, + loadavg: loadavg, + hostname: hostname, + endianness: endianness, + }; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + /** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + + /** Used as the `TypeError` message for "Functions" methods. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0; + + /** `Object#toString` result references. */ + var funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + symbolTag = '[object Symbol]'; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal && commonjsGlobal.Object === Object && commonjsGlobal; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ + function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; + } + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = root['__core-js_shared__']; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty$1 = objectProto.hasOwnProperty; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var objectToString$1 = objectProto.toString; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Symbol$1 = root.Symbol, + splice = arrayProto.splice; + + /* Built-in method references that are verified to be native. */ + var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty$1.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty$1.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject$1(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction$1(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value) { + return isArray$2(value) ? value : stringToPath(value); + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray$2(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoize(function(string) { + string = toString$1(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Assign cache to `_.memoize`. + memoize.Cache = MapCache; + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray$2 = Array.isArray; + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction$1(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject$1(value) ? objectToString$1.call(value) : ''; + return tag == funcTag || tag == genTag; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject$1(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return !!value && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString$1.call(value) == symbolTag); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString$1(value) { + return value == null ? '' : baseToString(value); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + var lodash_get = get; + + function getProp(obj, path, defaultValue) { + return obj[path] === undefined ? defaultValue : obj[path]; + } + + function setProp(obj, path, value) { + var pathArray = Array.isArray(path) ? path : path.split('.'); + + var _pathArray = _toArray(pathArray), + key = _pathArray[0], + restPath = _pathArray.slice(1); + + return _objectSpread({}, obj, _defineProperty({}, key, pathArray.length > 1 ? setProp(obj[key] || {}, restPath, value) : value)); + } + + function unsetProp(obj, path) { + var pathArray = Array.isArray(path) ? path : path.split('.'); + + var _pathArray2 = _toArray(pathArray), + key = _pathArray2[0], + restPath = _pathArray2.slice(1); + + if (_typeof(obj[key]) !== 'object') { + // This will never be hit in the current code because unwind does the check before calling unsetProp + + /* istanbul ignore next */ + return obj; + } + + if (pathArray.length === 1) { + return Object.keys(obj).filter(function (prop) { + return prop !== key; + }).reduce(function (acc, prop) { + return Object.assign(acc, _defineProperty({}, prop, obj[prop])); + }, {}); + } + + return Object.keys(obj).reduce(function (acc, prop) { + return _objectSpread({}, acc, _defineProperty({}, prop, prop !== key ? obj[prop] : unsetProp(obj[key], restPath))); + }, {}); + } + + function flattenReducer(acc, arr) { + try { + // This is faster but susceptible to `RangeError: Maximum call stack size exceeded` + acc.push.apply(acc, _toConsumableArray(arr)); + return acc; + } catch (err) { + // Fallback to a slower but safer option + return acc.concat(arr); + } + } + + function fastJoin(arr, separator) { + var isFirst = true; + return arr.reduce(function (acc, elem) { + if (elem === null || elem === undefined) { + elem = ''; + } + + if (isFirst) { + isFirst = false; + return "".concat(elem); + } + + return "".concat(acc).concat(separator).concat(elem); + }, ''); + } + + var utils = { + getProp: getProp, + setProp: setProp, + unsetProp: unsetProp, + fastJoin: fastJoin, + flattenReducer: flattenReducer + }; + + var getProp$1 = utils.getProp, + fastJoin$1 = utils.fastJoin, + flattenReducer$1 = utils.flattenReducer; + + var JSON2CSVBase = + /*#__PURE__*/ + function () { + function JSON2CSVBase(opts) { + _classCallCheck(this, JSON2CSVBase); + + this.opts = this.preprocessOpts(opts); + } + /** + * Check passing opts and set defaults. + * + * @param {Json2CsvOptions} opts Options object containing fields, + * delimiter, default value, quote mark, header, etc. + */ + + + _createClass(JSON2CSVBase, [{ + key: "preprocessOpts", + value: function preprocessOpts(opts) { + var processedOpts = Object.assign({}, opts); + processedOpts.transforms = !Array.isArray(processedOpts.transforms) ? processedOpts.transforms ? [processedOpts.transforms] : [] : processedOpts.transforms; + processedOpts.delimiter = processedOpts.delimiter || ','; + processedOpts.eol = processedOpts.eol || os.EOL; + processedOpts.quote = typeof processedOpts.quote === 'string' ? processedOpts.quote : '"'; + processedOpts.escapedQuote = typeof processedOpts.escapedQuote === 'string' ? processedOpts.escapedQuote : "".concat(processedOpts.quote).concat(processedOpts.quote); + processedOpts.header = processedOpts.header !== false; + processedOpts.includeEmptyRows = processedOpts.includeEmptyRows || false; + processedOpts.withBOM = processedOpts.withBOM || false; + return processedOpts; + } + /** + * Check and normalize the fields configuration. + * + * @param {(string|object)[]} fields Fields configuration provided by the user + * or inferred from the data + * @returns {object[]} preprocessed FieldsInfo array + */ + + }, { + key: "preprocessFieldsInfo", + value: function preprocessFieldsInfo(fields) { + var _this = this; + + return fields.map(function (fieldInfo) { + if (typeof fieldInfo === 'string') { + return { + label: fieldInfo, + value: fieldInfo.includes('.') || fieldInfo.includes('[') ? function (row) { + return lodash_get(row, fieldInfo, _this.opts.defaultValue); + } : function (row) { + return getProp$1(row, fieldInfo, _this.opts.defaultValue); + } + }; + } + + if (_typeof(fieldInfo) === 'object') { + var defaultValue = 'default' in fieldInfo ? fieldInfo.default : _this.opts.defaultValue; + + if (typeof fieldInfo.value === 'string') { + return { + label: fieldInfo.label || fieldInfo.value, + value: fieldInfo.value.includes('.') || fieldInfo.value.includes('[') ? function (row) { + return lodash_get(row, fieldInfo.value, defaultValue); + } : function (row) { + return getProp$1(row, fieldInfo.value, defaultValue); + } + }; + } + + if (typeof fieldInfo.value === 'function') { + var label = fieldInfo.label || fieldInfo.value.name || ''; + var field = { + label: label, + default: defaultValue + }; + return { + label: label, + value: function value(row) { + var value = fieldInfo.value(row, field); + return value === null || value === undefined ? defaultValue : value; + } + }; + } + } + + throw new Error('Invalid field info option. ' + JSON.stringify(fieldInfo)); + }); + } + /** + * Create the title row with all the provided fields as column headings + * + * @returns {String} titles as a string + */ + + }, { + key: "getHeader", + value: function getHeader() { + var _this2 = this; + + return fastJoin$1(this.opts.fields.map(function (fieldInfo) { + return _this2.processValue(fieldInfo.label); + }), this.opts.delimiter); + } + /** + * Preprocess each object according to the given transforms (unwind, flatten, etc.). + * @param {Object} row JSON object to be converted in a CSV row + */ + + }, { + key: "preprocessRow", + value: function preprocessRow(row) { + return this.opts.transforms.reduce(function (rows, transform) { + return rows.map(function (row) { + return transform(row); + }).reduce(flattenReducer$1, []); + }, [row]); + } + /** + * Create the content of a specific CSV row + * + * @param {Object} row JSON object to be converted in a CSV row + * @returns {String} CSV string (row) + */ + + }, { + key: "processRow", + value: function processRow(row) { + var _this3 = this; + + if (!row) { + return undefined; + } + + var processedRow = this.opts.fields.map(function (fieldInfo) { + return _this3.processCell(row, fieldInfo); + }); + + if (!this.opts.includeEmptyRows && processedRow.every(function (field) { + return field === undefined; + })) { + return undefined; + } + + return fastJoin$1(processedRow, this.opts.delimiter); + } + /** + * Create the content of a specfic CSV row cell + * + * @param {Object} row JSON object representing the CSV row that the cell belongs to + * @param {FieldInfo} fieldInfo Details of the field to process to be a CSV cell + * @returns {String} CSV string (cell) + */ + + }, { + key: "processCell", + value: function processCell(row, fieldInfo) { + return this.processValue(fieldInfo.value(row)); + } + /** + * Create the content of a specfic CSV row cell + * + * @param {Any} value Value to be included in a CSV cell + * @returns {String} Value stringified and processed + */ + + }, { + key: "processValue", + value: function processValue(value) { + if (value === null || value === undefined) { + return undefined; + } + + var valueType = _typeof(value); + + if (valueType !== 'boolean' && valueType !== 'number' && valueType !== 'string') { + value = JSON.stringify(value); + + if (value === undefined) { + return undefined; + } + + if (value[0] === '"') { + value = value.replace(/^"(.+)"$/, '$1'); + } + } + + if (typeof value === 'string') { + if (this.opts.excelStrings) { + if (value.includes(this.opts.quote)) { + value = value.replace(new RegExp(this.opts.quote, 'g'), "".concat(this.opts.escapedQuote).concat(this.opts.escapedQuote)); + } + + value = "\"=\"\"".concat(value, "\"\"\""); + } else { + if (value.includes(this.opts.quote)) { + value = value.replace(new RegExp(this.opts.quote, 'g'), this.opts.escapedQuote); + } + + value = "".concat(this.opts.quote).concat(value).concat(this.opts.quote); + } + } + + return value; + } + }]); + + return JSON2CSVBase; + }(); + + var JSON2CSVBase_1 = JSON2CSVBase; + + var fastJoin$2 = utils.fastJoin, + flattenReducer$2 = utils.flattenReducer; + + var JSON2CSVParser = + /*#__PURE__*/ + function (_JSON2CSVBase) { + _inherits(JSON2CSVParser, _JSON2CSVBase); + + function JSON2CSVParser(opts) { + var _this; + + _classCallCheck(this, JSON2CSVParser); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(JSON2CSVParser).call(this, opts)); + + if (_this.opts.fields) { + _this.opts.fields = _this.preprocessFieldsInfo(_this.opts.fields); + } + + return _this; + } + /** + * Main function that converts json to csv. + * + * @param {Array|Object} data Array of JSON objects to be converted to CSV + * @returns {String} The CSV formated data as a string + */ + + + _createClass(JSON2CSVParser, [{ + key: "parse", + value: function parse(data) { + var processedData = this.preprocessData(data); + + if (!this.opts.fields) { + this.opts.fields = processedData.reduce(function (fields, item) { + Object.keys(item).forEach(function (field) { + if (!fields.includes(field)) { + fields.push(field); + } + }); + return fields; + }, []); + this.opts.fields = this.preprocessFieldsInfo(this.opts.fields); + } + + var header = this.opts.header ? this.getHeader() : ''; + var rows = this.processData(processedData); + var csv = (this.opts.withBOM ? "\uFEFF" : '') + header + (header && rows ? this.opts.eol : '') + rows; + return csv; + } + /** + * Preprocess the data according to the give opts (unwind, flatten, etc.) + and calculate the fields and field names if they are not provided. + * + * @param {Array|Object} data Array or object to be converted to CSV + */ + + }, { + key: "preprocessData", + value: function preprocessData(data) { + var _this2 = this; + + var processedData = Array.isArray(data) ? data : [data]; + + if (!this.opts.fields && (processedData.length === 0 || _typeof(processedData[0]) !== 'object')) { + throw new Error('Data should not be empty or the "fields" option should be included'); + } + + if (this.opts.transforms.length === 0) return processedData; + return processedData.map(function (row) { + return _this2.preprocessRow(row); + }).reduce(flattenReducer$2, []); + } + /** + * Create the content row by row below the header + * + * @param {Array} data Array of JSON objects to be converted to CSV + * @returns {String} CSV string (body) + */ + + }, { + key: "processData", + value: function processData(data) { + var _this3 = this; + + return fastJoin$2(data.map(function (row) { + return _this3.processRow(row); + }).filter(function (row) { + return row; + }), // Filter empty rows + this.opts.eol); + } + }]); + + return JSON2CSVParser; + }(JSON2CSVBase_1); + + var JSON2CSVParser_1 = JSON2CSVParser; + + /*global Buffer*/ + // Named constants with unique integer values + var C = {}; + // Tokens + var LEFT_BRACE = C.LEFT_BRACE = 0x1; + var RIGHT_BRACE = C.RIGHT_BRACE = 0x2; + var LEFT_BRACKET = C.LEFT_BRACKET = 0x3; + var RIGHT_BRACKET = C.RIGHT_BRACKET = 0x4; + var COLON = C.COLON = 0x5; + var COMMA = C.COMMA = 0x6; + var TRUE = C.TRUE = 0x7; + var FALSE = C.FALSE = 0x8; + var NULL = C.NULL = 0x9; + var STRING = C.STRING = 0xa; + var NUMBER = C.NUMBER = 0xb; + // Tokenizer States + var START = C.START = 0x11; + var STOP = C.STOP = 0x12; + var TRUE1 = C.TRUE1 = 0x21; + var TRUE2 = C.TRUE2 = 0x22; + var TRUE3 = C.TRUE3 = 0x23; + var FALSE1 = C.FALSE1 = 0x31; + var FALSE2 = C.FALSE2 = 0x32; + var FALSE3 = C.FALSE3 = 0x33; + var FALSE4 = C.FALSE4 = 0x34; + var NULL1 = C.NULL1 = 0x41; + var NULL2 = C.NULL2 = 0x42; + var NULL3 = C.NULL3 = 0x43; + var NUMBER1 = C.NUMBER1 = 0x51; + var NUMBER3 = C.NUMBER3 = 0x53; + var STRING1 = C.STRING1 = 0x61; + var STRING2 = C.STRING2 = 0x62; + var STRING3 = C.STRING3 = 0x63; + var STRING4 = C.STRING4 = 0x64; + var STRING5 = C.STRING5 = 0x65; + var STRING6 = C.STRING6 = 0x66; + // Parser States + var VALUE = C.VALUE = 0x71; + var KEY = C.KEY = 0x72; + // Parser Modes + var OBJECT = C.OBJECT = 0x81; + var ARRAY = C.ARRAY = 0x82; + // Character constants + var BACK_SLASH = "\\".charCodeAt(0); + var FORWARD_SLASH = "\/".charCodeAt(0); + var BACKSPACE = "\b".charCodeAt(0); + var FORM_FEED = "\f".charCodeAt(0); + var NEWLINE = "\n".charCodeAt(0); + var CARRIAGE_RETURN = "\r".charCodeAt(0); + var TAB = "\t".charCodeAt(0); + + var STRING_BUFFER_SIZE = 64 * 1024; + + function Parser() { + this.tState = START; + this.value = undefined; + + this.string = undefined; // string data + this.stringBuffer = Buffer.alloc ? Buffer.alloc(STRING_BUFFER_SIZE) : new Buffer(STRING_BUFFER_SIZE); + this.stringBufferOffset = 0; + this.unicode = undefined; // unicode escapes + this.highSurrogate = undefined; + + this.key = undefined; + this.mode = undefined; + this.stack = []; + this.state = VALUE; + this.bytes_remaining = 0; // number of bytes remaining in multi byte utf8 char to read after split boundary + this.bytes_in_sequence = 0; // bytes in multi byte utf8 char to read + this.temp_buffs = { "2": new Buffer(2), "3": new Buffer(3), "4": new Buffer(4) }; // for rebuilding chars split before boundary is reached + + // Stream offset + this.offset = -1; + } + + // Slow code to string converter (only used when throwing syntax errors) + Parser.toknam = function (code) { + var keys = Object.keys(C); + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + if (C[key] === code) { return key; } + } + return code && ("0x" + code.toString(16)); + }; + + var proto = Parser.prototype; + proto.onError = function (err) { throw err; }; + proto.charError = function (buffer, i) { + this.tState = STOP; + this.onError(new Error("Unexpected " + JSON.stringify(String.fromCharCode(buffer[i])) + " at position " + i + " in state " + Parser.toknam(this.tState))); + }; + proto.appendStringChar = function (char) { + if (this.stringBufferOffset >= STRING_BUFFER_SIZE) { + this.string += this.stringBuffer.toString('utf8'); + this.stringBufferOffset = 0; + } + + this.stringBuffer[this.stringBufferOffset++] = char; + }; + proto.appendStringBuf = function (buf, start, end) { + var size = buf.length; + if (typeof start === 'number') { + if (typeof end === 'number') { + if (end < 0) { + // adding a negative end decreeses the size + size = buf.length - start + end; + } else { + size = end - start; + } + } else { + size = buf.length - start; + } + } + + if (size < 0) { + size = 0; + } + + if (this.stringBufferOffset + size > STRING_BUFFER_SIZE) { + this.string += this.stringBuffer.toString('utf8', 0, this.stringBufferOffset); + this.stringBufferOffset = 0; + } + + buf.copy(this.stringBuffer, this.stringBufferOffset, start, end); + this.stringBufferOffset += size; + }; + proto.write = function (buffer) { + if (typeof buffer === "string") buffer = new Buffer(buffer); + var n; + for (var i = 0, l = buffer.length; i < l; i++) { + if (this.tState === START){ + n = buffer[i]; + this.offset++; + if(n === 0x7b){ this.onToken(LEFT_BRACE, "{"); // { + }else if(n === 0x7d){ this.onToken(RIGHT_BRACE, "}"); // } + }else if(n === 0x5b){ this.onToken(LEFT_BRACKET, "["); // [ + }else if(n === 0x5d){ this.onToken(RIGHT_BRACKET, "]"); // ] + }else if(n === 0x3a){ this.onToken(COLON, ":"); // : + }else if(n === 0x2c){ this.onToken(COMMA, ","); // , + }else if(n === 0x74){ this.tState = TRUE1; // t + }else if(n === 0x66){ this.tState = FALSE1; // f + }else if(n === 0x6e){ this.tState = NULL1; // n + }else if(n === 0x22){ // " + this.string = ""; + this.stringBufferOffset = 0; + this.tState = STRING1; + }else if(n === 0x2d){ this.string = "-"; this.tState = NUMBER1; // - + }else{ + if (n >= 0x30 && n < 0x40) { // 1-9 + this.string = String.fromCharCode(n); this.tState = NUMBER3; + } else if (n === 0x20 || n === 0x09 || n === 0x0a || n === 0x0d) ; else { + return this.charError(buffer, i); + } + } + }else if (this.tState === STRING1){ // After open quote + n = buffer[i]; // get current byte from buffer + // check for carry over of a multi byte char split between data chunks + // & fill temp buffer it with start of this data chunk up to the boundary limit set in the last iteration + if (this.bytes_remaining > 0) { + for (var j = 0; j < this.bytes_remaining; j++) { + this.temp_buffs[this.bytes_in_sequence][this.bytes_in_sequence - this.bytes_remaining + j] = buffer[j]; + } + + this.appendStringBuf(this.temp_buffs[this.bytes_in_sequence]); + this.bytes_in_sequence = this.bytes_remaining = 0; + i = i + j - 1; + } else if (this.bytes_remaining === 0 && n >= 128) { // else if no remainder bytes carried over, parse multi byte (>=128) chars one at a time + if (n <= 193 || n > 244) { + return this.onError(new Error("Invalid UTF-8 character at position " + i + " in state " + Parser.toknam(this.tState))); + } + if ((n >= 194) && (n <= 223)) this.bytes_in_sequence = 2; + if ((n >= 224) && (n <= 239)) this.bytes_in_sequence = 3; + if ((n >= 240) && (n <= 244)) this.bytes_in_sequence = 4; + if ((this.bytes_in_sequence + i) > buffer.length) { // if bytes needed to complete char fall outside buffer length, we have a boundary split + for (var k = 0; k <= (buffer.length - 1 - i); k++) { + this.temp_buffs[this.bytes_in_sequence][k] = buffer[i + k]; // fill temp buffer of correct size with bytes available in this chunk + } + this.bytes_remaining = (i + this.bytes_in_sequence) - buffer.length; + i = buffer.length - 1; + } else { + this.appendStringBuf(buffer, i, i + this.bytes_in_sequence); + i = i + this.bytes_in_sequence - 1; + } + } else if (n === 0x22) { + this.tState = START; + this.string += this.stringBuffer.toString('utf8', 0, this.stringBufferOffset); + this.stringBufferOffset = 0; + this.onToken(STRING, this.string); + this.offset += Buffer.byteLength(this.string, 'utf8') + 1; + this.string = undefined; + } + else if (n === 0x5c) { + this.tState = STRING2; + } + else if (n >= 0x20) { this.appendStringChar(n); } + else { + return this.charError(buffer, i); + } + }else if (this.tState === STRING2){ // After backslash + n = buffer[i]; + if(n === 0x22){ this.appendStringChar(n); this.tState = STRING1; + }else if(n === 0x5c){ this.appendStringChar(BACK_SLASH); this.tState = STRING1; + }else if(n === 0x2f){ this.appendStringChar(FORWARD_SLASH); this.tState = STRING1; + }else if(n === 0x62){ this.appendStringChar(BACKSPACE); this.tState = STRING1; + }else if(n === 0x66){ this.appendStringChar(FORM_FEED); this.tState = STRING1; + }else if(n === 0x6e){ this.appendStringChar(NEWLINE); this.tState = STRING1; + }else if(n === 0x72){ this.appendStringChar(CARRIAGE_RETURN); this.tState = STRING1; + }else if(n === 0x74){ this.appendStringChar(TAB); this.tState = STRING1; + }else if(n === 0x75){ this.unicode = ""; this.tState = STRING3; + }else{ + return this.charError(buffer, i); + } + }else if (this.tState === STRING3 || this.tState === STRING4 || this.tState === STRING5 || this.tState === STRING6){ // unicode hex codes + n = buffer[i]; + // 0-9 A-F a-f + if ((n >= 0x30 && n < 0x40) || (n > 0x40 && n <= 0x46) || (n > 0x60 && n <= 0x66)) { + this.unicode += String.fromCharCode(n); + if (this.tState++ === STRING6) { + var intVal = parseInt(this.unicode, 16); + this.unicode = undefined; + if (this.highSurrogate !== undefined && intVal >= 0xDC00 && intVal < (0xDFFF + 1)) { //<56320,57343> - lowSurrogate + this.appendStringBuf(new Buffer(String.fromCharCode(this.highSurrogate, intVal))); + this.highSurrogate = undefined; + } else if (this.highSurrogate === undefined && intVal >= 0xD800 && intVal < (0xDBFF + 1)) { //<55296,56319> - highSurrogate + this.highSurrogate = intVal; + } else { + if (this.highSurrogate !== undefined) { + this.appendStringBuf(new Buffer(String.fromCharCode(this.highSurrogate))); + this.highSurrogate = undefined; + } + this.appendStringBuf(new Buffer(String.fromCharCode(intVal))); + } + this.tState = STRING1; + } + } else { + return this.charError(buffer, i); + } + } else if (this.tState === NUMBER1 || this.tState === NUMBER3) { + n = buffer[i]; + + switch (n) { + case 0x30: // 0 + case 0x31: // 1 + case 0x32: // 2 + case 0x33: // 3 + case 0x34: // 4 + case 0x35: // 5 + case 0x36: // 6 + case 0x37: // 7 + case 0x38: // 8 + case 0x39: // 9 + case 0x2e: // . + case 0x65: // e + case 0x45: // E + case 0x2b: // + + case 0x2d: // - + this.string += String.fromCharCode(n); + this.tState = NUMBER3; + break; + default: + this.tState = START; + var result = Number(this.string); + + if (isNaN(result)){ + return this.charError(buffer, i); + } + + if ((this.string.match(/[0-9]+/) == this.string) && (result.toString() != this.string)) { + // Long string of digits which is an ID string and not valid and/or safe JavaScript integer Number + this.onToken(STRING, this.string); + } else { + this.onToken(NUMBER, result); + } + + this.offset += this.string.length - 1; + this.string = undefined; + i--; + break; + } + }else if (this.tState === TRUE1){ // r + if (buffer[i] === 0x72) { this.tState = TRUE2; } + else { return this.charError(buffer, i); } + }else if (this.tState === TRUE2){ // u + if (buffer[i] === 0x75) { this.tState = TRUE3; } + else { return this.charError(buffer, i); } + }else if (this.tState === TRUE3){ // e + if (buffer[i] === 0x65) { this.tState = START; this.onToken(TRUE, true); this.offset+= 3; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE1){ // a + if (buffer[i] === 0x61) { this.tState = FALSE2; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE2){ // l + if (buffer[i] === 0x6c) { this.tState = FALSE3; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE3){ // s + if (buffer[i] === 0x73) { this.tState = FALSE4; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE4){ // e + if (buffer[i] === 0x65) { this.tState = START; this.onToken(FALSE, false); this.offset+= 4; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL1){ // u + if (buffer[i] === 0x75) { this.tState = NULL2; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL2){ // l + if (buffer[i] === 0x6c) { this.tState = NULL3; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL3){ // l + if (buffer[i] === 0x6c) { this.tState = START; this.onToken(NULL, null); this.offset += 3; } + else { return this.charError(buffer, i); } + } + } + }; + proto.onToken = function (token, value) { + // Override this to get events + }; + + proto.parseError = function (token, value) { + this.tState = STOP; + this.onError(new Error("Unexpected " + Parser.toknam(token) + (value ? ("(" + JSON.stringify(value) + ")") : "") + " in state " + Parser.toknam(this.state))); + }; + proto.push = function () { + this.stack.push({value: this.value, key: this.key, mode: this.mode}); + }; + proto.pop = function () { + var value = this.value; + var parent = this.stack.pop(); + this.value = parent.value; + this.key = parent.key; + this.mode = parent.mode; + this.emit(value); + if (!this.mode) { this.state = VALUE; } + }; + proto.emit = function (value) { + if (this.mode) { this.state = COMMA; } + this.onValue(value); + }; + proto.onValue = function (value) { + // Override me + }; + proto.onToken = function (token, value) { + if(this.state === VALUE){ + if(token === STRING || token === NUMBER || token === TRUE || token === FALSE || token === NULL){ + if (this.value) { + this.value[this.key] = value; + } + this.emit(value); + }else if(token === LEFT_BRACE){ + this.push(); + if (this.value) { + this.value = this.value[this.key] = {}; + } else { + this.value = {}; + } + this.key = undefined; + this.state = KEY; + this.mode = OBJECT; + }else if(token === LEFT_BRACKET){ + this.push(); + if (this.value) { + this.value = this.value[this.key] = []; + } else { + this.value = []; + } + this.key = 0; + this.mode = ARRAY; + this.state = VALUE; + }else if(token === RIGHT_BRACE){ + if (this.mode === OBJECT) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else if(token === RIGHT_BRACKET){ + if (this.mode === ARRAY) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else{ + return this.parseError(token, value); + } + }else if(this.state === KEY){ + if (token === STRING) { + this.key = value; + this.state = COLON; + } else if (token === RIGHT_BRACE) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else if(this.state === COLON){ + if (token === COLON) { this.state = VALUE; } + else { return this.parseError(token, value); } + }else if(this.state === COMMA){ + if (token === COMMA) { + if (this.mode === ARRAY) { this.key++; this.state = VALUE; } + else if (this.mode === OBJECT) { this.state = KEY; } + + } else if (token === RIGHT_BRACKET && this.mode === ARRAY || token === RIGHT_BRACE && this.mode === OBJECT) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else{ + return this.parseError(token, value); + } + }; + + Parser.C = C; + + var jsonparse = Parser; + + var Transform$1 = Stream.Transform; + + var JSON2CSVTransform = + /*#__PURE__*/ + function (_Transform) { + _inherits(JSON2CSVTransform, _Transform); + + function JSON2CSVTransform(opts, transformOpts) { + var _this; + + _classCallCheck(this, JSON2CSVTransform); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(JSON2CSVTransform).call(this, transformOpts)); // Inherit methods from JSON2CSVBase since extends doesn't + // allow multiple inheritance and manually preprocess opts + + Object.getOwnPropertyNames(JSON2CSVBase_1.prototype).forEach(function (key) { + return _this[key] = JSON2CSVBase_1.prototype[key]; + }); + _this.opts = _this.preprocessOpts(opts); + _this._data = ''; + _this._hasWritten = false; + + if (_this._readableState.objectMode) { + _this.initObjectModeParse(); + } else if (_this.opts.ndjson) { + _this.initNDJSONParse(); + } else { + _this.initJSONParser(); + } + + if (_this.opts.withBOM) { + _this.push("\uFEFF"); + } + + if (_this.opts.fields) { + _this.opts.fields = _this.preprocessFieldsInfo(_this.opts.fields); + + _this.pushHeader(); + } + + return _this; + } + /** + * Init the transform with a parser to process data in object mode. + * It receives JSON objects one by one and send them to `pushLine for processing. + */ + + + _createClass(JSON2CSVTransform, [{ + key: "initObjectModeParse", + value: function initObjectModeParse() { + var transform = this; + this.parser = { + write: function write(line) { + transform.pushLine(line); + }, + getPendingData: function getPendingData() { + return undefined; + } + }; + } + /** + * Init the transform with a parser to process NDJSON data. + * It maintains a buffer of received data, parses each line + * as JSON and send it to `pushLine for processing. + */ + + }, { + key: "initNDJSONParse", + value: function initNDJSONParse() { + var transform = this; + this.parser = { + _data: '', + write: function write(chunk) { + this._data += chunk.toString(); + + var lines = this._data.split('\n').map(function (line) { + return line.trim(); + }).filter(function (line) { + return line !== ''; + }); + + var pendingData = false; + lines.forEach(function (line, i) { + try { + transform.pushLine(JSON.parse(line)); + } catch (e) { + if (i === lines.length - 1) { + pendingData = true; + } else { + e.message = "Invalid JSON (".concat(line, ")"); + transform.emit('error', e); + } + } + }); + this._data = pendingData ? this._data.slice(this._data.lastIndexOf('\n')) : ''; + }, + getPendingData: function getPendingData() { + return this._data; + } + }; + } + /** + * Init the transform with a parser to process JSON data. + * It maintains a buffer of received data, parses each as JSON + * item if the data is an array or the data itself otherwise + * and send it to `pushLine` for processing. + */ + + }, { + key: "initJSONParser", + value: function initJSONParser() { + var transform = this; + this.parser = new jsonparse(); + + this.parser.onValue = function (value) { + if (this.stack.length !== this.depthToEmit) return; + transform.pushLine(value); + }; + + this.parser._onToken = this.parser.onToken; + + this.parser.onToken = function (token, value) { + transform.parser._onToken(token, value); + + if (this.stack.length === 0 && !transform.opts.fields && this.mode !== jsonparse.C.ARRAY && this.mode !== jsonparse.C.OBJECT) { + this.onError(new Error('Data should not be empty or the "fields" option should be included')); + } + + if (this.stack.length === 1) { + if (this.depthToEmit === undefined) { + // If Array emit its content, else emit itself + this.depthToEmit = this.mode === jsonparse.C.ARRAY ? 1 : 0; + } + + if (this.depthToEmit !== 0 && this.stack.length === 1) { + // No need to store the whole root array in memory + this.value = undefined; + } + } + }; + + this.parser.getPendingData = function () { + return this.value; + }; + + this.parser.onError = function (err) { + if (err.message.includes('Unexpected')) { + err.message = "Invalid JSON (".concat(err.message, ")"); + } + + transform.emit('error', err); + }; + } + /** + * Main function that send data to the parse to be processed. + * + * @param {Buffer} chunk Incoming data + * @param {String} encoding Encoding of the incoming data. Defaults to 'utf8' + * @param {Function} done Called when the proceesing of the supplied chunk is done + */ + + }, { + key: "_transform", + value: function _transform(chunk, encoding, done) { + this.parser.write(chunk); + done(); + } + }, { + key: "_flush", + value: function _flush(done) { + if (this.parser.getPendingData()) { + done(new Error('Invalid data received from stdin', this.parser.getPendingData())); + } + + done(); + } + /** + * Generate the csv header and pushes it downstream. + */ + + }, { + key: "pushHeader", + value: function pushHeader() { + if (this.opts.header) { + var header = this.getHeader(); + this.emit('header', header); + this.push(header); + this._hasWritten = true; + } + } + /** + * Transforms an incoming json data to csv and pushes it downstream. + * + * @param {Object} data JSON object to be converted in a CSV row + */ + + }, { + key: "pushLine", + value: function pushLine(data) { + var _this2 = this; + + var processedData = this.preprocessRow(data); + + if (!this._hasWritten) { + this.opts.fields = this.opts.fields || this.preprocessFieldsInfo(Object.keys(processedData[0])); + this.pushHeader(); + } + + processedData.forEach(function (row) { + var line = _this2.processRow(row, _this2.opts); + + if (line === undefined) return; + + _this2.emit('line', line); + + _this2.push(_this2._hasWritten ? _this2.opts.eol + line : line); + + _this2._hasWritten = true; + }); + } + }]); + + return JSON2CSVTransform; + }(Transform$1); + + var JSON2CSVTransform_1 = JSON2CSVTransform; + + var Transform$2 = Stream.Transform; + var fastJoin$3 = utils.fastJoin; + + var JSON2CSVAsyncParser = + /*#__PURE__*/ + function () { + function JSON2CSVAsyncParser(opts, transformOpts) { + _classCallCheck(this, JSON2CSVAsyncParser); + + this.input = new Transform$2(transformOpts); + + this.input._read = function () {}; + + this.transform = new JSON2CSVTransform_1(opts, transformOpts); + this.processor = this.input.pipe(this.transform); + } + + _createClass(JSON2CSVAsyncParser, [{ + key: "fromInput", + value: function fromInput(input) { + if (this._input) { + throw new Error('Async parser already has an input.'); + } + + this._input = input; + this.input = this._input.pipe(this.processor); + return this; + } + }, { + key: "throughTransform", + value: function throughTransform(transform) { + if (this._output) { + throw new Error('Can\'t add transforms once an output has been added.'); + } + + this.processor = this.processor.pipe(transform); + return this; + } + }, { + key: "toOutput", + value: function toOutput(output) { + if (this._output) { + throw new Error('Async parser already has an output.'); + } + + this._output = output; + this.processor = this.processor.pipe(output); + return this; + } + }, { + key: "promise", + value: function promise() { + var _this = this; + + var returnCSV = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + return new Promise(function (resolve, reject) { + if (!returnCSV) { + _this.processor.on('finish', function () { + return resolve(); + }).on('error', function (err) { + return reject(err); + }); + + return; + } + + var csvBuffer = []; + + _this.processor.on('data', function (chunk) { + return csvBuffer.push(chunk.toString()); + }).on('finish', function () { + return resolve(fastJoin$3(csvBuffer, '')); + }).on('error', function (err) { + return reject(err); + }); + }); + } + }]); + + return JSON2CSVAsyncParser; + }(); + + var JSON2CSVAsyncParser_1 = JSON2CSVAsyncParser; + + /** + * Performs the flattening of a data row recursively + * + * @param {String} separator Separator to be used as the flattened field name + * @returns {Object => Object} Flattened object + */ + function flatten() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$objects = _ref.objects, + objects = _ref$objects === void 0 ? true : _ref$objects, + _ref$arrays = _ref.arrays, + arrays = _ref$arrays === void 0 ? false : _ref$arrays, + _ref$separator = _ref.separator, + separator = _ref$separator === void 0 ? '.' : _ref$separator; + + function step(obj, flatDataRow, currentPath) { + Object.keys(obj).forEach(function (key) { + var newPath = currentPath ? "".concat(currentPath).concat(separator).concat(key) : key; + var value = obj[key]; + + if (objects && _typeof(value) === 'object' && value !== null && !Array.isArray(value) && Object.prototype.toString.call(value.toJSON) !== '[object Function]' && Object.keys(value).length) { + step(value, flatDataRow, newPath); + return; + } + + if (arrays && Array.isArray(value)) { + step(value, flatDataRow, newPath); + return; + } + + flatDataRow[newPath] = value; + }); + return flatDataRow; + } + + return function (dataRow) { + return step(dataRow, {}); + }; + } + + var flatten_1 = flatten; + + var setProp$1 = utils.setProp, + unsetProp$1 = utils.unsetProp, + flattenReducer$3 = utils.flattenReducer; + + function getUnwindablePaths(obj, currentPath) { + return Object.keys(obj).reduce(function (unwindablePaths, key) { + var newPath = currentPath ? "".concat(currentPath, ".").concat(key) : key; + var value = obj[key]; + + if (_typeof(value) === 'object' && value !== null && !Array.isArray(value) && Object.prototype.toString.call(value.toJSON) !== '[object Function]' && Object.keys(value).length) { + unwindablePaths = unwindablePaths.concat(getUnwindablePaths(value, newPath)); + } else if (Array.isArray(value)) { + unwindablePaths.push(newPath); + unwindablePaths = unwindablePaths.concat(value.map(function (arrObj) { + return getUnwindablePaths(arrObj, newPath); + }).reduce(flattenReducer$3, []).filter(function (item, index, arr) { + return arr.indexOf(item) !== index; + })); + } + + return unwindablePaths; + }, []); + } + /** + * Performs the unwind recursively in specified sequence + * + * @param {String[]} unwindPaths The paths as strings to be used to deconstruct the array + * @returns {Object => Array} Array of objects containing all rows after unwind of chosen paths + */ + + + function unwind() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$paths = _ref.paths, + paths = _ref$paths === void 0 ? undefined : _ref$paths, + _ref$blankOut = _ref.blankOut, + blankOut = _ref$blankOut === void 0 ? false : _ref$blankOut; + + function unwindReducer(rows, unwindPath) { + return rows.map(function (row) { + var unwindArray = lodash_get(row, unwindPath); + + if (!Array.isArray(unwindArray)) { + return row; + } + + if (!unwindArray.length) { + return unsetProp$1(row, unwindPath); + } + + return unwindArray.map(function (unwindRow, index) { + var clonedRow = blankOut && index > 0 ? {} : row; + return setProp$1(clonedRow, unwindPath, unwindRow); + }); + }).reduce(flattenReducer$3, []); + } + + paths = Array.isArray(paths) ? paths : paths ? [paths] : undefined; + return function (dataRow) { + return (paths || getUnwindablePaths(dataRow)).reduce(unwindReducer, [dataRow]); + }; + } + + var unwind_1 = unwind; + + var Readable$1 = Stream.Readable; + var Parser$1 = JSON2CSVParser_1; + var AsyncParser = JSON2CSVAsyncParser_1; + var Transform$3 = JSON2CSVTransform_1; // Convenience method to keep the API similar to version 3.X + + var parse = function parse(data, opts) { + return new JSON2CSVParser_1(opts).parse(data); + }; + + var parseAsync = function parseAsync(data, opts, transformOpts) { + try { + if (!(data instanceof Readable$1)) { + transformOpts = Object.assign({}, transformOpts, { + objectMode: true + }); + } + + var asyncParser = new JSON2CSVAsyncParser_1(opts, transformOpts); + var promise = asyncParser.promise(); + + if (Array.isArray(data)) { + data.forEach(function (item) { + return asyncParser.input.push(item); + }); + asyncParser.input.push(null); + } else if (data instanceof Readable$1) { + asyncParser.fromInput(data); + } else { + asyncParser.input.push(data); + asyncParser.input.push(null); + } + + return promise; + } catch (err) { + return Promise.reject(err); + } + }; + + var transforms = { + flatten: flatten_1, + unwind: unwind_1 + }; + var json2csv = { + Parser: Parser$1, + AsyncParser: AsyncParser, + Transform: Transform$3, + parse: parse, + parseAsync: parseAsync, + transforms: transforms + }; + + exports.AsyncParser = AsyncParser; + exports.Parser = Parser$1; + exports.Transform = Transform$3; + exports.default = json2csv; + exports.parse = parse; + exports.parseAsync = parseAsync; + exports.transforms = transforms; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/node_modules/json2csv/lib/JSON2CSVAsyncParser.js b/node_modules/json2csv/lib/JSON2CSVAsyncParser.js new file mode 100644 index 0000000..6773b73 --- /dev/null +++ b/node_modules/json2csv/lib/JSON2CSVAsyncParser.js @@ -0,0 +1,60 @@ +'use strict'; + +const { Transform } = require('stream'); +const JSON2CSVTransform = require('./JSON2CSVTransform'); +const { fastJoin } = require('./utils'); + +class JSON2CSVAsyncParser { + constructor(opts, transformOpts) { + this.input = new Transform(transformOpts); + this.input._read = () => {}; + + this.transform = new JSON2CSVTransform(opts, transformOpts); + this.processor = this.input.pipe(this.transform); + } + + fromInput(input) { + if (this._input) { + throw new Error('Async parser already has an input.'); + } + this._input = input; + this.input = this._input.pipe(this.processor); + return this; + } + + throughTransform(transform) { + if (this._output) { + throw new Error('Can\'t add transforms once an output has been added.'); + } + this.processor = this.processor.pipe(transform); + return this; + } + + toOutput(output) { + if (this._output) { + throw new Error('Async parser already has an output.'); + } + this._output = output; + this.processor = this.processor.pipe(output); + return this; + } + + promise(returnCSV = true) { + return new Promise((resolve, reject) => { + if (!returnCSV) { + this.processor + .on('finish', () => resolve()) + .on('error', err => reject(err)); + return; + } + + let csvBuffer = []; + this.processor + .on('data', chunk => csvBuffer.push(chunk.toString())) + .on('finish', () => resolve(fastJoin(csvBuffer, ''))) + .on('error', err => reject(err)); + }); + } +} + +module.exports = JSON2CSVAsyncParser \ No newline at end of file diff --git a/node_modules/json2csv/lib/JSON2CSVBase.js b/node_modules/json2csv/lib/JSON2CSVBase.js new file mode 100644 index 0000000..6e45da2 --- /dev/null +++ b/node_modules/json2csv/lib/JSON2CSVBase.js @@ -0,0 +1,188 @@ +'use strict'; + +const os = require('os'); +const lodashGet = require('lodash.get'); +const { getProp, fastJoin, flattenReducer } = require('./utils'); + +class JSON2CSVBase { + constructor(opts) { + this.opts = this.preprocessOpts(opts); + } + + /** + * Check passing opts and set defaults. + * + * @param {Json2CsvOptions} opts Options object containing fields, + * delimiter, default value, quote mark, header, etc. + */ + preprocessOpts(opts) { + const processedOpts = Object.assign({}, opts); + processedOpts.transforms = !Array.isArray(processedOpts.transforms) + ? (processedOpts.transforms ? [processedOpts.transforms] : []) + : processedOpts.transforms + processedOpts.delimiter = processedOpts.delimiter || ','; + processedOpts.eol = processedOpts.eol || os.EOL; + processedOpts.quote = typeof processedOpts.quote === 'string' + ? processedOpts.quote + : '"'; + processedOpts.escapedQuote = typeof processedOpts.escapedQuote === 'string' + ? processedOpts.escapedQuote + : `${processedOpts.quote}${processedOpts.quote}`; + processedOpts.header = processedOpts.header !== false; + processedOpts.includeEmptyRows = processedOpts.includeEmptyRows || false; + processedOpts.withBOM = processedOpts.withBOM || false; + + return processedOpts; + } + + /** + * Check and normalize the fields configuration. + * + * @param {(string|object)[]} fields Fields configuration provided by the user + * or inferred from the data + * @returns {object[]} preprocessed FieldsInfo array + */ + preprocessFieldsInfo(fields) { + return fields.map((fieldInfo) => { + if (typeof fieldInfo === 'string') { + return { + label: fieldInfo, + value: (fieldInfo.includes('.') || fieldInfo.includes('[')) + ? row => lodashGet(row, fieldInfo, this.opts.defaultValue) + : row => getProp(row, fieldInfo, this.opts.defaultValue), + }; + } + + if (typeof fieldInfo === 'object') { + const defaultValue = 'default' in fieldInfo + ? fieldInfo.default + : this.opts.defaultValue; + + if (typeof fieldInfo.value === 'string') { + return { + label: fieldInfo.label || fieldInfo.value, + value: (fieldInfo.value.includes('.') || fieldInfo.value.includes('[')) + ? row => lodashGet(row, fieldInfo.value, defaultValue) + : row => getProp(row, fieldInfo.value, defaultValue), + }; + } + + if (typeof fieldInfo.value === 'function') { + const label = fieldInfo.label || fieldInfo.value.name || ''; + const field = { label, default: defaultValue }; + return { + label, + value(row) { + const value = fieldInfo.value(row, field); + return (value === null || value === undefined) + ? defaultValue + : value; + }, + } + } + } + + throw new Error('Invalid field info option. ' + JSON.stringify(fieldInfo)); + }); + } + + /** + * Create the title row with all the provided fields as column headings + * + * @returns {String} titles as a string + */ + getHeader() { + return fastJoin( + this.opts.fields.map(fieldInfo => this.processValue(fieldInfo.label)), + this.opts.delimiter + ); + } + + /** + * Preprocess each object according to the given transforms (unwind, flatten, etc.). + * @param {Object} row JSON object to be converted in a CSV row + */ + preprocessRow(row) { + return this.opts.transforms.reduce((rows, transform) => + rows.map(row => transform(row)).reduce(flattenReducer, []), + [row] + ); + } + + /** + * Create the content of a specific CSV row + * + * @param {Object} row JSON object to be converted in a CSV row + * @returns {String} CSV string (row) + */ + processRow(row) { + if (!row) { + return undefined; + } + + const processedRow = this.opts.fields.map(fieldInfo => this.processCell(row, fieldInfo)); + + if (!this.opts.includeEmptyRows && processedRow.every(field => field === undefined)) { + return undefined; + } + + return fastJoin( + processedRow, + this.opts.delimiter + ); + } + + /** + * Create the content of a specfic CSV row cell + * + * @param {Object} row JSON object representing the CSV row that the cell belongs to + * @param {FieldInfo} fieldInfo Details of the field to process to be a CSV cell + * @returns {String} CSV string (cell) + */ + processCell(row, fieldInfo) { + return this.processValue(fieldInfo.value(row)); + } + + /** + * Create the content of a specfic CSV row cell + * + * @param {Any} value Value to be included in a CSV cell + * @returns {String} Value stringified and processed + */ + processValue(value) { + if (value === null || value === undefined) { + return undefined; + } + + const valueType = typeof value; + if (valueType !== 'boolean' && valueType !== 'number' && valueType !== 'string') { + value = JSON.stringify(value); + + if (value === undefined) { + return undefined; + } + + if (value[0] === '"') { + value = value.replace(/^"(.+)"$/,'$1'); + } + } + + if (typeof value === 'string') { + if (this.opts.excelStrings) { + if(value.includes(this.opts.quote)) { + value = value.replace(new RegExp(this.opts.quote, 'g'), `${this.opts.escapedQuote}${this.opts.escapedQuote}`); + } + value = `"=""${value}"""`; + } else { + if(value.includes(this.opts.quote)) { + value = value.replace(new RegExp(this.opts.quote, 'g'), this.opts.escapedQuote); + } + value = `${this.opts.quote}${value}${this.opts.quote}`; + } + } + + return value; + } +} + +module.exports = JSON2CSVBase; diff --git a/node_modules/json2csv/lib/JSON2CSVParser.js b/node_modules/json2csv/lib/JSON2CSVParser.js new file mode 100644 index 0000000..9b3b0c0 --- /dev/null +++ b/node_modules/json2csv/lib/JSON2CSVParser.js @@ -0,0 +1,81 @@ +'use strict'; + +const JSON2CSVBase = require('./JSON2CSVBase'); +const { fastJoin, flattenReducer } = require('./utils'); + +class JSON2CSVParser extends JSON2CSVBase { + constructor(opts) { + super(opts); + if (this.opts.fields) { + this.opts.fields = this.preprocessFieldsInfo(this.opts.fields); + } + } + /** + * Main function that converts json to csv. + * + * @param {Array|Object} data Array of JSON objects to be converted to CSV + * @returns {String} The CSV formated data as a string + */ + parse(data) { + const processedData = this.preprocessData(data); + + if (!this.opts.fields) { + this.opts.fields = processedData + .reduce((fields, item) => { + Object.keys(item).forEach((field) => { + if (!fields.includes(field)) { + fields.push(field) + } + }); + + return fields + }, []); + + this.opts.fields = this.preprocessFieldsInfo(this.opts.fields); + } + + const header = this.opts.header ? this.getHeader() : ''; + const rows = this.processData(processedData); + const csv = (this.opts.withBOM ? '\ufeff' : '') + + header + + ((header && rows) ? this.opts.eol : '') + + rows; + + return csv; + } + + /** + * Preprocess the data according to the give opts (unwind, flatten, etc.) + and calculate the fields and field names if they are not provided. + * + * @param {Array|Object} data Array or object to be converted to CSV + */ + preprocessData(data) { + const processedData = Array.isArray(data) ? data : [data]; + + if (!this.opts.fields && (processedData.length === 0 || typeof processedData[0] !== 'object')) { + throw new Error('Data should not be empty or the "fields" option should be included'); + } + + if (this.opts.transforms.length === 0) return processedData; + + return processedData + .map(row => this.preprocessRow(row)) + .reduce(flattenReducer, []); + } + + /** + * Create the content row by row below the header + * + * @param {Array} data Array of JSON objects to be converted to CSV + * @returns {String} CSV string (body) + */ + processData(data) { + return fastJoin( + data.map(row => this.processRow(row)).filter(row => row), // Filter empty rows + this.opts.eol + ); + } +} + +module.exports = JSON2CSVParser; diff --git a/node_modules/json2csv/lib/JSON2CSVTransform.js b/node_modules/json2csv/lib/JSON2CSVTransform.js new file mode 100644 index 0000000..f7a52f2 --- /dev/null +++ b/node_modules/json2csv/lib/JSON2CSVTransform.js @@ -0,0 +1,203 @@ +'use strict'; + +const { Transform } = require('stream'); +const Parser = require('jsonparse'); +const JSON2CSVBase = require('./JSON2CSVBase'); + +class JSON2CSVTransform extends Transform { + constructor(opts, transformOpts) { + super(transformOpts); + + // Inherit methods from JSON2CSVBase since extends doesn't + // allow multiple inheritance and manually preprocess opts + Object.getOwnPropertyNames(JSON2CSVBase.prototype) + .forEach(key => (this[key] = JSON2CSVBase.prototype[key])); + this.opts = this.preprocessOpts(opts); + + this._data = ''; + this._hasWritten = false; + + if (this._readableState.objectMode) { + this.initObjectModeParse(); + } else if (this.opts.ndjson) { + this.initNDJSONParse(); + } else { + this.initJSONParser(); + } + + if (this.opts.withBOM) { + this.push('\ufeff'); + } + + if (this.opts.fields) { + this.opts.fields = this.preprocessFieldsInfo(this.opts.fields); + this.pushHeader(); + } + } + + /** + * Init the transform with a parser to process data in object mode. + * It receives JSON objects one by one and send them to `pushLine for processing. + */ + initObjectModeParse() { + const transform = this; + + this.parser = { + write(line) { + transform.pushLine(line); + }, + getPendingData() { + return undefined; + } + }; + } + + /** + * Init the transform with a parser to process NDJSON data. + * It maintains a buffer of received data, parses each line + * as JSON and send it to `pushLine for processing. + */ + initNDJSONParse() { + const transform = this; + + this.parser = { + _data: '', + write(chunk) { + this._data += chunk.toString(); + const lines = this._data + .split('\n') + .map(line => line.trim()) + .filter(line => line !== ''); + + let pendingData = false; + lines + .forEach((line, i) => { + try { + transform.pushLine(JSON.parse(line)); + } catch(e) { + if (i === lines.length - 1) { + pendingData = true; + } else { + e.message = `Invalid JSON (${line})` + transform.emit('error', e); + } + } + }); + this._data = pendingData + ? this._data.slice(this._data.lastIndexOf('\n')) + : ''; + }, + getPendingData() { + return this._data; + } + }; + } + + /** + * Init the transform with a parser to process JSON data. + * It maintains a buffer of received data, parses each as JSON + * item if the data is an array or the data itself otherwise + * and send it to `pushLine` for processing. + */ + initJSONParser() { + const transform = this; + this.parser = new Parser(); + this.parser.onValue = function (value) { + if (this.stack.length !== this.depthToEmit) return; + transform.pushLine(value); + } + + this.parser._onToken = this.parser.onToken; + + this.parser.onToken = function (token, value) { + transform.parser._onToken(token, value); + + if (this.stack.length === 0 + && !transform.opts.fields + && this.mode !== Parser.C.ARRAY + && this.mode !== Parser.C.OBJECT) { + this.onError(new Error('Data should not be empty or the "fields" option should be included')); + } + + if (this.stack.length === 1) { + if(this.depthToEmit === undefined) { + // If Array emit its content, else emit itself + this.depthToEmit = (this.mode === Parser.C.ARRAY) ? 1 : 0; + } + + if (this.depthToEmit !== 0 && this.stack.length === 1) { + // No need to store the whole root array in memory + this.value = undefined; + } + } + } + + this.parser.getPendingData = function () { + return this.value; + } + + this.parser.onError = function (err) { + if(err.message.includes('Unexpected')) { + err.message = `Invalid JSON (${err.message})`; + } + transform.emit('error', err); + } + } + + /** + * Main function that send data to the parse to be processed. + * + * @param {Buffer} chunk Incoming data + * @param {String} encoding Encoding of the incoming data. Defaults to 'utf8' + * @param {Function} done Called when the proceesing of the supplied chunk is done + */ + _transform(chunk, encoding, done) { + this.parser.write(chunk); + done(); + } + + _flush(done) { + if (this.parser.getPendingData()) { + done(new Error('Invalid data received from stdin', this.parser.getPendingData())); + } + + done(); + } + + + /** + * Generate the csv header and pushes it downstream. + */ + pushHeader() { + if (this.opts.header) { + const header = this.getHeader(); + this.emit('header', header); + this.push(header); + this._hasWritten = true; + } + } + + /** + * Transforms an incoming json data to csv and pushes it downstream. + * + * @param {Object} data JSON object to be converted in a CSV row + */ + pushLine(data) { + const processedData = this.preprocessRow(data); + + if (!this._hasWritten) { + this.opts.fields = this.opts.fields || this.preprocessFieldsInfo(Object.keys(processedData[0])); + this.pushHeader(); + } + + processedData.forEach(row => { + const line = this.processRow(row, this.opts); + if (line === undefined) return; + this.emit('line', line); + this.push(this._hasWritten ? this.opts.eol + line : line); + this._hasWritten = true; + }); + } +} + +module.exports = JSON2CSVTransform; diff --git a/node_modules/json2csv/lib/json2csv.js b/node_modules/json2csv/lib/json2csv.js new file mode 100644 index 0000000..7fe5ba4 --- /dev/null +++ b/node_modules/json2csv/lib/json2csv.js @@ -0,0 +1,44 @@ +'use strict'; + +const { Readable } = require('stream'); +const JSON2CSVParser = require('./JSON2CSVParser'); +const JSON2CSVAsyncParser = require('./JSON2CSVAsyncParser'); +const JSON2CSVTransform = require('./JSON2CSVTransform'); +const flatten = require('./transforms/flatten'); +const unwind = require('./transforms/unwind'); + +module.exports.Parser = JSON2CSVParser; +module.exports.AsyncParser = JSON2CSVAsyncParser; +module.exports.Transform = JSON2CSVTransform; + +// Convenience method to keep the API similar to version 3.X +module.exports.parse = (data, opts) => new JSON2CSVParser(opts).parse(data); +module.exports.parseAsync = (data, opts, transformOpts) => { + try { + if (!(data instanceof Readable)) { + transformOpts = Object.assign({}, transformOpts, { objectMode: true }); + } + + const asyncParser = new JSON2CSVAsyncParser(opts, transformOpts); + const promise = asyncParser.promise(); + + if (Array.isArray(data)) { + data.forEach(item => asyncParser.input.push(item)); + asyncParser.input.push(null); + } else if (data instanceof Readable) { + asyncParser.fromInput(data); + } else { + asyncParser.input.push(data); + asyncParser.input.push(null); + } + + return promise; + } catch (err) { + return Promise.reject(err); + } +}; + +module.exports.transforms = { + flatten, + unwind, +}; \ No newline at end of file diff --git a/node_modules/json2csv/lib/transforms/flatten.js b/node_modules/json2csv/lib/transforms/flatten.js new file mode 100644 index 0000000..a7dcf1b --- /dev/null +++ b/node_modules/json2csv/lib/transforms/flatten.js @@ -0,0 +1,37 @@ +/** + * Performs the flattening of a data row recursively + * + * @param {String} separator Separator to be used as the flattened field name + * @returns {Object => Object} Flattened object + */ +function flatten({ objects = true, arrays = false, separator = '.' } = {}) { + function step (obj, flatDataRow, currentPath) { + Object.keys(obj).forEach((key) => { + const newPath = currentPath ? `${currentPath}${separator}${key}` : key; + const value = obj[key]; + + if (objects + && typeof value === 'object' + && value !== null + && !Array.isArray(value) + && Object.prototype.toString.call(value.toJSON) !== '[object Function]' + && Object.keys(value).length) { + step(value, flatDataRow, newPath); + return; + } + + if (arrays && Array.isArray(value)) { + step(value, flatDataRow, newPath); + return; + } + + flatDataRow[newPath] = value; + }); + + return flatDataRow; + } + + return dataRow => step(dataRow, {}); +} + +module.exports = flatten; diff --git a/node_modules/json2csv/lib/transforms/unwind.js b/node_modules/json2csv/lib/transforms/unwind.js new file mode 100644 index 0000000..65b1803 --- /dev/null +++ b/node_modules/json2csv/lib/transforms/unwind.js @@ -0,0 +1,63 @@ + +const lodashGet = require('lodash.get'); +const { setProp, unsetProp, flattenReducer } = require('../utils'); + +function getUnwindablePaths(obj, currentPath) { + return Object.keys(obj).reduce((unwindablePaths, key) => { + const newPath = currentPath ? `${currentPath}.${key}` : key; + const value = obj[key]; + + if (typeof value === 'object' + && value !== null + && !Array.isArray(value) + && Object.prototype.toString.call(value.toJSON) !== '[object Function]' + && Object.keys(value).length) { + unwindablePaths = unwindablePaths.concat(getUnwindablePaths(value, newPath)); + } else if (Array.isArray(value)) { + unwindablePaths.push(newPath); + unwindablePaths = unwindablePaths.concat(value + .map(arrObj => getUnwindablePaths(arrObj, newPath)) + .reduce(flattenReducer, []) + .filter((item, index, arr) => arr.indexOf(item) !== index)); + } + + return unwindablePaths; + }, []); +} + +/** + * Performs the unwind recursively in specified sequence + * + * @param {String[]} unwindPaths The paths as strings to be used to deconstruct the array + * @returns {Object => Array} Array of objects containing all rows after unwind of chosen paths +*/ +function unwind({ paths = undefined, blankOut = false } = {}) { + function unwindReducer(rows, unwindPath) { + return rows + .map(row => { + const unwindArray = lodashGet(row, unwindPath); + + if (!Array.isArray(unwindArray)) { + return row; + } + + if (!unwindArray.length) { + return unsetProp(row, unwindPath); + } + + return unwindArray.map((unwindRow, index) => { + const clonedRow = (blankOut && index > 0) + ? {} + : row; + + return setProp(clonedRow, unwindPath, unwindRow); + }); + }) + .reduce(flattenReducer, []); + } + + paths = Array.isArray(paths) ? paths : (paths ? [paths] : undefined); + return dataRow => (paths || getUnwindablePaths(dataRow)).reduce(unwindReducer, [dataRow]); +} + +module.exports = unwind; \ No newline at end of file diff --git a/node_modules/json2csv/lib/utils.js b/node_modules/json2csv/lib/utils.js new file mode 100644 index 0000000..9fb6b62 --- /dev/null +++ b/node_modules/json2csv/lib/utils.js @@ -0,0 +1,72 @@ +'use strict'; + +function getProp(obj, path, defaultValue) { + return obj[path] === undefined ? defaultValue : obj[path]; +} + +function setProp(obj, path, value) { + const pathArray = Array.isArray(path) ? path : path.split('.'); + const [key, ...restPath] = pathArray; + return { + ...obj, + [key]: pathArray.length > 1 ? setProp(obj[key] || {}, restPath, value) : value + }; +} + +function unsetProp(obj, path) { + const pathArray = Array.isArray(path) ? path : path.split('.'); + const [key, ...restPath] = pathArray; + + if (typeof obj[key] !== 'object') { + // This will never be hit in the current code because unwind does the check before calling unsetProp + /* istanbul ignore next */ + return obj; + } + + if (pathArray.length === 1) { + return Object.keys(obj) + .filter(prop => prop !== key) + .reduce((acc, prop) => Object.assign(acc, { [prop]: obj[prop] }), {}); + } + + return Object.keys(obj) + .reduce((acc, prop) => ({ + ...acc, + [prop]: prop !== key ? obj[prop] : unsetProp(obj[key], restPath), + }), {}); +} + +function flattenReducer(acc, arr) { + try { + // This is faster but susceptible to `RangeError: Maximum call stack size exceeded` + acc.push(...arr); + return acc; + } catch (err) { + // Fallback to a slower but safer option + return acc.concat(arr); + } +} + +function fastJoin(arr, separator) { + let isFirst = true; + return arr.reduce((acc, elem) => { + if (elem === null || elem === undefined) { + elem = ''; + } + + if (isFirst) { + isFirst = false; + return `${elem}`; + } + + return `${acc}${separator}${elem}`; + }, ''); +} + +module.exports = { + getProp, + setProp, + unsetProp, + fastJoin, + flattenReducer +}; \ No newline at end of file diff --git a/node_modules/json2csv/package.json b/node_modules/json2csv/package.json new file mode 100644 index 0000000..a13a684 --- /dev/null +++ b/node_modules/json2csv/package.json @@ -0,0 +1,73 @@ +{ + "name": "json2csv", + "version": "5.0.7", + "description": "Convert JSON to CSV", + "keywords": [ + "json", + "to", + "csv", + "export", + "convert", + "parse" + ], + "author": { + "name": "Mirco Zeiss", + "email": "mirco.zeiss@gmail.com", + "twitter": "zeMirco" + }, + "license": "MIT", + "bin": { + "json2csv": "./bin/json2csv.js" + }, + "main": "lib/json2csv.js", + "module": "dist/json2csv.esm.js", + "browser": "dist/json2csv.umd.js", + "repository": { + "type": "git", + "url": "https://github.com/zemirco/json2csv" + }, + "homepage": "http://zemirco.github.io/json2csv", + "scripts": { + "build": "rollup -c", + "dev": "rollup -c -w", + "test": "node test | tap-spec", + "lint": "eslint bin lib test", + "test-with-coverage": "nyc --reporter=text node test | tap-spec", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "deploy:docs": "docpress b && gh-pages -d _docpress", + "prepublish": "in-publish && npm run before:publish || not-in-publish", + "before:publish": "npm test && npm run build && npm run deploy:docs", + "release": "standard-version" + }, + "dependencies": { + "commander": "^6.1.0", + "jsonparse": "^1.3.1", + "lodash.get": "^4.4.2" + }, + "devDependencies": { + "@babel/core": "^7.3.3", + "@babel/preset-env": "^7.3.1", + "coveralls": "^3.0.3", + "docpress": "^0.8.0", + "eslint": "^6.1.0", + "gh-pages": "^2.0.1", + "in-publish": "^2.0.0", + "nyc": "^14.1.1", + "rollup": "^1.11.0", + "rollup-plugin-babel": "^4.3.2", + "rollup-plugin-commonjs": "^10.0.2", + "rollup-plugin-node-builtins": "^2.1.2", + "rollup-plugin-node-globals": "^1.2.1", + "rollup-plugin-node-resolve": "^5.2.0", + "standard-version": "^8.0.1", + "tap-spec": "^5.0.0", + "tape": "^4.10.1" + }, + "engines": { + "node": ">= 10", + "npm": ">= 6.13.0" + }, + "volta": { + "node": "10.19.0" + } +} diff --git a/node_modules/json2csv/rollup.config.js b/node_modules/json2csv/rollup.config.js new file mode 100644 index 0000000..05670a1 --- /dev/null +++ b/node_modules/json2csv/rollup.config.js @@ -0,0 +1,46 @@ +import resolve from 'rollup-plugin-node-resolve'; +import commonjs from 'rollup-plugin-commonjs'; +import globals from 'rollup-plugin-node-globals'; +import builtins from 'rollup-plugin-node-builtins'; +import babel from 'rollup-plugin-babel'; +import pkg from './package.json'; + +export default [ + { + input: 'lib/json2csv.js', + output: { + file: pkg.browser, + format: 'umd', + name: 'json2csv' + }, + plugins: [ + resolve({ + browser: true + }), + commonjs(), + globals(), + builtins(), + babel({ + exclude: ['node_modules/**'], + babelrc: false, + presets: [['@babel/env', { modules: false }]], + }) + ] + }, + { + input: 'lib/json2csv.js', + output: [ + { file: pkg.module, format: 'es' } + ], + external: [ 'os', 'stream' ], + plugins: [ + resolve(), + commonjs(), + babel({ + exclude: ['node_modules/**'], + babelrc: false, + presets: [['@babel/env', { modules: false }]], + }) + ] + } +]; diff --git a/node_modules/jsonparse/.npmignore b/node_modules/jsonparse/.npmignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/node_modules/jsonparse/.npmignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/node_modules/jsonparse/LICENSE b/node_modules/jsonparse/LICENSE new file mode 100644 index 0000000..6dc24be --- /dev/null +++ b/node_modules/jsonparse/LICENSE @@ -0,0 +1,24 @@ +The MIT License + +Copyright (c) 2012 Tim Caswell + +Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), to +deal in the Software without restriction, including +without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom +the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/jsonparse/README.markdown b/node_modules/jsonparse/README.markdown new file mode 100644 index 0000000..0f405d3 --- /dev/null +++ b/node_modules/jsonparse/README.markdown @@ -0,0 +1,11 @@ +This is a streaming JSON parser. For a simpler, sax-based version see this gist: https://gist.github.com/1821394 + +The MIT License (MIT) +Copyright (c) 2011-2012 Tim Caswell + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/node_modules/jsonparse/bench.js b/node_modules/jsonparse/bench.js new file mode 100644 index 0000000..b36d92f --- /dev/null +++ b/node_modules/jsonparse/bench.js @@ -0,0 +1,26 @@ +var fs = require('fs'), + Parser = require('./jsonparse'); + + +var json = fs.readFileSync("samplejson/basic.json"); + + +while (true) { + var start = Date.now(); + for (var i = 0; i < 1000; i++) { + JSON.parse(json); + } + var first = Date.now() - start; + + start = Date.now(); + var p = new Parser(); + for (var i = 0; i < 1000; i++) { + p.write(json); + } + var second = Date.now() - start; + + + console.log("JSON.parse took %s", first); + console.log("streaming parser took %s", second); + console.log("streaming is %s times slower", second / first); +} diff --git a/node_modules/jsonparse/examples/twitterfeed.js b/node_modules/jsonparse/examples/twitterfeed.js new file mode 100644 index 0000000..10210d4 --- /dev/null +++ b/node_modules/jsonparse/examples/twitterfeed.js @@ -0,0 +1,30 @@ +var Parser = require('../jsonparse'); +var Http = require('http'); +require('./colors'); +var p = new Parser(); +var cred = require('./credentials'); +var client = Http.createClient(80, "stream.twitter.com"); +var request = client.request("GET", "/1/statuses/sample.json", { + "Host": "stream.twitter.com", + "Authorization": (new Buffer(cred.username + ":" + cred.password)).toString("base64") +}); +request.on('response', function (response) { + console.log(response.statusCode); + console.dir(response.headers); + response.on('data', function (chunk) { + p.write(chunk); + }); + response.on('end', function () { + console.log("END"); + }); +}); +request.end(); +var text = "", name = ""; +p.onValue = function (value) { + if (this.stack.length === 1 && this.key === 'text') { text = value; } + if (this.stack.length === 2 && this.key === 'name' && this.stack[1].key === 'user') { name = value; } + if (this.stack.length === 0) { + console.log(text.blue + " - " + name.yellow); + text = name = ""; + } +}; diff --git a/node_modules/jsonparse/jsonparse.js b/node_modules/jsonparse/jsonparse.js new file mode 100644 index 0000000..3991060 --- /dev/null +++ b/node_modules/jsonparse/jsonparse.js @@ -0,0 +1,413 @@ +/*global Buffer*/ +// Named constants with unique integer values +var C = {}; +// Tokens +var LEFT_BRACE = C.LEFT_BRACE = 0x1; +var RIGHT_BRACE = C.RIGHT_BRACE = 0x2; +var LEFT_BRACKET = C.LEFT_BRACKET = 0x3; +var RIGHT_BRACKET = C.RIGHT_BRACKET = 0x4; +var COLON = C.COLON = 0x5; +var COMMA = C.COMMA = 0x6; +var TRUE = C.TRUE = 0x7; +var FALSE = C.FALSE = 0x8; +var NULL = C.NULL = 0x9; +var STRING = C.STRING = 0xa; +var NUMBER = C.NUMBER = 0xb; +// Tokenizer States +var START = C.START = 0x11; +var STOP = C.STOP = 0x12; +var TRUE1 = C.TRUE1 = 0x21; +var TRUE2 = C.TRUE2 = 0x22; +var TRUE3 = C.TRUE3 = 0x23; +var FALSE1 = C.FALSE1 = 0x31; +var FALSE2 = C.FALSE2 = 0x32; +var FALSE3 = C.FALSE3 = 0x33; +var FALSE4 = C.FALSE4 = 0x34; +var NULL1 = C.NULL1 = 0x41; +var NULL2 = C.NULL2 = 0x42; +var NULL3 = C.NULL3 = 0x43; +var NUMBER1 = C.NUMBER1 = 0x51; +var NUMBER3 = C.NUMBER3 = 0x53; +var STRING1 = C.STRING1 = 0x61; +var STRING2 = C.STRING2 = 0x62; +var STRING3 = C.STRING3 = 0x63; +var STRING4 = C.STRING4 = 0x64; +var STRING5 = C.STRING5 = 0x65; +var STRING6 = C.STRING6 = 0x66; +// Parser States +var VALUE = C.VALUE = 0x71; +var KEY = C.KEY = 0x72; +// Parser Modes +var OBJECT = C.OBJECT = 0x81; +var ARRAY = C.ARRAY = 0x82; +// Character constants +var BACK_SLASH = "\\".charCodeAt(0); +var FORWARD_SLASH = "\/".charCodeAt(0); +var BACKSPACE = "\b".charCodeAt(0); +var FORM_FEED = "\f".charCodeAt(0); +var NEWLINE = "\n".charCodeAt(0); +var CARRIAGE_RETURN = "\r".charCodeAt(0); +var TAB = "\t".charCodeAt(0); + +var STRING_BUFFER_SIZE = 64 * 1024; + +function Parser() { + this.tState = START; + this.value = undefined; + + this.string = undefined; // string data + this.stringBuffer = Buffer.alloc ? Buffer.alloc(STRING_BUFFER_SIZE) : new Buffer(STRING_BUFFER_SIZE); + this.stringBufferOffset = 0; + this.unicode = undefined; // unicode escapes + this.highSurrogate = undefined; + + this.key = undefined; + this.mode = undefined; + this.stack = []; + this.state = VALUE; + this.bytes_remaining = 0; // number of bytes remaining in multi byte utf8 char to read after split boundary + this.bytes_in_sequence = 0; // bytes in multi byte utf8 char to read + this.temp_buffs = { "2": new Buffer(2), "3": new Buffer(3), "4": new Buffer(4) }; // for rebuilding chars split before boundary is reached + + // Stream offset + this.offset = -1; +} + +// Slow code to string converter (only used when throwing syntax errors) +Parser.toknam = function (code) { + var keys = Object.keys(C); + for (var i = 0, l = keys.length; i < l; i++) { + var key = keys[i]; + if (C[key] === code) { return key; } + } + return code && ("0x" + code.toString(16)); +}; + +var proto = Parser.prototype; +proto.onError = function (err) { throw err; }; +proto.charError = function (buffer, i) { + this.tState = STOP; + this.onError(new Error("Unexpected " + JSON.stringify(String.fromCharCode(buffer[i])) + " at position " + i + " in state " + Parser.toknam(this.tState))); +}; +proto.appendStringChar = function (char) { + if (this.stringBufferOffset >= STRING_BUFFER_SIZE) { + this.string += this.stringBuffer.toString('utf8'); + this.stringBufferOffset = 0; + } + + this.stringBuffer[this.stringBufferOffset++] = char; +}; +proto.appendStringBuf = function (buf, start, end) { + var size = buf.length; + if (typeof start === 'number') { + if (typeof end === 'number') { + if (end < 0) { + // adding a negative end decreeses the size + size = buf.length - start + end; + } else { + size = end - start; + } + } else { + size = buf.length - start; + } + } + + if (size < 0) { + size = 0; + } + + if (this.stringBufferOffset + size > STRING_BUFFER_SIZE) { + this.string += this.stringBuffer.toString('utf8', 0, this.stringBufferOffset); + this.stringBufferOffset = 0; + } + + buf.copy(this.stringBuffer, this.stringBufferOffset, start, end); + this.stringBufferOffset += size; +}; +proto.write = function (buffer) { + if (typeof buffer === "string") buffer = new Buffer(buffer); + var n; + for (var i = 0, l = buffer.length; i < l; i++) { + if (this.tState === START){ + n = buffer[i]; + this.offset++; + if(n === 0x7b){ this.onToken(LEFT_BRACE, "{"); // { + }else if(n === 0x7d){ this.onToken(RIGHT_BRACE, "}"); // } + }else if(n === 0x5b){ this.onToken(LEFT_BRACKET, "["); // [ + }else if(n === 0x5d){ this.onToken(RIGHT_BRACKET, "]"); // ] + }else if(n === 0x3a){ this.onToken(COLON, ":"); // : + }else if(n === 0x2c){ this.onToken(COMMA, ","); // , + }else if(n === 0x74){ this.tState = TRUE1; // t + }else if(n === 0x66){ this.tState = FALSE1; // f + }else if(n === 0x6e){ this.tState = NULL1; // n + }else if(n === 0x22){ // " + this.string = ""; + this.stringBufferOffset = 0; + this.tState = STRING1; + }else if(n === 0x2d){ this.string = "-"; this.tState = NUMBER1; // - + }else{ + if (n >= 0x30 && n < 0x40) { // 1-9 + this.string = String.fromCharCode(n); this.tState = NUMBER3; + } else if (n === 0x20 || n === 0x09 || n === 0x0a || n === 0x0d) { + // whitespace + } else { + return this.charError(buffer, i); + } + } + }else if (this.tState === STRING1){ // After open quote + n = buffer[i]; // get current byte from buffer + // check for carry over of a multi byte char split between data chunks + // & fill temp buffer it with start of this data chunk up to the boundary limit set in the last iteration + if (this.bytes_remaining > 0) { + for (var j = 0; j < this.bytes_remaining; j++) { + this.temp_buffs[this.bytes_in_sequence][this.bytes_in_sequence - this.bytes_remaining + j] = buffer[j]; + } + + this.appendStringBuf(this.temp_buffs[this.bytes_in_sequence]); + this.bytes_in_sequence = this.bytes_remaining = 0; + i = i + j - 1; + } else if (this.bytes_remaining === 0 && n >= 128) { // else if no remainder bytes carried over, parse multi byte (>=128) chars one at a time + if (n <= 193 || n > 244) { + return this.onError(new Error("Invalid UTF-8 character at position " + i + " in state " + Parser.toknam(this.tState))); + } + if ((n >= 194) && (n <= 223)) this.bytes_in_sequence = 2; + if ((n >= 224) && (n <= 239)) this.bytes_in_sequence = 3; + if ((n >= 240) && (n <= 244)) this.bytes_in_sequence = 4; + if ((this.bytes_in_sequence + i) > buffer.length) { // if bytes needed to complete char fall outside buffer length, we have a boundary split + for (var k = 0; k <= (buffer.length - 1 - i); k++) { + this.temp_buffs[this.bytes_in_sequence][k] = buffer[i + k]; // fill temp buffer of correct size with bytes available in this chunk + } + this.bytes_remaining = (i + this.bytes_in_sequence) - buffer.length; + i = buffer.length - 1; + } else { + this.appendStringBuf(buffer, i, i + this.bytes_in_sequence); + i = i + this.bytes_in_sequence - 1; + } + } else if (n === 0x22) { + this.tState = START; + this.string += this.stringBuffer.toString('utf8', 0, this.stringBufferOffset); + this.stringBufferOffset = 0; + this.onToken(STRING, this.string); + this.offset += Buffer.byteLength(this.string, 'utf8') + 1; + this.string = undefined; + } + else if (n === 0x5c) { + this.tState = STRING2; + } + else if (n >= 0x20) { this.appendStringChar(n); } + else { + return this.charError(buffer, i); + } + }else if (this.tState === STRING2){ // After backslash + n = buffer[i]; + if(n === 0x22){ this.appendStringChar(n); this.tState = STRING1; + }else if(n === 0x5c){ this.appendStringChar(BACK_SLASH); this.tState = STRING1; + }else if(n === 0x2f){ this.appendStringChar(FORWARD_SLASH); this.tState = STRING1; + }else if(n === 0x62){ this.appendStringChar(BACKSPACE); this.tState = STRING1; + }else if(n === 0x66){ this.appendStringChar(FORM_FEED); this.tState = STRING1; + }else if(n === 0x6e){ this.appendStringChar(NEWLINE); this.tState = STRING1; + }else if(n === 0x72){ this.appendStringChar(CARRIAGE_RETURN); this.tState = STRING1; + }else if(n === 0x74){ this.appendStringChar(TAB); this.tState = STRING1; + }else if(n === 0x75){ this.unicode = ""; this.tState = STRING3; + }else{ + return this.charError(buffer, i); + } + }else if (this.tState === STRING3 || this.tState === STRING4 || this.tState === STRING5 || this.tState === STRING6){ // unicode hex codes + n = buffer[i]; + // 0-9 A-F a-f + if ((n >= 0x30 && n < 0x40) || (n > 0x40 && n <= 0x46) || (n > 0x60 && n <= 0x66)) { + this.unicode += String.fromCharCode(n); + if (this.tState++ === STRING6) { + var intVal = parseInt(this.unicode, 16); + this.unicode = undefined; + if (this.highSurrogate !== undefined && intVal >= 0xDC00 && intVal < (0xDFFF + 1)) { //<56320,57343> - lowSurrogate + this.appendStringBuf(new Buffer(String.fromCharCode(this.highSurrogate, intVal))); + this.highSurrogate = undefined; + } else if (this.highSurrogate === undefined && intVal >= 0xD800 && intVal < (0xDBFF + 1)) { //<55296,56319> - highSurrogate + this.highSurrogate = intVal; + } else { + if (this.highSurrogate !== undefined) { + this.appendStringBuf(new Buffer(String.fromCharCode(this.highSurrogate))); + this.highSurrogate = undefined; + } + this.appendStringBuf(new Buffer(String.fromCharCode(intVal))); + } + this.tState = STRING1; + } + } else { + return this.charError(buffer, i); + } + } else if (this.tState === NUMBER1 || this.tState === NUMBER3) { + n = buffer[i]; + + switch (n) { + case 0x30: // 0 + case 0x31: // 1 + case 0x32: // 2 + case 0x33: // 3 + case 0x34: // 4 + case 0x35: // 5 + case 0x36: // 6 + case 0x37: // 7 + case 0x38: // 8 + case 0x39: // 9 + case 0x2e: // . + case 0x65: // e + case 0x45: // E + case 0x2b: // + + case 0x2d: // - + this.string += String.fromCharCode(n); + this.tState = NUMBER3; + break; + default: + this.tState = START; + var result = Number(this.string); + + if (isNaN(result)){ + return this.charError(buffer, i); + } + + if ((this.string.match(/[0-9]+/) == this.string) && (result.toString() != this.string)) { + // Long string of digits which is an ID string and not valid and/or safe JavaScript integer Number + this.onToken(STRING, this.string); + } else { + this.onToken(NUMBER, result); + } + + this.offset += this.string.length - 1; + this.string = undefined; + i--; + break; + } + }else if (this.tState === TRUE1){ // r + if (buffer[i] === 0x72) { this.tState = TRUE2; } + else { return this.charError(buffer, i); } + }else if (this.tState === TRUE2){ // u + if (buffer[i] === 0x75) { this.tState = TRUE3; } + else { return this.charError(buffer, i); } + }else if (this.tState === TRUE3){ // e + if (buffer[i] === 0x65) { this.tState = START; this.onToken(TRUE, true); this.offset+= 3; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE1){ // a + if (buffer[i] === 0x61) { this.tState = FALSE2; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE2){ // l + if (buffer[i] === 0x6c) { this.tState = FALSE3; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE3){ // s + if (buffer[i] === 0x73) { this.tState = FALSE4; } + else { return this.charError(buffer, i); } + }else if (this.tState === FALSE4){ // e + if (buffer[i] === 0x65) { this.tState = START; this.onToken(FALSE, false); this.offset+= 4; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL1){ // u + if (buffer[i] === 0x75) { this.tState = NULL2; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL2){ // l + if (buffer[i] === 0x6c) { this.tState = NULL3; } + else { return this.charError(buffer, i); } + }else if (this.tState === NULL3){ // l + if (buffer[i] === 0x6c) { this.tState = START; this.onToken(NULL, null); this.offset += 3; } + else { return this.charError(buffer, i); } + } + } +}; +proto.onToken = function (token, value) { + // Override this to get events +}; + +proto.parseError = function (token, value) { + this.tState = STOP; + this.onError(new Error("Unexpected " + Parser.toknam(token) + (value ? ("(" + JSON.stringify(value) + ")") : "") + " in state " + Parser.toknam(this.state))); +}; +proto.push = function () { + this.stack.push({value: this.value, key: this.key, mode: this.mode}); +}; +proto.pop = function () { + var value = this.value; + var parent = this.stack.pop(); + this.value = parent.value; + this.key = parent.key; + this.mode = parent.mode; + this.emit(value); + if (!this.mode) { this.state = VALUE; } +}; +proto.emit = function (value) { + if (this.mode) { this.state = COMMA; } + this.onValue(value); +}; +proto.onValue = function (value) { + // Override me +}; +proto.onToken = function (token, value) { + if(this.state === VALUE){ + if(token === STRING || token === NUMBER || token === TRUE || token === FALSE || token === NULL){ + if (this.value) { + this.value[this.key] = value; + } + this.emit(value); + }else if(token === LEFT_BRACE){ + this.push(); + if (this.value) { + this.value = this.value[this.key] = {}; + } else { + this.value = {}; + } + this.key = undefined; + this.state = KEY; + this.mode = OBJECT; + }else if(token === LEFT_BRACKET){ + this.push(); + if (this.value) { + this.value = this.value[this.key] = []; + } else { + this.value = []; + } + this.key = 0; + this.mode = ARRAY; + this.state = VALUE; + }else if(token === RIGHT_BRACE){ + if (this.mode === OBJECT) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else if(token === RIGHT_BRACKET){ + if (this.mode === ARRAY) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else{ + return this.parseError(token, value); + } + }else if(this.state === KEY){ + if (token === STRING) { + this.key = value; + this.state = COLON; + } else if (token === RIGHT_BRACE) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else if(this.state === COLON){ + if (token === COLON) { this.state = VALUE; } + else { return this.parseError(token, value); } + }else if(this.state === COMMA){ + if (token === COMMA) { + if (this.mode === ARRAY) { this.key++; this.state = VALUE; } + else if (this.mode === OBJECT) { this.state = KEY; } + + } else if (token === RIGHT_BRACKET && this.mode === ARRAY || token === RIGHT_BRACE && this.mode === OBJECT) { + this.pop(); + } else { + return this.parseError(token, value); + } + }else{ + return this.parseError(token, value); + } +}; + +Parser.C = C; + +module.exports = Parser; diff --git a/node_modules/jsonparse/package.json b/node_modules/jsonparse/package.json new file mode 100644 index 0000000..a2312ee --- /dev/null +++ b/node_modules/jsonparse/package.json @@ -0,0 +1,22 @@ +{ + "name": "jsonparse", + "description": "This is a pure-js JSON streaming parser for node.js", + "tags": ["json", "stream"], + "version": "1.3.1", + "author": "Tim Caswell ", + "repository": { + "type": "git", + "url": "http://github.com/creationix/jsonparse.git" + }, + "devDependencies": { + "tape": "~0.1.1", + "tap": "~0.3.3" + }, + "scripts": { + "test": "tap test/*.js" + }, + "bugs": "http://github.com/creationix/jsonparse/issues", + "engines": ["node >= 0.2.0"], + "license": "MIT", + "main": "jsonparse.js" +} diff --git a/node_modules/jsonparse/samplejson/basic.json b/node_modules/jsonparse/samplejson/basic.json new file mode 100644 index 0000000..950dff9 --- /dev/null +++ b/node_modules/jsonparse/samplejson/basic.json @@ -0,0 +1,167 @@ +[ + { + }, + { + "image": [ + {"shape": "rect", "fill": "#333", "stroke": "#999", "x": 0.5e+1, "y": 0.5, "z": 0.8e-0, "w": 0.5e5, "u": 2E10, "foo": 2E+1, "bar": 2E-0, "width": 47, "height": 47} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": true,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#248", "stroke": "#48f", "points": [[0.5,47.5],[47.5,47.5],[47.5,0.5]]} + ], + "solid": { + "1": [2,4], + "2": [1], + "3": [2], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": false,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#248", "stroke": "#48f", "points": [[0.5,0.5],[47.5,47.5],[0.5,47.5]]} + ], + "solid": { + "1": [2], + "2": [3], + "3": [2,6], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": true,"9": false} + }, + { + "image": [ + {"shape": "polygon", "fill": "#333", "stroke": "#999", "points": [[0.5,0.5],[47.5,47.5],[47.5,0.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [3], + "7": [4,8], + "8": [7], + "9": [6,8] + }, + "corners": {"1": false,"3": true,"7": true,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#333", "stroke": "#999", "points": [[0.5,0.5],[0.5,47.5],[47.5,0.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [1], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [9], + "9": [6,8] + }, + "corners": {"1": true,"3": false,"7": true,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#482", "stroke": "#8f4", "points": [[0.5,47.5],[0.5,23.5],[24.5,23.5],[24.5,0.5],[47.5,0.5],[47.5,47.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [6,2], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [9], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": false,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#482", "stroke": "#8f4", "points": [[0.5,0.5],[23.5,0.5],[23.5,24.5],[47.5,24.5],[47.5,47.5],[0.5,47.5]]} + ], + "jumpable": 3, + "solid": { + "1": [4,2], + "2": [], + "3": [2,6], + "4": [7], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": true,"9": false} + }, + { + "image": [ + {"shape": "circle", "fill": "#ff0", "stroke": "#ff8", "cx": 24, "cy": 24, "r": 18} + ], + "item": true + }, + { + "image": [ + {"shape": "polygon", "fill": "#842", "stroke": "#f84", "points": [[4.5,0.5],[14.5,0.5],[14.5,17.5],[34,17.5],[33.5,0.5],[43.5,0.5],[43.5,47.5],[33.5,47.5],[33.5,30.5],[14.5,30.5],[14.5,47.5],[4.5,47.5]]} + ], + "jumpable": 3 + }, + { + "image": [ + {"shape": "polygon", "fill": "#333", "stroke": "#999", "points": [[0.5,0.5],[47.5,0.5],[24,47.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [1], + "5": [2,8,1,3,7,9,4,6], + "6": [3], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": false,"3": false,"7": true,"9": true} + }, + { + "image": [ + {"shape": "rect", "fill": "#114acb", "x": 0.5, "y": 0.5, "width": 47, "height": 47}, + {"shape": "polygon", "fill": "rgba(255,255,255,0.30)", "points": [[0.5,0.5],[47.5,0.5],[40,8],[8,8],[8,40],[0.5,47.5]]}, + {"shape": "polygon", "fill": "rgba(0,0,0,0.30)", "points": [[47.5,0.5],[48,48],[0.5,47.5],[8,40],[40,40],[40,8]]}, + {"shape": "polygon", "fill": "rgb(255,255,0)", "stroke": "rgba(255,255,0,0.5)", "points": [[24,9],[35,20],[26,29],[26,33],[22,33],[22,27],[29,20],[24,15],[16,23],[13,20]]}, + {"shape": "rect", "fill": "rgb(255,255,0)", "stroke": "rgba(255,255,0,0.5)", "x": 22, "y":35, "width": 4, "height": 4} + ] + } +] diff --git a/node_modules/jsonparse/samplejson/basic2.json b/node_modules/jsonparse/samplejson/basic2.json new file mode 100644 index 0000000..3a6919b --- /dev/null +++ b/node_modules/jsonparse/samplejson/basic2.json @@ -0,0 +1,180 @@ +[ + { + }, + { + "image": [ + {"shape": "rect", "fill": "#333", "stroke": "#999", "x": 0.5, "y": 0.5, "width": 47, "height": 47} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": true,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#248", "stroke": "#48f", "points": [[0.5,47.5],[47.5,47.5],[47.5,0.5]]} + ], + "solid": { + "1": [2,4], + "2": [1], + "3": [2], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": false,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#248", "stroke": "#48f", "points": [[0.5,0.5],[47.5,47.5],[0.5,47.5]]} + ], + "solid": { + "1": [2], + "2": [3], + "3": [2,6], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": true,"9": false} + }, + { + "image": [ + {"shape": "polygon", "fill": "#333", "stroke": "#999", "points": [[0.5,0.5],[47.5,47.5],[47.5,0.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [3], + "7": [4,8], + "8": [7], + "9": [6,8] + }, + "corners": {"1": false,"3": true,"7": true,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#333", "stroke": "#999", "points": [[0.5,0.5],[0.5,47.5],[47.5,0.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [1], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [9], + "9": [6,8] + }, + "corners": {"1": true,"3": false,"7": true,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#482", "stroke": "#8f4", "points": [[0.5,47.5],[0.5,23.5],[24.5,23.5],[24.5,0.5],[47.5,0.5],[47.5,47.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [6,2], + "4": [], + "5": [2,8,1,3,7,9,4,6], + "6": [9], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": false,"9": true} + }, + { + "image": [ + {"shape": "polygon", "fill": "#482", "stroke": "#8f4", "points": [[0.5,0.5],[23.5,0.5],[23.5,24.5],[47.5,24.5],[47.5,47.5],[0.5,47.5]]} + ], + "jumpable": 3, + "solid": { + "1": [4,2], + "2": [], + "3": [2,6], + "4": [7], + "5": [2,8,1,3,7,9,4,6], + "6": [], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": true,"3": true,"7": true,"9": false} + }, + { + "image": [ + {"shape": "circle", "fill": "#ff0", "stroke": "#ff8", "cx": 24, "cy": 24, "r": 18} + ], + "item": true + }, + { + "image": [ + {"shape": "polygon", "fill": "#842", "stroke": "#f84", "points": [[4.5,0.5],[14.5,0.5],[14.5,17.5],[34,17.5],[33.5,0.5],[43.5,0.5],[43.5,47.5],[33.5,47.5],[33.5,30.5],[14.5,30.5],[14.5,47.5],[4.5,47.5]]} + ], + "jumpable": 3 + }, + { + "image": [ + {"shape": "polygon", "fill": "#333", "stroke": "#999", "points": [[0.5,0.5],[47.5,0.5],[24,47.5]]} + ], + "jumpable": 3, + "solid": { + "1": [2,4], + "2": [], + "3": [2,6], + "4": [1], + "5": [2,8,1,3,7,9,4,6], + "6": [3], + "7": [4,8], + "8": [], + "9": [6,8] + }, + "corners": {"1": false,"3": false,"7": true,"9": true} + }, + { + "image": [ + {"shape": "rect", "fill": "#114acb", "x": 0.5, "y": 0.5, "width": 47, "height": 47}, + {"shape": "polygon", "fill": "rgba(255,255,255,0.30)", "points": [[0.5,0.5],[47.5,0.5],[40,8],[8,8],[8,40],[0.5,47.5]]}, + {"shape": "polygon", "fill": "rgba(0,0,0,0.30)", "points": [[47.5,0.5],[48,48],[0.5,47.5],[8,40],[40,40],[40,8]]}, + {"shape": "polygon", "fill": "rgb(255,255,0)", "stroke": "rgba(255,255,0,0.5)", "points": [[24,9],[35,20],[26,29],[26,33],[22,33],[22,27],[29,20],[24,15],[16,23],[13,20]]}, + {"shape": "rect", "fill": "rgb(255,255,0)", "stroke": "rgba(255,255,0,0.5)", "x": 22, "y":35, "width": 4, "height": 4} + ], + "item": true + }, + { + "image": [ + {"shape": "circle", "fill": "#80f", "stroke": "#88f", "cx": 24, "cy": 24, "r": 18} + ], + "item": true + }, + { + "image": [ + {"shape": "circle", "fill": "#4f4", "stroke": "#8f8", "cx": 24, "cy": 24, "r": 18} + ], + "item": true + } +] diff --git a/node_modules/jsonparse/test/big-token.js b/node_modules/jsonparse/test/big-token.js new file mode 100644 index 0000000..3604631 --- /dev/null +++ b/node_modules/jsonparse/test/big-token.js @@ -0,0 +1,24 @@ +var stream = require('stream'); +var JsonParse = require('../jsonparse'); +var test = require('tape'); + +test('can handle large tokens without running out of memory', function (t) { + var parser = new JsonParse(); + var chunkSize = 1024; + var chunks = 1024 * 200; // 200mb + var quote = Buffer.from ? Buffer.from('"') : new Buffer('"'); + t.plan(1); + + parser.onToken = function (type, value) { + t.equal(value.length, chunkSize * chunks, 'token should be size of input json'); + t.end(); + }; + + parser.write(quote); + for (var i = 0; i < chunks; ++i) { + var buf = Buffer.alloc ? Buffer.alloc(chunkSize) : new Buffer(chunkSize); + buf.fill('a'); + parser.write(buf); + } + parser.write(quote); +}); diff --git a/node_modules/jsonparse/test/boundary.js b/node_modules/jsonparse/test/boundary.js new file mode 100644 index 0000000..6671f5f --- /dev/null +++ b/node_modules/jsonparse/test/boundary.js @@ -0,0 +1,110 @@ +var test = require('tape'); +var Parser = require('../'); + +test('2 byte utf8 \'De\' character: д', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, 'д'); + }; + + var de_buffer = new Buffer([0xd0, 0xb4]); + + p.write('"'); + p.write(de_buffer); + p.write('"'); + +}); + +test('3 byte utf8 \'Han\' character: 我', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '我'); + }; + + var han_buffer = new Buffer([0xe6, 0x88, 0x91]); + p.write('"'); + p.write(han_buffer); + p.write('"'); +}); + +test('4 byte utf8 character (unicode scalar U+2070E): 𠜎', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '𠜎'); + }; + + var Ux2070E_buffer = new Buffer([0xf0, 0xa0, 0x9c, 0x8e]); + p.write('"'); + p.write(Ux2070E_buffer); + p.write('"'); +}); + +test('3 byte utf8 \'Han\' character chunked inbetween 2nd and 3rd byte: 我', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '我'); + }; + + var han_buffer_first = new Buffer([0xe6, 0x88]); + var han_buffer_second = new Buffer([0x91]); + p.write('"'); + p.write(han_buffer_first); + p.write(han_buffer_second); + p.write('"'); +}); + +test('4 byte utf8 character (unicode scalar U+2070E) chunked inbetween 2nd and 3rd byte: 𠜎', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '𠜎'); + }; + + var Ux2070E_buffer_first = new Buffer([0xf0, 0xa0]); + var Ux2070E_buffer_second = new Buffer([0x9c, 0x8e]); + p.write('"'); + p.write(Ux2070E_buffer_first); + p.write(Ux2070E_buffer_second); + p.write('"'); +}); + +test('1-4 byte utf8 character string chunked inbetween random bytes: Aж文𠜱B', function (t) { + t.plan(1); + +var p = new Parser(); + p.onValue = function (value) { + t.equal(value, 'Aж文𠜱B'); + }; + + var eclectic_buffer = new Buffer([0x41, // A + 0xd0, 0xb6, // ж + 0xe6, 0x96, 0x87, // 文 + 0xf0, 0xa0, 0x9c, 0xb1, // 𠜱 + 0x42]); // B + + var rand_chunk = Math.floor(Math.random() * (eclectic_buffer.length)); + var first_buffer = eclectic_buffer.slice(0, rand_chunk); + var second_buffer = eclectic_buffer.slice(rand_chunk); + + //console.log('eclectic_buffer: ' + eclectic_buffer) + //console.log('sliced from 0 to ' + rand_chunk); + //console.log(first_buffer); + //console.log('then sliced from ' + rand_chunk + ' to the end'); + //console.log(second_buffer); + + console.log('chunked after offset ' + rand_chunk); + p.write('"'); + p.write(first_buffer); + p.write(second_buffer); + p.write('"'); + +}); \ No newline at end of file diff --git a/node_modules/jsonparse/test/offset.js b/node_modules/jsonparse/test/offset.js new file mode 100644 index 0000000..9a552ab --- /dev/null +++ b/node_modules/jsonparse/test/offset.js @@ -0,0 +1,67 @@ +var test = require('tape'); +var Parser = require('../'); + +var input = '{\n "string": "value",\n "number": 3,\n "object"'; +var input2 = ': {\n "key": "vд"\n },\n "array": [\n -1,\n 12\n ]\n '; +var input3 = '"null": null, "true": true, "false": false, "frac": 3.14 }'; + +var offsets = [ + [ 0, Parser.C.LEFT_BRACE ], + [ 4, Parser.C.STRING ], + [ 12, Parser.C.COLON ], + [ 14, Parser.C.STRING ], + [ 21, Parser.C.COMMA ], + [ 25, Parser.C.STRING ], + [ 33, Parser.C.COLON ], + [ 35, Parser.C.NUMBER ], + [ 36, Parser.C.COMMA ], + [ 40, Parser.C.STRING ], + [ 48, Parser.C.COLON ], + [ 50, Parser.C.LEFT_BRACE ], + [ 54, Parser.C.STRING ], + [ 59, Parser.C.COLON ], + [ 61, Parser.C.STRING ], + [ 69, Parser.C.RIGHT_BRACE ], + [ 70, Parser.C.COMMA ], + [ 74, Parser.C.STRING ], + [ 81, Parser.C.COLON ], + [ 83, Parser.C.LEFT_BRACKET ], + [ 87, Parser.C.NUMBER ], + [ 89, Parser.C.COMMA ], + [ 93, Parser.C.NUMBER ], + [ 98, Parser.C.RIGHT_BRACKET ], + [ 102, Parser.C.STRING ], + [ 108, Parser.C.COLON ], + [ 110, Parser.C.NULL ], + [ 114, Parser.C.COMMA ], + [ 116, Parser.C.STRING ], + [ 122, Parser.C.COLON ], + [ 124, Parser.C.TRUE ], + [ 128, Parser.C.COMMA ], + [ 130, Parser.C.STRING ], + [ 137, Parser.C.COLON ], + [ 139, Parser.C.FALSE ], + [ 144, Parser.C.COMMA ], + [ 146, Parser.C.STRING ], + [ 152, Parser.C.COLON ], + [ 154, Parser.C.NUMBER ], + [ 159, Parser.C.RIGHT_BRACE ] +]; + +test('offset', function(t) { + t.plan(offsets.length * 2 + 1); + + var p = new Parser(); + var i = 0; + p.onToken = function (token) { + t.equal(p.offset, offsets[i][0]); + t.equal(token, offsets[i][1]); + i++; + }; + + p.write(input); + p.write(input2); + p.write(input3); + + t.equal(i, offsets.length); +}); diff --git a/node_modules/jsonparse/test/primitives.js b/node_modules/jsonparse/test/primitives.js new file mode 100644 index 0000000..33cae16 --- /dev/null +++ b/node_modules/jsonparse/test/primitives.js @@ -0,0 +1,57 @@ +var test = require('tape'); +var Parser = require('../'); + +var expected = [ + [ [], '' ], + [ [], 'Hello' ], + [ [], 'This"is' ], + [ [], '\r\n\f\t\\/"' ], + [ [], 'Λάμβδα' ], + [ [], '\\' ], + [ [], '/' ], + [ [], '"' ], + [ [ 0 ], 0 ], + [ [ 1 ], 1 ], + [ [ 2 ], -1 ], + [ [], [ 0, 1, -1 ] ], + [ [ 0 ], 1 ], + [ [ 1 ], 1.1 ], + [ [ 2 ], -1.1 ], + [ [ 3 ], -1 ], + [ [], [ 1, 1.1, -1.1, -1 ] ], + [ [ 0 ], -1 ], + [ [], [ -1 ] ], + [ [ 0 ], -0.1 ], + [ [], [ -0.1 ] ], + [ [ 0 ], 6.02e+23 ], + [ [], [ 6.02e+23 ] ], + [ [ 0 ], '7161093205057351174' ], + [ [], [ '7161093205057351174'] ] +]; + +test('primitives', function (t) { + t.plan(25); + + var p = new Parser(); + p.onValue = function (value) { + var keys = this.stack + .slice(1) + .map(function (item) { return item.key }) + .concat(this.key !== undefined ? this.key : []) + ; + t.deepEqual( + [ keys, value ], + expected.shift() + ); + }; + + p.write('"""Hello""This\\"is""\\r\\n\\f\\t\\\\\\/\\""'); + p.write('"\\u039b\\u03ac\\u03bc\\u03b2\\u03b4\\u03b1"'); + p.write('"\\\\"'); + p.write('"\\/"'); + p.write('"\\""'); + p.write('[0,1,-1]'); + p.write('[1.0,1.1,-1.1,-1.0][-1][-0.1]'); + p.write('[6.02e23]'); + p.write('[7161093205057351174]'); +}); diff --git a/node_modules/jsonparse/test/surrogate.js b/node_modules/jsonparse/test/surrogate.js new file mode 100644 index 0000000..c048f37 --- /dev/null +++ b/node_modules/jsonparse/test/surrogate.js @@ -0,0 +1,26 @@ +var test = require('tape'); +var Parser = require('../'); + +test('parse surrogate pair', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '😋'); + }; + + p.write('"\\uD83D\\uDE0B"'); +}); + +test('parse chunked surrogate pair', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '😋'); + }; + + p.write('"\\uD83D'); + p.write('\\uDE0B"'); +}); + diff --git a/node_modules/jsonparse/test/unvalid.js b/node_modules/jsonparse/test/unvalid.js new file mode 100644 index 0000000..7715cc0 --- /dev/null +++ b/node_modules/jsonparse/test/unvalid.js @@ -0,0 +1,15 @@ +var test = require('tape'); +var Parser = require('../'); + +test('unvalid', function (t) { + var count = 0; + + var p = new Parser(); + p.onError = function (value) { + count++; + t.equal(1, count); + t.end(); + }; + + p.write('{"test": eer['); +}); diff --git a/node_modules/jsonparse/test/utf8.js b/node_modules/jsonparse/test/utf8.js new file mode 100644 index 0000000..6cb842f --- /dev/null +++ b/node_modules/jsonparse/test/utf8.js @@ -0,0 +1,38 @@ +var test = require('tape'); +var Parser = require('../'); + +test('3 bytes of utf8', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '├──'); + }; + + p.write('"├──"'); +}); + +test('utf8 snowman', function (t) { + t.plan(1); + + var p = new Parser(); + p.onValue = function (value) { + t.equal(value, '☃'); + }; + + p.write('"☃"'); +}); + +test('utf8 with regular ascii', function (t) { + t.plan(4); + + var p = new Parser(); + var expected = [ "snow: ☃!", "xyz", "¡que!" ]; + expected.push(expected.slice()); + + p.onValue = function (value) { + t.deepEqual(value, expected.shift()); + }; + + p.write('["snow: ☃!","xyz","¡que!"]'); +}); diff --git a/node_modules/lodash.get/LICENSE b/node_modules/lodash.get/LICENSE new file mode 100644 index 0000000..e0c69d5 --- /dev/null +++ b/node_modules/lodash.get/LICENSE @@ -0,0 +1,47 @@ +Copyright jQuery Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. diff --git a/node_modules/lodash.get/README.md b/node_modules/lodash.get/README.md new file mode 100644 index 0000000..9079614 --- /dev/null +++ b/node_modules/lodash.get/README.md @@ -0,0 +1,18 @@ +# lodash.get v4.4.2 + +The [lodash](https://lodash.com/) method `_.get` exported as a [Node.js](https://nodejs.org/) module. + +## Installation + +Using npm: +```bash +$ {sudo -H} npm i -g npm +$ npm i --save lodash.get +``` + +In Node.js: +```js +var get = require('lodash.get'); +``` + +See the [documentation](https://lodash.com/docs#get) or [package source](https://github.com/lodash/lodash/blob/4.4.2-npm-packages/lodash.get) for more details. diff --git a/node_modules/lodash.get/index.js b/node_modules/lodash.get/index.js new file mode 100644 index 0000000..0eaadec --- /dev/null +++ b/node_modules/lodash.get/index.js @@ -0,0 +1,931 @@ +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as the `TypeError` message for "Functions" methods. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** `Object#toString` result references. */ +var funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + symbolTag = '[object Symbol]'; + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +/** Used for built-in method references. */ +var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** Built-in value references. */ +var Symbol = root.Symbol, + splice = arrayProto.splice; + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'), + nativeCreate = getNative(Object, 'create'); + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; +} + +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; +} + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); +} + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; +} + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; +} + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); +} + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value) { + return isArray(value) ? value : stringToPath(value); +} + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoize(function(string) { + string = toString(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; +} + +// Assign cache to `_.memoize`. +memoize.Cache = MapCache; + +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); +} + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : baseToString(value); +} + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +module.exports = get; diff --git a/node_modules/lodash.get/package.json b/node_modules/lodash.get/package.json new file mode 100644 index 0000000..3dd8e77 --- /dev/null +++ b/node_modules/lodash.get/package.json @@ -0,0 +1,17 @@ +{ + "name": "lodash.get", + "version": "4.4.2", + "description": "The lodash method `_.get` exported as a module.", + "homepage": "https://lodash.com/", + "icon": "https://lodash.com/icon.svg", + "license": "MIT", + "keywords": "lodash-modularized, get", + "author": "John-David Dalton (http://allyoucanleet.com/)", + "contributors": [ + "John-David Dalton (http://allyoucanleet.com/)", + "Blaine Bublitz (https://github.com/phated)", + "Mathias Bynens (https://mathiasbynens.be/)" + ], + "repository": "lodash/lodash", + "scripts": { "test": "echo \"See https://travis-ci.org/lodash/lodash-cli for testing details.\"" } +} diff --git a/node_modules/lodash/LICENSE b/node_modules/lodash/LICENSE new file mode 100644 index 0000000..77c42f1 --- /dev/null +++ b/node_modules/lodash/LICENSE @@ -0,0 +1,47 @@ +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. diff --git a/node_modules/lodash/README.md b/node_modules/lodash/README.md new file mode 100644 index 0000000..3ab1a05 --- /dev/null +++ b/node_modules/lodash/README.md @@ -0,0 +1,39 @@ +# lodash v4.17.21 + +The [Lodash](https://lodash.com/) library exported as [Node.js](https://nodejs.org/) modules. + +## Installation + +Using npm: +```shell +$ npm i -g npm +$ npm i --save lodash +``` + +In Node.js: +```js +// Load the full build. +var _ = require('lodash'); +// Load the core build. +var _ = require('lodash/core'); +// Load the FP build for immutable auto-curried iteratee-first data-last methods. +var fp = require('lodash/fp'); + +// Load method categories. +var array = require('lodash/array'); +var object = require('lodash/fp/object'); + +// Cherry-pick methods for smaller browserify/rollup/webpack bundles. +var at = require('lodash/at'); +var curryN = require('lodash/fp/curryN'); +``` + +See the [package source](https://github.com/lodash/lodash/tree/4.17.21-npm) for more details. + +**Note:**
+Install [n_](https://www.npmjs.com/package/n_) for Lodash use in the Node.js < 6 REPL. + +## Support + +Tested in Chrome 74-75, Firefox 66-67, IE 11, Edge 18, Safari 11-12, & Node.js 8-12.
+Automated [browser](https://saucelabs.com/u/lodash) & [CI](https://travis-ci.org/lodash/lodash/) test runs are available. diff --git a/node_modules/lodash/_DataView.js b/node_modules/lodash/_DataView.js new file mode 100644 index 0000000..ac2d57c --- /dev/null +++ b/node_modules/lodash/_DataView.js @@ -0,0 +1,7 @@ +var getNative = require('./_getNative'), + root = require('./_root'); + +/* Built-in method references that are verified to be native. */ +var DataView = getNative(root, 'DataView'); + +module.exports = DataView; diff --git a/node_modules/lodash/_Hash.js b/node_modules/lodash/_Hash.js new file mode 100644 index 0000000..b504fe3 --- /dev/null +++ b/node_modules/lodash/_Hash.js @@ -0,0 +1,32 @@ +var hashClear = require('./_hashClear'), + hashDelete = require('./_hashDelete'), + hashGet = require('./_hashGet'), + hashHas = require('./_hashHas'), + hashSet = require('./_hashSet'); + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `Hash`. +Hash.prototype.clear = hashClear; +Hash.prototype['delete'] = hashDelete; +Hash.prototype.get = hashGet; +Hash.prototype.has = hashHas; +Hash.prototype.set = hashSet; + +module.exports = Hash; diff --git a/node_modules/lodash/_LazyWrapper.js b/node_modules/lodash/_LazyWrapper.js new file mode 100644 index 0000000..81786c7 --- /dev/null +++ b/node_modules/lodash/_LazyWrapper.js @@ -0,0 +1,28 @@ +var baseCreate = require('./_baseCreate'), + baseLodash = require('./_baseLodash'); + +/** Used as references for the maximum length and index of an array. */ +var MAX_ARRAY_LENGTH = 4294967295; + +/** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ +function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; +} + +// Ensure `LazyWrapper` is an instance of `baseLodash`. +LazyWrapper.prototype = baseCreate(baseLodash.prototype); +LazyWrapper.prototype.constructor = LazyWrapper; + +module.exports = LazyWrapper; diff --git a/node_modules/lodash/_ListCache.js b/node_modules/lodash/_ListCache.js new file mode 100644 index 0000000..26895c3 --- /dev/null +++ b/node_modules/lodash/_ListCache.js @@ -0,0 +1,32 @@ +var listCacheClear = require('./_listCacheClear'), + listCacheDelete = require('./_listCacheDelete'), + listCacheGet = require('./_listCacheGet'), + listCacheHas = require('./_listCacheHas'), + listCacheSet = require('./_listCacheSet'); + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = listCacheClear; +ListCache.prototype['delete'] = listCacheDelete; +ListCache.prototype.get = listCacheGet; +ListCache.prototype.has = listCacheHas; +ListCache.prototype.set = listCacheSet; + +module.exports = ListCache; diff --git a/node_modules/lodash/_LodashWrapper.js b/node_modules/lodash/_LodashWrapper.js new file mode 100644 index 0000000..c1e4d9d --- /dev/null +++ b/node_modules/lodash/_LodashWrapper.js @@ -0,0 +1,22 @@ +var baseCreate = require('./_baseCreate'), + baseLodash = require('./_baseLodash'); + +/** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ +function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; +} + +LodashWrapper.prototype = baseCreate(baseLodash.prototype); +LodashWrapper.prototype.constructor = LodashWrapper; + +module.exports = LodashWrapper; diff --git a/node_modules/lodash/_Map.js b/node_modules/lodash/_Map.js new file mode 100644 index 0000000..b73f29a --- /dev/null +++ b/node_modules/lodash/_Map.js @@ -0,0 +1,7 @@ +var getNative = require('./_getNative'), + root = require('./_root'); + +/* Built-in method references that are verified to be native. */ +var Map = getNative(root, 'Map'); + +module.exports = Map; diff --git a/node_modules/lodash/_MapCache.js b/node_modules/lodash/_MapCache.js new file mode 100644 index 0000000..4a4eea7 --- /dev/null +++ b/node_modules/lodash/_MapCache.js @@ -0,0 +1,32 @@ +var mapCacheClear = require('./_mapCacheClear'), + mapCacheDelete = require('./_mapCacheDelete'), + mapCacheGet = require('./_mapCacheGet'), + mapCacheHas = require('./_mapCacheHas'), + mapCacheSet = require('./_mapCacheSet'); + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = mapCacheClear; +MapCache.prototype['delete'] = mapCacheDelete; +MapCache.prototype.get = mapCacheGet; +MapCache.prototype.has = mapCacheHas; +MapCache.prototype.set = mapCacheSet; + +module.exports = MapCache; diff --git a/node_modules/lodash/_Promise.js b/node_modules/lodash/_Promise.js new file mode 100644 index 0000000..247b9e1 --- /dev/null +++ b/node_modules/lodash/_Promise.js @@ -0,0 +1,7 @@ +var getNative = require('./_getNative'), + root = require('./_root'); + +/* Built-in method references that are verified to be native. */ +var Promise = getNative(root, 'Promise'); + +module.exports = Promise; diff --git a/node_modules/lodash/_Set.js b/node_modules/lodash/_Set.js new file mode 100644 index 0000000..b3c8dcb --- /dev/null +++ b/node_modules/lodash/_Set.js @@ -0,0 +1,7 @@ +var getNative = require('./_getNative'), + root = require('./_root'); + +/* Built-in method references that are verified to be native. */ +var Set = getNative(root, 'Set'); + +module.exports = Set; diff --git a/node_modules/lodash/_SetCache.js b/node_modules/lodash/_SetCache.js new file mode 100644 index 0000000..6468b06 --- /dev/null +++ b/node_modules/lodash/_SetCache.js @@ -0,0 +1,27 @@ +var MapCache = require('./_MapCache'), + setCacheAdd = require('./_setCacheAdd'), + setCacheHas = require('./_setCacheHas'); + +/** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ +function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } +} + +// Add methods to `SetCache`. +SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; +SetCache.prototype.has = setCacheHas; + +module.exports = SetCache; diff --git a/node_modules/lodash/_Stack.js b/node_modules/lodash/_Stack.js new file mode 100644 index 0000000..80b2cf1 --- /dev/null +++ b/node_modules/lodash/_Stack.js @@ -0,0 +1,27 @@ +var ListCache = require('./_ListCache'), + stackClear = require('./_stackClear'), + stackDelete = require('./_stackDelete'), + stackGet = require('./_stackGet'), + stackHas = require('./_stackHas'), + stackSet = require('./_stackSet'); + +/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; +} + +// Add methods to `Stack`. +Stack.prototype.clear = stackClear; +Stack.prototype['delete'] = stackDelete; +Stack.prototype.get = stackGet; +Stack.prototype.has = stackHas; +Stack.prototype.set = stackSet; + +module.exports = Stack; diff --git a/node_modules/lodash/_Symbol.js b/node_modules/lodash/_Symbol.js new file mode 100644 index 0000000..a013f7c --- /dev/null +++ b/node_modules/lodash/_Symbol.js @@ -0,0 +1,6 @@ +var root = require('./_root'); + +/** Built-in value references. */ +var Symbol = root.Symbol; + +module.exports = Symbol; diff --git a/node_modules/lodash/_Uint8Array.js b/node_modules/lodash/_Uint8Array.js new file mode 100644 index 0000000..2fb30e1 --- /dev/null +++ b/node_modules/lodash/_Uint8Array.js @@ -0,0 +1,6 @@ +var root = require('./_root'); + +/** Built-in value references. */ +var Uint8Array = root.Uint8Array; + +module.exports = Uint8Array; diff --git a/node_modules/lodash/_WeakMap.js b/node_modules/lodash/_WeakMap.js new file mode 100644 index 0000000..567f86c --- /dev/null +++ b/node_modules/lodash/_WeakMap.js @@ -0,0 +1,7 @@ +var getNative = require('./_getNative'), + root = require('./_root'); + +/* Built-in method references that are verified to be native. */ +var WeakMap = getNative(root, 'WeakMap'); + +module.exports = WeakMap; diff --git a/node_modules/lodash/_apply.js b/node_modules/lodash/_apply.js new file mode 100644 index 0000000..36436dd --- /dev/null +++ b/node_modules/lodash/_apply.js @@ -0,0 +1,21 @@ +/** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} + +module.exports = apply; diff --git a/node_modules/lodash/_arrayAggregator.js b/node_modules/lodash/_arrayAggregator.js new file mode 100644 index 0000000..d96c3ca --- /dev/null +++ b/node_modules/lodash/_arrayAggregator.js @@ -0,0 +1,22 @@ +/** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ +function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; +} + +module.exports = arrayAggregator; diff --git a/node_modules/lodash/_arrayEach.js b/node_modules/lodash/_arrayEach.js new file mode 100644 index 0000000..2c5f579 --- /dev/null +++ b/node_modules/lodash/_arrayEach.js @@ -0,0 +1,22 @@ +/** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ +function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; +} + +module.exports = arrayEach; diff --git a/node_modules/lodash/_arrayEachRight.js b/node_modules/lodash/_arrayEachRight.js new file mode 100644 index 0000000..976ca5c --- /dev/null +++ b/node_modules/lodash/_arrayEachRight.js @@ -0,0 +1,21 @@ +/** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ +function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; +} + +module.exports = arrayEachRight; diff --git a/node_modules/lodash/_arrayEvery.js b/node_modules/lodash/_arrayEvery.js new file mode 100644 index 0000000..e26a918 --- /dev/null +++ b/node_modules/lodash/_arrayEvery.js @@ -0,0 +1,23 @@ +/** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ +function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; +} + +module.exports = arrayEvery; diff --git a/node_modules/lodash/_arrayFilter.js b/node_modules/lodash/_arrayFilter.js new file mode 100644 index 0000000..75ea254 --- /dev/null +++ b/node_modules/lodash/_arrayFilter.js @@ -0,0 +1,25 @@ +/** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ +function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; +} + +module.exports = arrayFilter; diff --git a/node_modules/lodash/_arrayIncludes.js b/node_modules/lodash/_arrayIncludes.js new file mode 100644 index 0000000..3737a6d --- /dev/null +++ b/node_modules/lodash/_arrayIncludes.js @@ -0,0 +1,17 @@ +var baseIndexOf = require('./_baseIndexOf'); + +/** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ +function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; +} + +module.exports = arrayIncludes; diff --git a/node_modules/lodash/_arrayIncludesWith.js b/node_modules/lodash/_arrayIncludesWith.js new file mode 100644 index 0000000..235fd97 --- /dev/null +++ b/node_modules/lodash/_arrayIncludesWith.js @@ -0,0 +1,22 @@ +/** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ +function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; +} + +module.exports = arrayIncludesWith; diff --git a/node_modules/lodash/_arrayLikeKeys.js b/node_modules/lodash/_arrayLikeKeys.js new file mode 100644 index 0000000..b2ec9ce --- /dev/null +++ b/node_modules/lodash/_arrayLikeKeys.js @@ -0,0 +1,49 @@ +var baseTimes = require('./_baseTimes'), + isArguments = require('./isArguments'), + isArray = require('./isArray'), + isBuffer = require('./isBuffer'), + isIndex = require('./_isIndex'), + isTypedArray = require('./isTypedArray'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; +} + +module.exports = arrayLikeKeys; diff --git a/node_modules/lodash/_arrayMap.js b/node_modules/lodash/_arrayMap.js new file mode 100644 index 0000000..22b2246 --- /dev/null +++ b/node_modules/lodash/_arrayMap.js @@ -0,0 +1,21 @@ +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +module.exports = arrayMap; diff --git a/node_modules/lodash/_arrayPush.js b/node_modules/lodash/_arrayPush.js new file mode 100644 index 0000000..7d742b3 --- /dev/null +++ b/node_modules/lodash/_arrayPush.js @@ -0,0 +1,20 @@ +/** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ +function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; +} + +module.exports = arrayPush; diff --git a/node_modules/lodash/_arrayReduce.js b/node_modules/lodash/_arrayReduce.js new file mode 100644 index 0000000..de8b79b --- /dev/null +++ b/node_modules/lodash/_arrayReduce.js @@ -0,0 +1,26 @@ +/** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ +function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; +} + +module.exports = arrayReduce; diff --git a/node_modules/lodash/_arrayReduceRight.js b/node_modules/lodash/_arrayReduceRight.js new file mode 100644 index 0000000..22d8976 --- /dev/null +++ b/node_modules/lodash/_arrayReduceRight.js @@ -0,0 +1,24 @@ +/** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ +function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; +} + +module.exports = arrayReduceRight; diff --git a/node_modules/lodash/_arraySample.js b/node_modules/lodash/_arraySample.js new file mode 100644 index 0000000..fcab010 --- /dev/null +++ b/node_modules/lodash/_arraySample.js @@ -0,0 +1,15 @@ +var baseRandom = require('./_baseRandom'); + +/** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ +function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; +} + +module.exports = arraySample; diff --git a/node_modules/lodash/_arraySampleSize.js b/node_modules/lodash/_arraySampleSize.js new file mode 100644 index 0000000..8c7e364 --- /dev/null +++ b/node_modules/lodash/_arraySampleSize.js @@ -0,0 +1,17 @@ +var baseClamp = require('./_baseClamp'), + copyArray = require('./_copyArray'), + shuffleSelf = require('./_shuffleSelf'); + +/** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ +function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); +} + +module.exports = arraySampleSize; diff --git a/node_modules/lodash/_arrayShuffle.js b/node_modules/lodash/_arrayShuffle.js new file mode 100644 index 0000000..46313a3 --- /dev/null +++ b/node_modules/lodash/_arrayShuffle.js @@ -0,0 +1,15 @@ +var copyArray = require('./_copyArray'), + shuffleSelf = require('./_shuffleSelf'); + +/** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ +function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); +} + +module.exports = arrayShuffle; diff --git a/node_modules/lodash/_arraySome.js b/node_modules/lodash/_arraySome.js new file mode 100644 index 0000000..6fd02fd --- /dev/null +++ b/node_modules/lodash/_arraySome.js @@ -0,0 +1,23 @@ +/** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +module.exports = arraySome; diff --git a/node_modules/lodash/_asciiSize.js b/node_modules/lodash/_asciiSize.js new file mode 100644 index 0000000..11d29c3 --- /dev/null +++ b/node_modules/lodash/_asciiSize.js @@ -0,0 +1,12 @@ +var baseProperty = require('./_baseProperty'); + +/** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ +var asciiSize = baseProperty('length'); + +module.exports = asciiSize; diff --git a/node_modules/lodash/_asciiToArray.js b/node_modules/lodash/_asciiToArray.js new file mode 100644 index 0000000..8e3dd5b --- /dev/null +++ b/node_modules/lodash/_asciiToArray.js @@ -0,0 +1,12 @@ +/** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ +function asciiToArray(string) { + return string.split(''); +} + +module.exports = asciiToArray; diff --git a/node_modules/lodash/_asciiWords.js b/node_modules/lodash/_asciiWords.js new file mode 100644 index 0000000..d765f0f --- /dev/null +++ b/node_modules/lodash/_asciiWords.js @@ -0,0 +1,15 @@ +/** Used to match words composed of alphanumeric characters. */ +var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + +/** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ +function asciiWords(string) { + return string.match(reAsciiWord) || []; +} + +module.exports = asciiWords; diff --git a/node_modules/lodash/_assignMergeValue.js b/node_modules/lodash/_assignMergeValue.js new file mode 100644 index 0000000..cb1185e --- /dev/null +++ b/node_modules/lodash/_assignMergeValue.js @@ -0,0 +1,20 @@ +var baseAssignValue = require('./_baseAssignValue'), + eq = require('./eq'); + +/** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } +} + +module.exports = assignMergeValue; diff --git a/node_modules/lodash/_assignValue.js b/node_modules/lodash/_assignValue.js new file mode 100644 index 0000000..4083957 --- /dev/null +++ b/node_modules/lodash/_assignValue.js @@ -0,0 +1,28 @@ +var baseAssignValue = require('./_baseAssignValue'), + eq = require('./eq'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } +} + +module.exports = assignValue; diff --git a/node_modules/lodash/_assocIndexOf.js b/node_modules/lodash/_assocIndexOf.js new file mode 100644 index 0000000..5b77a2b --- /dev/null +++ b/node_modules/lodash/_assocIndexOf.js @@ -0,0 +1,21 @@ +var eq = require('./eq'); + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; +} + +module.exports = assocIndexOf; diff --git a/node_modules/lodash/_baseAggregator.js b/node_modules/lodash/_baseAggregator.js new file mode 100644 index 0000000..4bc9e91 --- /dev/null +++ b/node_modules/lodash/_baseAggregator.js @@ -0,0 +1,21 @@ +var baseEach = require('./_baseEach'); + +/** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ +function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; +} + +module.exports = baseAggregator; diff --git a/node_modules/lodash/_baseAssign.js b/node_modules/lodash/_baseAssign.js new file mode 100644 index 0000000..e5c4a1a --- /dev/null +++ b/node_modules/lodash/_baseAssign.js @@ -0,0 +1,17 @@ +var copyObject = require('./_copyObject'), + keys = require('./keys'); + +/** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); +} + +module.exports = baseAssign; diff --git a/node_modules/lodash/_baseAssignIn.js b/node_modules/lodash/_baseAssignIn.js new file mode 100644 index 0000000..6624f90 --- /dev/null +++ b/node_modules/lodash/_baseAssignIn.js @@ -0,0 +1,17 @@ +var copyObject = require('./_copyObject'), + keysIn = require('./keysIn'); + +/** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ +function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); +} + +module.exports = baseAssignIn; diff --git a/node_modules/lodash/_baseAssignValue.js b/node_modules/lodash/_baseAssignValue.js new file mode 100644 index 0000000..d6f66ef --- /dev/null +++ b/node_modules/lodash/_baseAssignValue.js @@ -0,0 +1,25 @@ +var defineProperty = require('./_defineProperty'); + +/** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } +} + +module.exports = baseAssignValue; diff --git a/node_modules/lodash/_baseAt.js b/node_modules/lodash/_baseAt.js new file mode 100644 index 0000000..90e4237 --- /dev/null +++ b/node_modules/lodash/_baseAt.js @@ -0,0 +1,23 @@ +var get = require('./get'); + +/** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ +function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; +} + +module.exports = baseAt; diff --git a/node_modules/lodash/_baseClamp.js b/node_modules/lodash/_baseClamp.js new file mode 100644 index 0000000..a1c5692 --- /dev/null +++ b/node_modules/lodash/_baseClamp.js @@ -0,0 +1,22 @@ +/** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ +function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; +} + +module.exports = baseClamp; diff --git a/node_modules/lodash/_baseClone.js b/node_modules/lodash/_baseClone.js new file mode 100644 index 0000000..69f8705 --- /dev/null +++ b/node_modules/lodash/_baseClone.js @@ -0,0 +1,166 @@ +var Stack = require('./_Stack'), + arrayEach = require('./_arrayEach'), + assignValue = require('./_assignValue'), + baseAssign = require('./_baseAssign'), + baseAssignIn = require('./_baseAssignIn'), + cloneBuffer = require('./_cloneBuffer'), + copyArray = require('./_copyArray'), + copySymbols = require('./_copySymbols'), + copySymbolsIn = require('./_copySymbolsIn'), + getAllKeys = require('./_getAllKeys'), + getAllKeysIn = require('./_getAllKeysIn'), + getTag = require('./_getTag'), + initCloneArray = require('./_initCloneArray'), + initCloneByTag = require('./_initCloneByTag'), + initCloneObject = require('./_initCloneObject'), + isArray = require('./isArray'), + isBuffer = require('./isBuffer'), + isMap = require('./isMap'), + isObject = require('./isObject'), + isSet = require('./isSet'), + keys = require('./keys'), + keysIn = require('./keysIn'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values supported by `_.clone`. */ +var cloneableTags = {}; +cloneableTags[argsTag] = cloneableTags[arrayTag] = +cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = +cloneableTags[boolTag] = cloneableTags[dateTag] = +cloneableTags[float32Tag] = cloneableTags[float64Tag] = +cloneableTags[int8Tag] = cloneableTags[int16Tag] = +cloneableTags[int32Tag] = cloneableTags[mapTag] = +cloneableTags[numberTag] = cloneableTags[objectTag] = +cloneableTags[regexpTag] = cloneableTags[setTag] = +cloneableTags[stringTag] = cloneableTags[symbolTag] = +cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = +cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; +cloneableTags[errorTag] = cloneableTags[funcTag] = +cloneableTags[weakMapTag] = false; + +/** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ +function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + } + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; +} + +module.exports = baseClone; diff --git a/node_modules/lodash/_baseConforms.js b/node_modules/lodash/_baseConforms.js new file mode 100644 index 0000000..947e20d --- /dev/null +++ b/node_modules/lodash/_baseConforms.js @@ -0,0 +1,18 @@ +var baseConformsTo = require('./_baseConformsTo'), + keys = require('./keys'); + +/** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ +function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; +} + +module.exports = baseConforms; diff --git a/node_modules/lodash/_baseConformsTo.js b/node_modules/lodash/_baseConformsTo.js new file mode 100644 index 0000000..e449cb8 --- /dev/null +++ b/node_modules/lodash/_baseConformsTo.js @@ -0,0 +1,27 @@ +/** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ +function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; +} + +module.exports = baseConformsTo; diff --git a/node_modules/lodash/_baseCreate.js b/node_modules/lodash/_baseCreate.js new file mode 100644 index 0000000..ffa6a52 --- /dev/null +++ b/node_modules/lodash/_baseCreate.js @@ -0,0 +1,30 @@ +var isObject = require('./isObject'); + +/** Built-in value references. */ +var objectCreate = Object.create; + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; +}()); + +module.exports = baseCreate; diff --git a/node_modules/lodash/_baseDelay.js b/node_modules/lodash/_baseDelay.js new file mode 100644 index 0000000..1486d69 --- /dev/null +++ b/node_modules/lodash/_baseDelay.js @@ -0,0 +1,21 @@ +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ +function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); +} + +module.exports = baseDelay; diff --git a/node_modules/lodash/_baseDifference.js b/node_modules/lodash/_baseDifference.js new file mode 100644 index 0000000..343ac19 --- /dev/null +++ b/node_modules/lodash/_baseDifference.js @@ -0,0 +1,67 @@ +var SetCache = require('./_SetCache'), + arrayIncludes = require('./_arrayIncludes'), + arrayIncludesWith = require('./_arrayIncludesWith'), + arrayMap = require('./_arrayMap'), + baseUnary = require('./_baseUnary'), + cacheHas = require('./_cacheHas'); + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ +function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; +} + +module.exports = baseDifference; diff --git a/node_modules/lodash/_baseEach.js b/node_modules/lodash/_baseEach.js new file mode 100644 index 0000000..512c067 --- /dev/null +++ b/node_modules/lodash/_baseEach.js @@ -0,0 +1,14 @@ +var baseForOwn = require('./_baseForOwn'), + createBaseEach = require('./_createBaseEach'); + +/** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ +var baseEach = createBaseEach(baseForOwn); + +module.exports = baseEach; diff --git a/node_modules/lodash/_baseEachRight.js b/node_modules/lodash/_baseEachRight.js new file mode 100644 index 0000000..0a8feec --- /dev/null +++ b/node_modules/lodash/_baseEachRight.js @@ -0,0 +1,14 @@ +var baseForOwnRight = require('./_baseForOwnRight'), + createBaseEach = require('./_createBaseEach'); + +/** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ +var baseEachRight = createBaseEach(baseForOwnRight, true); + +module.exports = baseEachRight; diff --git a/node_modules/lodash/_baseEvery.js b/node_modules/lodash/_baseEvery.js new file mode 100644 index 0000000..fa52f7b --- /dev/null +++ b/node_modules/lodash/_baseEvery.js @@ -0,0 +1,21 @@ +var baseEach = require('./_baseEach'); + +/** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ +function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; +} + +module.exports = baseEvery; diff --git a/node_modules/lodash/_baseExtremum.js b/node_modules/lodash/_baseExtremum.js new file mode 100644 index 0000000..9d6aa77 --- /dev/null +++ b/node_modules/lodash/_baseExtremum.js @@ -0,0 +1,32 @@ +var isSymbol = require('./isSymbol'); + +/** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ +function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; +} + +module.exports = baseExtremum; diff --git a/node_modules/lodash/_baseFill.js b/node_modules/lodash/_baseFill.js new file mode 100644 index 0000000..46ef9c7 --- /dev/null +++ b/node_modules/lodash/_baseFill.js @@ -0,0 +1,32 @@ +var toInteger = require('./toInteger'), + toLength = require('./toLength'); + +/** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ +function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; +} + +module.exports = baseFill; diff --git a/node_modules/lodash/_baseFilter.js b/node_modules/lodash/_baseFilter.js new file mode 100644 index 0000000..4678477 --- /dev/null +++ b/node_modules/lodash/_baseFilter.js @@ -0,0 +1,21 @@ +var baseEach = require('./_baseEach'); + +/** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ +function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; +} + +module.exports = baseFilter; diff --git a/node_modules/lodash/_baseFindIndex.js b/node_modules/lodash/_baseFindIndex.js new file mode 100644 index 0000000..e3f5d8a --- /dev/null +++ b/node_modules/lodash/_baseFindIndex.js @@ -0,0 +1,24 @@ +/** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; +} + +module.exports = baseFindIndex; diff --git a/node_modules/lodash/_baseFindKey.js b/node_modules/lodash/_baseFindKey.js new file mode 100644 index 0000000..2e430f3 --- /dev/null +++ b/node_modules/lodash/_baseFindKey.js @@ -0,0 +1,23 @@ +/** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ +function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; +} + +module.exports = baseFindKey; diff --git a/node_modules/lodash/_baseFlatten.js b/node_modules/lodash/_baseFlatten.js new file mode 100644 index 0000000..4b1e009 --- /dev/null +++ b/node_modules/lodash/_baseFlatten.js @@ -0,0 +1,38 @@ +var arrayPush = require('./_arrayPush'), + isFlattenable = require('./_isFlattenable'); + +/** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ +function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; +} + +module.exports = baseFlatten; diff --git a/node_modules/lodash/_baseFor.js b/node_modules/lodash/_baseFor.js new file mode 100644 index 0000000..d946590 --- /dev/null +++ b/node_modules/lodash/_baseFor.js @@ -0,0 +1,16 @@ +var createBaseFor = require('./_createBaseFor'); + +/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = createBaseFor(); + +module.exports = baseFor; diff --git a/node_modules/lodash/_baseForOwn.js b/node_modules/lodash/_baseForOwn.js new file mode 100644 index 0000000..503d523 --- /dev/null +++ b/node_modules/lodash/_baseForOwn.js @@ -0,0 +1,16 @@ +var baseFor = require('./_baseFor'), + keys = require('./keys'); + +/** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); +} + +module.exports = baseForOwn; diff --git a/node_modules/lodash/_baseForOwnRight.js b/node_modules/lodash/_baseForOwnRight.js new file mode 100644 index 0000000..a4b10e6 --- /dev/null +++ b/node_modules/lodash/_baseForOwnRight.js @@ -0,0 +1,16 @@ +var baseForRight = require('./_baseForRight'), + keys = require('./keys'); + +/** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); +} + +module.exports = baseForOwnRight; diff --git a/node_modules/lodash/_baseForRight.js b/node_modules/lodash/_baseForRight.js new file mode 100644 index 0000000..32842cd --- /dev/null +++ b/node_modules/lodash/_baseForRight.js @@ -0,0 +1,15 @@ +var createBaseFor = require('./_createBaseFor'); + +/** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseForRight = createBaseFor(true); + +module.exports = baseForRight; diff --git a/node_modules/lodash/_baseFunctions.js b/node_modules/lodash/_baseFunctions.js new file mode 100644 index 0000000..d23bc9b --- /dev/null +++ b/node_modules/lodash/_baseFunctions.js @@ -0,0 +1,19 @@ +var arrayFilter = require('./_arrayFilter'), + isFunction = require('./isFunction'); + +/** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ +function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); +} + +module.exports = baseFunctions; diff --git a/node_modules/lodash/_baseGet.js b/node_modules/lodash/_baseGet.js new file mode 100644 index 0000000..a194913 --- /dev/null +++ b/node_modules/lodash/_baseGet.js @@ -0,0 +1,24 @@ +var castPath = require('./_castPath'), + toKey = require('./_toKey'); + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +module.exports = baseGet; diff --git a/node_modules/lodash/_baseGetAllKeys.js b/node_modules/lodash/_baseGetAllKeys.js new file mode 100644 index 0000000..8ad204e --- /dev/null +++ b/node_modules/lodash/_baseGetAllKeys.js @@ -0,0 +1,20 @@ +var arrayPush = require('./_arrayPush'), + isArray = require('./isArray'); + +/** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ +function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); +} + +module.exports = baseGetAllKeys; diff --git a/node_modules/lodash/_baseGetTag.js b/node_modules/lodash/_baseGetTag.js new file mode 100644 index 0000000..b927ccc --- /dev/null +++ b/node_modules/lodash/_baseGetTag.js @@ -0,0 +1,28 @@ +var Symbol = require('./_Symbol'), + getRawTag = require('./_getRawTag'), + objectToString = require('./_objectToString'); + +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var symToStringTag = Symbol ? Symbol.toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); +} + +module.exports = baseGetTag; diff --git a/node_modules/lodash/_baseGt.js b/node_modules/lodash/_baseGt.js new file mode 100644 index 0000000..502d273 --- /dev/null +++ b/node_modules/lodash/_baseGt.js @@ -0,0 +1,14 @@ +/** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ +function baseGt(value, other) { + return value > other; +} + +module.exports = baseGt; diff --git a/node_modules/lodash/_baseHas.js b/node_modules/lodash/_baseHas.js new file mode 100644 index 0000000..1b73032 --- /dev/null +++ b/node_modules/lodash/_baseHas.js @@ -0,0 +1,19 @@ +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); +} + +module.exports = baseHas; diff --git a/node_modules/lodash/_baseHasIn.js b/node_modules/lodash/_baseHasIn.js new file mode 100644 index 0000000..2e0d042 --- /dev/null +++ b/node_modules/lodash/_baseHasIn.js @@ -0,0 +1,13 @@ +/** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHasIn(object, key) { + return object != null && key in Object(object); +} + +module.exports = baseHasIn; diff --git a/node_modules/lodash/_baseInRange.js b/node_modules/lodash/_baseInRange.js new file mode 100644 index 0000000..ec95666 --- /dev/null +++ b/node_modules/lodash/_baseInRange.js @@ -0,0 +1,18 @@ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ +function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); +} + +module.exports = baseInRange; diff --git a/node_modules/lodash/_baseIndexOf.js b/node_modules/lodash/_baseIndexOf.js new file mode 100644 index 0000000..167e706 --- /dev/null +++ b/node_modules/lodash/_baseIndexOf.js @@ -0,0 +1,20 @@ +var baseFindIndex = require('./_baseFindIndex'), + baseIsNaN = require('./_baseIsNaN'), + strictIndexOf = require('./_strictIndexOf'); + +/** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); +} + +module.exports = baseIndexOf; diff --git a/node_modules/lodash/_baseIndexOfWith.js b/node_modules/lodash/_baseIndexOfWith.js new file mode 100644 index 0000000..f815fe0 --- /dev/null +++ b/node_modules/lodash/_baseIndexOfWith.js @@ -0,0 +1,23 @@ +/** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; +} + +module.exports = baseIndexOfWith; diff --git a/node_modules/lodash/_baseIntersection.js b/node_modules/lodash/_baseIntersection.js new file mode 100644 index 0000000..c1d250c --- /dev/null +++ b/node_modules/lodash/_baseIntersection.js @@ -0,0 +1,74 @@ +var SetCache = require('./_SetCache'), + arrayIncludes = require('./_arrayIncludes'), + arrayIncludesWith = require('./_arrayIncludesWith'), + arrayMap = require('./_arrayMap'), + baseUnary = require('./_baseUnary'), + cacheHas = require('./_cacheHas'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ +function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; +} + +module.exports = baseIntersection; diff --git a/node_modules/lodash/_baseInverter.js b/node_modules/lodash/_baseInverter.js new file mode 100644 index 0000000..fbc337f --- /dev/null +++ b/node_modules/lodash/_baseInverter.js @@ -0,0 +1,21 @@ +var baseForOwn = require('./_baseForOwn'); + +/** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ +function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; +} + +module.exports = baseInverter; diff --git a/node_modules/lodash/_baseInvoke.js b/node_modules/lodash/_baseInvoke.js new file mode 100644 index 0000000..49bcf3c --- /dev/null +++ b/node_modules/lodash/_baseInvoke.js @@ -0,0 +1,24 @@ +var apply = require('./_apply'), + castPath = require('./_castPath'), + last = require('./last'), + parent = require('./_parent'), + toKey = require('./_toKey'); + +/** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ +function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); +} + +module.exports = baseInvoke; diff --git a/node_modules/lodash/_baseIsArguments.js b/node_modules/lodash/_baseIsArguments.js new file mode 100644 index 0000000..b3562cc --- /dev/null +++ b/node_modules/lodash/_baseIsArguments.js @@ -0,0 +1,18 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]'; + +/** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ +function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; +} + +module.exports = baseIsArguments; diff --git a/node_modules/lodash/_baseIsArrayBuffer.js b/node_modules/lodash/_baseIsArrayBuffer.js new file mode 100644 index 0000000..a2c4f30 --- /dev/null +++ b/node_modules/lodash/_baseIsArrayBuffer.js @@ -0,0 +1,17 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +var arrayBufferTag = '[object ArrayBuffer]'; + +/** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ +function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; +} + +module.exports = baseIsArrayBuffer; diff --git a/node_modules/lodash/_baseIsDate.js b/node_modules/lodash/_baseIsDate.js new file mode 100644 index 0000000..ba67c78 --- /dev/null +++ b/node_modules/lodash/_baseIsDate.js @@ -0,0 +1,18 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var dateTag = '[object Date]'; + +/** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ +function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; +} + +module.exports = baseIsDate; diff --git a/node_modules/lodash/_baseIsEqual.js b/node_modules/lodash/_baseIsEqual.js new file mode 100644 index 0000000..00a68a4 --- /dev/null +++ b/node_modules/lodash/_baseIsEqual.js @@ -0,0 +1,28 @@ +var baseIsEqualDeep = require('./_baseIsEqualDeep'), + isObjectLike = require('./isObjectLike'); + +/** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); +} + +module.exports = baseIsEqual; diff --git a/node_modules/lodash/_baseIsEqualDeep.js b/node_modules/lodash/_baseIsEqualDeep.js new file mode 100644 index 0000000..e3cfd6a --- /dev/null +++ b/node_modules/lodash/_baseIsEqualDeep.js @@ -0,0 +1,83 @@ +var Stack = require('./_Stack'), + equalArrays = require('./_equalArrays'), + equalByTag = require('./_equalByTag'), + equalObjects = require('./_equalObjects'), + getTag = require('./_getTag'), + isArray = require('./isArray'), + isBuffer = require('./isBuffer'), + isTypedArray = require('./isTypedArray'); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); +} + +module.exports = baseIsEqualDeep; diff --git a/node_modules/lodash/_baseIsMap.js b/node_modules/lodash/_baseIsMap.js new file mode 100644 index 0000000..02a4021 --- /dev/null +++ b/node_modules/lodash/_baseIsMap.js @@ -0,0 +1,18 @@ +var getTag = require('./_getTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var mapTag = '[object Map]'; + +/** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ +function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; +} + +module.exports = baseIsMap; diff --git a/node_modules/lodash/_baseIsMatch.js b/node_modules/lodash/_baseIsMatch.js new file mode 100644 index 0000000..72494be --- /dev/null +++ b/node_modules/lodash/_baseIsMatch.js @@ -0,0 +1,62 @@ +var Stack = require('./_Stack'), + baseIsEqual = require('./_baseIsEqual'); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; +} + +module.exports = baseIsMatch; diff --git a/node_modules/lodash/_baseIsNaN.js b/node_modules/lodash/_baseIsNaN.js new file mode 100644 index 0000000..316f1eb --- /dev/null +++ b/node_modules/lodash/_baseIsNaN.js @@ -0,0 +1,12 @@ +/** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ +function baseIsNaN(value) { + return value !== value; +} + +module.exports = baseIsNaN; diff --git a/node_modules/lodash/_baseIsNative.js b/node_modules/lodash/_baseIsNative.js new file mode 100644 index 0000000..8702330 --- /dev/null +++ b/node_modules/lodash/_baseIsNative.js @@ -0,0 +1,47 @@ +var isFunction = require('./isFunction'), + isMasked = require('./_isMasked'), + isObject = require('./isObject'), + toSource = require('./_toSource'); + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); +} + +module.exports = baseIsNative; diff --git a/node_modules/lodash/_baseIsRegExp.js b/node_modules/lodash/_baseIsRegExp.js new file mode 100644 index 0000000..6cd7c1a --- /dev/null +++ b/node_modules/lodash/_baseIsRegExp.js @@ -0,0 +1,18 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var regexpTag = '[object RegExp]'; + +/** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ +function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; +} + +module.exports = baseIsRegExp; diff --git a/node_modules/lodash/_baseIsSet.js b/node_modules/lodash/_baseIsSet.js new file mode 100644 index 0000000..6dee367 --- /dev/null +++ b/node_modules/lodash/_baseIsSet.js @@ -0,0 +1,18 @@ +var getTag = require('./_getTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var setTag = '[object Set]'; + +/** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ +function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; +} + +module.exports = baseIsSet; diff --git a/node_modules/lodash/_baseIsTypedArray.js b/node_modules/lodash/_baseIsTypedArray.js new file mode 100644 index 0000000..1edb32f --- /dev/null +++ b/node_modules/lodash/_baseIsTypedArray.js @@ -0,0 +1,60 @@ +var baseGetTag = require('./_baseGetTag'), + isLength = require('./isLength'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; +} + +module.exports = baseIsTypedArray; diff --git a/node_modules/lodash/_baseIteratee.js b/node_modules/lodash/_baseIteratee.js new file mode 100644 index 0000000..995c257 --- /dev/null +++ b/node_modules/lodash/_baseIteratee.js @@ -0,0 +1,31 @@ +var baseMatches = require('./_baseMatches'), + baseMatchesProperty = require('./_baseMatchesProperty'), + identity = require('./identity'), + isArray = require('./isArray'), + property = require('./property'); + +/** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ +function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); +} + +module.exports = baseIteratee; diff --git a/node_modules/lodash/_baseKeys.js b/node_modules/lodash/_baseKeys.js new file mode 100644 index 0000000..45e9e6f --- /dev/null +++ b/node_modules/lodash/_baseKeys.js @@ -0,0 +1,30 @@ +var isPrototype = require('./_isPrototype'), + nativeKeys = require('./_nativeKeys'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} + +module.exports = baseKeys; diff --git a/node_modules/lodash/_baseKeysIn.js b/node_modules/lodash/_baseKeysIn.js new file mode 100644 index 0000000..ea8a0a1 --- /dev/null +++ b/node_modules/lodash/_baseKeysIn.js @@ -0,0 +1,33 @@ +var isObject = require('./isObject'), + isPrototype = require('./_isPrototype'), + nativeKeysIn = require('./_nativeKeysIn'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = baseKeysIn; diff --git a/node_modules/lodash/_baseLodash.js b/node_modules/lodash/_baseLodash.js new file mode 100644 index 0000000..f76c790 --- /dev/null +++ b/node_modules/lodash/_baseLodash.js @@ -0,0 +1,10 @@ +/** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ +function baseLodash() { + // No operation performed. +} + +module.exports = baseLodash; diff --git a/node_modules/lodash/_baseLt.js b/node_modules/lodash/_baseLt.js new file mode 100644 index 0000000..8674d29 --- /dev/null +++ b/node_modules/lodash/_baseLt.js @@ -0,0 +1,14 @@ +/** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ +function baseLt(value, other) { + return value < other; +} + +module.exports = baseLt; diff --git a/node_modules/lodash/_baseMap.js b/node_modules/lodash/_baseMap.js new file mode 100644 index 0000000..0bf5cea --- /dev/null +++ b/node_modules/lodash/_baseMap.js @@ -0,0 +1,22 @@ +var baseEach = require('./_baseEach'), + isArrayLike = require('./isArrayLike'); + +/** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; +} + +module.exports = baseMap; diff --git a/node_modules/lodash/_baseMatches.js b/node_modules/lodash/_baseMatches.js new file mode 100644 index 0000000..e56582a --- /dev/null +++ b/node_modules/lodash/_baseMatches.js @@ -0,0 +1,22 @@ +var baseIsMatch = require('./_baseIsMatch'), + getMatchData = require('./_getMatchData'), + matchesStrictComparable = require('./_matchesStrictComparable'); + +/** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; +} + +module.exports = baseMatches; diff --git a/node_modules/lodash/_baseMatchesProperty.js b/node_modules/lodash/_baseMatchesProperty.js new file mode 100644 index 0000000..24afd89 --- /dev/null +++ b/node_modules/lodash/_baseMatchesProperty.js @@ -0,0 +1,33 @@ +var baseIsEqual = require('./_baseIsEqual'), + get = require('./get'), + hasIn = require('./hasIn'), + isKey = require('./_isKey'), + isStrictComparable = require('./_isStrictComparable'), + matchesStrictComparable = require('./_matchesStrictComparable'), + toKey = require('./_toKey'); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; +} + +module.exports = baseMatchesProperty; diff --git a/node_modules/lodash/_baseMean.js b/node_modules/lodash/_baseMean.js new file mode 100644 index 0000000..fa9e00a --- /dev/null +++ b/node_modules/lodash/_baseMean.js @@ -0,0 +1,20 @@ +var baseSum = require('./_baseSum'); + +/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; + +/** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ +function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; +} + +module.exports = baseMean; diff --git a/node_modules/lodash/_baseMerge.js b/node_modules/lodash/_baseMerge.js new file mode 100644 index 0000000..c98b5eb --- /dev/null +++ b/node_modules/lodash/_baseMerge.js @@ -0,0 +1,42 @@ +var Stack = require('./_Stack'), + assignMergeValue = require('./_assignMergeValue'), + baseFor = require('./_baseFor'), + baseMergeDeep = require('./_baseMergeDeep'), + isObject = require('./isObject'), + keysIn = require('./keysIn'), + safeGet = require('./_safeGet'); + +/** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); +} + +module.exports = baseMerge; diff --git a/node_modules/lodash/_baseMergeDeep.js b/node_modules/lodash/_baseMergeDeep.js new file mode 100644 index 0000000..4679e8d --- /dev/null +++ b/node_modules/lodash/_baseMergeDeep.js @@ -0,0 +1,94 @@ +var assignMergeValue = require('./_assignMergeValue'), + cloneBuffer = require('./_cloneBuffer'), + cloneTypedArray = require('./_cloneTypedArray'), + copyArray = require('./_copyArray'), + initCloneObject = require('./_initCloneObject'), + isArguments = require('./isArguments'), + isArray = require('./isArray'), + isArrayLikeObject = require('./isArrayLikeObject'), + isBuffer = require('./isBuffer'), + isFunction = require('./isFunction'), + isObject = require('./isObject'), + isPlainObject = require('./isPlainObject'), + isTypedArray = require('./isTypedArray'), + safeGet = require('./_safeGet'), + toPlainObject = require('./toPlainObject'); + +/** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ +function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); +} + +module.exports = baseMergeDeep; diff --git a/node_modules/lodash/_baseNth.js b/node_modules/lodash/_baseNth.js new file mode 100644 index 0000000..0403c2a --- /dev/null +++ b/node_modules/lodash/_baseNth.js @@ -0,0 +1,20 @@ +var isIndex = require('./_isIndex'); + +/** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ +function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; +} + +module.exports = baseNth; diff --git a/node_modules/lodash/_baseOrderBy.js b/node_modules/lodash/_baseOrderBy.js new file mode 100644 index 0000000..775a017 --- /dev/null +++ b/node_modules/lodash/_baseOrderBy.js @@ -0,0 +1,49 @@ +var arrayMap = require('./_arrayMap'), + baseGet = require('./_baseGet'), + baseIteratee = require('./_baseIteratee'), + baseMap = require('./_baseMap'), + baseSortBy = require('./_baseSortBy'), + baseUnary = require('./_baseUnary'), + compareMultiple = require('./_compareMultiple'), + identity = require('./identity'), + isArray = require('./isArray'); + +/** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ +function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee) { + if (isArray(iteratee)) { + return function(value) { + return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); + } + } + return iteratee; + }); + } else { + iteratees = [identity]; + } + + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(baseIteratee)); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); +} + +module.exports = baseOrderBy; diff --git a/node_modules/lodash/_basePick.js b/node_modules/lodash/_basePick.js new file mode 100644 index 0000000..09b458a --- /dev/null +++ b/node_modules/lodash/_basePick.js @@ -0,0 +1,19 @@ +var basePickBy = require('./_basePickBy'), + hasIn = require('./hasIn'); + +/** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ +function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); +} + +module.exports = basePick; diff --git a/node_modules/lodash/_basePickBy.js b/node_modules/lodash/_basePickBy.js new file mode 100644 index 0000000..85be68c --- /dev/null +++ b/node_modules/lodash/_basePickBy.js @@ -0,0 +1,30 @@ +var baseGet = require('./_baseGet'), + baseSet = require('./_baseSet'), + castPath = require('./_castPath'); + +/** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ +function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; +} + +module.exports = basePickBy; diff --git a/node_modules/lodash/_baseProperty.js b/node_modules/lodash/_baseProperty.js new file mode 100644 index 0000000..496281e --- /dev/null +++ b/node_modules/lodash/_baseProperty.js @@ -0,0 +1,14 @@ +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +module.exports = baseProperty; diff --git a/node_modules/lodash/_basePropertyDeep.js b/node_modules/lodash/_basePropertyDeep.js new file mode 100644 index 0000000..1e5aae5 --- /dev/null +++ b/node_modules/lodash/_basePropertyDeep.js @@ -0,0 +1,16 @@ +var baseGet = require('./_baseGet'); + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; +} + +module.exports = basePropertyDeep; diff --git a/node_modules/lodash/_basePropertyOf.js b/node_modules/lodash/_basePropertyOf.js new file mode 100644 index 0000000..4617399 --- /dev/null +++ b/node_modules/lodash/_basePropertyOf.js @@ -0,0 +1,14 @@ +/** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; +} + +module.exports = basePropertyOf; diff --git a/node_modules/lodash/_basePullAll.js b/node_modules/lodash/_basePullAll.js new file mode 100644 index 0000000..305720e --- /dev/null +++ b/node_modules/lodash/_basePullAll.js @@ -0,0 +1,51 @@ +var arrayMap = require('./_arrayMap'), + baseIndexOf = require('./_baseIndexOf'), + baseIndexOfWith = require('./_baseIndexOfWith'), + baseUnary = require('./_baseUnary'), + copyArray = require('./_copyArray'); + +/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/** Built-in value references. */ +var splice = arrayProto.splice; + +/** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ +function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; +} + +module.exports = basePullAll; diff --git a/node_modules/lodash/_basePullAt.js b/node_modules/lodash/_basePullAt.js new file mode 100644 index 0000000..c3e9e71 --- /dev/null +++ b/node_modules/lodash/_basePullAt.js @@ -0,0 +1,37 @@ +var baseUnset = require('./_baseUnset'), + isIndex = require('./_isIndex'); + +/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/** Built-in value references. */ +var splice = arrayProto.splice; + +/** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ +function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; +} + +module.exports = basePullAt; diff --git a/node_modules/lodash/_baseRandom.js b/node_modules/lodash/_baseRandom.js new file mode 100644 index 0000000..94f76a7 --- /dev/null +++ b/node_modules/lodash/_baseRandom.js @@ -0,0 +1,18 @@ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeFloor = Math.floor, + nativeRandom = Math.random; + +/** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ +function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); +} + +module.exports = baseRandom; diff --git a/node_modules/lodash/_baseRange.js b/node_modules/lodash/_baseRange.js new file mode 100644 index 0000000..0fb8e41 --- /dev/null +++ b/node_modules/lodash/_baseRange.js @@ -0,0 +1,28 @@ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeCeil = Math.ceil, + nativeMax = Math.max; + +/** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ +function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; +} + +module.exports = baseRange; diff --git a/node_modules/lodash/_baseReduce.js b/node_modules/lodash/_baseReduce.js new file mode 100644 index 0000000..5a1f8b5 --- /dev/null +++ b/node_modules/lodash/_baseReduce.js @@ -0,0 +1,23 @@ +/** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ +function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; +} + +module.exports = baseReduce; diff --git a/node_modules/lodash/_baseRepeat.js b/node_modules/lodash/_baseRepeat.js new file mode 100644 index 0000000..ee44c31 --- /dev/null +++ b/node_modules/lodash/_baseRepeat.js @@ -0,0 +1,35 @@ +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeFloor = Math.floor; + +/** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ +function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; +} + +module.exports = baseRepeat; diff --git a/node_modules/lodash/_baseRest.js b/node_modules/lodash/_baseRest.js new file mode 100644 index 0000000..d0dc4bd --- /dev/null +++ b/node_modules/lodash/_baseRest.js @@ -0,0 +1,17 @@ +var identity = require('./identity'), + overRest = require('./_overRest'), + setToString = require('./_setToString'); + +/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); +} + +module.exports = baseRest; diff --git a/node_modules/lodash/_baseSample.js b/node_modules/lodash/_baseSample.js new file mode 100644 index 0000000..58582b9 --- /dev/null +++ b/node_modules/lodash/_baseSample.js @@ -0,0 +1,15 @@ +var arraySample = require('./_arraySample'), + values = require('./values'); + +/** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ +function baseSample(collection) { + return arraySample(values(collection)); +} + +module.exports = baseSample; diff --git a/node_modules/lodash/_baseSampleSize.js b/node_modules/lodash/_baseSampleSize.js new file mode 100644 index 0000000..5c90ec5 --- /dev/null +++ b/node_modules/lodash/_baseSampleSize.js @@ -0,0 +1,18 @@ +var baseClamp = require('./_baseClamp'), + shuffleSelf = require('./_shuffleSelf'), + values = require('./values'); + +/** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ +function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); +} + +module.exports = baseSampleSize; diff --git a/node_modules/lodash/_baseSet.js b/node_modules/lodash/_baseSet.js new file mode 100644 index 0000000..99f4fbf --- /dev/null +++ b/node_modules/lodash/_baseSet.js @@ -0,0 +1,51 @@ +var assignValue = require('./_assignValue'), + castPath = require('./_castPath'), + isIndex = require('./_isIndex'), + isObject = require('./isObject'), + toKey = require('./_toKey'); + +/** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ +function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; +} + +module.exports = baseSet; diff --git a/node_modules/lodash/_baseSetData.js b/node_modules/lodash/_baseSetData.js new file mode 100644 index 0000000..c409947 --- /dev/null +++ b/node_modules/lodash/_baseSetData.js @@ -0,0 +1,17 @@ +var identity = require('./identity'), + metaMap = require('./_metaMap'); + +/** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ +var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; +}; + +module.exports = baseSetData; diff --git a/node_modules/lodash/_baseSetToString.js b/node_modules/lodash/_baseSetToString.js new file mode 100644 index 0000000..89eaca3 --- /dev/null +++ b/node_modules/lodash/_baseSetToString.js @@ -0,0 +1,22 @@ +var constant = require('./constant'), + defineProperty = require('./_defineProperty'), + identity = require('./identity'); + +/** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); +}; + +module.exports = baseSetToString; diff --git a/node_modules/lodash/_baseShuffle.js b/node_modules/lodash/_baseShuffle.js new file mode 100644 index 0000000..023077a --- /dev/null +++ b/node_modules/lodash/_baseShuffle.js @@ -0,0 +1,15 @@ +var shuffleSelf = require('./_shuffleSelf'), + values = require('./values'); + +/** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ +function baseShuffle(collection) { + return shuffleSelf(values(collection)); +} + +module.exports = baseShuffle; diff --git a/node_modules/lodash/_baseSlice.js b/node_modules/lodash/_baseSlice.js new file mode 100644 index 0000000..786f6c9 --- /dev/null +++ b/node_modules/lodash/_baseSlice.js @@ -0,0 +1,31 @@ +/** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; +} + +module.exports = baseSlice; diff --git a/node_modules/lodash/_baseSome.js b/node_modules/lodash/_baseSome.js new file mode 100644 index 0000000..58f3f44 --- /dev/null +++ b/node_modules/lodash/_baseSome.js @@ -0,0 +1,22 @@ +var baseEach = require('./_baseEach'); + +/** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; +} + +module.exports = baseSome; diff --git a/node_modules/lodash/_baseSortBy.js b/node_modules/lodash/_baseSortBy.js new file mode 100644 index 0000000..a25c92e --- /dev/null +++ b/node_modules/lodash/_baseSortBy.js @@ -0,0 +1,21 @@ +/** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ +function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; +} + +module.exports = baseSortBy; diff --git a/node_modules/lodash/_baseSortedIndex.js b/node_modules/lodash/_baseSortedIndex.js new file mode 100644 index 0000000..638c366 --- /dev/null +++ b/node_modules/lodash/_baseSortedIndex.js @@ -0,0 +1,42 @@ +var baseSortedIndexBy = require('./_baseSortedIndexBy'), + identity = require('./identity'), + isSymbol = require('./isSymbol'); + +/** Used as references for the maximum length and index of an array. */ +var MAX_ARRAY_LENGTH = 4294967295, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + +/** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ +function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); +} + +module.exports = baseSortedIndex; diff --git a/node_modules/lodash/_baseSortedIndexBy.js b/node_modules/lodash/_baseSortedIndexBy.js new file mode 100644 index 0000000..c247b37 --- /dev/null +++ b/node_modules/lodash/_baseSortedIndexBy.js @@ -0,0 +1,67 @@ +var isSymbol = require('./isSymbol'); + +/** Used as references for the maximum length and index of an array. */ +var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeFloor = Math.floor, + nativeMin = Math.min; + +/** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ +function baseSortedIndexBy(array, value, iteratee, retHighest) { + var low = 0, + high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + + value = iteratee(value); + var valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); +} + +module.exports = baseSortedIndexBy; diff --git a/node_modules/lodash/_baseSortedUniq.js b/node_modules/lodash/_baseSortedUniq.js new file mode 100644 index 0000000..802159a --- /dev/null +++ b/node_modules/lodash/_baseSortedUniq.js @@ -0,0 +1,30 @@ +var eq = require('./eq'); + +/** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ +function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; +} + +module.exports = baseSortedUniq; diff --git a/node_modules/lodash/_baseSum.js b/node_modules/lodash/_baseSum.js new file mode 100644 index 0000000..a9e84c1 --- /dev/null +++ b/node_modules/lodash/_baseSum.js @@ -0,0 +1,24 @@ +/** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ +function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; +} + +module.exports = baseSum; diff --git a/node_modules/lodash/_baseTimes.js b/node_modules/lodash/_baseTimes.js new file mode 100644 index 0000000..0603fc3 --- /dev/null +++ b/node_modules/lodash/_baseTimes.js @@ -0,0 +1,20 @@ +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +module.exports = baseTimes; diff --git a/node_modules/lodash/_baseToNumber.js b/node_modules/lodash/_baseToNumber.js new file mode 100644 index 0000000..04859f3 --- /dev/null +++ b/node_modules/lodash/_baseToNumber.js @@ -0,0 +1,24 @@ +var isSymbol = require('./isSymbol'); + +/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; + +/** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ +function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; +} + +module.exports = baseToNumber; diff --git a/node_modules/lodash/_baseToPairs.js b/node_modules/lodash/_baseToPairs.js new file mode 100644 index 0000000..bff1991 --- /dev/null +++ b/node_modules/lodash/_baseToPairs.js @@ -0,0 +1,18 @@ +var arrayMap = require('./_arrayMap'); + +/** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ +function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); +} + +module.exports = baseToPairs; diff --git a/node_modules/lodash/_baseToString.js b/node_modules/lodash/_baseToString.js new file mode 100644 index 0000000..ada6ad2 --- /dev/null +++ b/node_modules/lodash/_baseToString.js @@ -0,0 +1,37 @@ +var Symbol = require('./_Symbol'), + arrayMap = require('./_arrayMap'), + isArray = require('./isArray'), + isSymbol = require('./isSymbol'); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +module.exports = baseToString; diff --git a/node_modules/lodash/_baseTrim.js b/node_modules/lodash/_baseTrim.js new file mode 100644 index 0000000..3e2797d --- /dev/null +++ b/node_modules/lodash/_baseTrim.js @@ -0,0 +1,19 @@ +var trimmedEndIndex = require('./_trimmedEndIndex'); + +/** Used to match leading whitespace. */ +var reTrimStart = /^\s+/; + +/** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ +function baseTrim(string) { + return string + ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; +} + +module.exports = baseTrim; diff --git a/node_modules/lodash/_baseUnary.js b/node_modules/lodash/_baseUnary.js new file mode 100644 index 0000000..98639e9 --- /dev/null +++ b/node_modules/lodash/_baseUnary.js @@ -0,0 +1,14 @@ +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +module.exports = baseUnary; diff --git a/node_modules/lodash/_baseUniq.js b/node_modules/lodash/_baseUniq.js new file mode 100644 index 0000000..aea459d --- /dev/null +++ b/node_modules/lodash/_baseUniq.js @@ -0,0 +1,72 @@ +var SetCache = require('./_SetCache'), + arrayIncludes = require('./_arrayIncludes'), + arrayIncludesWith = require('./_arrayIncludesWith'), + cacheHas = require('./_cacheHas'), + createSet = require('./_createSet'), + setToArray = require('./_setToArray'); + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ +function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; +} + +module.exports = baseUniq; diff --git a/node_modules/lodash/_baseUnset.js b/node_modules/lodash/_baseUnset.js new file mode 100644 index 0000000..eefc6e3 --- /dev/null +++ b/node_modules/lodash/_baseUnset.js @@ -0,0 +1,20 @@ +var castPath = require('./_castPath'), + last = require('./last'), + parent = require('./_parent'), + toKey = require('./_toKey'); + +/** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ +function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; +} + +module.exports = baseUnset; diff --git a/node_modules/lodash/_baseUpdate.js b/node_modules/lodash/_baseUpdate.js new file mode 100644 index 0000000..92a6237 --- /dev/null +++ b/node_modules/lodash/_baseUpdate.js @@ -0,0 +1,18 @@ +var baseGet = require('./_baseGet'), + baseSet = require('./_baseSet'); + +/** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ +function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); +} + +module.exports = baseUpdate; diff --git a/node_modules/lodash/_baseValues.js b/node_modules/lodash/_baseValues.js new file mode 100644 index 0000000..b95faad --- /dev/null +++ b/node_modules/lodash/_baseValues.js @@ -0,0 +1,19 @@ +var arrayMap = require('./_arrayMap'); + +/** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ +function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); +} + +module.exports = baseValues; diff --git a/node_modules/lodash/_baseWhile.js b/node_modules/lodash/_baseWhile.js new file mode 100644 index 0000000..07eac61 --- /dev/null +++ b/node_modules/lodash/_baseWhile.js @@ -0,0 +1,26 @@ +var baseSlice = require('./_baseSlice'); + +/** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ +function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); +} + +module.exports = baseWhile; diff --git a/node_modules/lodash/_baseWrapperValue.js b/node_modules/lodash/_baseWrapperValue.js new file mode 100644 index 0000000..443e0df --- /dev/null +++ b/node_modules/lodash/_baseWrapperValue.js @@ -0,0 +1,25 @@ +var LazyWrapper = require('./_LazyWrapper'), + arrayPush = require('./_arrayPush'), + arrayReduce = require('./_arrayReduce'); + +/** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ +function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); +} + +module.exports = baseWrapperValue; diff --git a/node_modules/lodash/_baseXor.js b/node_modules/lodash/_baseXor.js new file mode 100644 index 0000000..8e69338 --- /dev/null +++ b/node_modules/lodash/_baseXor.js @@ -0,0 +1,36 @@ +var baseDifference = require('./_baseDifference'), + baseFlatten = require('./_baseFlatten'), + baseUniq = require('./_baseUniq'); + +/** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ +function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); +} + +module.exports = baseXor; diff --git a/node_modules/lodash/_baseZipObject.js b/node_modules/lodash/_baseZipObject.js new file mode 100644 index 0000000..401f85b --- /dev/null +++ b/node_modules/lodash/_baseZipObject.js @@ -0,0 +1,23 @@ +/** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ +function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; +} + +module.exports = baseZipObject; diff --git a/node_modules/lodash/_cacheHas.js b/node_modules/lodash/_cacheHas.js new file mode 100644 index 0000000..2dec892 --- /dev/null +++ b/node_modules/lodash/_cacheHas.js @@ -0,0 +1,13 @@ +/** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function cacheHas(cache, key) { + return cache.has(key); +} + +module.exports = cacheHas; diff --git a/node_modules/lodash/_castArrayLikeObject.js b/node_modules/lodash/_castArrayLikeObject.js new file mode 100644 index 0000000..92c75fa --- /dev/null +++ b/node_modules/lodash/_castArrayLikeObject.js @@ -0,0 +1,14 @@ +var isArrayLikeObject = require('./isArrayLikeObject'); + +/** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ +function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; +} + +module.exports = castArrayLikeObject; diff --git a/node_modules/lodash/_castFunction.js b/node_modules/lodash/_castFunction.js new file mode 100644 index 0000000..98c91ae --- /dev/null +++ b/node_modules/lodash/_castFunction.js @@ -0,0 +1,14 @@ +var identity = require('./identity'); + +/** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ +function castFunction(value) { + return typeof value == 'function' ? value : identity; +} + +module.exports = castFunction; diff --git a/node_modules/lodash/_castPath.js b/node_modules/lodash/_castPath.js new file mode 100644 index 0000000..017e4c1 --- /dev/null +++ b/node_modules/lodash/_castPath.js @@ -0,0 +1,21 @@ +var isArray = require('./isArray'), + isKey = require('./_isKey'), + stringToPath = require('./_stringToPath'), + toString = require('./toString'); + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); +} + +module.exports = castPath; diff --git a/node_modules/lodash/_castRest.js b/node_modules/lodash/_castRest.js new file mode 100644 index 0000000..213c66f --- /dev/null +++ b/node_modules/lodash/_castRest.js @@ -0,0 +1,14 @@ +var baseRest = require('./_baseRest'); + +/** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ +var castRest = baseRest; + +module.exports = castRest; diff --git a/node_modules/lodash/_castSlice.js b/node_modules/lodash/_castSlice.js new file mode 100644 index 0000000..071faeb --- /dev/null +++ b/node_modules/lodash/_castSlice.js @@ -0,0 +1,18 @@ +var baseSlice = require('./_baseSlice'); + +/** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ +function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); +} + +module.exports = castSlice; diff --git a/node_modules/lodash/_charsEndIndex.js b/node_modules/lodash/_charsEndIndex.js new file mode 100644 index 0000000..07908ff --- /dev/null +++ b/node_modules/lodash/_charsEndIndex.js @@ -0,0 +1,19 @@ +var baseIndexOf = require('./_baseIndexOf'); + +/** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ +function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; +} + +module.exports = charsEndIndex; diff --git a/node_modules/lodash/_charsStartIndex.js b/node_modules/lodash/_charsStartIndex.js new file mode 100644 index 0000000..b17afd2 --- /dev/null +++ b/node_modules/lodash/_charsStartIndex.js @@ -0,0 +1,20 @@ +var baseIndexOf = require('./_baseIndexOf'); + +/** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ +function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; +} + +module.exports = charsStartIndex; diff --git a/node_modules/lodash/_cloneArrayBuffer.js b/node_modules/lodash/_cloneArrayBuffer.js new file mode 100644 index 0000000..c3d8f6e --- /dev/null +++ b/node_modules/lodash/_cloneArrayBuffer.js @@ -0,0 +1,16 @@ +var Uint8Array = require('./_Uint8Array'); + +/** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ +function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; +} + +module.exports = cloneArrayBuffer; diff --git a/node_modules/lodash/_cloneBuffer.js b/node_modules/lodash/_cloneBuffer.js new file mode 100644 index 0000000..27c4810 --- /dev/null +++ b/node_modules/lodash/_cloneBuffer.js @@ -0,0 +1,35 @@ +var root = require('./_root'); + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Built-in value references. */ +var Buffer = moduleExports ? root.Buffer : undefined, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined; + +/** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ +function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; +} + +module.exports = cloneBuffer; diff --git a/node_modules/lodash/_cloneDataView.js b/node_modules/lodash/_cloneDataView.js new file mode 100644 index 0000000..9c9b7b0 --- /dev/null +++ b/node_modules/lodash/_cloneDataView.js @@ -0,0 +1,16 @@ +var cloneArrayBuffer = require('./_cloneArrayBuffer'); + +/** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ +function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); +} + +module.exports = cloneDataView; diff --git a/node_modules/lodash/_cloneRegExp.js b/node_modules/lodash/_cloneRegExp.js new file mode 100644 index 0000000..64a30df --- /dev/null +++ b/node_modules/lodash/_cloneRegExp.js @@ -0,0 +1,17 @@ +/** Used to match `RegExp` flags from their coerced string values. */ +var reFlags = /\w*$/; + +/** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ +function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; +} + +module.exports = cloneRegExp; diff --git a/node_modules/lodash/_cloneSymbol.js b/node_modules/lodash/_cloneSymbol.js new file mode 100644 index 0000000..bede39f --- /dev/null +++ b/node_modules/lodash/_cloneSymbol.js @@ -0,0 +1,18 @@ +var Symbol = require('./_Symbol'); + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; + +/** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ +function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; +} + +module.exports = cloneSymbol; diff --git a/node_modules/lodash/_cloneTypedArray.js b/node_modules/lodash/_cloneTypedArray.js new file mode 100644 index 0000000..7aad84d --- /dev/null +++ b/node_modules/lodash/_cloneTypedArray.js @@ -0,0 +1,16 @@ +var cloneArrayBuffer = require('./_cloneArrayBuffer'); + +/** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ +function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); +} + +module.exports = cloneTypedArray; diff --git a/node_modules/lodash/_compareAscending.js b/node_modules/lodash/_compareAscending.js new file mode 100644 index 0000000..8dc2791 --- /dev/null +++ b/node_modules/lodash/_compareAscending.js @@ -0,0 +1,41 @@ +var isSymbol = require('./isSymbol'); + +/** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ +function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; +} + +module.exports = compareAscending; diff --git a/node_modules/lodash/_compareMultiple.js b/node_modules/lodash/_compareMultiple.js new file mode 100644 index 0000000..ad61f0f --- /dev/null +++ b/node_modules/lodash/_compareMultiple.js @@ -0,0 +1,44 @@ +var compareAscending = require('./_compareAscending'); + +/** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ +function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; +} + +module.exports = compareMultiple; diff --git a/node_modules/lodash/_composeArgs.js b/node_modules/lodash/_composeArgs.js new file mode 100644 index 0000000..1ce40f4 --- /dev/null +++ b/node_modules/lodash/_composeArgs.js @@ -0,0 +1,39 @@ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ +function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; +} + +module.exports = composeArgs; diff --git a/node_modules/lodash/_composeArgsRight.js b/node_modules/lodash/_composeArgsRight.js new file mode 100644 index 0000000..8dc588d --- /dev/null +++ b/node_modules/lodash/_composeArgsRight.js @@ -0,0 +1,41 @@ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ +function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; +} + +module.exports = composeArgsRight; diff --git a/node_modules/lodash/_copyArray.js b/node_modules/lodash/_copyArray.js new file mode 100644 index 0000000..cd94d5d --- /dev/null +++ b/node_modules/lodash/_copyArray.js @@ -0,0 +1,20 @@ +/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} + +module.exports = copyArray; diff --git a/node_modules/lodash/_copyObject.js b/node_modules/lodash/_copyObject.js new file mode 100644 index 0000000..2f2a5c2 --- /dev/null +++ b/node_modules/lodash/_copyObject.js @@ -0,0 +1,40 @@ +var assignValue = require('./_assignValue'), + baseAssignValue = require('./_baseAssignValue'); + +/** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ +function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; +} + +module.exports = copyObject; diff --git a/node_modules/lodash/_copySymbols.js b/node_modules/lodash/_copySymbols.js new file mode 100644 index 0000000..c35944a --- /dev/null +++ b/node_modules/lodash/_copySymbols.js @@ -0,0 +1,16 @@ +var copyObject = require('./_copyObject'), + getSymbols = require('./_getSymbols'); + +/** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ +function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); +} + +module.exports = copySymbols; diff --git a/node_modules/lodash/_copySymbolsIn.js b/node_modules/lodash/_copySymbolsIn.js new file mode 100644 index 0000000..fdf20a7 --- /dev/null +++ b/node_modules/lodash/_copySymbolsIn.js @@ -0,0 +1,16 @@ +var copyObject = require('./_copyObject'), + getSymbolsIn = require('./_getSymbolsIn'); + +/** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ +function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); +} + +module.exports = copySymbolsIn; diff --git a/node_modules/lodash/_coreJsData.js b/node_modules/lodash/_coreJsData.js new file mode 100644 index 0000000..f8e5b4e --- /dev/null +++ b/node_modules/lodash/_coreJsData.js @@ -0,0 +1,6 @@ +var root = require('./_root'); + +/** Used to detect overreaching core-js shims. */ +var coreJsData = root['__core-js_shared__']; + +module.exports = coreJsData; diff --git a/node_modules/lodash/_countHolders.js b/node_modules/lodash/_countHolders.js new file mode 100644 index 0000000..718fcda --- /dev/null +++ b/node_modules/lodash/_countHolders.js @@ -0,0 +1,21 @@ +/** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ +function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; +} + +module.exports = countHolders; diff --git a/node_modules/lodash/_createAggregator.js b/node_modules/lodash/_createAggregator.js new file mode 100644 index 0000000..0be42c4 --- /dev/null +++ b/node_modules/lodash/_createAggregator.js @@ -0,0 +1,23 @@ +var arrayAggregator = require('./_arrayAggregator'), + baseAggregator = require('./_baseAggregator'), + baseIteratee = require('./_baseIteratee'), + isArray = require('./isArray'); + +/** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ +function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, baseIteratee(iteratee, 2), accumulator); + }; +} + +module.exports = createAggregator; diff --git a/node_modules/lodash/_createAssigner.js b/node_modules/lodash/_createAssigner.js new file mode 100644 index 0000000..1f904c5 --- /dev/null +++ b/node_modules/lodash/_createAssigner.js @@ -0,0 +1,37 @@ +var baseRest = require('./_baseRest'), + isIterateeCall = require('./_isIterateeCall'); + +/** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ +function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); +} + +module.exports = createAssigner; diff --git a/node_modules/lodash/_createBaseEach.js b/node_modules/lodash/_createBaseEach.js new file mode 100644 index 0000000..d24fdd1 --- /dev/null +++ b/node_modules/lodash/_createBaseEach.js @@ -0,0 +1,32 @@ +var isArrayLike = require('./isArrayLike'); + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +module.exports = createBaseEach; diff --git a/node_modules/lodash/_createBaseFor.js b/node_modules/lodash/_createBaseFor.js new file mode 100644 index 0000000..94cbf29 --- /dev/null +++ b/node_modules/lodash/_createBaseFor.js @@ -0,0 +1,25 @@ +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +module.exports = createBaseFor; diff --git a/node_modules/lodash/_createBind.js b/node_modules/lodash/_createBind.js new file mode 100644 index 0000000..07cb99f --- /dev/null +++ b/node_modules/lodash/_createBind.js @@ -0,0 +1,28 @@ +var createCtor = require('./_createCtor'), + root = require('./_root'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1; + +/** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; +} + +module.exports = createBind; diff --git a/node_modules/lodash/_createCaseFirst.js b/node_modules/lodash/_createCaseFirst.js new file mode 100644 index 0000000..fe8ea48 --- /dev/null +++ b/node_modules/lodash/_createCaseFirst.js @@ -0,0 +1,33 @@ +var castSlice = require('./_castSlice'), + hasUnicode = require('./_hasUnicode'), + stringToArray = require('./_stringToArray'), + toString = require('./toString'); + +/** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ +function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; +} + +module.exports = createCaseFirst; diff --git a/node_modules/lodash/_createCompounder.js b/node_modules/lodash/_createCompounder.js new file mode 100644 index 0000000..8d4cee2 --- /dev/null +++ b/node_modules/lodash/_createCompounder.js @@ -0,0 +1,24 @@ +var arrayReduce = require('./_arrayReduce'), + deburr = require('./deburr'), + words = require('./words'); + +/** Used to compose unicode capture groups. */ +var rsApos = "['\u2019]"; + +/** Used to match apostrophes. */ +var reApos = RegExp(rsApos, 'g'); + +/** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ +function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; +} + +module.exports = createCompounder; diff --git a/node_modules/lodash/_createCtor.js b/node_modules/lodash/_createCtor.js new file mode 100644 index 0000000..9047aa5 --- /dev/null +++ b/node_modules/lodash/_createCtor.js @@ -0,0 +1,37 @@ +var baseCreate = require('./_baseCreate'), + isObject = require('./isObject'); + +/** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ +function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; +} + +module.exports = createCtor; diff --git a/node_modules/lodash/_createCurry.js b/node_modules/lodash/_createCurry.js new file mode 100644 index 0000000..f06c2cd --- /dev/null +++ b/node_modules/lodash/_createCurry.js @@ -0,0 +1,46 @@ +var apply = require('./_apply'), + createCtor = require('./_createCtor'), + createHybrid = require('./_createHybrid'), + createRecurry = require('./_createRecurry'), + getHolder = require('./_getHolder'), + replaceHolders = require('./_replaceHolders'), + root = require('./_root'); + +/** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; +} + +module.exports = createCurry; diff --git a/node_modules/lodash/_createFind.js b/node_modules/lodash/_createFind.js new file mode 100644 index 0000000..8859ff8 --- /dev/null +++ b/node_modules/lodash/_createFind.js @@ -0,0 +1,25 @@ +var baseIteratee = require('./_baseIteratee'), + isArrayLike = require('./isArrayLike'), + keys = require('./keys'); + +/** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ +function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = baseIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; +} + +module.exports = createFind; diff --git a/node_modules/lodash/_createFlow.js b/node_modules/lodash/_createFlow.js new file mode 100644 index 0000000..baaddbf --- /dev/null +++ b/node_modules/lodash/_createFlow.js @@ -0,0 +1,78 @@ +var LodashWrapper = require('./_LodashWrapper'), + flatRest = require('./_flatRest'), + getData = require('./_getData'), + getFuncName = require('./_getFuncName'), + isArray = require('./isArray'), + isLaziable = require('./_isLaziable'); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to compose bitmasks for function metadata. */ +var WRAP_CURRY_FLAG = 8, + WRAP_PARTIAL_FLAG = 32, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256; + +/** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ +function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); +} + +module.exports = createFlow; diff --git a/node_modules/lodash/_createHybrid.js b/node_modules/lodash/_createHybrid.js new file mode 100644 index 0000000..b671bd1 --- /dev/null +++ b/node_modules/lodash/_createHybrid.js @@ -0,0 +1,92 @@ +var composeArgs = require('./_composeArgs'), + composeArgsRight = require('./_composeArgsRight'), + countHolders = require('./_countHolders'), + createCtor = require('./_createCtor'), + createRecurry = require('./_createRecurry'), + getHolder = require('./_getHolder'), + reorder = require('./_reorder'), + replaceHolders = require('./_replaceHolders'), + root = require('./_root'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_ARY_FLAG = 128, + WRAP_FLIP_FLAG = 512; + +/** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; +} + +module.exports = createHybrid; diff --git a/node_modules/lodash/_createInverter.js b/node_modules/lodash/_createInverter.js new file mode 100644 index 0000000..6c0c562 --- /dev/null +++ b/node_modules/lodash/_createInverter.js @@ -0,0 +1,17 @@ +var baseInverter = require('./_baseInverter'); + +/** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ +function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; +} + +module.exports = createInverter; diff --git a/node_modules/lodash/_createMathOperation.js b/node_modules/lodash/_createMathOperation.js new file mode 100644 index 0000000..f1e238a --- /dev/null +++ b/node_modules/lodash/_createMathOperation.js @@ -0,0 +1,38 @@ +var baseToNumber = require('./_baseToNumber'), + baseToString = require('./_baseToString'); + +/** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ +function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; +} + +module.exports = createMathOperation; diff --git a/node_modules/lodash/_createOver.js b/node_modules/lodash/_createOver.js new file mode 100644 index 0000000..3b94551 --- /dev/null +++ b/node_modules/lodash/_createOver.js @@ -0,0 +1,27 @@ +var apply = require('./_apply'), + arrayMap = require('./_arrayMap'), + baseIteratee = require('./_baseIteratee'), + baseRest = require('./_baseRest'), + baseUnary = require('./_baseUnary'), + flatRest = require('./_flatRest'); + +/** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ +function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(baseIteratee)); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); +} + +module.exports = createOver; diff --git a/node_modules/lodash/_createPadding.js b/node_modules/lodash/_createPadding.js new file mode 100644 index 0000000..2124612 --- /dev/null +++ b/node_modules/lodash/_createPadding.js @@ -0,0 +1,33 @@ +var baseRepeat = require('./_baseRepeat'), + baseToString = require('./_baseToString'), + castSlice = require('./_castSlice'), + hasUnicode = require('./_hasUnicode'), + stringSize = require('./_stringSize'), + stringToArray = require('./_stringToArray'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeCeil = Math.ceil; + +/** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ +function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); +} + +module.exports = createPadding; diff --git a/node_modules/lodash/_createPartial.js b/node_modules/lodash/_createPartial.js new file mode 100644 index 0000000..e16c248 --- /dev/null +++ b/node_modules/lodash/_createPartial.js @@ -0,0 +1,43 @@ +var apply = require('./_apply'), + createCtor = require('./_createCtor'), + root = require('./_root'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1; + +/** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ +function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; +} + +module.exports = createPartial; diff --git a/node_modules/lodash/_createRange.js b/node_modules/lodash/_createRange.js new file mode 100644 index 0000000..9f52c77 --- /dev/null +++ b/node_modules/lodash/_createRange.js @@ -0,0 +1,30 @@ +var baseRange = require('./_baseRange'), + isIterateeCall = require('./_isIterateeCall'), + toFinite = require('./toFinite'); + +/** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ +function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; +} + +module.exports = createRange; diff --git a/node_modules/lodash/_createRecurry.js b/node_modules/lodash/_createRecurry.js new file mode 100644 index 0000000..eb29fb2 --- /dev/null +++ b/node_modules/lodash/_createRecurry.js @@ -0,0 +1,56 @@ +var isLaziable = require('./_isLaziable'), + setData = require('./_setData'), + setWrapToString = require('./_setWrapToString'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64; + +/** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); +} + +module.exports = createRecurry; diff --git a/node_modules/lodash/_createRelationalOperation.js b/node_modules/lodash/_createRelationalOperation.js new file mode 100644 index 0000000..a17c6b5 --- /dev/null +++ b/node_modules/lodash/_createRelationalOperation.js @@ -0,0 +1,20 @@ +var toNumber = require('./toNumber'); + +/** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ +function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; +} + +module.exports = createRelationalOperation; diff --git a/node_modules/lodash/_createRound.js b/node_modules/lodash/_createRound.js new file mode 100644 index 0000000..88be5df --- /dev/null +++ b/node_modules/lodash/_createRound.js @@ -0,0 +1,35 @@ +var root = require('./_root'), + toInteger = require('./toInteger'), + toNumber = require('./toNumber'), + toString = require('./toString'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsFinite = root.isFinite, + nativeMin = Math.min; + +/** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ +function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number)) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; +} + +module.exports = createRound; diff --git a/node_modules/lodash/_createSet.js b/node_modules/lodash/_createSet.js new file mode 100644 index 0000000..0f644ee --- /dev/null +++ b/node_modules/lodash/_createSet.js @@ -0,0 +1,19 @@ +var Set = require('./_Set'), + noop = require('./noop'), + setToArray = require('./_setToArray'); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ +var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); +}; + +module.exports = createSet; diff --git a/node_modules/lodash/_createToPairs.js b/node_modules/lodash/_createToPairs.js new file mode 100644 index 0000000..568417a --- /dev/null +++ b/node_modules/lodash/_createToPairs.js @@ -0,0 +1,30 @@ +var baseToPairs = require('./_baseToPairs'), + getTag = require('./_getTag'), + mapToArray = require('./_mapToArray'), + setToPairs = require('./_setToPairs'); + +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + setTag = '[object Set]'; + +/** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ +function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; +} + +module.exports = createToPairs; diff --git a/node_modules/lodash/_createWrap.js b/node_modules/lodash/_createWrap.js new file mode 100644 index 0000000..33f0633 --- /dev/null +++ b/node_modules/lodash/_createWrap.js @@ -0,0 +1,106 @@ +var baseSetData = require('./_baseSetData'), + createBind = require('./_createBind'), + createCurry = require('./_createCurry'), + createHybrid = require('./_createHybrid'), + createPartial = require('./_createPartial'), + getData = require('./_getData'), + mergeData = require('./_mergeData'), + setData = require('./_setData'), + setWrapToString = require('./_setWrapToString'), + toInteger = require('./toInteger'); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); +} + +module.exports = createWrap; diff --git a/node_modules/lodash/_customDefaultsAssignIn.js b/node_modules/lodash/_customDefaultsAssignIn.js new file mode 100644 index 0000000..1f49e6f --- /dev/null +++ b/node_modules/lodash/_customDefaultsAssignIn.js @@ -0,0 +1,29 @@ +var eq = require('./eq'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ +function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; +} + +module.exports = customDefaultsAssignIn; diff --git a/node_modules/lodash/_customDefaultsMerge.js b/node_modules/lodash/_customDefaultsMerge.js new file mode 100644 index 0000000..4cab317 --- /dev/null +++ b/node_modules/lodash/_customDefaultsMerge.js @@ -0,0 +1,28 @@ +var baseMerge = require('./_baseMerge'), + isObject = require('./isObject'); + +/** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ +function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; +} + +module.exports = customDefaultsMerge; diff --git a/node_modules/lodash/_customOmitClone.js b/node_modules/lodash/_customOmitClone.js new file mode 100644 index 0000000..968db2e --- /dev/null +++ b/node_modules/lodash/_customOmitClone.js @@ -0,0 +1,16 @@ +var isPlainObject = require('./isPlainObject'); + +/** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ +function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; +} + +module.exports = customOmitClone; diff --git a/node_modules/lodash/_deburrLetter.js b/node_modules/lodash/_deburrLetter.js new file mode 100644 index 0000000..3e531ed --- /dev/null +++ b/node_modules/lodash/_deburrLetter.js @@ -0,0 +1,71 @@ +var basePropertyOf = require('./_basePropertyOf'); + +/** Used to map Latin Unicode letters to basic Latin letters. */ +var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' +}; + +/** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ +var deburrLetter = basePropertyOf(deburredLetters); + +module.exports = deburrLetter; diff --git a/node_modules/lodash/_defineProperty.js b/node_modules/lodash/_defineProperty.js new file mode 100644 index 0000000..b6116d9 --- /dev/null +++ b/node_modules/lodash/_defineProperty.js @@ -0,0 +1,11 @@ +var getNative = require('./_getNative'); + +var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} +}()); + +module.exports = defineProperty; diff --git a/node_modules/lodash/_equalArrays.js b/node_modules/lodash/_equalArrays.js new file mode 100644 index 0000000..824228c --- /dev/null +++ b/node_modules/lodash/_equalArrays.js @@ -0,0 +1,84 @@ +var SetCache = require('./_SetCache'), + arraySome = require('./_arraySome'), + cacheHas = require('./_cacheHas'); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; +} + +module.exports = equalArrays; diff --git a/node_modules/lodash/_equalByTag.js b/node_modules/lodash/_equalByTag.js new file mode 100644 index 0000000..71919e8 --- /dev/null +++ b/node_modules/lodash/_equalByTag.js @@ -0,0 +1,112 @@ +var Symbol = require('./_Symbol'), + Uint8Array = require('./_Uint8Array'), + eq = require('./eq'), + equalArrays = require('./_equalArrays'), + mapToArray = require('./_mapToArray'), + setToArray = require('./_setToArray'); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + mapTag = '[object Map]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]'; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; +} + +module.exports = equalByTag; diff --git a/node_modules/lodash/_equalObjects.js b/node_modules/lodash/_equalObjects.js new file mode 100644 index 0000000..cdaacd2 --- /dev/null +++ b/node_modules/lodash/_equalObjects.js @@ -0,0 +1,90 @@ +var getAllKeys = require('./_getAllKeys'); + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; +} + +module.exports = equalObjects; diff --git a/node_modules/lodash/_escapeHtmlChar.js b/node_modules/lodash/_escapeHtmlChar.js new file mode 100644 index 0000000..7ca68ee --- /dev/null +++ b/node_modules/lodash/_escapeHtmlChar.js @@ -0,0 +1,21 @@ +var basePropertyOf = require('./_basePropertyOf'); + +/** Used to map characters to HTML entities. */ +var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; + +/** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ +var escapeHtmlChar = basePropertyOf(htmlEscapes); + +module.exports = escapeHtmlChar; diff --git a/node_modules/lodash/_escapeStringChar.js b/node_modules/lodash/_escapeStringChar.js new file mode 100644 index 0000000..44eca96 --- /dev/null +++ b/node_modules/lodash/_escapeStringChar.js @@ -0,0 +1,22 @@ +/** Used to escape characters for inclusion in compiled string literals. */ +var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' +}; + +/** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ +function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; +} + +module.exports = escapeStringChar; diff --git a/node_modules/lodash/_flatRest.js b/node_modules/lodash/_flatRest.js new file mode 100644 index 0000000..94ab6cc --- /dev/null +++ b/node_modules/lodash/_flatRest.js @@ -0,0 +1,16 @@ +var flatten = require('./flatten'), + overRest = require('./_overRest'), + setToString = require('./_setToString'); + +/** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ +function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); +} + +module.exports = flatRest; diff --git a/node_modules/lodash/_freeGlobal.js b/node_modules/lodash/_freeGlobal.js new file mode 100644 index 0000000..bbec998 --- /dev/null +++ b/node_modules/lodash/_freeGlobal.js @@ -0,0 +1,4 @@ +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +module.exports = freeGlobal; diff --git a/node_modules/lodash/_getAllKeys.js b/node_modules/lodash/_getAllKeys.js new file mode 100644 index 0000000..a9ce699 --- /dev/null +++ b/node_modules/lodash/_getAllKeys.js @@ -0,0 +1,16 @@ +var baseGetAllKeys = require('./_baseGetAllKeys'), + getSymbols = require('./_getSymbols'), + keys = require('./keys'); + +/** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); +} + +module.exports = getAllKeys; diff --git a/node_modules/lodash/_getAllKeysIn.js b/node_modules/lodash/_getAllKeysIn.js new file mode 100644 index 0000000..1b46678 --- /dev/null +++ b/node_modules/lodash/_getAllKeysIn.js @@ -0,0 +1,17 @@ +var baseGetAllKeys = require('./_baseGetAllKeys'), + getSymbolsIn = require('./_getSymbolsIn'), + keysIn = require('./keysIn'); + +/** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); +} + +module.exports = getAllKeysIn; diff --git a/node_modules/lodash/_getData.js b/node_modules/lodash/_getData.js new file mode 100644 index 0000000..a1fe7b7 --- /dev/null +++ b/node_modules/lodash/_getData.js @@ -0,0 +1,15 @@ +var metaMap = require('./_metaMap'), + noop = require('./noop'); + +/** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ +var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); +}; + +module.exports = getData; diff --git a/node_modules/lodash/_getFuncName.js b/node_modules/lodash/_getFuncName.js new file mode 100644 index 0000000..21e15b3 --- /dev/null +++ b/node_modules/lodash/_getFuncName.js @@ -0,0 +1,31 @@ +var realNames = require('./_realNames'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ +function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; +} + +module.exports = getFuncName; diff --git a/node_modules/lodash/_getHolder.js b/node_modules/lodash/_getHolder.js new file mode 100644 index 0000000..65e94b5 --- /dev/null +++ b/node_modules/lodash/_getHolder.js @@ -0,0 +1,13 @@ +/** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ +function getHolder(func) { + var object = func; + return object.placeholder; +} + +module.exports = getHolder; diff --git a/node_modules/lodash/_getMapData.js b/node_modules/lodash/_getMapData.js new file mode 100644 index 0000000..17f6303 --- /dev/null +++ b/node_modules/lodash/_getMapData.js @@ -0,0 +1,18 @@ +var isKeyable = require('./_isKeyable'); + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +module.exports = getMapData; diff --git a/node_modules/lodash/_getMatchData.js b/node_modules/lodash/_getMatchData.js new file mode 100644 index 0000000..2cc70f9 --- /dev/null +++ b/node_modules/lodash/_getMatchData.js @@ -0,0 +1,24 @@ +var isStrictComparable = require('./_isStrictComparable'), + keys = require('./keys'); + +/** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; +} + +module.exports = getMatchData; diff --git a/node_modules/lodash/_getNative.js b/node_modules/lodash/_getNative.js new file mode 100644 index 0000000..97a622b --- /dev/null +++ b/node_modules/lodash/_getNative.js @@ -0,0 +1,17 @@ +var baseIsNative = require('./_baseIsNative'), + getValue = require('./_getValue'); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; +} + +module.exports = getNative; diff --git a/node_modules/lodash/_getPrototype.js b/node_modules/lodash/_getPrototype.js new file mode 100644 index 0000000..e808612 --- /dev/null +++ b/node_modules/lodash/_getPrototype.js @@ -0,0 +1,6 @@ +var overArg = require('./_overArg'); + +/** Built-in value references. */ +var getPrototype = overArg(Object.getPrototypeOf, Object); + +module.exports = getPrototype; diff --git a/node_modules/lodash/_getRawTag.js b/node_modules/lodash/_getRawTag.js new file mode 100644 index 0000000..49a95c9 --- /dev/null +++ b/node_modules/lodash/_getRawTag.js @@ -0,0 +1,46 @@ +var Symbol = require('./_Symbol'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = Symbol ? Symbol.toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +module.exports = getRawTag; diff --git a/node_modules/lodash/_getSymbols.js b/node_modules/lodash/_getSymbols.js new file mode 100644 index 0000000..7d6eafe --- /dev/null +++ b/node_modules/lodash/_getSymbols.js @@ -0,0 +1,30 @@ +var arrayFilter = require('./_arrayFilter'), + stubArray = require('./stubArray'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; + +/** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); +}; + +module.exports = getSymbols; diff --git a/node_modules/lodash/_getSymbolsIn.js b/node_modules/lodash/_getSymbolsIn.js new file mode 100644 index 0000000..cec0855 --- /dev/null +++ b/node_modules/lodash/_getSymbolsIn.js @@ -0,0 +1,25 @@ +var arrayPush = require('./_arrayPush'), + getPrototype = require('./_getPrototype'), + getSymbols = require('./_getSymbols'), + stubArray = require('./stubArray'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; + +/** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; +}; + +module.exports = getSymbolsIn; diff --git a/node_modules/lodash/_getTag.js b/node_modules/lodash/_getTag.js new file mode 100644 index 0000000..deaf89d --- /dev/null +++ b/node_modules/lodash/_getTag.js @@ -0,0 +1,58 @@ +var DataView = require('./_DataView'), + Map = require('./_Map'), + Promise = require('./_Promise'), + Set = require('./_Set'), + WeakMap = require('./_WeakMap'), + baseGetTag = require('./_baseGetTag'), + toSource = require('./_toSource'); + +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + setTag = '[object Set]', + weakMapTag = '[object WeakMap]'; + +var dataViewTag = '[object DataView]'; + +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = baseGetTag; + +// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. +if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; +} + +module.exports = getTag; diff --git a/node_modules/lodash/_getValue.js b/node_modules/lodash/_getValue.js new file mode 100644 index 0000000..5f7d773 --- /dev/null +++ b/node_modules/lodash/_getValue.js @@ -0,0 +1,13 @@ +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +module.exports = getValue; diff --git a/node_modules/lodash/_getView.js b/node_modules/lodash/_getView.js new file mode 100644 index 0000000..df1e5d4 --- /dev/null +++ b/node_modules/lodash/_getView.js @@ -0,0 +1,33 @@ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ +function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; +} + +module.exports = getView; diff --git a/node_modules/lodash/_getWrapDetails.js b/node_modules/lodash/_getWrapDetails.js new file mode 100644 index 0000000..3bcc6e4 --- /dev/null +++ b/node_modules/lodash/_getWrapDetails.js @@ -0,0 +1,17 @@ +/** Used to match wrap detail comments. */ +var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + +/** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ +function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; +} + +module.exports = getWrapDetails; diff --git a/node_modules/lodash/_hasPath.js b/node_modules/lodash/_hasPath.js new file mode 100644 index 0000000..93dbde1 --- /dev/null +++ b/node_modules/lodash/_hasPath.js @@ -0,0 +1,39 @@ +var castPath = require('./_castPath'), + isArguments = require('./isArguments'), + isArray = require('./isArray'), + isIndex = require('./_isIndex'), + isLength = require('./isLength'), + toKey = require('./_toKey'); + +/** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ +function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); +} + +module.exports = hasPath; diff --git a/node_modules/lodash/_hasUnicode.js b/node_modules/lodash/_hasUnicode.js new file mode 100644 index 0000000..cb6ca15 --- /dev/null +++ b/node_modules/lodash/_hasUnicode.js @@ -0,0 +1,26 @@ +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; + +/** Used to compose unicode capture groups. */ +var rsZWJ = '\\u200d'; + +/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ +var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + +/** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ +function hasUnicode(string) { + return reHasUnicode.test(string); +} + +module.exports = hasUnicode; diff --git a/node_modules/lodash/_hasUnicodeWord.js b/node_modules/lodash/_hasUnicodeWord.js new file mode 100644 index 0000000..95d52c4 --- /dev/null +++ b/node_modules/lodash/_hasUnicodeWord.js @@ -0,0 +1,15 @@ +/** Used to detect strings that need a more robust regexp to match words. */ +var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + +/** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ +function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); +} + +module.exports = hasUnicodeWord; diff --git a/node_modules/lodash/_hashClear.js b/node_modules/lodash/_hashClear.js new file mode 100644 index 0000000..5d4b70c --- /dev/null +++ b/node_modules/lodash/_hashClear.js @@ -0,0 +1,15 @@ +var nativeCreate = require('./_nativeCreate'); + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; +} + +module.exports = hashClear; diff --git a/node_modules/lodash/_hashDelete.js b/node_modules/lodash/_hashDelete.js new file mode 100644 index 0000000..ea9dabf --- /dev/null +++ b/node_modules/lodash/_hashDelete.js @@ -0,0 +1,17 @@ +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; +} + +module.exports = hashDelete; diff --git a/node_modules/lodash/_hashGet.js b/node_modules/lodash/_hashGet.js new file mode 100644 index 0000000..1fc2f34 --- /dev/null +++ b/node_modules/lodash/_hashGet.js @@ -0,0 +1,30 @@ +var nativeCreate = require('./_nativeCreate'); + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +module.exports = hashGet; diff --git a/node_modules/lodash/_hashHas.js b/node_modules/lodash/_hashHas.js new file mode 100644 index 0000000..281a551 --- /dev/null +++ b/node_modules/lodash/_hashHas.js @@ -0,0 +1,23 @@ +var nativeCreate = require('./_nativeCreate'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); +} + +module.exports = hashHas; diff --git a/node_modules/lodash/_hashSet.js b/node_modules/lodash/_hashSet.js new file mode 100644 index 0000000..e105528 --- /dev/null +++ b/node_modules/lodash/_hashSet.js @@ -0,0 +1,23 @@ +var nativeCreate = require('./_nativeCreate'); + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +module.exports = hashSet; diff --git a/node_modules/lodash/_initCloneArray.js b/node_modules/lodash/_initCloneArray.js new file mode 100644 index 0000000..078c15a --- /dev/null +++ b/node_modules/lodash/_initCloneArray.js @@ -0,0 +1,26 @@ +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ +function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; +} + +module.exports = initCloneArray; diff --git a/node_modules/lodash/_initCloneByTag.js b/node_modules/lodash/_initCloneByTag.js new file mode 100644 index 0000000..f69a008 --- /dev/null +++ b/node_modules/lodash/_initCloneByTag.js @@ -0,0 +1,77 @@ +var cloneArrayBuffer = require('./_cloneArrayBuffer'), + cloneDataView = require('./_cloneDataView'), + cloneRegExp = require('./_cloneRegExp'), + cloneSymbol = require('./_cloneSymbol'), + cloneTypedArray = require('./_cloneTypedArray'); + +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + mapTag = '[object Map]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ +function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return new Ctor; + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return new Ctor; + + case symbolTag: + return cloneSymbol(object); + } +} + +module.exports = initCloneByTag; diff --git a/node_modules/lodash/_initCloneObject.js b/node_modules/lodash/_initCloneObject.js new file mode 100644 index 0000000..5a13e64 --- /dev/null +++ b/node_modules/lodash/_initCloneObject.js @@ -0,0 +1,18 @@ +var baseCreate = require('./_baseCreate'), + getPrototype = require('./_getPrototype'), + isPrototype = require('./_isPrototype'); + +/** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ +function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; +} + +module.exports = initCloneObject; diff --git a/node_modules/lodash/_insertWrapDetails.js b/node_modules/lodash/_insertWrapDetails.js new file mode 100644 index 0000000..e790808 --- /dev/null +++ b/node_modules/lodash/_insertWrapDetails.js @@ -0,0 +1,23 @@ +/** Used to match wrap detail comments. */ +var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/; + +/** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ +function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); +} + +module.exports = insertWrapDetails; diff --git a/node_modules/lodash/_isFlattenable.js b/node_modules/lodash/_isFlattenable.js new file mode 100644 index 0000000..4cc2c24 --- /dev/null +++ b/node_modules/lodash/_isFlattenable.js @@ -0,0 +1,20 @@ +var Symbol = require('./_Symbol'), + isArguments = require('./isArguments'), + isArray = require('./isArray'); + +/** Built-in value references. */ +var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; + +/** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ +function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); +} + +module.exports = isFlattenable; diff --git a/node_modules/lodash/_isIndex.js b/node_modules/lodash/_isIndex.js new file mode 100644 index 0000000..061cd39 --- /dev/null +++ b/node_modules/lodash/_isIndex.js @@ -0,0 +1,25 @@ +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); +} + +module.exports = isIndex; diff --git a/node_modules/lodash/_isIterateeCall.js b/node_modules/lodash/_isIterateeCall.js new file mode 100644 index 0000000..a0bb5a9 --- /dev/null +++ b/node_modules/lodash/_isIterateeCall.js @@ -0,0 +1,30 @@ +var eq = require('./eq'), + isArrayLike = require('./isArrayLike'), + isIndex = require('./_isIndex'), + isObject = require('./isObject'); + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; +} + +module.exports = isIterateeCall; diff --git a/node_modules/lodash/_isKey.js b/node_modules/lodash/_isKey.js new file mode 100644 index 0000000..ff08b06 --- /dev/null +++ b/node_modules/lodash/_isKey.js @@ -0,0 +1,29 @@ +var isArray = require('./isArray'), + isSymbol = require('./isSymbol'); + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +module.exports = isKey; diff --git a/node_modules/lodash/_isKeyable.js b/node_modules/lodash/_isKeyable.js new file mode 100644 index 0000000..39f1828 --- /dev/null +++ b/node_modules/lodash/_isKeyable.js @@ -0,0 +1,15 @@ +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +module.exports = isKeyable; diff --git a/node_modules/lodash/_isLaziable.js b/node_modules/lodash/_isLaziable.js new file mode 100644 index 0000000..a57c4f2 --- /dev/null +++ b/node_modules/lodash/_isLaziable.js @@ -0,0 +1,28 @@ +var LazyWrapper = require('./_LazyWrapper'), + getData = require('./_getData'), + getFuncName = require('./_getFuncName'), + lodash = require('./wrapperLodash'); + +/** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ +function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; +} + +module.exports = isLaziable; diff --git a/node_modules/lodash/_isMaskable.js b/node_modules/lodash/_isMaskable.js new file mode 100644 index 0000000..eb98d09 --- /dev/null +++ b/node_modules/lodash/_isMaskable.js @@ -0,0 +1,14 @@ +var coreJsData = require('./_coreJsData'), + isFunction = require('./isFunction'), + stubFalse = require('./stubFalse'); + +/** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ +var isMaskable = coreJsData ? isFunction : stubFalse; + +module.exports = isMaskable; diff --git a/node_modules/lodash/_isMasked.js b/node_modules/lodash/_isMasked.js new file mode 100644 index 0000000..4b0f21b --- /dev/null +++ b/node_modules/lodash/_isMasked.js @@ -0,0 +1,20 @@ +var coreJsData = require('./_coreJsData'); + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +module.exports = isMasked; diff --git a/node_modules/lodash/_isPrototype.js b/node_modules/lodash/_isPrototype.js new file mode 100644 index 0000000..0f29498 --- /dev/null +++ b/node_modules/lodash/_isPrototype.js @@ -0,0 +1,18 @@ +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +module.exports = isPrototype; diff --git a/node_modules/lodash/_isStrictComparable.js b/node_modules/lodash/_isStrictComparable.js new file mode 100644 index 0000000..b59f40b --- /dev/null +++ b/node_modules/lodash/_isStrictComparable.js @@ -0,0 +1,15 @@ +var isObject = require('./isObject'); + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !isObject(value); +} + +module.exports = isStrictComparable; diff --git a/node_modules/lodash/_iteratorToArray.js b/node_modules/lodash/_iteratorToArray.js new file mode 100644 index 0000000..4768566 --- /dev/null +++ b/node_modules/lodash/_iteratorToArray.js @@ -0,0 +1,18 @@ +/** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ +function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; +} + +module.exports = iteratorToArray; diff --git a/node_modules/lodash/_lazyClone.js b/node_modules/lodash/_lazyClone.js new file mode 100644 index 0000000..d8a51f8 --- /dev/null +++ b/node_modules/lodash/_lazyClone.js @@ -0,0 +1,23 @@ +var LazyWrapper = require('./_LazyWrapper'), + copyArray = require('./_copyArray'); + +/** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ +function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; +} + +module.exports = lazyClone; diff --git a/node_modules/lodash/_lazyReverse.js b/node_modules/lodash/_lazyReverse.js new file mode 100644 index 0000000..c5b5219 --- /dev/null +++ b/node_modules/lodash/_lazyReverse.js @@ -0,0 +1,23 @@ +var LazyWrapper = require('./_LazyWrapper'); + +/** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ +function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; +} + +module.exports = lazyReverse; diff --git a/node_modules/lodash/_lazyValue.js b/node_modules/lodash/_lazyValue.js new file mode 100644 index 0000000..371ca8d --- /dev/null +++ b/node_modules/lodash/_lazyValue.js @@ -0,0 +1,69 @@ +var baseWrapperValue = require('./_baseWrapperValue'), + getView = require('./_getView'), + isArray = require('./isArray'); + +/** Used to indicate the type of lazy iteratees. */ +var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ +function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; +} + +module.exports = lazyValue; diff --git a/node_modules/lodash/_listCacheClear.js b/node_modules/lodash/_listCacheClear.js new file mode 100644 index 0000000..acbe39a --- /dev/null +++ b/node_modules/lodash/_listCacheClear.js @@ -0,0 +1,13 @@ +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} + +module.exports = listCacheClear; diff --git a/node_modules/lodash/_listCacheDelete.js b/node_modules/lodash/_listCacheDelete.js new file mode 100644 index 0000000..b1384ad --- /dev/null +++ b/node_modules/lodash/_listCacheDelete.js @@ -0,0 +1,35 @@ +var assocIndexOf = require('./_assocIndexOf'); + +/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/** Built-in value references. */ +var splice = arrayProto.splice; + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; +} + +module.exports = listCacheDelete; diff --git a/node_modules/lodash/_listCacheGet.js b/node_modules/lodash/_listCacheGet.js new file mode 100644 index 0000000..f8192fc --- /dev/null +++ b/node_modules/lodash/_listCacheGet.js @@ -0,0 +1,19 @@ +var assocIndexOf = require('./_assocIndexOf'); + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +module.exports = listCacheGet; diff --git a/node_modules/lodash/_listCacheHas.js b/node_modules/lodash/_listCacheHas.js new file mode 100644 index 0000000..2adf671 --- /dev/null +++ b/node_modules/lodash/_listCacheHas.js @@ -0,0 +1,16 @@ +var assocIndexOf = require('./_assocIndexOf'); + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; +} + +module.exports = listCacheHas; diff --git a/node_modules/lodash/_listCacheSet.js b/node_modules/lodash/_listCacheSet.js new file mode 100644 index 0000000..5855c95 --- /dev/null +++ b/node_modules/lodash/_listCacheSet.js @@ -0,0 +1,26 @@ +var assocIndexOf = require('./_assocIndexOf'); + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +module.exports = listCacheSet; diff --git a/node_modules/lodash/_mapCacheClear.js b/node_modules/lodash/_mapCacheClear.js new file mode 100644 index 0000000..bc9ca20 --- /dev/null +++ b/node_modules/lodash/_mapCacheClear.js @@ -0,0 +1,21 @@ +var Hash = require('./_Hash'), + ListCache = require('./_ListCache'), + Map = require('./_Map'); + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; +} + +module.exports = mapCacheClear; diff --git a/node_modules/lodash/_mapCacheDelete.js b/node_modules/lodash/_mapCacheDelete.js new file mode 100644 index 0000000..946ca3c --- /dev/null +++ b/node_modules/lodash/_mapCacheDelete.js @@ -0,0 +1,18 @@ +var getMapData = require('./_getMapData'); + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; +} + +module.exports = mapCacheDelete; diff --git a/node_modules/lodash/_mapCacheGet.js b/node_modules/lodash/_mapCacheGet.js new file mode 100644 index 0000000..f29f55c --- /dev/null +++ b/node_modules/lodash/_mapCacheGet.js @@ -0,0 +1,16 @@ +var getMapData = require('./_getMapData'); + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return getMapData(this, key).get(key); +} + +module.exports = mapCacheGet; diff --git a/node_modules/lodash/_mapCacheHas.js b/node_modules/lodash/_mapCacheHas.js new file mode 100644 index 0000000..a1214c0 --- /dev/null +++ b/node_modules/lodash/_mapCacheHas.js @@ -0,0 +1,16 @@ +var getMapData = require('./_getMapData'); + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return getMapData(this, key).has(key); +} + +module.exports = mapCacheHas; diff --git a/node_modules/lodash/_mapCacheSet.js b/node_modules/lodash/_mapCacheSet.js new file mode 100644 index 0000000..7346849 --- /dev/null +++ b/node_modules/lodash/_mapCacheSet.js @@ -0,0 +1,22 @@ +var getMapData = require('./_getMapData'); + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; +} + +module.exports = mapCacheSet; diff --git a/node_modules/lodash/_mapToArray.js b/node_modules/lodash/_mapToArray.js new file mode 100644 index 0000000..fe3dd53 --- /dev/null +++ b/node_modules/lodash/_mapToArray.js @@ -0,0 +1,18 @@ +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; +} + +module.exports = mapToArray; diff --git a/node_modules/lodash/_matchesStrictComparable.js b/node_modules/lodash/_matchesStrictComparable.js new file mode 100644 index 0000000..f608af9 --- /dev/null +++ b/node_modules/lodash/_matchesStrictComparable.js @@ -0,0 +1,20 @@ +/** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; +} + +module.exports = matchesStrictComparable; diff --git a/node_modules/lodash/_memoizeCapped.js b/node_modules/lodash/_memoizeCapped.js new file mode 100644 index 0000000..7f71c8f --- /dev/null +++ b/node_modules/lodash/_memoizeCapped.js @@ -0,0 +1,26 @@ +var memoize = require('./memoize'); + +/** Used as the maximum memoize cache size. */ +var MAX_MEMOIZE_SIZE = 500; + +/** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ +function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; +} + +module.exports = memoizeCapped; diff --git a/node_modules/lodash/_mergeData.js b/node_modules/lodash/_mergeData.js new file mode 100644 index 0000000..cb570f9 --- /dev/null +++ b/node_modules/lodash/_mergeData.js @@ -0,0 +1,90 @@ +var composeArgs = require('./_composeArgs'), + composeArgsRight = require('./_composeArgsRight'), + replaceHolders = require('./_replaceHolders'); + +/** Used as the internal argument placeholder. */ +var PLACEHOLDER = '__lodash_placeholder__'; + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ +function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; +} + +module.exports = mergeData; diff --git a/node_modules/lodash/_metaMap.js b/node_modules/lodash/_metaMap.js new file mode 100644 index 0000000..0157a0b --- /dev/null +++ b/node_modules/lodash/_metaMap.js @@ -0,0 +1,6 @@ +var WeakMap = require('./_WeakMap'); + +/** Used to store function metadata. */ +var metaMap = WeakMap && new WeakMap; + +module.exports = metaMap; diff --git a/node_modules/lodash/_nativeCreate.js b/node_modules/lodash/_nativeCreate.js new file mode 100644 index 0000000..c7aede8 --- /dev/null +++ b/node_modules/lodash/_nativeCreate.js @@ -0,0 +1,6 @@ +var getNative = require('./_getNative'); + +/* Built-in method references that are verified to be native. */ +var nativeCreate = getNative(Object, 'create'); + +module.exports = nativeCreate; diff --git a/node_modules/lodash/_nativeKeys.js b/node_modules/lodash/_nativeKeys.js new file mode 100644 index 0000000..479a104 --- /dev/null +++ b/node_modules/lodash/_nativeKeys.js @@ -0,0 +1,6 @@ +var overArg = require('./_overArg'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = overArg(Object.keys, Object); + +module.exports = nativeKeys; diff --git a/node_modules/lodash/_nativeKeysIn.js b/node_modules/lodash/_nativeKeysIn.js new file mode 100644 index 0000000..00ee505 --- /dev/null +++ b/node_modules/lodash/_nativeKeysIn.js @@ -0,0 +1,20 @@ +/** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; +} + +module.exports = nativeKeysIn; diff --git a/node_modules/lodash/_nodeUtil.js b/node_modules/lodash/_nodeUtil.js new file mode 100644 index 0000000..983d78f --- /dev/null +++ b/node_modules/lodash/_nodeUtil.js @@ -0,0 +1,30 @@ +var freeGlobal = require('./_freeGlobal'); + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} +}()); + +module.exports = nodeUtil; diff --git a/node_modules/lodash/_objectToString.js b/node_modules/lodash/_objectToString.js new file mode 100644 index 0000000..c614ec0 --- /dev/null +++ b/node_modules/lodash/_objectToString.js @@ -0,0 +1,22 @@ +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString.call(value); +} + +module.exports = objectToString; diff --git a/node_modules/lodash/_overArg.js b/node_modules/lodash/_overArg.js new file mode 100644 index 0000000..651c5c5 --- /dev/null +++ b/node_modules/lodash/_overArg.js @@ -0,0 +1,15 @@ +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +module.exports = overArg; diff --git a/node_modules/lodash/_overRest.js b/node_modules/lodash/_overRest.js new file mode 100644 index 0000000..c7cdef3 --- /dev/null +++ b/node_modules/lodash/_overRest.js @@ -0,0 +1,36 @@ +var apply = require('./_apply'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ +function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; +} + +module.exports = overRest; diff --git a/node_modules/lodash/_parent.js b/node_modules/lodash/_parent.js new file mode 100644 index 0000000..f174328 --- /dev/null +++ b/node_modules/lodash/_parent.js @@ -0,0 +1,16 @@ +var baseGet = require('./_baseGet'), + baseSlice = require('./_baseSlice'); + +/** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ +function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); +} + +module.exports = parent; diff --git a/node_modules/lodash/_reEscape.js b/node_modules/lodash/_reEscape.js new file mode 100644 index 0000000..7f47eda --- /dev/null +++ b/node_modules/lodash/_reEscape.js @@ -0,0 +1,4 @@ +/** Used to match template delimiters. */ +var reEscape = /<%-([\s\S]+?)%>/g; + +module.exports = reEscape; diff --git a/node_modules/lodash/_reEvaluate.js b/node_modules/lodash/_reEvaluate.js new file mode 100644 index 0000000..6adfc31 --- /dev/null +++ b/node_modules/lodash/_reEvaluate.js @@ -0,0 +1,4 @@ +/** Used to match template delimiters. */ +var reEvaluate = /<%([\s\S]+?)%>/g; + +module.exports = reEvaluate; diff --git a/node_modules/lodash/_reInterpolate.js b/node_modules/lodash/_reInterpolate.js new file mode 100644 index 0000000..d02ff0b --- /dev/null +++ b/node_modules/lodash/_reInterpolate.js @@ -0,0 +1,4 @@ +/** Used to match template delimiters. */ +var reInterpolate = /<%=([\s\S]+?)%>/g; + +module.exports = reInterpolate; diff --git a/node_modules/lodash/_realNames.js b/node_modules/lodash/_realNames.js new file mode 100644 index 0000000..aa0d529 --- /dev/null +++ b/node_modules/lodash/_realNames.js @@ -0,0 +1,4 @@ +/** Used to lookup unminified function names. */ +var realNames = {}; + +module.exports = realNames; diff --git a/node_modules/lodash/_reorder.js b/node_modules/lodash/_reorder.js new file mode 100644 index 0000000..a3502b0 --- /dev/null +++ b/node_modules/lodash/_reorder.js @@ -0,0 +1,29 @@ +var copyArray = require('./_copyArray'), + isIndex = require('./_isIndex'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ +function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; +} + +module.exports = reorder; diff --git a/node_modules/lodash/_replaceHolders.js b/node_modules/lodash/_replaceHolders.js new file mode 100644 index 0000000..74360ec --- /dev/null +++ b/node_modules/lodash/_replaceHolders.js @@ -0,0 +1,29 @@ +/** Used as the internal argument placeholder. */ +var PLACEHOLDER = '__lodash_placeholder__'; + +/** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ +function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; +} + +module.exports = replaceHolders; diff --git a/node_modules/lodash/_root.js b/node_modules/lodash/_root.js new file mode 100644 index 0000000..d2852be --- /dev/null +++ b/node_modules/lodash/_root.js @@ -0,0 +1,9 @@ +var freeGlobal = require('./_freeGlobal'); + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +module.exports = root; diff --git a/node_modules/lodash/_safeGet.js b/node_modules/lodash/_safeGet.js new file mode 100644 index 0000000..b070897 --- /dev/null +++ b/node_modules/lodash/_safeGet.js @@ -0,0 +1,21 @@ +/** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; +} + +module.exports = safeGet; diff --git a/node_modules/lodash/_setCacheAdd.js b/node_modules/lodash/_setCacheAdd.js new file mode 100644 index 0000000..1081a74 --- /dev/null +++ b/node_modules/lodash/_setCacheAdd.js @@ -0,0 +1,19 @@ +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ +function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; +} + +module.exports = setCacheAdd; diff --git a/node_modules/lodash/_setCacheHas.js b/node_modules/lodash/_setCacheHas.js new file mode 100644 index 0000000..9a49255 --- /dev/null +++ b/node_modules/lodash/_setCacheHas.js @@ -0,0 +1,14 @@ +/** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ +function setCacheHas(value) { + return this.__data__.has(value); +} + +module.exports = setCacheHas; diff --git a/node_modules/lodash/_setData.js b/node_modules/lodash/_setData.js new file mode 100644 index 0000000..e5cf3eb --- /dev/null +++ b/node_modules/lodash/_setData.js @@ -0,0 +1,20 @@ +var baseSetData = require('./_baseSetData'), + shortOut = require('./_shortOut'); + +/** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ +var setData = shortOut(baseSetData); + +module.exports = setData; diff --git a/node_modules/lodash/_setToArray.js b/node_modules/lodash/_setToArray.js new file mode 100644 index 0000000..b87f074 --- /dev/null +++ b/node_modules/lodash/_setToArray.js @@ -0,0 +1,18 @@ +/** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ +function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; +} + +module.exports = setToArray; diff --git a/node_modules/lodash/_setToPairs.js b/node_modules/lodash/_setToPairs.js new file mode 100644 index 0000000..36ad37a --- /dev/null +++ b/node_modules/lodash/_setToPairs.js @@ -0,0 +1,18 @@ +/** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ +function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; +} + +module.exports = setToPairs; diff --git a/node_modules/lodash/_setToString.js b/node_modules/lodash/_setToString.js new file mode 100644 index 0000000..6ca8419 --- /dev/null +++ b/node_modules/lodash/_setToString.js @@ -0,0 +1,14 @@ +var baseSetToString = require('./_baseSetToString'), + shortOut = require('./_shortOut'); + +/** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var setToString = shortOut(baseSetToString); + +module.exports = setToString; diff --git a/node_modules/lodash/_setWrapToString.js b/node_modules/lodash/_setWrapToString.js new file mode 100644 index 0000000..decdc44 --- /dev/null +++ b/node_modules/lodash/_setWrapToString.js @@ -0,0 +1,21 @@ +var getWrapDetails = require('./_getWrapDetails'), + insertWrapDetails = require('./_insertWrapDetails'), + setToString = require('./_setToString'), + updateWrapDetails = require('./_updateWrapDetails'); + +/** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ +function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); +} + +module.exports = setWrapToString; diff --git a/node_modules/lodash/_shortOut.js b/node_modules/lodash/_shortOut.js new file mode 100644 index 0000000..3300a07 --- /dev/null +++ b/node_modules/lodash/_shortOut.js @@ -0,0 +1,37 @@ +/** Used to detect hot functions by number of calls within a span of milliseconds. */ +var HOT_COUNT = 800, + HOT_SPAN = 16; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeNow = Date.now; + +/** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ +function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; +} + +module.exports = shortOut; diff --git a/node_modules/lodash/_shuffleSelf.js b/node_modules/lodash/_shuffleSelf.js new file mode 100644 index 0000000..8bcc4f5 --- /dev/null +++ b/node_modules/lodash/_shuffleSelf.js @@ -0,0 +1,28 @@ +var baseRandom = require('./_baseRandom'); + +/** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ +function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; +} + +module.exports = shuffleSelf; diff --git a/node_modules/lodash/_stackClear.js b/node_modules/lodash/_stackClear.js new file mode 100644 index 0000000..ce8e5a9 --- /dev/null +++ b/node_modules/lodash/_stackClear.js @@ -0,0 +1,15 @@ +var ListCache = require('./_ListCache'); + +/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new ListCache; + this.size = 0; +} + +module.exports = stackClear; diff --git a/node_modules/lodash/_stackDelete.js b/node_modules/lodash/_stackDelete.js new file mode 100644 index 0000000..ff9887a --- /dev/null +++ b/node_modules/lodash/_stackDelete.js @@ -0,0 +1,18 @@ +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; +} + +module.exports = stackDelete; diff --git a/node_modules/lodash/_stackGet.js b/node_modules/lodash/_stackGet.js new file mode 100644 index 0000000..1cdf004 --- /dev/null +++ b/node_modules/lodash/_stackGet.js @@ -0,0 +1,14 @@ +/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +module.exports = stackGet; diff --git a/node_modules/lodash/_stackHas.js b/node_modules/lodash/_stackHas.js new file mode 100644 index 0000000..16a3ad1 --- /dev/null +++ b/node_modules/lodash/_stackHas.js @@ -0,0 +1,14 @@ +/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +module.exports = stackHas; diff --git a/node_modules/lodash/_stackSet.js b/node_modules/lodash/_stackSet.js new file mode 100644 index 0000000..b790ac5 --- /dev/null +++ b/node_modules/lodash/_stackSet.js @@ -0,0 +1,34 @@ +var ListCache = require('./_ListCache'), + Map = require('./_Map'), + MapCache = require('./_MapCache'); + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; +} + +module.exports = stackSet; diff --git a/node_modules/lodash/_strictIndexOf.js b/node_modules/lodash/_strictIndexOf.js new file mode 100644 index 0000000..0486a49 --- /dev/null +++ b/node_modules/lodash/_strictIndexOf.js @@ -0,0 +1,23 @@ +/** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; +} + +module.exports = strictIndexOf; diff --git a/node_modules/lodash/_strictLastIndexOf.js b/node_modules/lodash/_strictLastIndexOf.js new file mode 100644 index 0000000..d7310dc --- /dev/null +++ b/node_modules/lodash/_strictLastIndexOf.js @@ -0,0 +1,21 @@ +/** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; +} + +module.exports = strictLastIndexOf; diff --git a/node_modules/lodash/_stringSize.js b/node_modules/lodash/_stringSize.js new file mode 100644 index 0000000..17ef462 --- /dev/null +++ b/node_modules/lodash/_stringSize.js @@ -0,0 +1,18 @@ +var asciiSize = require('./_asciiSize'), + hasUnicode = require('./_hasUnicode'), + unicodeSize = require('./_unicodeSize'); + +/** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ +function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); +} + +module.exports = stringSize; diff --git a/node_modules/lodash/_stringToArray.js b/node_modules/lodash/_stringToArray.js new file mode 100644 index 0000000..d161158 --- /dev/null +++ b/node_modules/lodash/_stringToArray.js @@ -0,0 +1,18 @@ +var asciiToArray = require('./_asciiToArray'), + hasUnicode = require('./_hasUnicode'), + unicodeToArray = require('./_unicodeToArray'); + +/** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ +function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); +} + +module.exports = stringToArray; diff --git a/node_modules/lodash/_stringToPath.js b/node_modules/lodash/_stringToPath.js new file mode 100644 index 0000000..8f39f8a --- /dev/null +++ b/node_modules/lodash/_stringToPath.js @@ -0,0 +1,27 @@ +var memoizeCapped = require('./_memoizeCapped'); + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +module.exports = stringToPath; diff --git a/node_modules/lodash/_toKey.js b/node_modules/lodash/_toKey.js new file mode 100644 index 0000000..c6d645c --- /dev/null +++ b/node_modules/lodash/_toKey.js @@ -0,0 +1,21 @@ +var isSymbol = require('./isSymbol'); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +module.exports = toKey; diff --git a/node_modules/lodash/_toSource.js b/node_modules/lodash/_toSource.js new file mode 100644 index 0000000..a020b38 --- /dev/null +++ b/node_modules/lodash/_toSource.js @@ -0,0 +1,26 @@ +/** Used for built-in method references. */ +var funcProto = Function.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +module.exports = toSource; diff --git a/node_modules/lodash/_trimmedEndIndex.js b/node_modules/lodash/_trimmedEndIndex.js new file mode 100644 index 0000000..139439a --- /dev/null +++ b/node_modules/lodash/_trimmedEndIndex.js @@ -0,0 +1,19 @@ +/** Used to match a single whitespace character. */ +var reWhitespace = /\s/; + +/** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ +function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; +} + +module.exports = trimmedEndIndex; diff --git a/node_modules/lodash/_unescapeHtmlChar.js b/node_modules/lodash/_unescapeHtmlChar.js new file mode 100644 index 0000000..a71fecb --- /dev/null +++ b/node_modules/lodash/_unescapeHtmlChar.js @@ -0,0 +1,21 @@ +var basePropertyOf = require('./_basePropertyOf'); + +/** Used to map HTML entities to characters. */ +var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" +}; + +/** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ +var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + +module.exports = unescapeHtmlChar; diff --git a/node_modules/lodash/_unicodeSize.js b/node_modules/lodash/_unicodeSize.js new file mode 100644 index 0000000..68137ec --- /dev/null +++ b/node_modules/lodash/_unicodeSize.js @@ -0,0 +1,44 @@ +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; + +/** Used to compose unicode capture groups. */ +var rsAstral = '[' + rsAstralRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsZWJ = '\\u200d'; + +/** Used to compose unicode regexes. */ +var reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + +/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ +var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + +/** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ +function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; +} + +module.exports = unicodeSize; diff --git a/node_modules/lodash/_unicodeToArray.js b/node_modules/lodash/_unicodeToArray.js new file mode 100644 index 0000000..2a725c0 --- /dev/null +++ b/node_modules/lodash/_unicodeToArray.js @@ -0,0 +1,40 @@ +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; + +/** Used to compose unicode capture groups. */ +var rsAstral = '[' + rsAstralRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsZWJ = '\\u200d'; + +/** Used to compose unicode regexes. */ +var reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + +/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ +var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + +/** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ +function unicodeToArray(string) { + return string.match(reUnicode) || []; +} + +module.exports = unicodeToArray; diff --git a/node_modules/lodash/_unicodeWords.js b/node_modules/lodash/_unicodeWords.js new file mode 100644 index 0000000..e72e6e0 --- /dev/null +++ b/node_modules/lodash/_unicodeWords.js @@ -0,0 +1,69 @@ +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + +/** Used to compose unicode capture groups. */ +var rsApos = "['\u2019]", + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + +/** Used to compose unicode regexes. */ +var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq; + +/** Used to match complex or compound words. */ +var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji +].join('|'), 'g'); + +/** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ +function unicodeWords(string) { + return string.match(reUnicodeWord) || []; +} + +module.exports = unicodeWords; diff --git a/node_modules/lodash/_updateWrapDetails.js b/node_modules/lodash/_updateWrapDetails.js new file mode 100644 index 0000000..8759fbd --- /dev/null +++ b/node_modules/lodash/_updateWrapDetails.js @@ -0,0 +1,46 @@ +var arrayEach = require('./_arrayEach'), + arrayIncludes = require('./_arrayIncludes'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + +/** Used to associate wrap methods with their bit flags. */ +var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] +]; + +/** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ +function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); +} + +module.exports = updateWrapDetails; diff --git a/node_modules/lodash/_wrapperClone.js b/node_modules/lodash/_wrapperClone.js new file mode 100644 index 0000000..7bb58a2 --- /dev/null +++ b/node_modules/lodash/_wrapperClone.js @@ -0,0 +1,23 @@ +var LazyWrapper = require('./_LazyWrapper'), + LodashWrapper = require('./_LodashWrapper'), + copyArray = require('./_copyArray'); + +/** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ +function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; +} + +module.exports = wrapperClone; diff --git a/node_modules/lodash/add.js b/node_modules/lodash/add.js new file mode 100644 index 0000000..f069515 --- /dev/null +++ b/node_modules/lodash/add.js @@ -0,0 +1,22 @@ +var createMathOperation = require('./_createMathOperation'); + +/** + * Adds two numbers. + * + * @static + * @memberOf _ + * @since 3.4.0 + * @category Math + * @param {number} augend The first number in an addition. + * @param {number} addend The second number in an addition. + * @returns {number} Returns the total. + * @example + * + * _.add(6, 4); + * // => 10 + */ +var add = createMathOperation(function(augend, addend) { + return augend + addend; +}, 0); + +module.exports = add; diff --git a/node_modules/lodash/after.js b/node_modules/lodash/after.js new file mode 100644 index 0000000..3900c97 --- /dev/null +++ b/node_modules/lodash/after.js @@ -0,0 +1,42 @@ +var toInteger = require('./toInteger'); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ +function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; +} + +module.exports = after; diff --git a/node_modules/lodash/array.js b/node_modules/lodash/array.js new file mode 100644 index 0000000..af688d3 --- /dev/null +++ b/node_modules/lodash/array.js @@ -0,0 +1,67 @@ +module.exports = { + 'chunk': require('./chunk'), + 'compact': require('./compact'), + 'concat': require('./concat'), + 'difference': require('./difference'), + 'differenceBy': require('./differenceBy'), + 'differenceWith': require('./differenceWith'), + 'drop': require('./drop'), + 'dropRight': require('./dropRight'), + 'dropRightWhile': require('./dropRightWhile'), + 'dropWhile': require('./dropWhile'), + 'fill': require('./fill'), + 'findIndex': require('./findIndex'), + 'findLastIndex': require('./findLastIndex'), + 'first': require('./first'), + 'flatten': require('./flatten'), + 'flattenDeep': require('./flattenDeep'), + 'flattenDepth': require('./flattenDepth'), + 'fromPairs': require('./fromPairs'), + 'head': require('./head'), + 'indexOf': require('./indexOf'), + 'initial': require('./initial'), + 'intersection': require('./intersection'), + 'intersectionBy': require('./intersectionBy'), + 'intersectionWith': require('./intersectionWith'), + 'join': require('./join'), + 'last': require('./last'), + 'lastIndexOf': require('./lastIndexOf'), + 'nth': require('./nth'), + 'pull': require('./pull'), + 'pullAll': require('./pullAll'), + 'pullAllBy': require('./pullAllBy'), + 'pullAllWith': require('./pullAllWith'), + 'pullAt': require('./pullAt'), + 'remove': require('./remove'), + 'reverse': require('./reverse'), + 'slice': require('./slice'), + 'sortedIndex': require('./sortedIndex'), + 'sortedIndexBy': require('./sortedIndexBy'), + 'sortedIndexOf': require('./sortedIndexOf'), + 'sortedLastIndex': require('./sortedLastIndex'), + 'sortedLastIndexBy': require('./sortedLastIndexBy'), + 'sortedLastIndexOf': require('./sortedLastIndexOf'), + 'sortedUniq': require('./sortedUniq'), + 'sortedUniqBy': require('./sortedUniqBy'), + 'tail': require('./tail'), + 'take': require('./take'), + 'takeRight': require('./takeRight'), + 'takeRightWhile': require('./takeRightWhile'), + 'takeWhile': require('./takeWhile'), + 'union': require('./union'), + 'unionBy': require('./unionBy'), + 'unionWith': require('./unionWith'), + 'uniq': require('./uniq'), + 'uniqBy': require('./uniqBy'), + 'uniqWith': require('./uniqWith'), + 'unzip': require('./unzip'), + 'unzipWith': require('./unzipWith'), + 'without': require('./without'), + 'xor': require('./xor'), + 'xorBy': require('./xorBy'), + 'xorWith': require('./xorWith'), + 'zip': require('./zip'), + 'zipObject': require('./zipObject'), + 'zipObjectDeep': require('./zipObjectDeep'), + 'zipWith': require('./zipWith') +}; diff --git a/node_modules/lodash/ary.js b/node_modules/lodash/ary.js new file mode 100644 index 0000000..70c87d0 --- /dev/null +++ b/node_modules/lodash/ary.js @@ -0,0 +1,29 @@ +var createWrap = require('./_createWrap'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_ARY_FLAG = 128; + +/** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ +function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); +} + +module.exports = ary; diff --git a/node_modules/lodash/assign.js b/node_modules/lodash/assign.js new file mode 100644 index 0000000..909db26 --- /dev/null +++ b/node_modules/lodash/assign.js @@ -0,0 +1,58 @@ +var assignValue = require('./_assignValue'), + copyObject = require('./_copyObject'), + createAssigner = require('./_createAssigner'), + isArrayLike = require('./isArrayLike'), + isPrototype = require('./_isPrototype'), + keys = require('./keys'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ +var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } +}); + +module.exports = assign; diff --git a/node_modules/lodash/assignIn.js b/node_modules/lodash/assignIn.js new file mode 100644 index 0000000..e663473 --- /dev/null +++ b/node_modules/lodash/assignIn.js @@ -0,0 +1,40 @@ +var copyObject = require('./_copyObject'), + createAssigner = require('./_createAssigner'), + keysIn = require('./keysIn'); + +/** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ +var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); +}); + +module.exports = assignIn; diff --git a/node_modules/lodash/assignInWith.js b/node_modules/lodash/assignInWith.js new file mode 100644 index 0000000..68fcc0b --- /dev/null +++ b/node_modules/lodash/assignInWith.js @@ -0,0 +1,38 @@ +var copyObject = require('./_copyObject'), + createAssigner = require('./_createAssigner'), + keysIn = require('./keysIn'); + +/** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ +var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); +}); + +module.exports = assignInWith; diff --git a/node_modules/lodash/assignWith.js b/node_modules/lodash/assignWith.js new file mode 100644 index 0000000..7dc6c76 --- /dev/null +++ b/node_modules/lodash/assignWith.js @@ -0,0 +1,37 @@ +var copyObject = require('./_copyObject'), + createAssigner = require('./_createAssigner'), + keys = require('./keys'); + +/** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ +var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); +}); + +module.exports = assignWith; diff --git a/node_modules/lodash/at.js b/node_modules/lodash/at.js new file mode 100644 index 0000000..781ee9e --- /dev/null +++ b/node_modules/lodash/at.js @@ -0,0 +1,23 @@ +var baseAt = require('./_baseAt'), + flatRest = require('./_flatRest'); + +/** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ +var at = flatRest(baseAt); + +module.exports = at; diff --git a/node_modules/lodash/attempt.js b/node_modules/lodash/attempt.js new file mode 100644 index 0000000..624d015 --- /dev/null +++ b/node_modules/lodash/attempt.js @@ -0,0 +1,35 @@ +var apply = require('./_apply'), + baseRest = require('./_baseRest'), + isError = require('./isError'); + +/** + * Attempts to invoke `func`, returning either the result or the caught error + * object. Any additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Util + * @param {Function} func The function to attempt. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {*} Returns the `func` result or error object. + * @example + * + * // Avoid throwing errors for invalid selectors. + * var elements = _.attempt(function(selector) { + * return document.querySelectorAll(selector); + * }, '>_>'); + * + * if (_.isError(elements)) { + * elements = []; + * } + */ +var attempt = baseRest(function(func, args) { + try { + return apply(func, undefined, args); + } catch (e) { + return isError(e) ? e : new Error(e); + } +}); + +module.exports = attempt; diff --git a/node_modules/lodash/before.js b/node_modules/lodash/before.js new file mode 100644 index 0000000..a3e0a16 --- /dev/null +++ b/node_modules/lodash/before.js @@ -0,0 +1,40 @@ +var toInteger = require('./toInteger'); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ +function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; +} + +module.exports = before; diff --git a/node_modules/lodash/bind.js b/node_modules/lodash/bind.js new file mode 100644 index 0000000..b1076e9 --- /dev/null +++ b/node_modules/lodash/bind.js @@ -0,0 +1,57 @@ +var baseRest = require('./_baseRest'), + createWrap = require('./_createWrap'), + getHolder = require('./_getHolder'), + replaceHolders = require('./_replaceHolders'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_PARTIAL_FLAG = 32; + +/** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ +var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); +}); + +// Assign default placeholders. +bind.placeholder = {}; + +module.exports = bind; diff --git a/node_modules/lodash/bindAll.js b/node_modules/lodash/bindAll.js new file mode 100644 index 0000000..a35706d --- /dev/null +++ b/node_modules/lodash/bindAll.js @@ -0,0 +1,41 @@ +var arrayEach = require('./_arrayEach'), + baseAssignValue = require('./_baseAssignValue'), + bind = require('./bind'), + flatRest = require('./_flatRest'), + toKey = require('./_toKey'); + +/** + * Binds methods of an object to the object itself, overwriting the existing + * method. + * + * **Note:** This method doesn't set the "length" property of bound functions. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {Object} object The object to bind and assign the bound methods to. + * @param {...(string|string[])} methodNames The object method names to bind. + * @returns {Object} Returns `object`. + * @example + * + * var view = { + * 'label': 'docs', + * 'click': function() { + * console.log('clicked ' + this.label); + * } + * }; + * + * _.bindAll(view, ['click']); + * jQuery(element).on('click', view.click); + * // => Logs 'clicked docs' when clicked. + */ +var bindAll = flatRest(function(object, methodNames) { + arrayEach(methodNames, function(key) { + key = toKey(key); + baseAssignValue(object, key, bind(object[key], object)); + }); + return object; +}); + +module.exports = bindAll; diff --git a/node_modules/lodash/bindKey.js b/node_modules/lodash/bindKey.js new file mode 100644 index 0000000..f7fd64c --- /dev/null +++ b/node_modules/lodash/bindKey.js @@ -0,0 +1,68 @@ +var baseRest = require('./_baseRest'), + createWrap = require('./_createWrap'), + getHolder = require('./_getHolder'), + replaceHolders = require('./_replaceHolders'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_PARTIAL_FLAG = 32; + +/** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ +var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); +}); + +// Assign default placeholders. +bindKey.placeholder = {}; + +module.exports = bindKey; diff --git a/node_modules/lodash/camelCase.js b/node_modules/lodash/camelCase.js new file mode 100644 index 0000000..d7390de --- /dev/null +++ b/node_modules/lodash/camelCase.js @@ -0,0 +1,29 @@ +var capitalize = require('./capitalize'), + createCompounder = require('./_createCompounder'); + +/** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ +var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); +}); + +module.exports = camelCase; diff --git a/node_modules/lodash/capitalize.js b/node_modules/lodash/capitalize.js new file mode 100644 index 0000000..3e1600e --- /dev/null +++ b/node_modules/lodash/capitalize.js @@ -0,0 +1,23 @@ +var toString = require('./toString'), + upperFirst = require('./upperFirst'); + +/** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ +function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); +} + +module.exports = capitalize; diff --git a/node_modules/lodash/castArray.js b/node_modules/lodash/castArray.js new file mode 100644 index 0000000..e470bdb --- /dev/null +++ b/node_modules/lodash/castArray.js @@ -0,0 +1,44 @@ +var isArray = require('./isArray'); + +/** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ +function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; +} + +module.exports = castArray; diff --git a/node_modules/lodash/ceil.js b/node_modules/lodash/ceil.js new file mode 100644 index 0000000..56c8722 --- /dev/null +++ b/node_modules/lodash/ceil.js @@ -0,0 +1,26 @@ +var createRound = require('./_createRound'); + +/** + * Computes `number` rounded up to `precision`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Math + * @param {number} number The number to round up. + * @param {number} [precision=0] The precision to round up to. + * @returns {number} Returns the rounded up number. + * @example + * + * _.ceil(4.006); + * // => 5 + * + * _.ceil(6.004, 2); + * // => 6.01 + * + * _.ceil(6040, -2); + * // => 6100 + */ +var ceil = createRound('ceil'); + +module.exports = ceil; diff --git a/node_modules/lodash/chain.js b/node_modules/lodash/chain.js new file mode 100644 index 0000000..f6cd647 --- /dev/null +++ b/node_modules/lodash/chain.js @@ -0,0 +1,38 @@ +var lodash = require('./wrapperLodash'); + +/** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ +function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; +} + +module.exports = chain; diff --git a/node_modules/lodash/chunk.js b/node_modules/lodash/chunk.js new file mode 100644 index 0000000..5b562fe --- /dev/null +++ b/node_modules/lodash/chunk.js @@ -0,0 +1,50 @@ +var baseSlice = require('./_baseSlice'), + isIterateeCall = require('./_isIterateeCall'), + toInteger = require('./toInteger'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeCeil = Math.ceil, + nativeMax = Math.max; + +/** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ +function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; +} + +module.exports = chunk; diff --git a/node_modules/lodash/clamp.js b/node_modules/lodash/clamp.js new file mode 100644 index 0000000..91a72c9 --- /dev/null +++ b/node_modules/lodash/clamp.js @@ -0,0 +1,39 @@ +var baseClamp = require('./_baseClamp'), + toNumber = require('./toNumber'); + +/** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ +function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); +} + +module.exports = clamp; diff --git a/node_modules/lodash/clone.js b/node_modules/lodash/clone.js new file mode 100644 index 0000000..dd439d6 --- /dev/null +++ b/node_modules/lodash/clone.js @@ -0,0 +1,36 @@ +var baseClone = require('./_baseClone'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_SYMBOLS_FLAG = 4; + +/** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ +function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); +} + +module.exports = clone; diff --git a/node_modules/lodash/cloneDeep.js b/node_modules/lodash/cloneDeep.js new file mode 100644 index 0000000..4425fbe --- /dev/null +++ b/node_modules/lodash/cloneDeep.js @@ -0,0 +1,29 @@ +var baseClone = require('./_baseClone'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1, + CLONE_SYMBOLS_FLAG = 4; + +/** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ +function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); +} + +module.exports = cloneDeep; diff --git a/node_modules/lodash/cloneDeepWith.js b/node_modules/lodash/cloneDeepWith.js new file mode 100644 index 0000000..fd9c6c0 --- /dev/null +++ b/node_modules/lodash/cloneDeepWith.js @@ -0,0 +1,40 @@ +var baseClone = require('./_baseClone'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1, + CLONE_SYMBOLS_FLAG = 4; + +/** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ +function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); +} + +module.exports = cloneDeepWith; diff --git a/node_modules/lodash/cloneWith.js b/node_modules/lodash/cloneWith.js new file mode 100644 index 0000000..d2f4e75 --- /dev/null +++ b/node_modules/lodash/cloneWith.js @@ -0,0 +1,42 @@ +var baseClone = require('./_baseClone'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_SYMBOLS_FLAG = 4; + +/** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ +function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); +} + +module.exports = cloneWith; diff --git a/node_modules/lodash/collection.js b/node_modules/lodash/collection.js new file mode 100644 index 0000000..77fe837 --- /dev/null +++ b/node_modules/lodash/collection.js @@ -0,0 +1,30 @@ +module.exports = { + 'countBy': require('./countBy'), + 'each': require('./each'), + 'eachRight': require('./eachRight'), + 'every': require('./every'), + 'filter': require('./filter'), + 'find': require('./find'), + 'findLast': require('./findLast'), + 'flatMap': require('./flatMap'), + 'flatMapDeep': require('./flatMapDeep'), + 'flatMapDepth': require('./flatMapDepth'), + 'forEach': require('./forEach'), + 'forEachRight': require('./forEachRight'), + 'groupBy': require('./groupBy'), + 'includes': require('./includes'), + 'invokeMap': require('./invokeMap'), + 'keyBy': require('./keyBy'), + 'map': require('./map'), + 'orderBy': require('./orderBy'), + 'partition': require('./partition'), + 'reduce': require('./reduce'), + 'reduceRight': require('./reduceRight'), + 'reject': require('./reject'), + 'sample': require('./sample'), + 'sampleSize': require('./sampleSize'), + 'shuffle': require('./shuffle'), + 'size': require('./size'), + 'some': require('./some'), + 'sortBy': require('./sortBy') +}; diff --git a/node_modules/lodash/commit.js b/node_modules/lodash/commit.js new file mode 100644 index 0000000..fe4db71 --- /dev/null +++ b/node_modules/lodash/commit.js @@ -0,0 +1,33 @@ +var LodashWrapper = require('./_LodashWrapper'); + +/** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ +function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); +} + +module.exports = wrapperCommit; diff --git a/node_modules/lodash/compact.js b/node_modules/lodash/compact.js new file mode 100644 index 0000000..031fab4 --- /dev/null +++ b/node_modules/lodash/compact.js @@ -0,0 +1,31 @@ +/** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ +function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; +} + +module.exports = compact; diff --git a/node_modules/lodash/concat.js b/node_modules/lodash/concat.js new file mode 100644 index 0000000..1da48a4 --- /dev/null +++ b/node_modules/lodash/concat.js @@ -0,0 +1,43 @@ +var arrayPush = require('./_arrayPush'), + baseFlatten = require('./_baseFlatten'), + copyArray = require('./_copyArray'), + isArray = require('./isArray'); + +/** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ +function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); +} + +module.exports = concat; diff --git a/node_modules/lodash/cond.js b/node_modules/lodash/cond.js new file mode 100644 index 0000000..6455598 --- /dev/null +++ b/node_modules/lodash/cond.js @@ -0,0 +1,60 @@ +var apply = require('./_apply'), + arrayMap = require('./_arrayMap'), + baseIteratee = require('./_baseIteratee'), + baseRest = require('./_baseRest'); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that iterates over `pairs` and invokes the corresponding + * function of the first predicate to return truthy. The predicate-function + * pairs are invoked with the `this` binding and arguments of the created + * function. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Util + * @param {Array} pairs The predicate-function pairs. + * @returns {Function} Returns the new composite function. + * @example + * + * var func = _.cond([ + * [_.matches({ 'a': 1 }), _.constant('matches A')], + * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')], + * [_.stubTrue, _.constant('no match')] + * ]); + * + * func({ 'a': 1, 'b': 2 }); + * // => 'matches A' + * + * func({ 'a': 0, 'b': 1 }); + * // => 'matches B' + * + * func({ 'a': '1', 'b': '2' }); + * // => 'no match' + */ +function cond(pairs) { + var length = pairs == null ? 0 : pairs.length, + toIteratee = baseIteratee; + + pairs = !length ? [] : arrayMap(pairs, function(pair) { + if (typeof pair[1] != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return [toIteratee(pair[0]), pair[1]]; + }); + + return baseRest(function(args) { + var index = -1; + while (++index < length) { + var pair = pairs[index]; + if (apply(pair[0], this, args)) { + return apply(pair[1], this, args); + } + } + }); +} + +module.exports = cond; diff --git a/node_modules/lodash/conforms.js b/node_modules/lodash/conforms.js new file mode 100644 index 0000000..5501a94 --- /dev/null +++ b/node_modules/lodash/conforms.js @@ -0,0 +1,35 @@ +var baseClone = require('./_baseClone'), + baseConforms = require('./_baseConforms'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1; + +/** + * Creates a function that invokes the predicate properties of `source` with + * the corresponding property values of a given object, returning `true` if + * all predicates return truthy, else `false`. + * + * **Note:** The created function is equivalent to `_.conformsTo` with + * `source` partially applied. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Util + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + * @example + * + * var objects = [ + * { 'a': 2, 'b': 1 }, + * { 'a': 1, 'b': 2 } + * ]; + * + * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } })); + * // => [{ 'a': 1, 'b': 2 }] + */ +function conforms(source) { + return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); +} + +module.exports = conforms; diff --git a/node_modules/lodash/conformsTo.js b/node_modules/lodash/conformsTo.js new file mode 100644 index 0000000..b8a93eb --- /dev/null +++ b/node_modules/lodash/conformsTo.js @@ -0,0 +1,32 @@ +var baseConformsTo = require('./_baseConformsTo'), + keys = require('./keys'); + +/** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ +function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); +} + +module.exports = conformsTo; diff --git a/node_modules/lodash/constant.js b/node_modules/lodash/constant.js new file mode 100644 index 0000000..655ece3 --- /dev/null +++ b/node_modules/lodash/constant.js @@ -0,0 +1,26 @@ +/** + * Creates a function that returns `value`. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. + * @example + * + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true + */ +function constant(value) { + return function() { + return value; + }; +} + +module.exports = constant; diff --git a/node_modules/lodash/core.js b/node_modules/lodash/core.js new file mode 100644 index 0000000..be1d567 --- /dev/null +++ b/node_modules/lodash/core.js @@ -0,0 +1,3877 @@ +/** + * @license + * Lodash (Custom Build) + * Build: `lodash core -o ./dist/lodash.core.js` + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.21'; + + /** Error message constants. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_PARTIAL_FLAG = 32; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + numberTag = '[object Number]', + objectTag = '[object Object]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; + + /** Used to match HTML entities and HTML characters. */ + var reUnescapedHtml = /[&<>"']/g, + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /*--------------------------------------------------------------------------*/ + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + array.push.apply(array, values); + return array; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return baseMap(props, function(key) { + return object[key]; + }); + } + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /*--------------------------------------------------------------------------*/ + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + objectProto = Object.prototype; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Built-in value references. */ + var objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeIsFinite = root.isFinite, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + return value instanceof LodashWrapper + ? value + : new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + } + + LodashWrapper.prototype = baseCreate(lodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + object[key] = value; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !false) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return baseFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + return objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + var baseIsArguments = noop; + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : baseGetTag(object), + othTag = othIsArr ? arrayTag : baseGetTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + stack || (stack = []); + var objStack = find(stack, function(entry) { + return entry[0] == object; + }); + var othStack = find(stack, function(entry) { + return entry[0] == other; + }); + if (objStack && othStack) { + return objStack[1] == other; + } + stack.push([object, other]); + stack.push([other, object]); + if (isSameTag && !objIsObj) { + var result = (objIsArr) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + stack.pop(); + return result; + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + stack.pop(); + return result; + } + } + if (!isSameTag) { + return false; + } + var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack); + stack.pop(); + return result; + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(func) { + if (typeof func == 'function') { + return func; + } + if (func == null) { + return identity; + } + return (typeof func == 'object' ? baseMatches : baseProperty)(func); + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var props = nativeKeys(source); + return function(object) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length]; + if (!(key in object && + baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG) + )) { + return false; + } + } + return true; + }; + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, props) { + object = Object(object); + return reduce(props, function(result, key) { + if (key in object) { + result[key] = object[key]; + } + return result; + }, {}); + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source) { + return baseSlice(source, 0, source.length); + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + return reduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = false; + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = false; + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = baseIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return fn.apply(isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined; + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + var compared; + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!baseSome(other, function(othValue, othIndex) { + if (!indexOf(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + var compared; + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return func.apply(this, otherArgs); + }; + } + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = identity; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + return baseFilter(array, Boolean); + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, baseIteratee(predicate, 3), index); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (typeof fromIndex == 'number') { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; + } else { + fromIndex = 0; + } + var index = (fromIndex || 0) - 1, + isReflexive = value === value; + + while (++index < length) { + var other = array[index]; + if ((isReflexive ? other === value : other !== other)) { + return index; + } + } + return -1; + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + start = start == null ? 0 : +start; + end = end === undefined ? length : +end; + return length ? baseSlice(array, start, end) : []; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + predicate = guard ? undefined : predicate; + return baseEvery(collection, baseIteratee(predicate)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ + function filter(collection, predicate) { + return baseFilter(collection, baseIteratee(predicate)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + return baseEach(collection, baseIteratee(iteratee)); + } + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + return baseMap(collection, baseIteratee(iteratee)); + } + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + collection = isArrayLike(collection) ? collection : nativeKeys(collection); + return collection.length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + predicate = guard ? undefined : predicate; + return baseSome(collection, baseIteratee(predicate)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + */ + function sortBy(collection, iteratee) { + var index = 0; + iteratee = baseIteratee(iteratee); + + return baseMap(baseMap(collection, function(value, key, collection) { + return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) }; + }).sort(function(object, other) { + return compareAscending(object.criteria, other.criteria) || (object.index - other.index); + }), baseProperty('value')); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials); + }); + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + if (!isObject(value)) { + return value; + } + return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = baseIsDate; + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (isArrayLike(value) && + (isArray(value) || isString(value) || + isFunction(value.splice) || isArguments(value))) { + return !value.length; + } + return !nativeKeys(value).length; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = baseIsRegExp; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!isArrayLike(value)) { + return values(value); + } + return value.length ? copyArray(value) : []; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + var toInteger = Number; + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + var toNumber = Number; + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + if (typeof value == 'string') { + return value; + } + return value == null ? '' : (value + ''); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + copyObject(source, nativeKeys(source), object); + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, nativeKeysIn(source), object); + }); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : assign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; + }); + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasOwnProperty.call(object, path); + } + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + var keys = nativeKeys; + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + var keysIn = nativeKeysIn; + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + var value = object == null ? undefined : object[path]; + if (value === undefined) { + value = defaultValue; + } + return isFunction(value) ? value.call(object) : value; + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /*------------------------------------------------------------------------*/ + + /** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ + function identity(value) { + return value; + } + + /** + * Creates a function that invokes `func` with the arguments of the created + * function. If `func` is a property name, the created function returns the + * property value for a given element. If `func` is an array or object, the + * created function returns `true` for elements that contain the equivalent + * source properties, otherwise it returns `false`. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Util + * @param {*} [func=_.identity] The value to convert to a callback. + * @returns {Function} Returns the callback. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true })); + * // => [{ 'user': 'barney', 'age': 36, 'active': true }] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, _.iteratee(['user', 'fred'])); + * // => [{ 'user': 'fred', 'age': 40 }] + * + * // The `_.property` iteratee shorthand. + * _.map(users, _.iteratee('user')); + * // => ['barney', 'fred'] + * + * // Create custom iteratee shorthands. + * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) { + * return !_.isRegExp(func) ? iteratee(func) : function(string) { + * return func.test(string); + * }; + * }); + * + * _.filter(['abc', 'def'], /ef/); + * // => ['def'] + */ + var iteratee = baseIteratee; + + /** + * Creates a function that performs a partial deep comparison between a given + * object and `source`, returning `true` if the given object has equivalent + * property values, else `false`. + * + * **Note:** The created function is equivalent to `_.isMatch` with `source` + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * **Note:** Multiple values can be checked by combining several matchers + * using `_.overSome` + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Util + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + * @example + * + * var objects = [ + * { 'a': 1, 'b': 2, 'c': 3 }, + * { 'a': 4, 'b': 5, 'c': 6 } + * ]; + * + * _.filter(objects, _.matches({ 'a': 4, 'c': 6 })); + * // => [{ 'a': 4, 'b': 5, 'c': 6 }] + * + * // Checking for several possible values + * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })])); + * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }] + */ + function matches(source) { + return baseMatches(assign({}, source)); + } + + /** + * Adds all own enumerable string keyed function properties of a source + * object to the destination object. If `object` is a function, then methods + * are added to its prototype as well. + * + * **Note:** Use `_.runInContext` to create a pristine `lodash` function to + * avoid conflicts caused by modifying the original. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {Function|Object} [object=lodash] The destination object. + * @param {Object} source The object of functions to add. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.chain=true] Specify whether mixins are chainable. + * @returns {Function|Object} Returns `object`. + * @example + * + * function vowels(string) { + * return _.filter(string, function(v) { + * return /[aeiou]/i.test(v); + * }); + * } + * + * _.mixin({ 'vowels': vowels }); + * _.vowels('fred'); + * // => ['e'] + * + * _('fred').vowels().value(); + * // => ['e'] + * + * _.mixin({ 'vowels': vowels }, { 'chain': false }); + * _('fred').vowels(); + * // => ['e'] + */ + function mixin(object, source, options) { + var props = keys(source), + methodNames = baseFunctions(source, props); + + if (options == null && + !(isObject(source) && (methodNames.length || !props.length))) { + options = source; + source = object; + object = this; + methodNames = baseFunctions(source, keys(source)); + } + var chain = !(isObject(options) && 'chain' in options) || !!options.chain, + isFunc = isFunction(object); + + baseEach(methodNames, function(methodName) { + var func = source[methodName]; + object[methodName] = func; + if (isFunc) { + object.prototype[methodName] = function() { + var chainAll = this.__chain__; + if (chain || chainAll) { + var result = object(this.__wrapped__), + actions = result.__actions__ = copyArray(this.__actions__); + + actions.push({ 'func': func, 'args': arguments, 'thisArg': object }); + result.__chain__ = chainAll; + return result; + } + return func.apply(object, arrayPush([this.value()], arguments)); + }; + } + }); + + return object; + } + + /** + * Reverts the `_` variable to its previous value and returns a reference to + * the `lodash` function. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @returns {Function} Returns the `lodash` function. + * @example + * + * var lodash = _.noConflict(); + */ + function noConflict() { + if (root._ === this) { + root._ = oldDash; + } + return this; + } + + /** + * This method returns `undefined`. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Util + * @example + * + * _.times(2, _.noop); + * // => [undefined, undefined] + */ + function noop() { + // No operation performed. + } + + /** + * Generates a unique ID. If `prefix` is given, the ID is appended to it. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {string} [prefix=''] The value to prefix the ID with. + * @returns {string} Returns the unique ID. + * @example + * + * _.uniqueId('contact_'); + * // => 'contact_104' + * + * _.uniqueId(); + * // => '105' + */ + function uniqueId(prefix) { + var id = ++idCounter; + return toString(prefix) + id; + } + + /*------------------------------------------------------------------------*/ + + /** + * Computes the maximum value of `array`. If `array` is empty or falsey, + * `undefined` is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Math + * @param {Array} array The array to iterate over. + * @returns {*} Returns the maximum value. + * @example + * + * _.max([4, 2, 8, 6]); + * // => 8 + * + * _.max([]); + * // => undefined + */ + function max(array) { + return (array && array.length) + ? baseExtremum(array, identity, baseGt) + : undefined; + } + + /** + * Computes the minimum value of `array`. If `array` is empty or falsey, + * `undefined` is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Math + * @param {Array} array The array to iterate over. + * @returns {*} Returns the minimum value. + * @example + * + * _.min([4, 2, 8, 6]); + * // => 2 + * + * _.min([]); + * // => undefined + */ + function min(array) { + return (array && array.length) + ? baseExtremum(array, identity, baseLt) + : undefined; + } + + /*------------------------------------------------------------------------*/ + + // Add methods that return wrapped values in chain sequences. + lodash.assignIn = assignIn; + lodash.before = before; + lodash.bind = bind; + lodash.chain = chain; + lodash.compact = compact; + lodash.concat = concat; + lodash.create = create; + lodash.defaults = defaults; + lodash.defer = defer; + lodash.delay = delay; + lodash.filter = filter; + lodash.flatten = flatten; + lodash.flattenDeep = flattenDeep; + lodash.iteratee = iteratee; + lodash.keys = keys; + lodash.map = map; + lodash.matches = matches; + lodash.mixin = mixin; + lodash.negate = negate; + lodash.once = once; + lodash.pick = pick; + lodash.slice = slice; + lodash.sortBy = sortBy; + lodash.tap = tap; + lodash.thru = thru; + lodash.toArray = toArray; + lodash.values = values; + + // Add aliases. + lodash.extend = assignIn; + + // Add methods to `lodash.prototype`. + mixin(lodash, lodash); + + /*------------------------------------------------------------------------*/ + + // Add methods that return unwrapped values in chain sequences. + lodash.clone = clone; + lodash.escape = escape; + lodash.every = every; + lodash.find = find; + lodash.forEach = forEach; + lodash.has = has; + lodash.head = head; + lodash.identity = identity; + lodash.indexOf = indexOf; + lodash.isArguments = isArguments; + lodash.isArray = isArray; + lodash.isBoolean = isBoolean; + lodash.isDate = isDate; + lodash.isEmpty = isEmpty; + lodash.isEqual = isEqual; + lodash.isFinite = isFinite; + lodash.isFunction = isFunction; + lodash.isNaN = isNaN; + lodash.isNull = isNull; + lodash.isNumber = isNumber; + lodash.isObject = isObject; + lodash.isRegExp = isRegExp; + lodash.isString = isString; + lodash.isUndefined = isUndefined; + lodash.last = last; + lodash.max = max; + lodash.min = min; + lodash.noConflict = noConflict; + lodash.noop = noop; + lodash.reduce = reduce; + lodash.result = result; + lodash.size = size; + lodash.some = some; + lodash.uniqueId = uniqueId; + + // Add aliases. + lodash.each = forEach; + lodash.first = head; + + mixin(lodash, (function() { + var source = {}; + baseForOwn(lodash, function(func, methodName) { + if (!hasOwnProperty.call(lodash.prototype, methodName)) { + source[methodName] = func; + } + }); + return source; + }()), { 'chain': false }); + + /*------------------------------------------------------------------------*/ + + /** + * The semantic version number. + * + * @static + * @memberOf _ + * @type {string} + */ + lodash.VERSION = VERSION; + + // Add `Array` methods to `lodash.prototype`. + baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) { + var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName], + chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', + retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName); + + lodash.prototype[methodName] = function() { + var args = arguments; + if (retUnwrapped && !this.__chain__) { + var value = this.value(); + return func.apply(isArray(value) ? value : [], args); + } + return this[chainName](function(value) { + return func.apply(isArray(value) ? value : [], args); + }); + }; + }); + + // Add chain sequence methods to the `lodash` wrapper. + lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; + + /*--------------------------------------------------------------------------*/ + + // Some AMD build optimizers, like r.js, check for condition patterns like: + if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { + // Expose Lodash on the global object to prevent errors when Lodash is + // loaded by a script tag in the presence of an AMD loader. + // See http://requirejs.org/docs/errors.html#mismatch for more details. + // Use `_.noConflict` to remove Lodash from the global object. + root._ = lodash; + + // Define as an anonymous module so, through path mapping, it can be + // referenced as the "underscore" module. + define(function() { + return lodash; + }); + } + // Check for `exports` after `define` in case a build optimizer adds it. + else if (freeModule) { + // Export for Node.js. + (freeModule.exports = lodash)._ = lodash; + // Export for CommonJS support. + freeExports._ = lodash; + } + else { + // Export to the global object. + root._ = lodash; + } +}.call(this)); diff --git a/node_modules/lodash/core.min.js b/node_modules/lodash/core.min.js new file mode 100644 index 0000000..e425e4d --- /dev/null +++ b/node_modules/lodash/core.min.js @@ -0,0 +1,29 @@ +/** + * @license + * Lodash (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE + * Build: `lodash core -o ./dist/lodash.core.js` + */ +;(function(){function n(n){return H(n)&&pn.call(n,"callee")&&!yn.call(n,"callee")}function t(n,t){return n.push.apply(n,t),n}function r(n){return function(t){return null==t?Z:t[n]}}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return j(t,function(t){return n[t]})}function o(n){return n instanceof i?n:new i(n)}function i(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function c(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function"); +return setTimeout(function(){n.apply(Z,r)},t)}function f(n,t){var r=true;return mn(n,function(n,e,u){return r=!!t(n,e,u)}),r}function a(n,t,r){for(var e=-1,u=n.length;++et}function b(n,t,r,e,u){return n===t||(null==n||null==t||!H(n)&&!H(t)?n!==n&&t!==t:y(n,t,r,e,b,u))}function y(n,t,r,e,u,o){var i=Nn(n),c=Nn(t),f=i?"[object Array]":hn.call(n),a=c?"[object Array]":hn.call(t),f="[object Arguments]"==f?"[object Object]":f,a="[object Arguments]"==a?"[object Object]":a,l="[object Object]"==f,c="[object Object]"==a,a=f==a;o||(o=[]);var p=An(o,function(t){return t[0]==n}),s=An(o,function(n){ +return n[0]==t});if(p&&s)return p[1]==t;if(o.push([n,t]),o.push([t,n]),a&&!l){if(i)r=T(n,t,r,e,u,o);else n:{switch(f){case"[object Boolean]":case"[object Date]":case"[object Number]":r=J(+n,+t);break n;case"[object Error]":r=n.name==t.name&&n.message==t.message;break n;case"[object RegExp]":case"[object String]":r=n==t+"";break n}r=false}return o.pop(),r}return 1&r||(i=l&&pn.call(n,"__wrapped__"),f=c&&pn.call(t,"__wrapped__"),!i&&!f)?!!a&&(r=B(n,t,r,e,u,o),o.pop(),r):(i=i?n.value():n,f=f?t.value():t, +r=u(i,f,r,e,o),o.pop(),r)}function g(n){return typeof n=="function"?n:null==n?X:(typeof n=="object"?d:r)(n)}function _(n,t){return nt&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++ei))return false;var c=o.get(n),f=o.get(t);if(c&&f)return c==t&&f==n;for(var c=-1,f=true,a=2&r?[]:Z;++cr?jn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++rarguments.length,mn); +}function G(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Fn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=Z),r}}function J(n,t){return n===t||n!==n&&t!==t}function M(n){var t;return(t=null!=n)&&(t=n.length,t=typeof t=="number"&&-1=t),t&&!U(n)}function U(n){return!!V(n)&&(n=hn.call(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function V(n){var t=typeof n; +return null!=n&&("object"==t||"function"==t)}function H(n){return null!=n&&typeof n=="object"}function K(n){return typeof n=="number"||H(n)&&"[object Number]"==hn.call(n)}function L(n){return typeof n=="string"||!Nn(n)&&H(n)&&"[object String]"==hn.call(n)}function Q(n){return typeof n=="string"?n:null==n?"":n+""}function W(n){return null==n?[]:u(n,Dn(n))}function X(n){return n}function Y(n,r,e){var u=Dn(r),o=h(r,u);null!=e||V(r)&&(o.length||!u.length)||(e=r,r=n,n=this,o=h(r,Dn(r)));var i=!(V(e)&&"chain"in e&&!e.chain),c=U(n); +return mn(o,function(e){var u=r[e];n[e]=u,c&&(n.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=n(this.__wrapped__);return(e.__actions__=A(this.__actions__)).push({func:u,args:arguments,thisArg:n}),e.__chain__=r,e}return u.apply(n,t([this.value()],arguments))})}),n}var Z,nn=1/0,tn=/[&<>"']/g,rn=RegExp(tn.source),en=/^(?:0|[1-9]\d*)$/,un=typeof self=="object"&&self&&self.Object===Object&&self,on=typeof global=="object"&&global&&global.Object===Object&&global||un||Function("return this")(),cn=(un=typeof exports=="object"&&exports&&!exports.nodeType&&exports)&&typeof module=="object"&&module&&!module.nodeType&&module,fn=function(n){ +return function(t){return null==n?Z:n[t]}}({"&":"&","<":"<",">":">",'"':""","'":"'"}),an=Array.prototype,ln=Object.prototype,pn=ln.hasOwnProperty,sn=0,hn=ln.toString,vn=on._,bn=Object.create,yn=ln.propertyIsEnumerable,gn=on.isFinite,_n=function(n,t){return function(r){return n(t(r))}}(Object.keys,Object),jn=Math.max,dn=function(){function n(){}return function(t){return V(t)?bn?bn(t):(n.prototype=t,t=new n,n.prototype=Z,t):{}}}();i.prototype=dn(o.prototype),i.prototype.constructor=i; +var mn=function(n,t){return function(r,e){if(null==r)return r;if(!M(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++or&&(r=jn(e+r,0));n:{for(t=g(t),e=n.length,r+=-1;++re||o&&c&&a||!u&&a||!i){r=1;break n}if(!o&&r { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ +var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } +}); + +module.exports = countBy; diff --git a/node_modules/lodash/create.js b/node_modules/lodash/create.js new file mode 100644 index 0000000..919edb8 --- /dev/null +++ b/node_modules/lodash/create.js @@ -0,0 +1,43 @@ +var baseAssign = require('./_baseAssign'), + baseCreate = require('./_baseCreate'); + +/** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ +function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); +} + +module.exports = create; diff --git a/node_modules/lodash/curry.js b/node_modules/lodash/curry.js new file mode 100644 index 0000000..918db1a --- /dev/null +++ b/node_modules/lodash/curry.js @@ -0,0 +1,57 @@ +var createWrap = require('./_createWrap'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_CURRY_FLAG = 8; + +/** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ +function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; +} + +// Assign default placeholders. +curry.placeholder = {}; + +module.exports = curry; diff --git a/node_modules/lodash/curryRight.js b/node_modules/lodash/curryRight.js new file mode 100644 index 0000000..c85b6f3 --- /dev/null +++ b/node_modules/lodash/curryRight.js @@ -0,0 +1,54 @@ +var createWrap = require('./_createWrap'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_CURRY_RIGHT_FLAG = 16; + +/** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ +function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; +} + +// Assign default placeholders. +curryRight.placeholder = {}; + +module.exports = curryRight; diff --git a/node_modules/lodash/date.js b/node_modules/lodash/date.js new file mode 100644 index 0000000..cbf5b41 --- /dev/null +++ b/node_modules/lodash/date.js @@ -0,0 +1,3 @@ +module.exports = { + 'now': require('./now') +}; diff --git a/node_modules/lodash/debounce.js b/node_modules/lodash/debounce.js new file mode 100644 index 0000000..8f751d5 --- /dev/null +++ b/node_modules/lodash/debounce.js @@ -0,0 +1,191 @@ +var isObject = require('./isObject'), + now = require('./now'), + toNumber = require('./toNumber'); + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ +function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; +} + +module.exports = debounce; diff --git a/node_modules/lodash/deburr.js b/node_modules/lodash/deburr.js new file mode 100644 index 0000000..f85e314 --- /dev/null +++ b/node_modules/lodash/deburr.js @@ -0,0 +1,45 @@ +var deburrLetter = require('./_deburrLetter'), + toString = require('./toString'); + +/** Used to match Latin Unicode letters (excluding mathematical operators). */ +var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + +/** Used to compose unicode character classes. */ +var rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange; + +/** Used to compose unicode capture groups. */ +var rsCombo = '[' + rsComboRange + ']'; + +/** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ +var reComboMark = RegExp(rsCombo, 'g'); + +/** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ +function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); +} + +module.exports = deburr; diff --git a/node_modules/lodash/defaultTo.js b/node_modules/lodash/defaultTo.js new file mode 100644 index 0000000..5b33359 --- /dev/null +++ b/node_modules/lodash/defaultTo.js @@ -0,0 +1,25 @@ +/** + * Checks `value` to determine whether a default value should be returned in + * its place. The `defaultValue` is returned if `value` is `NaN`, `null`, + * or `undefined`. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Util + * @param {*} value The value to check. + * @param {*} defaultValue The default value. + * @returns {*} Returns the resolved value. + * @example + * + * _.defaultTo(1, 10); + * // => 1 + * + * _.defaultTo(undefined, 10); + * // => 10 + */ +function defaultTo(value, defaultValue) { + return (value == null || value !== value) ? defaultValue : value; +} + +module.exports = defaultTo; diff --git a/node_modules/lodash/defaults.js b/node_modules/lodash/defaults.js new file mode 100644 index 0000000..c74df04 --- /dev/null +++ b/node_modules/lodash/defaults.js @@ -0,0 +1,64 @@ +var baseRest = require('./_baseRest'), + eq = require('./eq'), + isIterateeCall = require('./_isIterateeCall'), + keysIn = require('./keysIn'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ +var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; +}); + +module.exports = defaults; diff --git a/node_modules/lodash/defaultsDeep.js b/node_modules/lodash/defaultsDeep.js new file mode 100644 index 0000000..9b5fa3e --- /dev/null +++ b/node_modules/lodash/defaultsDeep.js @@ -0,0 +1,30 @@ +var apply = require('./_apply'), + baseRest = require('./_baseRest'), + customDefaultsMerge = require('./_customDefaultsMerge'), + mergeWith = require('./mergeWith'); + +/** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ +var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); +}); + +module.exports = defaultsDeep; diff --git a/node_modules/lodash/defer.js b/node_modules/lodash/defer.js new file mode 100644 index 0000000..f6d6c6f --- /dev/null +++ b/node_modules/lodash/defer.js @@ -0,0 +1,26 @@ +var baseDelay = require('./_baseDelay'), + baseRest = require('./_baseRest'); + +/** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ +var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); +}); + +module.exports = defer; diff --git a/node_modules/lodash/delay.js b/node_modules/lodash/delay.js new file mode 100644 index 0000000..bd55479 --- /dev/null +++ b/node_modules/lodash/delay.js @@ -0,0 +1,28 @@ +var baseDelay = require('./_baseDelay'), + baseRest = require('./_baseRest'), + toNumber = require('./toNumber'); + +/** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ +var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); +}); + +module.exports = delay; diff --git a/node_modules/lodash/difference.js b/node_modules/lodash/difference.js new file mode 100644 index 0000000..fa28bb3 --- /dev/null +++ b/node_modules/lodash/difference.js @@ -0,0 +1,33 @@ +var baseDifference = require('./_baseDifference'), + baseFlatten = require('./_baseFlatten'), + baseRest = require('./_baseRest'), + isArrayLikeObject = require('./isArrayLikeObject'); + +/** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ +var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; +}); + +module.exports = difference; diff --git a/node_modules/lodash/differenceBy.js b/node_modules/lodash/differenceBy.js new file mode 100644 index 0000000..2cd63e7 --- /dev/null +++ b/node_modules/lodash/differenceBy.js @@ -0,0 +1,44 @@ +var baseDifference = require('./_baseDifference'), + baseFlatten = require('./_baseFlatten'), + baseIteratee = require('./_baseIteratee'), + baseRest = require('./_baseRest'), + isArrayLikeObject = require('./isArrayLikeObject'), + last = require('./last'); + +/** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ +var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2)) + : []; +}); + +module.exports = differenceBy; diff --git a/node_modules/lodash/differenceWith.js b/node_modules/lodash/differenceWith.js new file mode 100644 index 0000000..c0233f4 --- /dev/null +++ b/node_modules/lodash/differenceWith.js @@ -0,0 +1,40 @@ +var baseDifference = require('./_baseDifference'), + baseFlatten = require('./_baseFlatten'), + baseRest = require('./_baseRest'), + isArrayLikeObject = require('./isArrayLikeObject'), + last = require('./last'); + +/** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ +var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; +}); + +module.exports = differenceWith; diff --git a/node_modules/lodash/divide.js b/node_modules/lodash/divide.js new file mode 100644 index 0000000..8cae0cd --- /dev/null +++ b/node_modules/lodash/divide.js @@ -0,0 +1,22 @@ +var createMathOperation = require('./_createMathOperation'); + +/** + * Divide two numbers. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Math + * @param {number} dividend The first number in a division. + * @param {number} divisor The second number in a division. + * @returns {number} Returns the quotient. + * @example + * + * _.divide(6, 4); + * // => 1.5 + */ +var divide = createMathOperation(function(dividend, divisor) { + return dividend / divisor; +}, 1); + +module.exports = divide; diff --git a/node_modules/lodash/drop.js b/node_modules/lodash/drop.js new file mode 100644 index 0000000..d5c3cba --- /dev/null +++ b/node_modules/lodash/drop.js @@ -0,0 +1,38 @@ +var baseSlice = require('./_baseSlice'), + toInteger = require('./toInteger'); + +/** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ +function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); +} + +module.exports = drop; diff --git a/node_modules/lodash/dropRight.js b/node_modules/lodash/dropRight.js new file mode 100644 index 0000000..441fe99 --- /dev/null +++ b/node_modules/lodash/dropRight.js @@ -0,0 +1,39 @@ +var baseSlice = require('./_baseSlice'), + toInteger = require('./toInteger'); + +/** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ +function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); +} + +module.exports = dropRight; diff --git a/node_modules/lodash/dropRightWhile.js b/node_modules/lodash/dropRightWhile.js new file mode 100644 index 0000000..9ad36a0 --- /dev/null +++ b/node_modules/lodash/dropRightWhile.js @@ -0,0 +1,45 @@ +var baseIteratee = require('./_baseIteratee'), + baseWhile = require('./_baseWhile'); + +/** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ +function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, baseIteratee(predicate, 3), true, true) + : []; +} + +module.exports = dropRightWhile; diff --git a/node_modules/lodash/dropWhile.js b/node_modules/lodash/dropWhile.js new file mode 100644 index 0000000..903ef56 --- /dev/null +++ b/node_modules/lodash/dropWhile.js @@ -0,0 +1,45 @@ +var baseIteratee = require('./_baseIteratee'), + baseWhile = require('./_baseWhile'); + +/** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ +function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, baseIteratee(predicate, 3), true) + : []; +} + +module.exports = dropWhile; diff --git a/node_modules/lodash/each.js b/node_modules/lodash/each.js new file mode 100644 index 0000000..8800f42 --- /dev/null +++ b/node_modules/lodash/each.js @@ -0,0 +1 @@ +module.exports = require('./forEach'); diff --git a/node_modules/lodash/eachRight.js b/node_modules/lodash/eachRight.js new file mode 100644 index 0000000..3252b2a --- /dev/null +++ b/node_modules/lodash/eachRight.js @@ -0,0 +1 @@ +module.exports = require('./forEachRight'); diff --git a/node_modules/lodash/endsWith.js b/node_modules/lodash/endsWith.js new file mode 100644 index 0000000..76fc866 --- /dev/null +++ b/node_modules/lodash/endsWith.js @@ -0,0 +1,43 @@ +var baseClamp = require('./_baseClamp'), + baseToString = require('./_baseToString'), + toInteger = require('./toInteger'), + toString = require('./toString'); + +/** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ +function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; +} + +module.exports = endsWith; diff --git a/node_modules/lodash/entries.js b/node_modules/lodash/entries.js new file mode 100644 index 0000000..7a88df2 --- /dev/null +++ b/node_modules/lodash/entries.js @@ -0,0 +1 @@ +module.exports = require('./toPairs'); diff --git a/node_modules/lodash/entriesIn.js b/node_modules/lodash/entriesIn.js new file mode 100644 index 0000000..f6c6331 --- /dev/null +++ b/node_modules/lodash/entriesIn.js @@ -0,0 +1 @@ +module.exports = require('./toPairsIn'); diff --git a/node_modules/lodash/eq.js b/node_modules/lodash/eq.js new file mode 100644 index 0000000..a940688 --- /dev/null +++ b/node_modules/lodash/eq.js @@ -0,0 +1,37 @@ +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +module.exports = eq; diff --git a/node_modules/lodash/escape.js b/node_modules/lodash/escape.js new file mode 100644 index 0000000..9247e00 --- /dev/null +++ b/node_modules/lodash/escape.js @@ -0,0 +1,43 @@ +var escapeHtmlChar = require('./_escapeHtmlChar'), + toString = require('./toString'); + +/** Used to match HTML entities and HTML characters. */ +var reUnescapedHtml = /[&<>"']/g, + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + +/** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ +function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; +} + +module.exports = escape; diff --git a/node_modules/lodash/escapeRegExp.js b/node_modules/lodash/escapeRegExp.js new file mode 100644 index 0000000..0a58c69 --- /dev/null +++ b/node_modules/lodash/escapeRegExp.js @@ -0,0 +1,32 @@ +var toString = require('./toString'); + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + +/** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ +function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; +} + +module.exports = escapeRegExp; diff --git a/node_modules/lodash/every.js b/node_modules/lodash/every.js new file mode 100644 index 0000000..25080da --- /dev/null +++ b/node_modules/lodash/every.js @@ -0,0 +1,56 @@ +var arrayEvery = require('./_arrayEvery'), + baseEvery = require('./_baseEvery'), + baseIteratee = require('./_baseIteratee'), + isArray = require('./isArray'), + isIterateeCall = require('./_isIterateeCall'); + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, baseIteratee(predicate, 3)); +} + +module.exports = every; diff --git a/node_modules/lodash/extend.js b/node_modules/lodash/extend.js new file mode 100644 index 0000000..e00166c --- /dev/null +++ b/node_modules/lodash/extend.js @@ -0,0 +1 @@ +module.exports = require('./assignIn'); diff --git a/node_modules/lodash/extendWith.js b/node_modules/lodash/extendWith.js new file mode 100644 index 0000000..dbdcb3b --- /dev/null +++ b/node_modules/lodash/extendWith.js @@ -0,0 +1 @@ +module.exports = require('./assignInWith'); diff --git a/node_modules/lodash/fill.js b/node_modules/lodash/fill.js new file mode 100644 index 0000000..ae13aa1 --- /dev/null +++ b/node_modules/lodash/fill.js @@ -0,0 +1,45 @@ +var baseFill = require('./_baseFill'), + isIterateeCall = require('./_isIterateeCall'); + +/** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ +function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); +} + +module.exports = fill; diff --git a/node_modules/lodash/filter.js b/node_modules/lodash/filter.js new file mode 100644 index 0000000..89e0c8c --- /dev/null +++ b/node_modules/lodash/filter.js @@ -0,0 +1,52 @@ +var arrayFilter = require('./_arrayFilter'), + baseFilter = require('./_baseFilter'), + baseIteratee = require('./_baseIteratee'), + isArray = require('./isArray'); + +/** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ +function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, baseIteratee(predicate, 3)); +} + +module.exports = filter; diff --git a/node_modules/lodash/find.js b/node_modules/lodash/find.js new file mode 100644 index 0000000..de732cc --- /dev/null +++ b/node_modules/lodash/find.js @@ -0,0 +1,42 @@ +var createFind = require('./_createFind'), + findIndex = require('./findIndex'); + +/** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ +var find = createFind(findIndex); + +module.exports = find; diff --git a/node_modules/lodash/findIndex.js b/node_modules/lodash/findIndex.js new file mode 100644 index 0000000..4689069 --- /dev/null +++ b/node_modules/lodash/findIndex.js @@ -0,0 +1,55 @@ +var baseFindIndex = require('./_baseFindIndex'), + baseIteratee = require('./_baseIteratee'), + toInteger = require('./toInteger'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ +function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, baseIteratee(predicate, 3), index); +} + +module.exports = findIndex; diff --git a/node_modules/lodash/findKey.js b/node_modules/lodash/findKey.js new file mode 100644 index 0000000..cac0248 --- /dev/null +++ b/node_modules/lodash/findKey.js @@ -0,0 +1,44 @@ +var baseFindKey = require('./_baseFindKey'), + baseForOwn = require('./_baseForOwn'), + baseIteratee = require('./_baseIteratee'); + +/** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ +function findKey(object, predicate) { + return baseFindKey(object, baseIteratee(predicate, 3), baseForOwn); +} + +module.exports = findKey; diff --git a/node_modules/lodash/findLast.js b/node_modules/lodash/findLast.js new file mode 100644 index 0000000..70b4271 --- /dev/null +++ b/node_modules/lodash/findLast.js @@ -0,0 +1,25 @@ +var createFind = require('./_createFind'), + findLastIndex = require('./findLastIndex'); + +/** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ +var findLast = createFind(findLastIndex); + +module.exports = findLast; diff --git a/node_modules/lodash/findLastIndex.js b/node_modules/lodash/findLastIndex.js new file mode 100644 index 0000000..7da3431 --- /dev/null +++ b/node_modules/lodash/findLastIndex.js @@ -0,0 +1,59 @@ +var baseFindIndex = require('./_baseFindIndex'), + baseIteratee = require('./_baseIteratee'), + toInteger = require('./toInteger'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ +function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, baseIteratee(predicate, 3), index, true); +} + +module.exports = findLastIndex; diff --git a/node_modules/lodash/findLastKey.js b/node_modules/lodash/findLastKey.js new file mode 100644 index 0000000..66fb9fb --- /dev/null +++ b/node_modules/lodash/findLastKey.js @@ -0,0 +1,44 @@ +var baseFindKey = require('./_baseFindKey'), + baseForOwnRight = require('./_baseForOwnRight'), + baseIteratee = require('./_baseIteratee'); + +/** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ +function findLastKey(object, predicate) { + return baseFindKey(object, baseIteratee(predicate, 3), baseForOwnRight); +} + +module.exports = findLastKey; diff --git a/node_modules/lodash/first.js b/node_modules/lodash/first.js new file mode 100644 index 0000000..53f4ad1 --- /dev/null +++ b/node_modules/lodash/first.js @@ -0,0 +1 @@ +module.exports = require('./head'); diff --git a/node_modules/lodash/flake.lock b/node_modules/lodash/flake.lock new file mode 100644 index 0000000..dd03252 --- /dev/null +++ b/node_modules/lodash/flake.lock @@ -0,0 +1,40 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1613582597, + "narHash": "sha256-6LvipIvFuhyorHpUqK3HjySC5Y6gshXHFBhU9EJ4DoM=", + "path": "/nix/store/srvplqq673sqd9vyfhyc5w1p88y1gfm4-source", + "rev": "6b1057b452c55bb3b463f0d7055bc4ec3fd1f381", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs", + "utils": "utils" + } + }, + "utils": { + "locked": { + "lastModified": 1610051610, + "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/node_modules/lodash/flake.nix b/node_modules/lodash/flake.nix new file mode 100644 index 0000000..15a451c --- /dev/null +++ b/node_modules/lodash/flake.nix @@ -0,0 +1,20 @@ +{ + inputs = { + utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, utils }: + utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages."${system}"; + in rec { + devShell = pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + yarn + nodejs-14_x + nodePackages.typescript-language-server + nodePackages.eslint + ]; + }; + }); +} diff --git a/node_modules/lodash/flatMap.js b/node_modules/lodash/flatMap.js new file mode 100644 index 0000000..e668506 --- /dev/null +++ b/node_modules/lodash/flatMap.js @@ -0,0 +1,29 @@ +var baseFlatten = require('./_baseFlatten'), + map = require('./map'); + +/** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ +function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); +} + +module.exports = flatMap; diff --git a/node_modules/lodash/flatMapDeep.js b/node_modules/lodash/flatMapDeep.js new file mode 100644 index 0000000..4653d60 --- /dev/null +++ b/node_modules/lodash/flatMapDeep.js @@ -0,0 +1,31 @@ +var baseFlatten = require('./_baseFlatten'), + map = require('./map'); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ +function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); +} + +module.exports = flatMapDeep; diff --git a/node_modules/lodash/flatMapDepth.js b/node_modules/lodash/flatMapDepth.js new file mode 100644 index 0000000..6d72005 --- /dev/null +++ b/node_modules/lodash/flatMapDepth.js @@ -0,0 +1,31 @@ +var baseFlatten = require('./_baseFlatten'), + map = require('./map'), + toInteger = require('./toInteger'); + +/** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ +function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); +} + +module.exports = flatMapDepth; diff --git a/node_modules/lodash/flatten.js b/node_modules/lodash/flatten.js new file mode 100644 index 0000000..3f09f7f --- /dev/null +++ b/node_modules/lodash/flatten.js @@ -0,0 +1,22 @@ +var baseFlatten = require('./_baseFlatten'); + +/** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ +function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; +} + +module.exports = flatten; diff --git a/node_modules/lodash/flattenDeep.js b/node_modules/lodash/flattenDeep.js new file mode 100644 index 0000000..8ad585c --- /dev/null +++ b/node_modules/lodash/flattenDeep.js @@ -0,0 +1,25 @@ +var baseFlatten = require('./_baseFlatten'); + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ +function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; +} + +module.exports = flattenDeep; diff --git a/node_modules/lodash/flattenDepth.js b/node_modules/lodash/flattenDepth.js new file mode 100644 index 0000000..441fdcc --- /dev/null +++ b/node_modules/lodash/flattenDepth.js @@ -0,0 +1,33 @@ +var baseFlatten = require('./_baseFlatten'), + toInteger = require('./toInteger'); + +/** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ +function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); +} + +module.exports = flattenDepth; diff --git a/node_modules/lodash/flip.js b/node_modules/lodash/flip.js new file mode 100644 index 0000000..c28dd78 --- /dev/null +++ b/node_modules/lodash/flip.js @@ -0,0 +1,28 @@ +var createWrap = require('./_createWrap'); + +/** Used to compose bitmasks for function metadata. */ +var WRAP_FLIP_FLAG = 512; + +/** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ +function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); +} + +module.exports = flip; diff --git a/node_modules/lodash/floor.js b/node_modules/lodash/floor.js new file mode 100644 index 0000000..ab6dfa2 --- /dev/null +++ b/node_modules/lodash/floor.js @@ -0,0 +1,26 @@ +var createRound = require('./_createRound'); + +/** + * Computes `number` rounded down to `precision`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Math + * @param {number} number The number to round down. + * @param {number} [precision=0] The precision to round down to. + * @returns {number} Returns the rounded down number. + * @example + * + * _.floor(4.006); + * // => 4 + * + * _.floor(0.046, 2); + * // => 0.04 + * + * _.floor(4060, -2); + * // => 4000 + */ +var floor = createRound('floor'); + +module.exports = floor; diff --git a/node_modules/lodash/flow.js b/node_modules/lodash/flow.js new file mode 100644 index 0000000..74b6b62 --- /dev/null +++ b/node_modules/lodash/flow.js @@ -0,0 +1,27 @@ +var createFlow = require('./_createFlow'); + +/** + * Creates a function that returns the result of invoking the given functions + * with the `this` binding of the created function, where each successive + * invocation is supplied the return value of the previous. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Util + * @param {...(Function|Function[])} [funcs] The functions to invoke. + * @returns {Function} Returns the new composite function. + * @see _.flowRight + * @example + * + * function square(n) { + * return n * n; + * } + * + * var addSquare = _.flow([_.add, square]); + * addSquare(1, 2); + * // => 9 + */ +var flow = createFlow(); + +module.exports = flow; diff --git a/node_modules/lodash/flowRight.js b/node_modules/lodash/flowRight.js new file mode 100644 index 0000000..1146141 --- /dev/null +++ b/node_modules/lodash/flowRight.js @@ -0,0 +1,26 @@ +var createFlow = require('./_createFlow'); + +/** + * This method is like `_.flow` except that it creates a function that + * invokes the given functions from right to left. + * + * @static + * @since 3.0.0 + * @memberOf _ + * @category Util + * @param {...(Function|Function[])} [funcs] The functions to invoke. + * @returns {Function} Returns the new composite function. + * @see _.flow + * @example + * + * function square(n) { + * return n * n; + * } + * + * var addSquare = _.flowRight([square, _.add]); + * addSquare(1, 2); + * // => 9 + */ +var flowRight = createFlow(true); + +module.exports = flowRight; diff --git a/node_modules/lodash/forEach.js b/node_modules/lodash/forEach.js new file mode 100644 index 0000000..c64eaa7 --- /dev/null +++ b/node_modules/lodash/forEach.js @@ -0,0 +1,41 @@ +var arrayEach = require('./_arrayEach'), + baseEach = require('./_baseEach'), + castFunction = require('./_castFunction'), + isArray = require('./isArray'); + +/** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ +function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, castFunction(iteratee)); +} + +module.exports = forEach; diff --git a/node_modules/lodash/forEachRight.js b/node_modules/lodash/forEachRight.js new file mode 100644 index 0000000..7390eba --- /dev/null +++ b/node_modules/lodash/forEachRight.js @@ -0,0 +1,31 @@ +var arrayEachRight = require('./_arrayEachRight'), + baseEachRight = require('./_baseEachRight'), + castFunction = require('./_castFunction'), + isArray = require('./isArray'); + +/** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ +function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, castFunction(iteratee)); +} + +module.exports = forEachRight; diff --git a/node_modules/lodash/forIn.js b/node_modules/lodash/forIn.js new file mode 100644 index 0000000..583a596 --- /dev/null +++ b/node_modules/lodash/forIn.js @@ -0,0 +1,39 @@ +var baseFor = require('./_baseFor'), + castFunction = require('./_castFunction'), + keysIn = require('./keysIn'); + +/** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ +function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, castFunction(iteratee), keysIn); +} + +module.exports = forIn; diff --git a/node_modules/lodash/forInRight.js b/node_modules/lodash/forInRight.js new file mode 100644 index 0000000..4aedf58 --- /dev/null +++ b/node_modules/lodash/forInRight.js @@ -0,0 +1,37 @@ +var baseForRight = require('./_baseForRight'), + castFunction = require('./_castFunction'), + keysIn = require('./keysIn'); + +/** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ +function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, castFunction(iteratee), keysIn); +} + +module.exports = forInRight; diff --git a/node_modules/lodash/forOwn.js b/node_modules/lodash/forOwn.js new file mode 100644 index 0000000..94eed84 --- /dev/null +++ b/node_modules/lodash/forOwn.js @@ -0,0 +1,36 @@ +var baseForOwn = require('./_baseForOwn'), + castFunction = require('./_castFunction'); + +/** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ +function forOwn(object, iteratee) { + return object && baseForOwn(object, castFunction(iteratee)); +} + +module.exports = forOwn; diff --git a/node_modules/lodash/forOwnRight.js b/node_modules/lodash/forOwnRight.js new file mode 100644 index 0000000..86f338f --- /dev/null +++ b/node_modules/lodash/forOwnRight.js @@ -0,0 +1,34 @@ +var baseForOwnRight = require('./_baseForOwnRight'), + castFunction = require('./_castFunction'); + +/** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ +function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, castFunction(iteratee)); +} + +module.exports = forOwnRight; diff --git a/node_modules/lodash/fp.js b/node_modules/lodash/fp.js new file mode 100644 index 0000000..e372dbb --- /dev/null +++ b/node_modules/lodash/fp.js @@ -0,0 +1,2 @@ +var _ = require('./lodash.min').runInContext(); +module.exports = require('./fp/_baseConvert')(_, _); diff --git a/node_modules/lodash/fp/F.js b/node_modules/lodash/fp/F.js new file mode 100644 index 0000000..a05a63a --- /dev/null +++ b/node_modules/lodash/fp/F.js @@ -0,0 +1 @@ +module.exports = require('./stubFalse'); diff --git a/node_modules/lodash/fp/T.js b/node_modules/lodash/fp/T.js new file mode 100644 index 0000000..e2ba8ea --- /dev/null +++ b/node_modules/lodash/fp/T.js @@ -0,0 +1 @@ +module.exports = require('./stubTrue'); diff --git a/node_modules/lodash/fp/__.js b/node_modules/lodash/fp/__.js new file mode 100644 index 0000000..4af98de --- /dev/null +++ b/node_modules/lodash/fp/__.js @@ -0,0 +1 @@ +module.exports = require('./placeholder'); diff --git a/node_modules/lodash/fp/_baseConvert.js b/node_modules/lodash/fp/_baseConvert.js new file mode 100644 index 0000000..9baf8e1 --- /dev/null +++ b/node_modules/lodash/fp/_baseConvert.js @@ -0,0 +1,569 @@ +var mapping = require('./_mapping'), + fallbackHolder = require('./placeholder'); + +/** Built-in value reference. */ +var push = Array.prototype.push; + +/** + * Creates a function, with an arity of `n`, that invokes `func` with the + * arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} n The arity of the new function. + * @returns {Function} Returns the new function. + */ +function baseArity(func, n) { + return n == 2 + ? function(a, b) { return func.apply(undefined, arguments); } + : function(a) { return func.apply(undefined, arguments); }; +} + +/** + * Creates a function that invokes `func`, with up to `n` arguments, ignoring + * any additional arguments. + * + * @private + * @param {Function} func The function to cap arguments for. + * @param {number} n The arity cap. + * @returns {Function} Returns the new function. + */ +function baseAry(func, n) { + return n == 2 + ? function(a, b) { return func(a, b); } + : function(a) { return func(a); }; +} + +/** + * Creates a clone of `array`. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the cloned array. + */ +function cloneArray(array) { + var length = array ? array.length : 0, + result = Array(length); + + while (length--) { + result[length] = array[length]; + } + return result; +} + +/** + * Creates a function that clones a given object using the assignment `func`. + * + * @private + * @param {Function} func The assignment function. + * @returns {Function} Returns the new cloner function. + */ +function createCloner(func) { + return function(object) { + return func({}, object); + }; +} + +/** + * A specialized version of `_.spread` which flattens the spread array into + * the arguments of the invoked `func`. + * + * @private + * @param {Function} func The function to spread arguments over. + * @param {number} start The start position of the spread. + * @returns {Function} Returns the new function. + */ +function flatSpread(func, start) { + return function() { + var length = arguments.length, + lastIndex = length - 1, + args = Array(length); + + while (length--) { + args[length] = arguments[length]; + } + var array = args[start], + otherArgs = args.slice(0, start); + + if (array) { + push.apply(otherArgs, array); + } + if (start != lastIndex) { + push.apply(otherArgs, args.slice(start + 1)); + } + return func.apply(this, otherArgs); + }; +} + +/** + * Creates a function that wraps `func` and uses `cloner` to clone the first + * argument it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} cloner The function to clone arguments. + * @returns {Function} Returns the new immutable function. + */ +function wrapImmutable(func, cloner) { + return function() { + var length = arguments.length; + if (!length) { + return; + } + var args = Array(length); + while (length--) { + args[length] = arguments[length]; + } + var result = args[0] = cloner.apply(undefined, args); + func.apply(undefined, args); + return result; + }; +} + +/** + * The base implementation of `convert` which accepts a `util` object of methods + * required to perform conversions. + * + * @param {Object} util The util object. + * @param {string} name The name of the function to convert. + * @param {Function} func The function to convert. + * @param {Object} [options] The options object. + * @param {boolean} [options.cap=true] Specify capping iteratee arguments. + * @param {boolean} [options.curry=true] Specify currying. + * @param {boolean} [options.fixed=true] Specify fixed arity. + * @param {boolean} [options.immutable=true] Specify immutable operations. + * @param {boolean} [options.rearg=true] Specify rearranging arguments. + * @returns {Function|Object} Returns the converted function or object. + */ +function baseConvert(util, name, func, options) { + var isLib = typeof name == 'function', + isObj = name === Object(name); + + if (isObj) { + options = func; + func = name; + name = undefined; + } + if (func == null) { + throw new TypeError; + } + options || (options = {}); + + var config = { + 'cap': 'cap' in options ? options.cap : true, + 'curry': 'curry' in options ? options.curry : true, + 'fixed': 'fixed' in options ? options.fixed : true, + 'immutable': 'immutable' in options ? options.immutable : true, + 'rearg': 'rearg' in options ? options.rearg : true + }; + + var defaultHolder = isLib ? func : fallbackHolder, + forceCurry = ('curry' in options) && options.curry, + forceFixed = ('fixed' in options) && options.fixed, + forceRearg = ('rearg' in options) && options.rearg, + pristine = isLib ? func.runInContext() : undefined; + + var helpers = isLib ? func : { + 'ary': util.ary, + 'assign': util.assign, + 'clone': util.clone, + 'curry': util.curry, + 'forEach': util.forEach, + 'isArray': util.isArray, + 'isError': util.isError, + 'isFunction': util.isFunction, + 'isWeakMap': util.isWeakMap, + 'iteratee': util.iteratee, + 'keys': util.keys, + 'rearg': util.rearg, + 'toInteger': util.toInteger, + 'toPath': util.toPath + }; + + var ary = helpers.ary, + assign = helpers.assign, + clone = helpers.clone, + curry = helpers.curry, + each = helpers.forEach, + isArray = helpers.isArray, + isError = helpers.isError, + isFunction = helpers.isFunction, + isWeakMap = helpers.isWeakMap, + keys = helpers.keys, + rearg = helpers.rearg, + toInteger = helpers.toInteger, + toPath = helpers.toPath; + + var aryMethodKeys = keys(mapping.aryMethod); + + var wrappers = { + 'castArray': function(castArray) { + return function() { + var value = arguments[0]; + return isArray(value) + ? castArray(cloneArray(value)) + : castArray.apply(undefined, arguments); + }; + }, + 'iteratee': function(iteratee) { + return function() { + var func = arguments[0], + arity = arguments[1], + result = iteratee(func, arity), + length = result.length; + + if (config.cap && typeof arity == 'number') { + arity = arity > 2 ? (arity - 2) : 1; + return (length && length <= arity) ? result : baseAry(result, arity); + } + return result; + }; + }, + 'mixin': function(mixin) { + return function(source) { + var func = this; + if (!isFunction(func)) { + return mixin(func, Object(source)); + } + var pairs = []; + each(keys(source), function(key) { + if (isFunction(source[key])) { + pairs.push([key, func.prototype[key]]); + } + }); + + mixin(func, Object(source)); + + each(pairs, function(pair) { + var value = pair[1]; + if (isFunction(value)) { + func.prototype[pair[0]] = value; + } else { + delete func.prototype[pair[0]]; + } + }); + return func; + }; + }, + 'nthArg': function(nthArg) { + return function(n) { + var arity = n < 0 ? 1 : (toInteger(n) + 1); + return curry(nthArg(n), arity); + }; + }, + 'rearg': function(rearg) { + return function(func, indexes) { + var arity = indexes ? indexes.length : 0; + return curry(rearg(func, indexes), arity); + }; + }, + 'runInContext': function(runInContext) { + return function(context) { + return baseConvert(util, runInContext(context), options); + }; + } + }; + + /*--------------------------------------------------------------------------*/ + + /** + * Casts `func` to a function with an arity capped iteratee if needed. + * + * @private + * @param {string} name The name of the function to inspect. + * @param {Function} func The function to inspect. + * @returns {Function} Returns the cast function. + */ + function castCap(name, func) { + if (config.cap) { + var indexes = mapping.iterateeRearg[name]; + if (indexes) { + return iterateeRearg(func, indexes); + } + var n = !isLib && mapping.iterateeAry[name]; + if (n) { + return iterateeAry(func, n); + } + } + return func; + } + + /** + * Casts `func` to a curried function if needed. + * + * @private + * @param {string} name The name of the function to inspect. + * @param {Function} func The function to inspect. + * @param {number} n The arity of `func`. + * @returns {Function} Returns the cast function. + */ + function castCurry(name, func, n) { + return (forceCurry || (config.curry && n > 1)) + ? curry(func, n) + : func; + } + + /** + * Casts `func` to a fixed arity function if needed. + * + * @private + * @param {string} name The name of the function to inspect. + * @param {Function} func The function to inspect. + * @param {number} n The arity cap. + * @returns {Function} Returns the cast function. + */ + function castFixed(name, func, n) { + if (config.fixed && (forceFixed || !mapping.skipFixed[name])) { + var data = mapping.methodSpread[name], + start = data && data.start; + + return start === undefined ? ary(func, n) : flatSpread(func, start); + } + return func; + } + + /** + * Casts `func` to an rearged function if needed. + * + * @private + * @param {string} name The name of the function to inspect. + * @param {Function} func The function to inspect. + * @param {number} n The arity of `func`. + * @returns {Function} Returns the cast function. + */ + function castRearg(name, func, n) { + return (config.rearg && n > 1 && (forceRearg || !mapping.skipRearg[name])) + ? rearg(func, mapping.methodRearg[name] || mapping.aryRearg[n]) + : func; + } + + /** + * Creates a clone of `object` by `path`. + * + * @private + * @param {Object} object The object to clone. + * @param {Array|string} path The path to clone by. + * @returns {Object} Returns the cloned object. + */ + function cloneByPath(object, path) { + path = toPath(path); + + var index = -1, + length = path.length, + lastIndex = length - 1, + result = clone(Object(object)), + nested = result; + + while (nested != null && ++index < length) { + var key = path[index], + value = nested[key]; + + if (value != null && + !(isFunction(value) || isError(value) || isWeakMap(value))) { + nested[key] = clone(index == lastIndex ? value : Object(value)); + } + nested = nested[key]; + } + return result; + } + + /** + * Converts `lodash` to an immutable auto-curried iteratee-first data-last + * version with conversion `options` applied. + * + * @param {Object} [options] The options object. See `baseConvert` for more details. + * @returns {Function} Returns the converted `lodash`. + */ + function convertLib(options) { + return _.runInContext.convert(options)(undefined); + } + + /** + * Create a converter function for `func` of `name`. + * + * @param {string} name The name of the function to convert. + * @param {Function} func The function to convert. + * @returns {Function} Returns the new converter function. + */ + function createConverter(name, func) { + var realName = mapping.aliasToReal[name] || name, + methodName = mapping.remap[realName] || realName, + oldOptions = options; + + return function(options) { + var newUtil = isLib ? pristine : helpers, + newFunc = isLib ? pristine[methodName] : func, + newOptions = assign(assign({}, oldOptions), options); + + return baseConvert(newUtil, realName, newFunc, newOptions); + }; + } + + /** + * Creates a function that wraps `func` to invoke its iteratee, with up to `n` + * arguments, ignoring any additional arguments. + * + * @private + * @param {Function} func The function to cap iteratee arguments for. + * @param {number} n The arity cap. + * @returns {Function} Returns the new function. + */ + function iterateeAry(func, n) { + return overArg(func, function(func) { + return typeof func == 'function' ? baseAry(func, n) : func; + }); + } + + /** + * Creates a function that wraps `func` to invoke its iteratee with arguments + * arranged according to the specified `indexes` where the argument value at + * the first index is provided as the first argument, the argument value at + * the second index is provided as the second argument, and so on. + * + * @private + * @param {Function} func The function to rearrange iteratee arguments for. + * @param {number[]} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + */ + function iterateeRearg(func, indexes) { + return overArg(func, function(func) { + var n = indexes.length; + return baseArity(rearg(baseAry(func, n), indexes), n); + }); + } + + /** + * Creates a function that invokes `func` with its first argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function() { + var length = arguments.length; + if (!length) { + return func(); + } + var args = Array(length); + while (length--) { + args[length] = arguments[length]; + } + var index = config.rearg ? 0 : (length - 1); + args[index] = transform(args[index]); + return func.apply(undefined, args); + }; + } + + /** + * Creates a function that wraps `func` and applys the conversions + * rules by `name`. + * + * @private + * @param {string} name The name of the function to wrap. + * @param {Function} func The function to wrap. + * @returns {Function} Returns the converted function. + */ + function wrap(name, func, placeholder) { + var result, + realName = mapping.aliasToReal[name] || name, + wrapped = func, + wrapper = wrappers[realName]; + + if (wrapper) { + wrapped = wrapper(func); + } + else if (config.immutable) { + if (mapping.mutate.array[realName]) { + wrapped = wrapImmutable(func, cloneArray); + } + else if (mapping.mutate.object[realName]) { + wrapped = wrapImmutable(func, createCloner(func)); + } + else if (mapping.mutate.set[realName]) { + wrapped = wrapImmutable(func, cloneByPath); + } + } + each(aryMethodKeys, function(aryKey) { + each(mapping.aryMethod[aryKey], function(otherName) { + if (realName == otherName) { + var data = mapping.methodSpread[realName], + afterRearg = data && data.afterRearg; + + result = afterRearg + ? castFixed(realName, castRearg(realName, wrapped, aryKey), aryKey) + : castRearg(realName, castFixed(realName, wrapped, aryKey), aryKey); + + result = castCap(realName, result); + result = castCurry(realName, result, aryKey); + return false; + } + }); + return !result; + }); + + result || (result = wrapped); + if (result == func) { + result = forceCurry ? curry(result, 1) : function() { + return func.apply(this, arguments); + }; + } + result.convert = createConverter(realName, func); + result.placeholder = func.placeholder = placeholder; + + return result; + } + + /*--------------------------------------------------------------------------*/ + + if (!isObj) { + return wrap(name, func, defaultHolder); + } + var _ = func; + + // Convert methods by ary cap. + var pairs = []; + each(aryMethodKeys, function(aryKey) { + each(mapping.aryMethod[aryKey], function(key) { + var func = _[mapping.remap[key] || key]; + if (func) { + pairs.push([key, wrap(key, func, _)]); + } + }); + }); + + // Convert remaining methods. + each(keys(_), function(key) { + var func = _[key]; + if (typeof func == 'function') { + var length = pairs.length; + while (length--) { + if (pairs[length][0] == key) { + return; + } + } + func.convert = createConverter(key, func); + pairs.push([key, func]); + } + }); + + // Assign to `_` leaving `_.prototype` unchanged to allow chaining. + each(pairs, function(pair) { + _[pair[0]] = pair[1]; + }); + + _.convert = convertLib; + _.placeholder = _; + + // Assign aliases. + each(keys(_), function(key) { + each(mapping.realToAlias[key] || [], function(alias) { + _[alias] = _[key]; + }); + }); + + return _; +} + +module.exports = baseConvert; diff --git a/node_modules/lodash/fp/_convertBrowser.js b/node_modules/lodash/fp/_convertBrowser.js new file mode 100644 index 0000000..bde030d --- /dev/null +++ b/node_modules/lodash/fp/_convertBrowser.js @@ -0,0 +1,18 @@ +var baseConvert = require('./_baseConvert'); + +/** + * Converts `lodash` to an immutable auto-curried iteratee-first data-last + * version with conversion `options` applied. + * + * @param {Function} lodash The lodash function to convert. + * @param {Object} [options] The options object. See `baseConvert` for more details. + * @returns {Function} Returns the converted `lodash`. + */ +function browserConvert(lodash, options) { + return baseConvert(lodash, lodash, options); +} + +if (typeof _ == 'function' && typeof _.runInContext == 'function') { + _ = browserConvert(_.runInContext()); +} +module.exports = browserConvert; diff --git a/node_modules/lodash/fp/_falseOptions.js b/node_modules/lodash/fp/_falseOptions.js new file mode 100644 index 0000000..773235e --- /dev/null +++ b/node_modules/lodash/fp/_falseOptions.js @@ -0,0 +1,7 @@ +module.exports = { + 'cap': false, + 'curry': false, + 'fixed': false, + 'immutable': false, + 'rearg': false +}; diff --git a/node_modules/lodash/fp/_mapping.js b/node_modules/lodash/fp/_mapping.js new file mode 100644 index 0000000..a642ec0 --- /dev/null +++ b/node_modules/lodash/fp/_mapping.js @@ -0,0 +1,358 @@ +/** Used to map aliases to their real names. */ +exports.aliasToReal = { + + // Lodash aliases. + 'each': 'forEach', + 'eachRight': 'forEachRight', + 'entries': 'toPairs', + 'entriesIn': 'toPairsIn', + 'extend': 'assignIn', + 'extendAll': 'assignInAll', + 'extendAllWith': 'assignInAllWith', + 'extendWith': 'assignInWith', + 'first': 'head', + + // Methods that are curried variants of others. + 'conforms': 'conformsTo', + 'matches': 'isMatch', + 'property': 'get', + + // Ramda aliases. + '__': 'placeholder', + 'F': 'stubFalse', + 'T': 'stubTrue', + 'all': 'every', + 'allPass': 'overEvery', + 'always': 'constant', + 'any': 'some', + 'anyPass': 'overSome', + 'apply': 'spread', + 'assoc': 'set', + 'assocPath': 'set', + 'complement': 'negate', + 'compose': 'flowRight', + 'contains': 'includes', + 'dissoc': 'unset', + 'dissocPath': 'unset', + 'dropLast': 'dropRight', + 'dropLastWhile': 'dropRightWhile', + 'equals': 'isEqual', + 'identical': 'eq', + 'indexBy': 'keyBy', + 'init': 'initial', + 'invertObj': 'invert', + 'juxt': 'over', + 'omitAll': 'omit', + 'nAry': 'ary', + 'path': 'get', + 'pathEq': 'matchesProperty', + 'pathOr': 'getOr', + 'paths': 'at', + 'pickAll': 'pick', + 'pipe': 'flow', + 'pluck': 'map', + 'prop': 'get', + 'propEq': 'matchesProperty', + 'propOr': 'getOr', + 'props': 'at', + 'symmetricDifference': 'xor', + 'symmetricDifferenceBy': 'xorBy', + 'symmetricDifferenceWith': 'xorWith', + 'takeLast': 'takeRight', + 'takeLastWhile': 'takeRightWhile', + 'unapply': 'rest', + 'unnest': 'flatten', + 'useWith': 'overArgs', + 'where': 'conformsTo', + 'whereEq': 'isMatch', + 'zipObj': 'zipObject' +}; + +/** Used to map ary to method names. */ +exports.aryMethod = { + '1': [ + 'assignAll', 'assignInAll', 'attempt', 'castArray', 'ceil', 'create', + 'curry', 'curryRight', 'defaultsAll', 'defaultsDeepAll', 'floor', 'flow', + 'flowRight', 'fromPairs', 'invert', 'iteratee', 'memoize', 'method', 'mergeAll', + 'methodOf', 'mixin', 'nthArg', 'over', 'overEvery', 'overSome','rest', 'reverse', + 'round', 'runInContext', 'spread', 'template', 'trim', 'trimEnd', 'trimStart', + 'uniqueId', 'words', 'zipAll' + ], + '2': [ + 'add', 'after', 'ary', 'assign', 'assignAllWith', 'assignIn', 'assignInAllWith', + 'at', 'before', 'bind', 'bindAll', 'bindKey', 'chunk', 'cloneDeepWith', + 'cloneWith', 'concat', 'conformsTo', 'countBy', 'curryN', 'curryRightN', + 'debounce', 'defaults', 'defaultsDeep', 'defaultTo', 'delay', 'difference', + 'divide', 'drop', 'dropRight', 'dropRightWhile', 'dropWhile', 'endsWith', 'eq', + 'every', 'filter', 'find', 'findIndex', 'findKey', 'findLast', 'findLastIndex', + 'findLastKey', 'flatMap', 'flatMapDeep', 'flattenDepth', 'forEach', + 'forEachRight', 'forIn', 'forInRight', 'forOwn', 'forOwnRight', 'get', + 'groupBy', 'gt', 'gte', 'has', 'hasIn', 'includes', 'indexOf', 'intersection', + 'invertBy', 'invoke', 'invokeMap', 'isEqual', 'isMatch', 'join', 'keyBy', + 'lastIndexOf', 'lt', 'lte', 'map', 'mapKeys', 'mapValues', 'matchesProperty', + 'maxBy', 'meanBy', 'merge', 'mergeAllWith', 'minBy', 'multiply', 'nth', 'omit', + 'omitBy', 'overArgs', 'pad', 'padEnd', 'padStart', 'parseInt', 'partial', + 'partialRight', 'partition', 'pick', 'pickBy', 'propertyOf', 'pull', 'pullAll', + 'pullAt', 'random', 'range', 'rangeRight', 'rearg', 'reject', 'remove', + 'repeat', 'restFrom', 'result', 'sampleSize', 'some', 'sortBy', 'sortedIndex', + 'sortedIndexOf', 'sortedLastIndex', 'sortedLastIndexOf', 'sortedUniqBy', + 'split', 'spreadFrom', 'startsWith', 'subtract', 'sumBy', 'take', 'takeRight', + 'takeRightWhile', 'takeWhile', 'tap', 'throttle', 'thru', 'times', 'trimChars', + 'trimCharsEnd', 'trimCharsStart', 'truncate', 'union', 'uniqBy', 'uniqWith', + 'unset', 'unzipWith', 'without', 'wrap', 'xor', 'zip', 'zipObject', + 'zipObjectDeep' + ], + '3': [ + 'assignInWith', 'assignWith', 'clamp', 'differenceBy', 'differenceWith', + 'findFrom', 'findIndexFrom', 'findLastFrom', 'findLastIndexFrom', 'getOr', + 'includesFrom', 'indexOfFrom', 'inRange', 'intersectionBy', 'intersectionWith', + 'invokeArgs', 'invokeArgsMap', 'isEqualWith', 'isMatchWith', 'flatMapDepth', + 'lastIndexOfFrom', 'mergeWith', 'orderBy', 'padChars', 'padCharsEnd', + 'padCharsStart', 'pullAllBy', 'pullAllWith', 'rangeStep', 'rangeStepRight', + 'reduce', 'reduceRight', 'replace', 'set', 'slice', 'sortedIndexBy', + 'sortedLastIndexBy', 'transform', 'unionBy', 'unionWith', 'update', 'xorBy', + 'xorWith', 'zipWith' + ], + '4': [ + 'fill', 'setWith', 'updateWith' + ] +}; + +/** Used to map ary to rearg configs. */ +exports.aryRearg = { + '2': [1, 0], + '3': [2, 0, 1], + '4': [3, 2, 0, 1] +}; + +/** Used to map method names to their iteratee ary. */ +exports.iterateeAry = { + 'dropRightWhile': 1, + 'dropWhile': 1, + 'every': 1, + 'filter': 1, + 'find': 1, + 'findFrom': 1, + 'findIndex': 1, + 'findIndexFrom': 1, + 'findKey': 1, + 'findLast': 1, + 'findLastFrom': 1, + 'findLastIndex': 1, + 'findLastIndexFrom': 1, + 'findLastKey': 1, + 'flatMap': 1, + 'flatMapDeep': 1, + 'flatMapDepth': 1, + 'forEach': 1, + 'forEachRight': 1, + 'forIn': 1, + 'forInRight': 1, + 'forOwn': 1, + 'forOwnRight': 1, + 'map': 1, + 'mapKeys': 1, + 'mapValues': 1, + 'partition': 1, + 'reduce': 2, + 'reduceRight': 2, + 'reject': 1, + 'remove': 1, + 'some': 1, + 'takeRightWhile': 1, + 'takeWhile': 1, + 'times': 1, + 'transform': 2 +}; + +/** Used to map method names to iteratee rearg configs. */ +exports.iterateeRearg = { + 'mapKeys': [1], + 'reduceRight': [1, 0] +}; + +/** Used to map method names to rearg configs. */ +exports.methodRearg = { + 'assignInAllWith': [1, 0], + 'assignInWith': [1, 2, 0], + 'assignAllWith': [1, 0], + 'assignWith': [1, 2, 0], + 'differenceBy': [1, 2, 0], + 'differenceWith': [1, 2, 0], + 'getOr': [2, 1, 0], + 'intersectionBy': [1, 2, 0], + 'intersectionWith': [1, 2, 0], + 'isEqualWith': [1, 2, 0], + 'isMatchWith': [2, 1, 0], + 'mergeAllWith': [1, 0], + 'mergeWith': [1, 2, 0], + 'padChars': [2, 1, 0], + 'padCharsEnd': [2, 1, 0], + 'padCharsStart': [2, 1, 0], + 'pullAllBy': [2, 1, 0], + 'pullAllWith': [2, 1, 0], + 'rangeStep': [1, 2, 0], + 'rangeStepRight': [1, 2, 0], + 'setWith': [3, 1, 2, 0], + 'sortedIndexBy': [2, 1, 0], + 'sortedLastIndexBy': [2, 1, 0], + 'unionBy': [1, 2, 0], + 'unionWith': [1, 2, 0], + 'updateWith': [3, 1, 2, 0], + 'xorBy': [1, 2, 0], + 'xorWith': [1, 2, 0], + 'zipWith': [1, 2, 0] +}; + +/** Used to map method names to spread configs. */ +exports.methodSpread = { + 'assignAll': { 'start': 0 }, + 'assignAllWith': { 'start': 0 }, + 'assignInAll': { 'start': 0 }, + 'assignInAllWith': { 'start': 0 }, + 'defaultsAll': { 'start': 0 }, + 'defaultsDeepAll': { 'start': 0 }, + 'invokeArgs': { 'start': 2 }, + 'invokeArgsMap': { 'start': 2 }, + 'mergeAll': { 'start': 0 }, + 'mergeAllWith': { 'start': 0 }, + 'partial': { 'start': 1 }, + 'partialRight': { 'start': 1 }, + 'without': { 'start': 1 }, + 'zipAll': { 'start': 0 } +}; + +/** Used to identify methods which mutate arrays or objects. */ +exports.mutate = { + 'array': { + 'fill': true, + 'pull': true, + 'pullAll': true, + 'pullAllBy': true, + 'pullAllWith': true, + 'pullAt': true, + 'remove': true, + 'reverse': true + }, + 'object': { + 'assign': true, + 'assignAll': true, + 'assignAllWith': true, + 'assignIn': true, + 'assignInAll': true, + 'assignInAllWith': true, + 'assignInWith': true, + 'assignWith': true, + 'defaults': true, + 'defaultsAll': true, + 'defaultsDeep': true, + 'defaultsDeepAll': true, + 'merge': true, + 'mergeAll': true, + 'mergeAllWith': true, + 'mergeWith': true, + }, + 'set': { + 'set': true, + 'setWith': true, + 'unset': true, + 'update': true, + 'updateWith': true + } +}; + +/** Used to map real names to their aliases. */ +exports.realToAlias = (function() { + var hasOwnProperty = Object.prototype.hasOwnProperty, + object = exports.aliasToReal, + result = {}; + + for (var key in object) { + var value = object[key]; + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + } + return result; +}()); + +/** Used to map method names to other names. */ +exports.remap = { + 'assignAll': 'assign', + 'assignAllWith': 'assignWith', + 'assignInAll': 'assignIn', + 'assignInAllWith': 'assignInWith', + 'curryN': 'curry', + 'curryRightN': 'curryRight', + 'defaultsAll': 'defaults', + 'defaultsDeepAll': 'defaultsDeep', + 'findFrom': 'find', + 'findIndexFrom': 'findIndex', + 'findLastFrom': 'findLast', + 'findLastIndexFrom': 'findLastIndex', + 'getOr': 'get', + 'includesFrom': 'includes', + 'indexOfFrom': 'indexOf', + 'invokeArgs': 'invoke', + 'invokeArgsMap': 'invokeMap', + 'lastIndexOfFrom': 'lastIndexOf', + 'mergeAll': 'merge', + 'mergeAllWith': 'mergeWith', + 'padChars': 'pad', + 'padCharsEnd': 'padEnd', + 'padCharsStart': 'padStart', + 'propertyOf': 'get', + 'rangeStep': 'range', + 'rangeStepRight': 'rangeRight', + 'restFrom': 'rest', + 'spreadFrom': 'spread', + 'trimChars': 'trim', + 'trimCharsEnd': 'trimEnd', + 'trimCharsStart': 'trimStart', + 'zipAll': 'zip' +}; + +/** Used to track methods that skip fixing their arity. */ +exports.skipFixed = { + 'castArray': true, + 'flow': true, + 'flowRight': true, + 'iteratee': true, + 'mixin': true, + 'rearg': true, + 'runInContext': true +}; + +/** Used to track methods that skip rearranging arguments. */ +exports.skipRearg = { + 'add': true, + 'assign': true, + 'assignIn': true, + 'bind': true, + 'bindKey': true, + 'concat': true, + 'difference': true, + 'divide': true, + 'eq': true, + 'gt': true, + 'gte': true, + 'isEqual': true, + 'lt': true, + 'lte': true, + 'matchesProperty': true, + 'merge': true, + 'multiply': true, + 'overArgs': true, + 'partial': true, + 'partialRight': true, + 'propertyOf': true, + 'random': true, + 'range': true, + 'rangeRight': true, + 'subtract': true, + 'zip': true, + 'zipObject': true, + 'zipObjectDeep': true +}; diff --git a/node_modules/lodash/fp/_util.js b/node_modules/lodash/fp/_util.js new file mode 100644 index 0000000..1dbf36f --- /dev/null +++ b/node_modules/lodash/fp/_util.js @@ -0,0 +1,16 @@ +module.exports = { + 'ary': require('../ary'), + 'assign': require('../_baseAssign'), + 'clone': require('../clone'), + 'curry': require('../curry'), + 'forEach': require('../_arrayEach'), + 'isArray': require('../isArray'), + 'isError': require('../isError'), + 'isFunction': require('../isFunction'), + 'isWeakMap': require('../isWeakMap'), + 'iteratee': require('../iteratee'), + 'keys': require('../_baseKeys'), + 'rearg': require('../rearg'), + 'toInteger': require('../toInteger'), + 'toPath': require('../toPath') +}; diff --git a/node_modules/lodash/fp/add.js b/node_modules/lodash/fp/add.js new file mode 100644 index 0000000..816eeec --- /dev/null +++ b/node_modules/lodash/fp/add.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('add', require('../add')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/after.js b/node_modules/lodash/fp/after.js new file mode 100644 index 0000000..21a0167 --- /dev/null +++ b/node_modules/lodash/fp/after.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('after', require('../after')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/all.js b/node_modules/lodash/fp/all.js new file mode 100644 index 0000000..d0839f7 --- /dev/null +++ b/node_modules/lodash/fp/all.js @@ -0,0 +1 @@ +module.exports = require('./every'); diff --git a/node_modules/lodash/fp/allPass.js b/node_modules/lodash/fp/allPass.js new file mode 100644 index 0000000..79b73ef --- /dev/null +++ b/node_modules/lodash/fp/allPass.js @@ -0,0 +1 @@ +module.exports = require('./overEvery'); diff --git a/node_modules/lodash/fp/always.js b/node_modules/lodash/fp/always.js new file mode 100644 index 0000000..9887703 --- /dev/null +++ b/node_modules/lodash/fp/always.js @@ -0,0 +1 @@ +module.exports = require('./constant'); diff --git a/node_modules/lodash/fp/any.js b/node_modules/lodash/fp/any.js new file mode 100644 index 0000000..900ac25 --- /dev/null +++ b/node_modules/lodash/fp/any.js @@ -0,0 +1 @@ +module.exports = require('./some'); diff --git a/node_modules/lodash/fp/anyPass.js b/node_modules/lodash/fp/anyPass.js new file mode 100644 index 0000000..2774ab3 --- /dev/null +++ b/node_modules/lodash/fp/anyPass.js @@ -0,0 +1 @@ +module.exports = require('./overSome'); diff --git a/node_modules/lodash/fp/apply.js b/node_modules/lodash/fp/apply.js new file mode 100644 index 0000000..2b75712 --- /dev/null +++ b/node_modules/lodash/fp/apply.js @@ -0,0 +1 @@ +module.exports = require('./spread'); diff --git a/node_modules/lodash/fp/array.js b/node_modules/lodash/fp/array.js new file mode 100644 index 0000000..fe939c2 --- /dev/null +++ b/node_modules/lodash/fp/array.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../array')); diff --git a/node_modules/lodash/fp/ary.js b/node_modules/lodash/fp/ary.js new file mode 100644 index 0000000..8edf187 --- /dev/null +++ b/node_modules/lodash/fp/ary.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('ary', require('../ary')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assign.js b/node_modules/lodash/fp/assign.js new file mode 100644 index 0000000..23f47af --- /dev/null +++ b/node_modules/lodash/fp/assign.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assign', require('../assign')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignAll.js b/node_modules/lodash/fp/assignAll.js new file mode 100644 index 0000000..b1d36c7 --- /dev/null +++ b/node_modules/lodash/fp/assignAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignAll', require('../assign')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignAllWith.js b/node_modules/lodash/fp/assignAllWith.js new file mode 100644 index 0000000..21e836e --- /dev/null +++ b/node_modules/lodash/fp/assignAllWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignAllWith', require('../assignWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignIn.js b/node_modules/lodash/fp/assignIn.js new file mode 100644 index 0000000..6e7c65f --- /dev/null +++ b/node_modules/lodash/fp/assignIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignIn', require('../assignIn')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignInAll.js b/node_modules/lodash/fp/assignInAll.js new file mode 100644 index 0000000..7ba75db --- /dev/null +++ b/node_modules/lodash/fp/assignInAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignInAll', require('../assignIn')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignInAllWith.js b/node_modules/lodash/fp/assignInAllWith.js new file mode 100644 index 0000000..e766903 --- /dev/null +++ b/node_modules/lodash/fp/assignInAllWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignInAllWith', require('../assignInWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignInWith.js b/node_modules/lodash/fp/assignInWith.js new file mode 100644 index 0000000..acb5923 --- /dev/null +++ b/node_modules/lodash/fp/assignInWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignInWith', require('../assignInWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assignWith.js b/node_modules/lodash/fp/assignWith.js new file mode 100644 index 0000000..eb92521 --- /dev/null +++ b/node_modules/lodash/fp/assignWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('assignWith', require('../assignWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/assoc.js b/node_modules/lodash/fp/assoc.js new file mode 100644 index 0000000..7648820 --- /dev/null +++ b/node_modules/lodash/fp/assoc.js @@ -0,0 +1 @@ +module.exports = require('./set'); diff --git a/node_modules/lodash/fp/assocPath.js b/node_modules/lodash/fp/assocPath.js new file mode 100644 index 0000000..7648820 --- /dev/null +++ b/node_modules/lodash/fp/assocPath.js @@ -0,0 +1 @@ +module.exports = require('./set'); diff --git a/node_modules/lodash/fp/at.js b/node_modules/lodash/fp/at.js new file mode 100644 index 0000000..cc39d25 --- /dev/null +++ b/node_modules/lodash/fp/at.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('at', require('../at')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/attempt.js b/node_modules/lodash/fp/attempt.js new file mode 100644 index 0000000..26ca42e --- /dev/null +++ b/node_modules/lodash/fp/attempt.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('attempt', require('../attempt')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/before.js b/node_modules/lodash/fp/before.js new file mode 100644 index 0000000..7a2de65 --- /dev/null +++ b/node_modules/lodash/fp/before.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('before', require('../before')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/bind.js b/node_modules/lodash/fp/bind.js new file mode 100644 index 0000000..5cbe4f3 --- /dev/null +++ b/node_modules/lodash/fp/bind.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('bind', require('../bind')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/bindAll.js b/node_modules/lodash/fp/bindAll.js new file mode 100644 index 0000000..6b4a4a0 --- /dev/null +++ b/node_modules/lodash/fp/bindAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('bindAll', require('../bindAll')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/bindKey.js b/node_modules/lodash/fp/bindKey.js new file mode 100644 index 0000000..6a46c6b --- /dev/null +++ b/node_modules/lodash/fp/bindKey.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('bindKey', require('../bindKey')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/camelCase.js b/node_modules/lodash/fp/camelCase.js new file mode 100644 index 0000000..87b77b4 --- /dev/null +++ b/node_modules/lodash/fp/camelCase.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('camelCase', require('../camelCase'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/capitalize.js b/node_modules/lodash/fp/capitalize.js new file mode 100644 index 0000000..cac74e1 --- /dev/null +++ b/node_modules/lodash/fp/capitalize.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('capitalize', require('../capitalize'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/castArray.js b/node_modules/lodash/fp/castArray.js new file mode 100644 index 0000000..8681c09 --- /dev/null +++ b/node_modules/lodash/fp/castArray.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('castArray', require('../castArray')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/ceil.js b/node_modules/lodash/fp/ceil.js new file mode 100644 index 0000000..f416b72 --- /dev/null +++ b/node_modules/lodash/fp/ceil.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('ceil', require('../ceil')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/chain.js b/node_modules/lodash/fp/chain.js new file mode 100644 index 0000000..604fe39 --- /dev/null +++ b/node_modules/lodash/fp/chain.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('chain', require('../chain'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/chunk.js b/node_modules/lodash/fp/chunk.js new file mode 100644 index 0000000..871ab08 --- /dev/null +++ b/node_modules/lodash/fp/chunk.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('chunk', require('../chunk')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/clamp.js b/node_modules/lodash/fp/clamp.js new file mode 100644 index 0000000..3b06c01 --- /dev/null +++ b/node_modules/lodash/fp/clamp.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('clamp', require('../clamp')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/clone.js b/node_modules/lodash/fp/clone.js new file mode 100644 index 0000000..cadb59c --- /dev/null +++ b/node_modules/lodash/fp/clone.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('clone', require('../clone'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/cloneDeep.js b/node_modules/lodash/fp/cloneDeep.js new file mode 100644 index 0000000..a6107aa --- /dev/null +++ b/node_modules/lodash/fp/cloneDeep.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('cloneDeep', require('../cloneDeep'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/cloneDeepWith.js b/node_modules/lodash/fp/cloneDeepWith.js new file mode 100644 index 0000000..6f01e44 --- /dev/null +++ b/node_modules/lodash/fp/cloneDeepWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('cloneDeepWith', require('../cloneDeepWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/cloneWith.js b/node_modules/lodash/fp/cloneWith.js new file mode 100644 index 0000000..aa88578 --- /dev/null +++ b/node_modules/lodash/fp/cloneWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('cloneWith', require('../cloneWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/collection.js b/node_modules/lodash/fp/collection.js new file mode 100644 index 0000000..fc8b328 --- /dev/null +++ b/node_modules/lodash/fp/collection.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../collection')); diff --git a/node_modules/lodash/fp/commit.js b/node_modules/lodash/fp/commit.js new file mode 100644 index 0000000..130a894 --- /dev/null +++ b/node_modules/lodash/fp/commit.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('commit', require('../commit'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/compact.js b/node_modules/lodash/fp/compact.js new file mode 100644 index 0000000..ce8f7a1 --- /dev/null +++ b/node_modules/lodash/fp/compact.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('compact', require('../compact'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/complement.js b/node_modules/lodash/fp/complement.js new file mode 100644 index 0000000..93eb462 --- /dev/null +++ b/node_modules/lodash/fp/complement.js @@ -0,0 +1 @@ +module.exports = require('./negate'); diff --git a/node_modules/lodash/fp/compose.js b/node_modules/lodash/fp/compose.js new file mode 100644 index 0000000..1954e94 --- /dev/null +++ b/node_modules/lodash/fp/compose.js @@ -0,0 +1 @@ +module.exports = require('./flowRight'); diff --git a/node_modules/lodash/fp/concat.js b/node_modules/lodash/fp/concat.js new file mode 100644 index 0000000..e59346a --- /dev/null +++ b/node_modules/lodash/fp/concat.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('concat', require('../concat')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/cond.js b/node_modules/lodash/fp/cond.js new file mode 100644 index 0000000..6a0120e --- /dev/null +++ b/node_modules/lodash/fp/cond.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('cond', require('../cond'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/conforms.js b/node_modules/lodash/fp/conforms.js new file mode 100644 index 0000000..3247f64 --- /dev/null +++ b/node_modules/lodash/fp/conforms.js @@ -0,0 +1 @@ +module.exports = require('./conformsTo'); diff --git a/node_modules/lodash/fp/conformsTo.js b/node_modules/lodash/fp/conformsTo.js new file mode 100644 index 0000000..aa7f41e --- /dev/null +++ b/node_modules/lodash/fp/conformsTo.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('conformsTo', require('../conformsTo')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/constant.js b/node_modules/lodash/fp/constant.js new file mode 100644 index 0000000..9e406fc --- /dev/null +++ b/node_modules/lodash/fp/constant.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('constant', require('../constant'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/contains.js b/node_modules/lodash/fp/contains.js new file mode 100644 index 0000000..594722a --- /dev/null +++ b/node_modules/lodash/fp/contains.js @@ -0,0 +1 @@ +module.exports = require('./includes'); diff --git a/node_modules/lodash/fp/convert.js b/node_modules/lodash/fp/convert.js new file mode 100644 index 0000000..4795dc4 --- /dev/null +++ b/node_modules/lodash/fp/convert.js @@ -0,0 +1,18 @@ +var baseConvert = require('./_baseConvert'), + util = require('./_util'); + +/** + * Converts `func` of `name` to an immutable auto-curried iteratee-first data-last + * version with conversion `options` applied. If `name` is an object its methods + * will be converted. + * + * @param {string} name The name of the function to wrap. + * @param {Function} [func] The function to wrap. + * @param {Object} [options] The options object. See `baseConvert` for more details. + * @returns {Function|Object} Returns the converted function or object. + */ +function convert(name, func, options) { + return baseConvert(util, name, func, options); +} + +module.exports = convert; diff --git a/node_modules/lodash/fp/countBy.js b/node_modules/lodash/fp/countBy.js new file mode 100644 index 0000000..dfa4643 --- /dev/null +++ b/node_modules/lodash/fp/countBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('countBy', require('../countBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/create.js b/node_modules/lodash/fp/create.js new file mode 100644 index 0000000..752025f --- /dev/null +++ b/node_modules/lodash/fp/create.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('create', require('../create')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/curry.js b/node_modules/lodash/fp/curry.js new file mode 100644 index 0000000..b0b4168 --- /dev/null +++ b/node_modules/lodash/fp/curry.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('curry', require('../curry')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/curryN.js b/node_modules/lodash/fp/curryN.js new file mode 100644 index 0000000..2ae7d00 --- /dev/null +++ b/node_modules/lodash/fp/curryN.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('curryN', require('../curry')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/curryRight.js b/node_modules/lodash/fp/curryRight.js new file mode 100644 index 0000000..cb619eb --- /dev/null +++ b/node_modules/lodash/fp/curryRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('curryRight', require('../curryRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/curryRightN.js b/node_modules/lodash/fp/curryRightN.js new file mode 100644 index 0000000..2495afc --- /dev/null +++ b/node_modules/lodash/fp/curryRightN.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('curryRightN', require('../curryRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/date.js b/node_modules/lodash/fp/date.js new file mode 100644 index 0000000..82cb952 --- /dev/null +++ b/node_modules/lodash/fp/date.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../date')); diff --git a/node_modules/lodash/fp/debounce.js b/node_modules/lodash/fp/debounce.js new file mode 100644 index 0000000..2612229 --- /dev/null +++ b/node_modules/lodash/fp/debounce.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('debounce', require('../debounce')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/deburr.js b/node_modules/lodash/fp/deburr.js new file mode 100644 index 0000000..96463ab --- /dev/null +++ b/node_modules/lodash/fp/deburr.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('deburr', require('../deburr'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/defaultTo.js b/node_modules/lodash/fp/defaultTo.js new file mode 100644 index 0000000..d6b52a4 --- /dev/null +++ b/node_modules/lodash/fp/defaultTo.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('defaultTo', require('../defaultTo')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/defaults.js b/node_modules/lodash/fp/defaults.js new file mode 100644 index 0000000..e1a8e6e --- /dev/null +++ b/node_modules/lodash/fp/defaults.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('defaults', require('../defaults')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/defaultsAll.js b/node_modules/lodash/fp/defaultsAll.js new file mode 100644 index 0000000..238fcc3 --- /dev/null +++ b/node_modules/lodash/fp/defaultsAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('defaultsAll', require('../defaults')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/defaultsDeep.js b/node_modules/lodash/fp/defaultsDeep.js new file mode 100644 index 0000000..1f172ff --- /dev/null +++ b/node_modules/lodash/fp/defaultsDeep.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('defaultsDeep', require('../defaultsDeep')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/defaultsDeepAll.js b/node_modules/lodash/fp/defaultsDeepAll.js new file mode 100644 index 0000000..6835f2f --- /dev/null +++ b/node_modules/lodash/fp/defaultsDeepAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('defaultsDeepAll', require('../defaultsDeep')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/defer.js b/node_modules/lodash/fp/defer.js new file mode 100644 index 0000000..ec7990f --- /dev/null +++ b/node_modules/lodash/fp/defer.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('defer', require('../defer'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/delay.js b/node_modules/lodash/fp/delay.js new file mode 100644 index 0000000..556dbd5 --- /dev/null +++ b/node_modules/lodash/fp/delay.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('delay', require('../delay')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/difference.js b/node_modules/lodash/fp/difference.js new file mode 100644 index 0000000..2d03765 --- /dev/null +++ b/node_modules/lodash/fp/difference.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('difference', require('../difference')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/differenceBy.js b/node_modules/lodash/fp/differenceBy.js new file mode 100644 index 0000000..2f91491 --- /dev/null +++ b/node_modules/lodash/fp/differenceBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('differenceBy', require('../differenceBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/differenceWith.js b/node_modules/lodash/fp/differenceWith.js new file mode 100644 index 0000000..bcf5ad2 --- /dev/null +++ b/node_modules/lodash/fp/differenceWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('differenceWith', require('../differenceWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/dissoc.js b/node_modules/lodash/fp/dissoc.js new file mode 100644 index 0000000..7ec7be1 --- /dev/null +++ b/node_modules/lodash/fp/dissoc.js @@ -0,0 +1 @@ +module.exports = require('./unset'); diff --git a/node_modules/lodash/fp/dissocPath.js b/node_modules/lodash/fp/dissocPath.js new file mode 100644 index 0000000..7ec7be1 --- /dev/null +++ b/node_modules/lodash/fp/dissocPath.js @@ -0,0 +1 @@ +module.exports = require('./unset'); diff --git a/node_modules/lodash/fp/divide.js b/node_modules/lodash/fp/divide.js new file mode 100644 index 0000000..82048c5 --- /dev/null +++ b/node_modules/lodash/fp/divide.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('divide', require('../divide')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/drop.js b/node_modules/lodash/fp/drop.js new file mode 100644 index 0000000..2fa9b4f --- /dev/null +++ b/node_modules/lodash/fp/drop.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('drop', require('../drop')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/dropLast.js b/node_modules/lodash/fp/dropLast.js new file mode 100644 index 0000000..174e525 --- /dev/null +++ b/node_modules/lodash/fp/dropLast.js @@ -0,0 +1 @@ +module.exports = require('./dropRight'); diff --git a/node_modules/lodash/fp/dropLastWhile.js b/node_modules/lodash/fp/dropLastWhile.js new file mode 100644 index 0000000..be2a9d2 --- /dev/null +++ b/node_modules/lodash/fp/dropLastWhile.js @@ -0,0 +1 @@ +module.exports = require('./dropRightWhile'); diff --git a/node_modules/lodash/fp/dropRight.js b/node_modules/lodash/fp/dropRight.js new file mode 100644 index 0000000..e98881f --- /dev/null +++ b/node_modules/lodash/fp/dropRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('dropRight', require('../dropRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/dropRightWhile.js b/node_modules/lodash/fp/dropRightWhile.js new file mode 100644 index 0000000..cacaa70 --- /dev/null +++ b/node_modules/lodash/fp/dropRightWhile.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('dropRightWhile', require('../dropRightWhile')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/dropWhile.js b/node_modules/lodash/fp/dropWhile.js new file mode 100644 index 0000000..285f864 --- /dev/null +++ b/node_modules/lodash/fp/dropWhile.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('dropWhile', require('../dropWhile')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/each.js b/node_modules/lodash/fp/each.js new file mode 100644 index 0000000..8800f42 --- /dev/null +++ b/node_modules/lodash/fp/each.js @@ -0,0 +1 @@ +module.exports = require('./forEach'); diff --git a/node_modules/lodash/fp/eachRight.js b/node_modules/lodash/fp/eachRight.js new file mode 100644 index 0000000..3252b2a --- /dev/null +++ b/node_modules/lodash/fp/eachRight.js @@ -0,0 +1 @@ +module.exports = require('./forEachRight'); diff --git a/node_modules/lodash/fp/endsWith.js b/node_modules/lodash/fp/endsWith.js new file mode 100644 index 0000000..17dc2a4 --- /dev/null +++ b/node_modules/lodash/fp/endsWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('endsWith', require('../endsWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/entries.js b/node_modules/lodash/fp/entries.js new file mode 100644 index 0000000..7a88df2 --- /dev/null +++ b/node_modules/lodash/fp/entries.js @@ -0,0 +1 @@ +module.exports = require('./toPairs'); diff --git a/node_modules/lodash/fp/entriesIn.js b/node_modules/lodash/fp/entriesIn.js new file mode 100644 index 0000000..f6c6331 --- /dev/null +++ b/node_modules/lodash/fp/entriesIn.js @@ -0,0 +1 @@ +module.exports = require('./toPairsIn'); diff --git a/node_modules/lodash/fp/eq.js b/node_modules/lodash/fp/eq.js new file mode 100644 index 0000000..9a3d21b --- /dev/null +++ b/node_modules/lodash/fp/eq.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('eq', require('../eq')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/equals.js b/node_modules/lodash/fp/equals.js new file mode 100644 index 0000000..e6a5ce0 --- /dev/null +++ b/node_modules/lodash/fp/equals.js @@ -0,0 +1 @@ +module.exports = require('./isEqual'); diff --git a/node_modules/lodash/fp/escape.js b/node_modules/lodash/fp/escape.js new file mode 100644 index 0000000..52c1fbb --- /dev/null +++ b/node_modules/lodash/fp/escape.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('escape', require('../escape'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/escapeRegExp.js b/node_modules/lodash/fp/escapeRegExp.js new file mode 100644 index 0000000..369b2ef --- /dev/null +++ b/node_modules/lodash/fp/escapeRegExp.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('escapeRegExp', require('../escapeRegExp'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/every.js b/node_modules/lodash/fp/every.js new file mode 100644 index 0000000..95c2776 --- /dev/null +++ b/node_modules/lodash/fp/every.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('every', require('../every')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/extend.js b/node_modules/lodash/fp/extend.js new file mode 100644 index 0000000..e00166c --- /dev/null +++ b/node_modules/lodash/fp/extend.js @@ -0,0 +1 @@ +module.exports = require('./assignIn'); diff --git a/node_modules/lodash/fp/extendAll.js b/node_modules/lodash/fp/extendAll.js new file mode 100644 index 0000000..cc55b64 --- /dev/null +++ b/node_modules/lodash/fp/extendAll.js @@ -0,0 +1 @@ +module.exports = require('./assignInAll'); diff --git a/node_modules/lodash/fp/extendAllWith.js b/node_modules/lodash/fp/extendAllWith.js new file mode 100644 index 0000000..6679d20 --- /dev/null +++ b/node_modules/lodash/fp/extendAllWith.js @@ -0,0 +1 @@ +module.exports = require('./assignInAllWith'); diff --git a/node_modules/lodash/fp/extendWith.js b/node_modules/lodash/fp/extendWith.js new file mode 100644 index 0000000..dbdcb3b --- /dev/null +++ b/node_modules/lodash/fp/extendWith.js @@ -0,0 +1 @@ +module.exports = require('./assignInWith'); diff --git a/node_modules/lodash/fp/fill.js b/node_modules/lodash/fp/fill.js new file mode 100644 index 0000000..b2d47e8 --- /dev/null +++ b/node_modules/lodash/fp/fill.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('fill', require('../fill')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/filter.js b/node_modules/lodash/fp/filter.js new file mode 100644 index 0000000..796d501 --- /dev/null +++ b/node_modules/lodash/fp/filter.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('filter', require('../filter')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/find.js b/node_modules/lodash/fp/find.js new file mode 100644 index 0000000..f805d33 --- /dev/null +++ b/node_modules/lodash/fp/find.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('find', require('../find')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findFrom.js b/node_modules/lodash/fp/findFrom.js new file mode 100644 index 0000000..da8275e --- /dev/null +++ b/node_modules/lodash/fp/findFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findFrom', require('../find')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findIndex.js b/node_modules/lodash/fp/findIndex.js new file mode 100644 index 0000000..8c15fd1 --- /dev/null +++ b/node_modules/lodash/fp/findIndex.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findIndex', require('../findIndex')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findIndexFrom.js b/node_modules/lodash/fp/findIndexFrom.js new file mode 100644 index 0000000..32e98cb --- /dev/null +++ b/node_modules/lodash/fp/findIndexFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findIndexFrom', require('../findIndex')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findKey.js b/node_modules/lodash/fp/findKey.js new file mode 100644 index 0000000..475bcfa --- /dev/null +++ b/node_modules/lodash/fp/findKey.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findKey', require('../findKey')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findLast.js b/node_modules/lodash/fp/findLast.js new file mode 100644 index 0000000..093fe94 --- /dev/null +++ b/node_modules/lodash/fp/findLast.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findLast', require('../findLast')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findLastFrom.js b/node_modules/lodash/fp/findLastFrom.js new file mode 100644 index 0000000..76c38fb --- /dev/null +++ b/node_modules/lodash/fp/findLastFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findLastFrom', require('../findLast')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findLastIndex.js b/node_modules/lodash/fp/findLastIndex.js new file mode 100644 index 0000000..36986df --- /dev/null +++ b/node_modules/lodash/fp/findLastIndex.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findLastIndex', require('../findLastIndex')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findLastIndexFrom.js b/node_modules/lodash/fp/findLastIndexFrom.js new file mode 100644 index 0000000..34c8176 --- /dev/null +++ b/node_modules/lodash/fp/findLastIndexFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findLastIndexFrom', require('../findLastIndex')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/findLastKey.js b/node_modules/lodash/fp/findLastKey.js new file mode 100644 index 0000000..5f81b60 --- /dev/null +++ b/node_modules/lodash/fp/findLastKey.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('findLastKey', require('../findLastKey')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/first.js b/node_modules/lodash/fp/first.js new file mode 100644 index 0000000..53f4ad1 --- /dev/null +++ b/node_modules/lodash/fp/first.js @@ -0,0 +1 @@ +module.exports = require('./head'); diff --git a/node_modules/lodash/fp/flatMap.js b/node_modules/lodash/fp/flatMap.js new file mode 100644 index 0000000..d01dc4d --- /dev/null +++ b/node_modules/lodash/fp/flatMap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flatMap', require('../flatMap')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flatMapDeep.js b/node_modules/lodash/fp/flatMapDeep.js new file mode 100644 index 0000000..569c42e --- /dev/null +++ b/node_modules/lodash/fp/flatMapDeep.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flatMapDeep', require('../flatMapDeep')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flatMapDepth.js b/node_modules/lodash/fp/flatMapDepth.js new file mode 100644 index 0000000..6eb68fd --- /dev/null +++ b/node_modules/lodash/fp/flatMapDepth.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flatMapDepth', require('../flatMapDepth')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flatten.js b/node_modules/lodash/fp/flatten.js new file mode 100644 index 0000000..30425d8 --- /dev/null +++ b/node_modules/lodash/fp/flatten.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flatten', require('../flatten'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flattenDeep.js b/node_modules/lodash/fp/flattenDeep.js new file mode 100644 index 0000000..aed5db2 --- /dev/null +++ b/node_modules/lodash/fp/flattenDeep.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flattenDeep', require('../flattenDeep'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flattenDepth.js b/node_modules/lodash/fp/flattenDepth.js new file mode 100644 index 0000000..ad65e37 --- /dev/null +++ b/node_modules/lodash/fp/flattenDepth.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flattenDepth', require('../flattenDepth')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flip.js b/node_modules/lodash/fp/flip.js new file mode 100644 index 0000000..0547e7b --- /dev/null +++ b/node_modules/lodash/fp/flip.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flip', require('../flip'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/floor.js b/node_modules/lodash/fp/floor.js new file mode 100644 index 0000000..a6cf335 --- /dev/null +++ b/node_modules/lodash/fp/floor.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('floor', require('../floor')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flow.js b/node_modules/lodash/fp/flow.js new file mode 100644 index 0000000..cd83677 --- /dev/null +++ b/node_modules/lodash/fp/flow.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flow', require('../flow')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/flowRight.js b/node_modules/lodash/fp/flowRight.js new file mode 100644 index 0000000..972a5b9 --- /dev/null +++ b/node_modules/lodash/fp/flowRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('flowRight', require('../flowRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/forEach.js b/node_modules/lodash/fp/forEach.js new file mode 100644 index 0000000..2f49452 --- /dev/null +++ b/node_modules/lodash/fp/forEach.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('forEach', require('../forEach')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/forEachRight.js b/node_modules/lodash/fp/forEachRight.js new file mode 100644 index 0000000..3ff9733 --- /dev/null +++ b/node_modules/lodash/fp/forEachRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('forEachRight', require('../forEachRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/forIn.js b/node_modules/lodash/fp/forIn.js new file mode 100644 index 0000000..9341749 --- /dev/null +++ b/node_modules/lodash/fp/forIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('forIn', require('../forIn')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/forInRight.js b/node_modules/lodash/fp/forInRight.js new file mode 100644 index 0000000..cecf8bb --- /dev/null +++ b/node_modules/lodash/fp/forInRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('forInRight', require('../forInRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/forOwn.js b/node_modules/lodash/fp/forOwn.js new file mode 100644 index 0000000..246449e --- /dev/null +++ b/node_modules/lodash/fp/forOwn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('forOwn', require('../forOwn')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/forOwnRight.js b/node_modules/lodash/fp/forOwnRight.js new file mode 100644 index 0000000..c5e826e --- /dev/null +++ b/node_modules/lodash/fp/forOwnRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('forOwnRight', require('../forOwnRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/fromPairs.js b/node_modules/lodash/fp/fromPairs.js new file mode 100644 index 0000000..f8cc596 --- /dev/null +++ b/node_modules/lodash/fp/fromPairs.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('fromPairs', require('../fromPairs')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/function.js b/node_modules/lodash/fp/function.js new file mode 100644 index 0000000..dfe69b1 --- /dev/null +++ b/node_modules/lodash/fp/function.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../function')); diff --git a/node_modules/lodash/fp/functions.js b/node_modules/lodash/fp/functions.js new file mode 100644 index 0000000..09d1bb1 --- /dev/null +++ b/node_modules/lodash/fp/functions.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('functions', require('../functions'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/functionsIn.js b/node_modules/lodash/fp/functionsIn.js new file mode 100644 index 0000000..2cfeb83 --- /dev/null +++ b/node_modules/lodash/fp/functionsIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('functionsIn', require('../functionsIn'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/get.js b/node_modules/lodash/fp/get.js new file mode 100644 index 0000000..6d3a328 --- /dev/null +++ b/node_modules/lodash/fp/get.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('get', require('../get')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/getOr.js b/node_modules/lodash/fp/getOr.js new file mode 100644 index 0000000..7dbf771 --- /dev/null +++ b/node_modules/lodash/fp/getOr.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('getOr', require('../get')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/groupBy.js b/node_modules/lodash/fp/groupBy.js new file mode 100644 index 0000000..fc0bc78 --- /dev/null +++ b/node_modules/lodash/fp/groupBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('groupBy', require('../groupBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/gt.js b/node_modules/lodash/fp/gt.js new file mode 100644 index 0000000..9e57c80 --- /dev/null +++ b/node_modules/lodash/fp/gt.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('gt', require('../gt')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/gte.js b/node_modules/lodash/fp/gte.js new file mode 100644 index 0000000..4584786 --- /dev/null +++ b/node_modules/lodash/fp/gte.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('gte', require('../gte')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/has.js b/node_modules/lodash/fp/has.js new file mode 100644 index 0000000..b901298 --- /dev/null +++ b/node_modules/lodash/fp/has.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('has', require('../has')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/hasIn.js b/node_modules/lodash/fp/hasIn.js new file mode 100644 index 0000000..b3c3d1a --- /dev/null +++ b/node_modules/lodash/fp/hasIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('hasIn', require('../hasIn')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/head.js b/node_modules/lodash/fp/head.js new file mode 100644 index 0000000..2694f0a --- /dev/null +++ b/node_modules/lodash/fp/head.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('head', require('../head'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/identical.js b/node_modules/lodash/fp/identical.js new file mode 100644 index 0000000..85563f4 --- /dev/null +++ b/node_modules/lodash/fp/identical.js @@ -0,0 +1 @@ +module.exports = require('./eq'); diff --git a/node_modules/lodash/fp/identity.js b/node_modules/lodash/fp/identity.js new file mode 100644 index 0000000..096415a --- /dev/null +++ b/node_modules/lodash/fp/identity.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('identity', require('../identity'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/inRange.js b/node_modules/lodash/fp/inRange.js new file mode 100644 index 0000000..202d940 --- /dev/null +++ b/node_modules/lodash/fp/inRange.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('inRange', require('../inRange')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/includes.js b/node_modules/lodash/fp/includes.js new file mode 100644 index 0000000..1146780 --- /dev/null +++ b/node_modules/lodash/fp/includes.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('includes', require('../includes')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/includesFrom.js b/node_modules/lodash/fp/includesFrom.js new file mode 100644 index 0000000..683afdb --- /dev/null +++ b/node_modules/lodash/fp/includesFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('includesFrom', require('../includes')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/indexBy.js b/node_modules/lodash/fp/indexBy.js new file mode 100644 index 0000000..7e64bc0 --- /dev/null +++ b/node_modules/lodash/fp/indexBy.js @@ -0,0 +1 @@ +module.exports = require('./keyBy'); diff --git a/node_modules/lodash/fp/indexOf.js b/node_modules/lodash/fp/indexOf.js new file mode 100644 index 0000000..524658e --- /dev/null +++ b/node_modules/lodash/fp/indexOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('indexOf', require('../indexOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/indexOfFrom.js b/node_modules/lodash/fp/indexOfFrom.js new file mode 100644 index 0000000..d99c822 --- /dev/null +++ b/node_modules/lodash/fp/indexOfFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('indexOfFrom', require('../indexOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/init.js b/node_modules/lodash/fp/init.js new file mode 100644 index 0000000..2f88d8b --- /dev/null +++ b/node_modules/lodash/fp/init.js @@ -0,0 +1 @@ +module.exports = require('./initial'); diff --git a/node_modules/lodash/fp/initial.js b/node_modules/lodash/fp/initial.js new file mode 100644 index 0000000..b732ba0 --- /dev/null +++ b/node_modules/lodash/fp/initial.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('initial', require('../initial'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/intersection.js b/node_modules/lodash/fp/intersection.js new file mode 100644 index 0000000..52936d5 --- /dev/null +++ b/node_modules/lodash/fp/intersection.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('intersection', require('../intersection')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/intersectionBy.js b/node_modules/lodash/fp/intersectionBy.js new file mode 100644 index 0000000..72629f2 --- /dev/null +++ b/node_modules/lodash/fp/intersectionBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('intersectionBy', require('../intersectionBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/intersectionWith.js b/node_modules/lodash/fp/intersectionWith.js new file mode 100644 index 0000000..e064f40 --- /dev/null +++ b/node_modules/lodash/fp/intersectionWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('intersectionWith', require('../intersectionWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/invert.js b/node_modules/lodash/fp/invert.js new file mode 100644 index 0000000..2d5d1f0 --- /dev/null +++ b/node_modules/lodash/fp/invert.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('invert', require('../invert')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/invertBy.js b/node_modules/lodash/fp/invertBy.js new file mode 100644 index 0000000..63ca97e --- /dev/null +++ b/node_modules/lodash/fp/invertBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('invertBy', require('../invertBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/invertObj.js b/node_modules/lodash/fp/invertObj.js new file mode 100644 index 0000000..f1d842e --- /dev/null +++ b/node_modules/lodash/fp/invertObj.js @@ -0,0 +1 @@ +module.exports = require('./invert'); diff --git a/node_modules/lodash/fp/invoke.js b/node_modules/lodash/fp/invoke.js new file mode 100644 index 0000000..fcf17f0 --- /dev/null +++ b/node_modules/lodash/fp/invoke.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('invoke', require('../invoke')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/invokeArgs.js b/node_modules/lodash/fp/invokeArgs.js new file mode 100644 index 0000000..d3f2953 --- /dev/null +++ b/node_modules/lodash/fp/invokeArgs.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('invokeArgs', require('../invoke')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/invokeArgsMap.js b/node_modules/lodash/fp/invokeArgsMap.js new file mode 100644 index 0000000..eaa9f84 --- /dev/null +++ b/node_modules/lodash/fp/invokeArgsMap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('invokeArgsMap', require('../invokeMap')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/invokeMap.js b/node_modules/lodash/fp/invokeMap.js new file mode 100644 index 0000000..6515fd7 --- /dev/null +++ b/node_modules/lodash/fp/invokeMap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('invokeMap', require('../invokeMap')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isArguments.js b/node_modules/lodash/fp/isArguments.js new file mode 100644 index 0000000..1d93c9e --- /dev/null +++ b/node_modules/lodash/fp/isArguments.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isArguments', require('../isArguments'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isArray.js b/node_modules/lodash/fp/isArray.js new file mode 100644 index 0000000..ba7ade8 --- /dev/null +++ b/node_modules/lodash/fp/isArray.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isArray', require('../isArray'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isArrayBuffer.js b/node_modules/lodash/fp/isArrayBuffer.js new file mode 100644 index 0000000..5088513 --- /dev/null +++ b/node_modules/lodash/fp/isArrayBuffer.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isArrayBuffer', require('../isArrayBuffer'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isArrayLike.js b/node_modules/lodash/fp/isArrayLike.js new file mode 100644 index 0000000..8f1856b --- /dev/null +++ b/node_modules/lodash/fp/isArrayLike.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isArrayLike', require('../isArrayLike'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isArrayLikeObject.js b/node_modules/lodash/fp/isArrayLikeObject.js new file mode 100644 index 0000000..2108498 --- /dev/null +++ b/node_modules/lodash/fp/isArrayLikeObject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isArrayLikeObject', require('../isArrayLikeObject'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isBoolean.js b/node_modules/lodash/fp/isBoolean.js new file mode 100644 index 0000000..9339f75 --- /dev/null +++ b/node_modules/lodash/fp/isBoolean.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isBoolean', require('../isBoolean'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isBuffer.js b/node_modules/lodash/fp/isBuffer.js new file mode 100644 index 0000000..e60b123 --- /dev/null +++ b/node_modules/lodash/fp/isBuffer.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isBuffer', require('../isBuffer'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isDate.js b/node_modules/lodash/fp/isDate.js new file mode 100644 index 0000000..dc41d08 --- /dev/null +++ b/node_modules/lodash/fp/isDate.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isDate', require('../isDate'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isElement.js b/node_modules/lodash/fp/isElement.js new file mode 100644 index 0000000..18ee039 --- /dev/null +++ b/node_modules/lodash/fp/isElement.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isElement', require('../isElement'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isEmpty.js b/node_modules/lodash/fp/isEmpty.js new file mode 100644 index 0000000..0f4ae84 --- /dev/null +++ b/node_modules/lodash/fp/isEmpty.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isEmpty', require('../isEmpty'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isEqual.js b/node_modules/lodash/fp/isEqual.js new file mode 100644 index 0000000..4138386 --- /dev/null +++ b/node_modules/lodash/fp/isEqual.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isEqual', require('../isEqual')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isEqualWith.js b/node_modules/lodash/fp/isEqualWith.js new file mode 100644 index 0000000..029ff5c --- /dev/null +++ b/node_modules/lodash/fp/isEqualWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isEqualWith', require('../isEqualWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isError.js b/node_modules/lodash/fp/isError.js new file mode 100644 index 0000000..3dfd81c --- /dev/null +++ b/node_modules/lodash/fp/isError.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isError', require('../isError'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isFinite.js b/node_modules/lodash/fp/isFinite.js new file mode 100644 index 0000000..0b647b8 --- /dev/null +++ b/node_modules/lodash/fp/isFinite.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isFinite', require('../isFinite'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isFunction.js b/node_modules/lodash/fp/isFunction.js new file mode 100644 index 0000000..ff8e5c4 --- /dev/null +++ b/node_modules/lodash/fp/isFunction.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isFunction', require('../isFunction'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isInteger.js b/node_modules/lodash/fp/isInteger.js new file mode 100644 index 0000000..67af4ff --- /dev/null +++ b/node_modules/lodash/fp/isInteger.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isInteger', require('../isInteger'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isLength.js b/node_modules/lodash/fp/isLength.js new file mode 100644 index 0000000..fc101c5 --- /dev/null +++ b/node_modules/lodash/fp/isLength.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isLength', require('../isLength'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isMap.js b/node_modules/lodash/fp/isMap.js new file mode 100644 index 0000000..a209aa6 --- /dev/null +++ b/node_modules/lodash/fp/isMap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isMap', require('../isMap'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isMatch.js b/node_modules/lodash/fp/isMatch.js new file mode 100644 index 0000000..6264ca1 --- /dev/null +++ b/node_modules/lodash/fp/isMatch.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isMatch', require('../isMatch')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isMatchWith.js b/node_modules/lodash/fp/isMatchWith.js new file mode 100644 index 0000000..d95f319 --- /dev/null +++ b/node_modules/lodash/fp/isMatchWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isMatchWith', require('../isMatchWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isNaN.js b/node_modules/lodash/fp/isNaN.js new file mode 100644 index 0000000..66a978f --- /dev/null +++ b/node_modules/lodash/fp/isNaN.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isNaN', require('../isNaN'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isNative.js b/node_modules/lodash/fp/isNative.js new file mode 100644 index 0000000..3d775ba --- /dev/null +++ b/node_modules/lodash/fp/isNative.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isNative', require('../isNative'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isNil.js b/node_modules/lodash/fp/isNil.js new file mode 100644 index 0000000..5952c02 --- /dev/null +++ b/node_modules/lodash/fp/isNil.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isNil', require('../isNil'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isNull.js b/node_modules/lodash/fp/isNull.js new file mode 100644 index 0000000..f201a35 --- /dev/null +++ b/node_modules/lodash/fp/isNull.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isNull', require('../isNull'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isNumber.js b/node_modules/lodash/fp/isNumber.js new file mode 100644 index 0000000..a2b5fa0 --- /dev/null +++ b/node_modules/lodash/fp/isNumber.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isNumber', require('../isNumber'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isObject.js b/node_modules/lodash/fp/isObject.js new file mode 100644 index 0000000..231ace0 --- /dev/null +++ b/node_modules/lodash/fp/isObject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isObject', require('../isObject'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isObjectLike.js b/node_modules/lodash/fp/isObjectLike.js new file mode 100644 index 0000000..f16082e --- /dev/null +++ b/node_modules/lodash/fp/isObjectLike.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isObjectLike', require('../isObjectLike'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isPlainObject.js b/node_modules/lodash/fp/isPlainObject.js new file mode 100644 index 0000000..b5bea90 --- /dev/null +++ b/node_modules/lodash/fp/isPlainObject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isPlainObject', require('../isPlainObject'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isRegExp.js b/node_modules/lodash/fp/isRegExp.js new file mode 100644 index 0000000..12a1a3d --- /dev/null +++ b/node_modules/lodash/fp/isRegExp.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isRegExp', require('../isRegExp'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isSafeInteger.js b/node_modules/lodash/fp/isSafeInteger.js new file mode 100644 index 0000000..7230f55 --- /dev/null +++ b/node_modules/lodash/fp/isSafeInteger.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isSafeInteger', require('../isSafeInteger'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isSet.js b/node_modules/lodash/fp/isSet.js new file mode 100644 index 0000000..35c01f6 --- /dev/null +++ b/node_modules/lodash/fp/isSet.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isSet', require('../isSet'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isString.js b/node_modules/lodash/fp/isString.js new file mode 100644 index 0000000..1fd0679 --- /dev/null +++ b/node_modules/lodash/fp/isString.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isString', require('../isString'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isSymbol.js b/node_modules/lodash/fp/isSymbol.js new file mode 100644 index 0000000..3867695 --- /dev/null +++ b/node_modules/lodash/fp/isSymbol.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isSymbol', require('../isSymbol'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isTypedArray.js b/node_modules/lodash/fp/isTypedArray.js new file mode 100644 index 0000000..8567953 --- /dev/null +++ b/node_modules/lodash/fp/isTypedArray.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isTypedArray', require('../isTypedArray'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isUndefined.js b/node_modules/lodash/fp/isUndefined.js new file mode 100644 index 0000000..ddbca31 --- /dev/null +++ b/node_modules/lodash/fp/isUndefined.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isUndefined', require('../isUndefined'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isWeakMap.js b/node_modules/lodash/fp/isWeakMap.js new file mode 100644 index 0000000..ef60c61 --- /dev/null +++ b/node_modules/lodash/fp/isWeakMap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isWeakMap', require('../isWeakMap'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/isWeakSet.js b/node_modules/lodash/fp/isWeakSet.js new file mode 100644 index 0000000..c99bfaa --- /dev/null +++ b/node_modules/lodash/fp/isWeakSet.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('isWeakSet', require('../isWeakSet'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/iteratee.js b/node_modules/lodash/fp/iteratee.js new file mode 100644 index 0000000..9f0f717 --- /dev/null +++ b/node_modules/lodash/fp/iteratee.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('iteratee', require('../iteratee')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/join.js b/node_modules/lodash/fp/join.js new file mode 100644 index 0000000..a220e00 --- /dev/null +++ b/node_modules/lodash/fp/join.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('join', require('../join')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/juxt.js b/node_modules/lodash/fp/juxt.js new file mode 100644 index 0000000..f71e04e --- /dev/null +++ b/node_modules/lodash/fp/juxt.js @@ -0,0 +1 @@ +module.exports = require('./over'); diff --git a/node_modules/lodash/fp/kebabCase.js b/node_modules/lodash/fp/kebabCase.js new file mode 100644 index 0000000..60737f1 --- /dev/null +++ b/node_modules/lodash/fp/kebabCase.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('kebabCase', require('../kebabCase'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/keyBy.js b/node_modules/lodash/fp/keyBy.js new file mode 100644 index 0000000..9a6a85d --- /dev/null +++ b/node_modules/lodash/fp/keyBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('keyBy', require('../keyBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/keys.js b/node_modules/lodash/fp/keys.js new file mode 100644 index 0000000..e12bb07 --- /dev/null +++ b/node_modules/lodash/fp/keys.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('keys', require('../keys'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/keysIn.js b/node_modules/lodash/fp/keysIn.js new file mode 100644 index 0000000..f3eb36a --- /dev/null +++ b/node_modules/lodash/fp/keysIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('keysIn', require('../keysIn'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lang.js b/node_modules/lodash/fp/lang.js new file mode 100644 index 0000000..08cc9c1 --- /dev/null +++ b/node_modules/lodash/fp/lang.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../lang')); diff --git a/node_modules/lodash/fp/last.js b/node_modules/lodash/fp/last.js new file mode 100644 index 0000000..0f71699 --- /dev/null +++ b/node_modules/lodash/fp/last.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('last', require('../last'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lastIndexOf.js b/node_modules/lodash/fp/lastIndexOf.js new file mode 100644 index 0000000..ddf39c3 --- /dev/null +++ b/node_modules/lodash/fp/lastIndexOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('lastIndexOf', require('../lastIndexOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lastIndexOfFrom.js b/node_modules/lodash/fp/lastIndexOfFrom.js new file mode 100644 index 0000000..1ff6a0b --- /dev/null +++ b/node_modules/lodash/fp/lastIndexOfFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('lastIndexOfFrom', require('../lastIndexOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lowerCase.js b/node_modules/lodash/fp/lowerCase.js new file mode 100644 index 0000000..ea64bc1 --- /dev/null +++ b/node_modules/lodash/fp/lowerCase.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('lowerCase', require('../lowerCase'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lowerFirst.js b/node_modules/lodash/fp/lowerFirst.js new file mode 100644 index 0000000..539720a --- /dev/null +++ b/node_modules/lodash/fp/lowerFirst.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('lowerFirst', require('../lowerFirst'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lt.js b/node_modules/lodash/fp/lt.js new file mode 100644 index 0000000..a31d21e --- /dev/null +++ b/node_modules/lodash/fp/lt.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('lt', require('../lt')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/lte.js b/node_modules/lodash/fp/lte.js new file mode 100644 index 0000000..d795d10 --- /dev/null +++ b/node_modules/lodash/fp/lte.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('lte', require('../lte')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/map.js b/node_modules/lodash/fp/map.js new file mode 100644 index 0000000..cf98794 --- /dev/null +++ b/node_modules/lodash/fp/map.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('map', require('../map')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mapKeys.js b/node_modules/lodash/fp/mapKeys.js new file mode 100644 index 0000000..1684587 --- /dev/null +++ b/node_modules/lodash/fp/mapKeys.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mapKeys', require('../mapKeys')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mapValues.js b/node_modules/lodash/fp/mapValues.js new file mode 100644 index 0000000..4004972 --- /dev/null +++ b/node_modules/lodash/fp/mapValues.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mapValues', require('../mapValues')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/matches.js b/node_modules/lodash/fp/matches.js new file mode 100644 index 0000000..29d1e1e --- /dev/null +++ b/node_modules/lodash/fp/matches.js @@ -0,0 +1 @@ +module.exports = require('./isMatch'); diff --git a/node_modules/lodash/fp/matchesProperty.js b/node_modules/lodash/fp/matchesProperty.js new file mode 100644 index 0000000..4575bd2 --- /dev/null +++ b/node_modules/lodash/fp/matchesProperty.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('matchesProperty', require('../matchesProperty')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/math.js b/node_modules/lodash/fp/math.js new file mode 100644 index 0000000..e8f50f7 --- /dev/null +++ b/node_modules/lodash/fp/math.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../math')); diff --git a/node_modules/lodash/fp/max.js b/node_modules/lodash/fp/max.js new file mode 100644 index 0000000..a66acac --- /dev/null +++ b/node_modules/lodash/fp/max.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('max', require('../max'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/maxBy.js b/node_modules/lodash/fp/maxBy.js new file mode 100644 index 0000000..d083fd6 --- /dev/null +++ b/node_modules/lodash/fp/maxBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('maxBy', require('../maxBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mean.js b/node_modules/lodash/fp/mean.js new file mode 100644 index 0000000..3117246 --- /dev/null +++ b/node_modules/lodash/fp/mean.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mean', require('../mean'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/meanBy.js b/node_modules/lodash/fp/meanBy.js new file mode 100644 index 0000000..556f25e --- /dev/null +++ b/node_modules/lodash/fp/meanBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('meanBy', require('../meanBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/memoize.js b/node_modules/lodash/fp/memoize.js new file mode 100644 index 0000000..638eec6 --- /dev/null +++ b/node_modules/lodash/fp/memoize.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('memoize', require('../memoize')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/merge.js b/node_modules/lodash/fp/merge.js new file mode 100644 index 0000000..ac66add --- /dev/null +++ b/node_modules/lodash/fp/merge.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('merge', require('../merge')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mergeAll.js b/node_modules/lodash/fp/mergeAll.js new file mode 100644 index 0000000..a3674d6 --- /dev/null +++ b/node_modules/lodash/fp/mergeAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mergeAll', require('../merge')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mergeAllWith.js b/node_modules/lodash/fp/mergeAllWith.js new file mode 100644 index 0000000..4bd4206 --- /dev/null +++ b/node_modules/lodash/fp/mergeAllWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mergeAllWith', require('../mergeWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mergeWith.js b/node_modules/lodash/fp/mergeWith.js new file mode 100644 index 0000000..00d44d5 --- /dev/null +++ b/node_modules/lodash/fp/mergeWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mergeWith', require('../mergeWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/method.js b/node_modules/lodash/fp/method.js new file mode 100644 index 0000000..f4060c6 --- /dev/null +++ b/node_modules/lodash/fp/method.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('method', require('../method')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/methodOf.js b/node_modules/lodash/fp/methodOf.js new file mode 100644 index 0000000..6139905 --- /dev/null +++ b/node_modules/lodash/fp/methodOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('methodOf', require('../methodOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/min.js b/node_modules/lodash/fp/min.js new file mode 100644 index 0000000..d12c6b4 --- /dev/null +++ b/node_modules/lodash/fp/min.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('min', require('../min'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/minBy.js b/node_modules/lodash/fp/minBy.js new file mode 100644 index 0000000..fdb9e24 --- /dev/null +++ b/node_modules/lodash/fp/minBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('minBy', require('../minBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/mixin.js b/node_modules/lodash/fp/mixin.js new file mode 100644 index 0000000..332e6fb --- /dev/null +++ b/node_modules/lodash/fp/mixin.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('mixin', require('../mixin')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/multiply.js b/node_modules/lodash/fp/multiply.js new file mode 100644 index 0000000..4dcf0b0 --- /dev/null +++ b/node_modules/lodash/fp/multiply.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('multiply', require('../multiply')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/nAry.js b/node_modules/lodash/fp/nAry.js new file mode 100644 index 0000000..f262a76 --- /dev/null +++ b/node_modules/lodash/fp/nAry.js @@ -0,0 +1 @@ +module.exports = require('./ary'); diff --git a/node_modules/lodash/fp/negate.js b/node_modules/lodash/fp/negate.js new file mode 100644 index 0000000..8b6dc7c --- /dev/null +++ b/node_modules/lodash/fp/negate.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('negate', require('../negate'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/next.js b/node_modules/lodash/fp/next.js new file mode 100644 index 0000000..140155e --- /dev/null +++ b/node_modules/lodash/fp/next.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('next', require('../next'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/noop.js b/node_modules/lodash/fp/noop.js new file mode 100644 index 0000000..b9e32cc --- /dev/null +++ b/node_modules/lodash/fp/noop.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('noop', require('../noop'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/now.js b/node_modules/lodash/fp/now.js new file mode 100644 index 0000000..6de2068 --- /dev/null +++ b/node_modules/lodash/fp/now.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('now', require('../now'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/nth.js b/node_modules/lodash/fp/nth.js new file mode 100644 index 0000000..da4fda7 --- /dev/null +++ b/node_modules/lodash/fp/nth.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('nth', require('../nth')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/nthArg.js b/node_modules/lodash/fp/nthArg.js new file mode 100644 index 0000000..fce3165 --- /dev/null +++ b/node_modules/lodash/fp/nthArg.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('nthArg', require('../nthArg')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/number.js b/node_modules/lodash/fp/number.js new file mode 100644 index 0000000..5c10b88 --- /dev/null +++ b/node_modules/lodash/fp/number.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../number')); diff --git a/node_modules/lodash/fp/object.js b/node_modules/lodash/fp/object.js new file mode 100644 index 0000000..ae39a13 --- /dev/null +++ b/node_modules/lodash/fp/object.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../object')); diff --git a/node_modules/lodash/fp/omit.js b/node_modules/lodash/fp/omit.js new file mode 100644 index 0000000..fd68529 --- /dev/null +++ b/node_modules/lodash/fp/omit.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('omit', require('../omit')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/omitAll.js b/node_modules/lodash/fp/omitAll.js new file mode 100644 index 0000000..144cf4b --- /dev/null +++ b/node_modules/lodash/fp/omitAll.js @@ -0,0 +1 @@ +module.exports = require('./omit'); diff --git a/node_modules/lodash/fp/omitBy.js b/node_modules/lodash/fp/omitBy.js new file mode 100644 index 0000000..90df738 --- /dev/null +++ b/node_modules/lodash/fp/omitBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('omitBy', require('../omitBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/once.js b/node_modules/lodash/fp/once.js new file mode 100644 index 0000000..f8f0a5c --- /dev/null +++ b/node_modules/lodash/fp/once.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('once', require('../once'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/orderBy.js b/node_modules/lodash/fp/orderBy.js new file mode 100644 index 0000000..848e210 --- /dev/null +++ b/node_modules/lodash/fp/orderBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('orderBy', require('../orderBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/over.js b/node_modules/lodash/fp/over.js new file mode 100644 index 0000000..01eba7b --- /dev/null +++ b/node_modules/lodash/fp/over.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('over', require('../over')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/overArgs.js b/node_modules/lodash/fp/overArgs.js new file mode 100644 index 0000000..738556f --- /dev/null +++ b/node_modules/lodash/fp/overArgs.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('overArgs', require('../overArgs')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/overEvery.js b/node_modules/lodash/fp/overEvery.js new file mode 100644 index 0000000..9f5a032 --- /dev/null +++ b/node_modules/lodash/fp/overEvery.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('overEvery', require('../overEvery')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/overSome.js b/node_modules/lodash/fp/overSome.js new file mode 100644 index 0000000..15939d5 --- /dev/null +++ b/node_modules/lodash/fp/overSome.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('overSome', require('../overSome')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pad.js b/node_modules/lodash/fp/pad.js new file mode 100644 index 0000000..f1dea4a --- /dev/null +++ b/node_modules/lodash/fp/pad.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pad', require('../pad')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/padChars.js b/node_modules/lodash/fp/padChars.js new file mode 100644 index 0000000..d6e0804 --- /dev/null +++ b/node_modules/lodash/fp/padChars.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('padChars', require('../pad')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/padCharsEnd.js b/node_modules/lodash/fp/padCharsEnd.js new file mode 100644 index 0000000..d4ab79a --- /dev/null +++ b/node_modules/lodash/fp/padCharsEnd.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('padCharsEnd', require('../padEnd')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/padCharsStart.js b/node_modules/lodash/fp/padCharsStart.js new file mode 100644 index 0000000..a08a300 --- /dev/null +++ b/node_modules/lodash/fp/padCharsStart.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('padCharsStart', require('../padStart')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/padEnd.js b/node_modules/lodash/fp/padEnd.js new file mode 100644 index 0000000..a8522ec --- /dev/null +++ b/node_modules/lodash/fp/padEnd.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('padEnd', require('../padEnd')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/padStart.js b/node_modules/lodash/fp/padStart.js new file mode 100644 index 0000000..f4ca79d --- /dev/null +++ b/node_modules/lodash/fp/padStart.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('padStart', require('../padStart')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/parseInt.js b/node_modules/lodash/fp/parseInt.js new file mode 100644 index 0000000..27314cc --- /dev/null +++ b/node_modules/lodash/fp/parseInt.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('parseInt', require('../parseInt')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/partial.js b/node_modules/lodash/fp/partial.js new file mode 100644 index 0000000..5d46015 --- /dev/null +++ b/node_modules/lodash/fp/partial.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('partial', require('../partial')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/partialRight.js b/node_modules/lodash/fp/partialRight.js new file mode 100644 index 0000000..7f05fed --- /dev/null +++ b/node_modules/lodash/fp/partialRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('partialRight', require('../partialRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/partition.js b/node_modules/lodash/fp/partition.js new file mode 100644 index 0000000..2ebcacc --- /dev/null +++ b/node_modules/lodash/fp/partition.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('partition', require('../partition')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/path.js b/node_modules/lodash/fp/path.js new file mode 100644 index 0000000..b29cfb2 --- /dev/null +++ b/node_modules/lodash/fp/path.js @@ -0,0 +1 @@ +module.exports = require('./get'); diff --git a/node_modules/lodash/fp/pathEq.js b/node_modules/lodash/fp/pathEq.js new file mode 100644 index 0000000..36c027a --- /dev/null +++ b/node_modules/lodash/fp/pathEq.js @@ -0,0 +1 @@ +module.exports = require('./matchesProperty'); diff --git a/node_modules/lodash/fp/pathOr.js b/node_modules/lodash/fp/pathOr.js new file mode 100644 index 0000000..4ab5820 --- /dev/null +++ b/node_modules/lodash/fp/pathOr.js @@ -0,0 +1 @@ +module.exports = require('./getOr'); diff --git a/node_modules/lodash/fp/paths.js b/node_modules/lodash/fp/paths.js new file mode 100644 index 0000000..1eb7950 --- /dev/null +++ b/node_modules/lodash/fp/paths.js @@ -0,0 +1 @@ +module.exports = require('./at'); diff --git a/node_modules/lodash/fp/pick.js b/node_modules/lodash/fp/pick.js new file mode 100644 index 0000000..197393d --- /dev/null +++ b/node_modules/lodash/fp/pick.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pick', require('../pick')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pickAll.js b/node_modules/lodash/fp/pickAll.js new file mode 100644 index 0000000..a8ecd46 --- /dev/null +++ b/node_modules/lodash/fp/pickAll.js @@ -0,0 +1 @@ +module.exports = require('./pick'); diff --git a/node_modules/lodash/fp/pickBy.js b/node_modules/lodash/fp/pickBy.js new file mode 100644 index 0000000..d832d16 --- /dev/null +++ b/node_modules/lodash/fp/pickBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pickBy', require('../pickBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pipe.js b/node_modules/lodash/fp/pipe.js new file mode 100644 index 0000000..b2e1e2c --- /dev/null +++ b/node_modules/lodash/fp/pipe.js @@ -0,0 +1 @@ +module.exports = require('./flow'); diff --git a/node_modules/lodash/fp/placeholder.js b/node_modules/lodash/fp/placeholder.js new file mode 100644 index 0000000..1ce1739 --- /dev/null +++ b/node_modules/lodash/fp/placeholder.js @@ -0,0 +1,6 @@ +/** + * The default argument placeholder value for methods. + * + * @type {Object} + */ +module.exports = {}; diff --git a/node_modules/lodash/fp/plant.js b/node_modules/lodash/fp/plant.js new file mode 100644 index 0000000..eca8f32 --- /dev/null +++ b/node_modules/lodash/fp/plant.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('plant', require('../plant'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pluck.js b/node_modules/lodash/fp/pluck.js new file mode 100644 index 0000000..0d1e1ab --- /dev/null +++ b/node_modules/lodash/fp/pluck.js @@ -0,0 +1 @@ +module.exports = require('./map'); diff --git a/node_modules/lodash/fp/prop.js b/node_modules/lodash/fp/prop.js new file mode 100644 index 0000000..b29cfb2 --- /dev/null +++ b/node_modules/lodash/fp/prop.js @@ -0,0 +1 @@ +module.exports = require('./get'); diff --git a/node_modules/lodash/fp/propEq.js b/node_modules/lodash/fp/propEq.js new file mode 100644 index 0000000..36c027a --- /dev/null +++ b/node_modules/lodash/fp/propEq.js @@ -0,0 +1 @@ +module.exports = require('./matchesProperty'); diff --git a/node_modules/lodash/fp/propOr.js b/node_modules/lodash/fp/propOr.js new file mode 100644 index 0000000..4ab5820 --- /dev/null +++ b/node_modules/lodash/fp/propOr.js @@ -0,0 +1 @@ +module.exports = require('./getOr'); diff --git a/node_modules/lodash/fp/property.js b/node_modules/lodash/fp/property.js new file mode 100644 index 0000000..b29cfb2 --- /dev/null +++ b/node_modules/lodash/fp/property.js @@ -0,0 +1 @@ +module.exports = require('./get'); diff --git a/node_modules/lodash/fp/propertyOf.js b/node_modules/lodash/fp/propertyOf.js new file mode 100644 index 0000000..f6273ee --- /dev/null +++ b/node_modules/lodash/fp/propertyOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('propertyOf', require('../get')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/props.js b/node_modules/lodash/fp/props.js new file mode 100644 index 0000000..1eb7950 --- /dev/null +++ b/node_modules/lodash/fp/props.js @@ -0,0 +1 @@ +module.exports = require('./at'); diff --git a/node_modules/lodash/fp/pull.js b/node_modules/lodash/fp/pull.js new file mode 100644 index 0000000..8d7084f --- /dev/null +++ b/node_modules/lodash/fp/pull.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pull', require('../pull')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pullAll.js b/node_modules/lodash/fp/pullAll.js new file mode 100644 index 0000000..98d5c9a --- /dev/null +++ b/node_modules/lodash/fp/pullAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pullAll', require('../pullAll')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pullAllBy.js b/node_modules/lodash/fp/pullAllBy.js new file mode 100644 index 0000000..876bc3b --- /dev/null +++ b/node_modules/lodash/fp/pullAllBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pullAllBy', require('../pullAllBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pullAllWith.js b/node_modules/lodash/fp/pullAllWith.js new file mode 100644 index 0000000..f71ba4d --- /dev/null +++ b/node_modules/lodash/fp/pullAllWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pullAllWith', require('../pullAllWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/pullAt.js b/node_modules/lodash/fp/pullAt.js new file mode 100644 index 0000000..e8b3bb6 --- /dev/null +++ b/node_modules/lodash/fp/pullAt.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('pullAt', require('../pullAt')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/random.js b/node_modules/lodash/fp/random.js new file mode 100644 index 0000000..99d852e --- /dev/null +++ b/node_modules/lodash/fp/random.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('random', require('../random')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/range.js b/node_modules/lodash/fp/range.js new file mode 100644 index 0000000..a6bb591 --- /dev/null +++ b/node_modules/lodash/fp/range.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('range', require('../range')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/rangeRight.js b/node_modules/lodash/fp/rangeRight.js new file mode 100644 index 0000000..fdb712f --- /dev/null +++ b/node_modules/lodash/fp/rangeRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('rangeRight', require('../rangeRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/rangeStep.js b/node_modules/lodash/fp/rangeStep.js new file mode 100644 index 0000000..d72dfc2 --- /dev/null +++ b/node_modules/lodash/fp/rangeStep.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('rangeStep', require('../range')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/rangeStepRight.js b/node_modules/lodash/fp/rangeStepRight.js new file mode 100644 index 0000000..8b2a67b --- /dev/null +++ b/node_modules/lodash/fp/rangeStepRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('rangeStepRight', require('../rangeRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/rearg.js b/node_modules/lodash/fp/rearg.js new file mode 100644 index 0000000..678e02a --- /dev/null +++ b/node_modules/lodash/fp/rearg.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('rearg', require('../rearg')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/reduce.js b/node_modules/lodash/fp/reduce.js new file mode 100644 index 0000000..4cef0a0 --- /dev/null +++ b/node_modules/lodash/fp/reduce.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('reduce', require('../reduce')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/reduceRight.js b/node_modules/lodash/fp/reduceRight.js new file mode 100644 index 0000000..caf5bb5 --- /dev/null +++ b/node_modules/lodash/fp/reduceRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('reduceRight', require('../reduceRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/reject.js b/node_modules/lodash/fp/reject.js new file mode 100644 index 0000000..c163273 --- /dev/null +++ b/node_modules/lodash/fp/reject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('reject', require('../reject')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/remove.js b/node_modules/lodash/fp/remove.js new file mode 100644 index 0000000..e9d1327 --- /dev/null +++ b/node_modules/lodash/fp/remove.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('remove', require('../remove')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/repeat.js b/node_modules/lodash/fp/repeat.js new file mode 100644 index 0000000..08470f2 --- /dev/null +++ b/node_modules/lodash/fp/repeat.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('repeat', require('../repeat')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/replace.js b/node_modules/lodash/fp/replace.js new file mode 100644 index 0000000..2227db6 --- /dev/null +++ b/node_modules/lodash/fp/replace.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('replace', require('../replace')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/rest.js b/node_modules/lodash/fp/rest.js new file mode 100644 index 0000000..c1f3d64 --- /dev/null +++ b/node_modules/lodash/fp/rest.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('rest', require('../rest')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/restFrom.js b/node_modules/lodash/fp/restFrom.js new file mode 100644 index 0000000..714e42b --- /dev/null +++ b/node_modules/lodash/fp/restFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('restFrom', require('../rest')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/result.js b/node_modules/lodash/fp/result.js new file mode 100644 index 0000000..f86ce07 --- /dev/null +++ b/node_modules/lodash/fp/result.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('result', require('../result')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/reverse.js b/node_modules/lodash/fp/reverse.js new file mode 100644 index 0000000..07c9f5e --- /dev/null +++ b/node_modules/lodash/fp/reverse.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('reverse', require('../reverse')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/round.js b/node_modules/lodash/fp/round.js new file mode 100644 index 0000000..4c0e5c8 --- /dev/null +++ b/node_modules/lodash/fp/round.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('round', require('../round')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sample.js b/node_modules/lodash/fp/sample.js new file mode 100644 index 0000000..6bea125 --- /dev/null +++ b/node_modules/lodash/fp/sample.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sample', require('../sample'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sampleSize.js b/node_modules/lodash/fp/sampleSize.js new file mode 100644 index 0000000..359ed6f --- /dev/null +++ b/node_modules/lodash/fp/sampleSize.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sampleSize', require('../sampleSize')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/seq.js b/node_modules/lodash/fp/seq.js new file mode 100644 index 0000000..d8f42b0 --- /dev/null +++ b/node_modules/lodash/fp/seq.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../seq')); diff --git a/node_modules/lodash/fp/set.js b/node_modules/lodash/fp/set.js new file mode 100644 index 0000000..0b56a56 --- /dev/null +++ b/node_modules/lodash/fp/set.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('set', require('../set')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/setWith.js b/node_modules/lodash/fp/setWith.js new file mode 100644 index 0000000..0b58495 --- /dev/null +++ b/node_modules/lodash/fp/setWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('setWith', require('../setWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/shuffle.js b/node_modules/lodash/fp/shuffle.js new file mode 100644 index 0000000..aa3a1ca --- /dev/null +++ b/node_modules/lodash/fp/shuffle.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('shuffle', require('../shuffle'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/size.js b/node_modules/lodash/fp/size.js new file mode 100644 index 0000000..7490136 --- /dev/null +++ b/node_modules/lodash/fp/size.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('size', require('../size'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/slice.js b/node_modules/lodash/fp/slice.js new file mode 100644 index 0000000..15945d3 --- /dev/null +++ b/node_modules/lodash/fp/slice.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('slice', require('../slice')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/snakeCase.js b/node_modules/lodash/fp/snakeCase.js new file mode 100644 index 0000000..a0ff780 --- /dev/null +++ b/node_modules/lodash/fp/snakeCase.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('snakeCase', require('../snakeCase'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/some.js b/node_modules/lodash/fp/some.js new file mode 100644 index 0000000..a4fa2d0 --- /dev/null +++ b/node_modules/lodash/fp/some.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('some', require('../some')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortBy.js b/node_modules/lodash/fp/sortBy.js new file mode 100644 index 0000000..e0790ad --- /dev/null +++ b/node_modules/lodash/fp/sortBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortBy', require('../sortBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedIndex.js b/node_modules/lodash/fp/sortedIndex.js new file mode 100644 index 0000000..364a054 --- /dev/null +++ b/node_modules/lodash/fp/sortedIndex.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedIndex', require('../sortedIndex')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedIndexBy.js b/node_modules/lodash/fp/sortedIndexBy.js new file mode 100644 index 0000000..9593dbd --- /dev/null +++ b/node_modules/lodash/fp/sortedIndexBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedIndexBy', require('../sortedIndexBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedIndexOf.js b/node_modules/lodash/fp/sortedIndexOf.js new file mode 100644 index 0000000..c9084ca --- /dev/null +++ b/node_modules/lodash/fp/sortedIndexOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedIndexOf', require('../sortedIndexOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedLastIndex.js b/node_modules/lodash/fp/sortedLastIndex.js new file mode 100644 index 0000000..47fe241 --- /dev/null +++ b/node_modules/lodash/fp/sortedLastIndex.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedLastIndex', require('../sortedLastIndex')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedLastIndexBy.js b/node_modules/lodash/fp/sortedLastIndexBy.js new file mode 100644 index 0000000..0f9a347 --- /dev/null +++ b/node_modules/lodash/fp/sortedLastIndexBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedLastIndexBy', require('../sortedLastIndexBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedLastIndexOf.js b/node_modules/lodash/fp/sortedLastIndexOf.js new file mode 100644 index 0000000..0d4d932 --- /dev/null +++ b/node_modules/lodash/fp/sortedLastIndexOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedLastIndexOf', require('../sortedLastIndexOf')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedUniq.js b/node_modules/lodash/fp/sortedUniq.js new file mode 100644 index 0000000..882d283 --- /dev/null +++ b/node_modules/lodash/fp/sortedUniq.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedUniq', require('../sortedUniq'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sortedUniqBy.js b/node_modules/lodash/fp/sortedUniqBy.js new file mode 100644 index 0000000..033db91 --- /dev/null +++ b/node_modules/lodash/fp/sortedUniqBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sortedUniqBy', require('../sortedUniqBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/split.js b/node_modules/lodash/fp/split.js new file mode 100644 index 0000000..14de1a7 --- /dev/null +++ b/node_modules/lodash/fp/split.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('split', require('../split')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/spread.js b/node_modules/lodash/fp/spread.js new file mode 100644 index 0000000..2d11b70 --- /dev/null +++ b/node_modules/lodash/fp/spread.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('spread', require('../spread')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/spreadFrom.js b/node_modules/lodash/fp/spreadFrom.js new file mode 100644 index 0000000..0b630df --- /dev/null +++ b/node_modules/lodash/fp/spreadFrom.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('spreadFrom', require('../spread')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/startCase.js b/node_modules/lodash/fp/startCase.js new file mode 100644 index 0000000..ada98c9 --- /dev/null +++ b/node_modules/lodash/fp/startCase.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('startCase', require('../startCase'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/startsWith.js b/node_modules/lodash/fp/startsWith.js new file mode 100644 index 0000000..985e2f2 --- /dev/null +++ b/node_modules/lodash/fp/startsWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('startsWith', require('../startsWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/string.js b/node_modules/lodash/fp/string.js new file mode 100644 index 0000000..773b037 --- /dev/null +++ b/node_modules/lodash/fp/string.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../string')); diff --git a/node_modules/lodash/fp/stubArray.js b/node_modules/lodash/fp/stubArray.js new file mode 100644 index 0000000..cd604cb --- /dev/null +++ b/node_modules/lodash/fp/stubArray.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('stubArray', require('../stubArray'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/stubFalse.js b/node_modules/lodash/fp/stubFalse.js new file mode 100644 index 0000000..3296664 --- /dev/null +++ b/node_modules/lodash/fp/stubFalse.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('stubFalse', require('../stubFalse'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/stubObject.js b/node_modules/lodash/fp/stubObject.js new file mode 100644 index 0000000..c6c8ec4 --- /dev/null +++ b/node_modules/lodash/fp/stubObject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('stubObject', require('../stubObject'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/stubString.js b/node_modules/lodash/fp/stubString.js new file mode 100644 index 0000000..701051e --- /dev/null +++ b/node_modules/lodash/fp/stubString.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('stubString', require('../stubString'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/stubTrue.js b/node_modules/lodash/fp/stubTrue.js new file mode 100644 index 0000000..9249082 --- /dev/null +++ b/node_modules/lodash/fp/stubTrue.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('stubTrue', require('../stubTrue'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/subtract.js b/node_modules/lodash/fp/subtract.js new file mode 100644 index 0000000..d32b16d --- /dev/null +++ b/node_modules/lodash/fp/subtract.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('subtract', require('../subtract')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sum.js b/node_modules/lodash/fp/sum.js new file mode 100644 index 0000000..5cce12b --- /dev/null +++ b/node_modules/lodash/fp/sum.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sum', require('../sum'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/sumBy.js b/node_modules/lodash/fp/sumBy.js new file mode 100644 index 0000000..c882656 --- /dev/null +++ b/node_modules/lodash/fp/sumBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('sumBy', require('../sumBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/symmetricDifference.js b/node_modules/lodash/fp/symmetricDifference.js new file mode 100644 index 0000000..78c16ad --- /dev/null +++ b/node_modules/lodash/fp/symmetricDifference.js @@ -0,0 +1 @@ +module.exports = require('./xor'); diff --git a/node_modules/lodash/fp/symmetricDifferenceBy.js b/node_modules/lodash/fp/symmetricDifferenceBy.js new file mode 100644 index 0000000..298fc7f --- /dev/null +++ b/node_modules/lodash/fp/symmetricDifferenceBy.js @@ -0,0 +1 @@ +module.exports = require('./xorBy'); diff --git a/node_modules/lodash/fp/symmetricDifferenceWith.js b/node_modules/lodash/fp/symmetricDifferenceWith.js new file mode 100644 index 0000000..70bc6fa --- /dev/null +++ b/node_modules/lodash/fp/symmetricDifferenceWith.js @@ -0,0 +1 @@ +module.exports = require('./xorWith'); diff --git a/node_modules/lodash/fp/tail.js b/node_modules/lodash/fp/tail.js new file mode 100644 index 0000000..f122f0a --- /dev/null +++ b/node_modules/lodash/fp/tail.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('tail', require('../tail'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/take.js b/node_modules/lodash/fp/take.js new file mode 100644 index 0000000..9af98a7 --- /dev/null +++ b/node_modules/lodash/fp/take.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('take', require('../take')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/takeLast.js b/node_modules/lodash/fp/takeLast.js new file mode 100644 index 0000000..e98c84a --- /dev/null +++ b/node_modules/lodash/fp/takeLast.js @@ -0,0 +1 @@ +module.exports = require('./takeRight'); diff --git a/node_modules/lodash/fp/takeLastWhile.js b/node_modules/lodash/fp/takeLastWhile.js new file mode 100644 index 0000000..5367968 --- /dev/null +++ b/node_modules/lodash/fp/takeLastWhile.js @@ -0,0 +1 @@ +module.exports = require('./takeRightWhile'); diff --git a/node_modules/lodash/fp/takeRight.js b/node_modules/lodash/fp/takeRight.js new file mode 100644 index 0000000..b82950a --- /dev/null +++ b/node_modules/lodash/fp/takeRight.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('takeRight', require('../takeRight')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/takeRightWhile.js b/node_modules/lodash/fp/takeRightWhile.js new file mode 100644 index 0000000..8ffb0a2 --- /dev/null +++ b/node_modules/lodash/fp/takeRightWhile.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('takeRightWhile', require('../takeRightWhile')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/takeWhile.js b/node_modules/lodash/fp/takeWhile.js new file mode 100644 index 0000000..2813664 --- /dev/null +++ b/node_modules/lodash/fp/takeWhile.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('takeWhile', require('../takeWhile')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/tap.js b/node_modules/lodash/fp/tap.js new file mode 100644 index 0000000..d33ad6e --- /dev/null +++ b/node_modules/lodash/fp/tap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('tap', require('../tap')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/template.js b/node_modules/lodash/fp/template.js new file mode 100644 index 0000000..74857e1 --- /dev/null +++ b/node_modules/lodash/fp/template.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('template', require('../template')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/templateSettings.js b/node_modules/lodash/fp/templateSettings.js new file mode 100644 index 0000000..7bcc0a8 --- /dev/null +++ b/node_modules/lodash/fp/templateSettings.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('templateSettings', require('../templateSettings'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/throttle.js b/node_modules/lodash/fp/throttle.js new file mode 100644 index 0000000..77fff14 --- /dev/null +++ b/node_modules/lodash/fp/throttle.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('throttle', require('../throttle')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/thru.js b/node_modules/lodash/fp/thru.js new file mode 100644 index 0000000..d42b3b1 --- /dev/null +++ b/node_modules/lodash/fp/thru.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('thru', require('../thru')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/times.js b/node_modules/lodash/fp/times.js new file mode 100644 index 0000000..0dab06d --- /dev/null +++ b/node_modules/lodash/fp/times.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('times', require('../times')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toArray.js b/node_modules/lodash/fp/toArray.js new file mode 100644 index 0000000..f0c360a --- /dev/null +++ b/node_modules/lodash/fp/toArray.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toArray', require('../toArray'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toFinite.js b/node_modules/lodash/fp/toFinite.js new file mode 100644 index 0000000..3a47687 --- /dev/null +++ b/node_modules/lodash/fp/toFinite.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toFinite', require('../toFinite'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toInteger.js b/node_modules/lodash/fp/toInteger.js new file mode 100644 index 0000000..e0af6a7 --- /dev/null +++ b/node_modules/lodash/fp/toInteger.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toInteger', require('../toInteger'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toIterator.js b/node_modules/lodash/fp/toIterator.js new file mode 100644 index 0000000..65e6baa --- /dev/null +++ b/node_modules/lodash/fp/toIterator.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toIterator', require('../toIterator'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toJSON.js b/node_modules/lodash/fp/toJSON.js new file mode 100644 index 0000000..2d718d0 --- /dev/null +++ b/node_modules/lodash/fp/toJSON.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toJSON', require('../toJSON'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toLength.js b/node_modules/lodash/fp/toLength.js new file mode 100644 index 0000000..b97cdd9 --- /dev/null +++ b/node_modules/lodash/fp/toLength.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toLength', require('../toLength'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toLower.js b/node_modules/lodash/fp/toLower.js new file mode 100644 index 0000000..616ef36 --- /dev/null +++ b/node_modules/lodash/fp/toLower.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toLower', require('../toLower'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toNumber.js b/node_modules/lodash/fp/toNumber.js new file mode 100644 index 0000000..d0c6f4d --- /dev/null +++ b/node_modules/lodash/fp/toNumber.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toNumber', require('../toNumber'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toPairs.js b/node_modules/lodash/fp/toPairs.js new file mode 100644 index 0000000..af78378 --- /dev/null +++ b/node_modules/lodash/fp/toPairs.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toPairs', require('../toPairs'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toPairsIn.js b/node_modules/lodash/fp/toPairsIn.js new file mode 100644 index 0000000..66504ab --- /dev/null +++ b/node_modules/lodash/fp/toPairsIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toPairsIn', require('../toPairsIn'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toPath.js b/node_modules/lodash/fp/toPath.js new file mode 100644 index 0000000..b4d5e50 --- /dev/null +++ b/node_modules/lodash/fp/toPath.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toPath', require('../toPath'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toPlainObject.js b/node_modules/lodash/fp/toPlainObject.js new file mode 100644 index 0000000..278bb86 --- /dev/null +++ b/node_modules/lodash/fp/toPlainObject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toPlainObject', require('../toPlainObject'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toSafeInteger.js b/node_modules/lodash/fp/toSafeInteger.js new file mode 100644 index 0000000..367a26f --- /dev/null +++ b/node_modules/lodash/fp/toSafeInteger.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toSafeInteger', require('../toSafeInteger'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toString.js b/node_modules/lodash/fp/toString.js new file mode 100644 index 0000000..cec4f8e --- /dev/null +++ b/node_modules/lodash/fp/toString.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toString', require('../toString'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/toUpper.js b/node_modules/lodash/fp/toUpper.js new file mode 100644 index 0000000..54f9a56 --- /dev/null +++ b/node_modules/lodash/fp/toUpper.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('toUpper', require('../toUpper'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/transform.js b/node_modules/lodash/fp/transform.js new file mode 100644 index 0000000..759d088 --- /dev/null +++ b/node_modules/lodash/fp/transform.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('transform', require('../transform')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/trim.js b/node_modules/lodash/fp/trim.js new file mode 100644 index 0000000..e6319a7 --- /dev/null +++ b/node_modules/lodash/fp/trim.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('trim', require('../trim')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/trimChars.js b/node_modules/lodash/fp/trimChars.js new file mode 100644 index 0000000..c9294de --- /dev/null +++ b/node_modules/lodash/fp/trimChars.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('trimChars', require('../trim')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/trimCharsEnd.js b/node_modules/lodash/fp/trimCharsEnd.js new file mode 100644 index 0000000..284bc2f --- /dev/null +++ b/node_modules/lodash/fp/trimCharsEnd.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('trimCharsEnd', require('../trimEnd')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/trimCharsStart.js b/node_modules/lodash/fp/trimCharsStart.js new file mode 100644 index 0000000..ff0ee65 --- /dev/null +++ b/node_modules/lodash/fp/trimCharsStart.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('trimCharsStart', require('../trimStart')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/trimEnd.js b/node_modules/lodash/fp/trimEnd.js new file mode 100644 index 0000000..7190880 --- /dev/null +++ b/node_modules/lodash/fp/trimEnd.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('trimEnd', require('../trimEnd')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/trimStart.js b/node_modules/lodash/fp/trimStart.js new file mode 100644 index 0000000..fda902c --- /dev/null +++ b/node_modules/lodash/fp/trimStart.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('trimStart', require('../trimStart')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/truncate.js b/node_modules/lodash/fp/truncate.js new file mode 100644 index 0000000..d265c1d --- /dev/null +++ b/node_modules/lodash/fp/truncate.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('truncate', require('../truncate')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unapply.js b/node_modules/lodash/fp/unapply.js new file mode 100644 index 0000000..c5dfe77 --- /dev/null +++ b/node_modules/lodash/fp/unapply.js @@ -0,0 +1 @@ +module.exports = require('./rest'); diff --git a/node_modules/lodash/fp/unary.js b/node_modules/lodash/fp/unary.js new file mode 100644 index 0000000..286c945 --- /dev/null +++ b/node_modules/lodash/fp/unary.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unary', require('../unary'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unescape.js b/node_modules/lodash/fp/unescape.js new file mode 100644 index 0000000..fddcb46 --- /dev/null +++ b/node_modules/lodash/fp/unescape.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unescape', require('../unescape'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/union.js b/node_modules/lodash/fp/union.js new file mode 100644 index 0000000..ef8228d --- /dev/null +++ b/node_modules/lodash/fp/union.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('union', require('../union')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unionBy.js b/node_modules/lodash/fp/unionBy.js new file mode 100644 index 0000000..603687a --- /dev/null +++ b/node_modules/lodash/fp/unionBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unionBy', require('../unionBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unionWith.js b/node_modules/lodash/fp/unionWith.js new file mode 100644 index 0000000..65bb3a7 --- /dev/null +++ b/node_modules/lodash/fp/unionWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unionWith', require('../unionWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/uniq.js b/node_modules/lodash/fp/uniq.js new file mode 100644 index 0000000..bc18524 --- /dev/null +++ b/node_modules/lodash/fp/uniq.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('uniq', require('../uniq'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/uniqBy.js b/node_modules/lodash/fp/uniqBy.js new file mode 100644 index 0000000..634c6a8 --- /dev/null +++ b/node_modules/lodash/fp/uniqBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('uniqBy', require('../uniqBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/uniqWith.js b/node_modules/lodash/fp/uniqWith.js new file mode 100644 index 0000000..0ec601a --- /dev/null +++ b/node_modules/lodash/fp/uniqWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('uniqWith', require('../uniqWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/uniqueId.js b/node_modules/lodash/fp/uniqueId.js new file mode 100644 index 0000000..aa8fc2f --- /dev/null +++ b/node_modules/lodash/fp/uniqueId.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('uniqueId', require('../uniqueId')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unnest.js b/node_modules/lodash/fp/unnest.js new file mode 100644 index 0000000..5d34060 --- /dev/null +++ b/node_modules/lodash/fp/unnest.js @@ -0,0 +1 @@ +module.exports = require('./flatten'); diff --git a/node_modules/lodash/fp/unset.js b/node_modules/lodash/fp/unset.js new file mode 100644 index 0000000..ea203a0 --- /dev/null +++ b/node_modules/lodash/fp/unset.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unset', require('../unset')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unzip.js b/node_modules/lodash/fp/unzip.js new file mode 100644 index 0000000..cc364b3 --- /dev/null +++ b/node_modules/lodash/fp/unzip.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unzip', require('../unzip'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/unzipWith.js b/node_modules/lodash/fp/unzipWith.js new file mode 100644 index 0000000..182eaa1 --- /dev/null +++ b/node_modules/lodash/fp/unzipWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('unzipWith', require('../unzipWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/update.js b/node_modules/lodash/fp/update.js new file mode 100644 index 0000000..b8ce2cc --- /dev/null +++ b/node_modules/lodash/fp/update.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('update', require('../update')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/updateWith.js b/node_modules/lodash/fp/updateWith.js new file mode 100644 index 0000000..d5e8282 --- /dev/null +++ b/node_modules/lodash/fp/updateWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('updateWith', require('../updateWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/upperCase.js b/node_modules/lodash/fp/upperCase.js new file mode 100644 index 0000000..c886f20 --- /dev/null +++ b/node_modules/lodash/fp/upperCase.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('upperCase', require('../upperCase'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/upperFirst.js b/node_modules/lodash/fp/upperFirst.js new file mode 100644 index 0000000..d8c04df --- /dev/null +++ b/node_modules/lodash/fp/upperFirst.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('upperFirst', require('../upperFirst'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/useWith.js b/node_modules/lodash/fp/useWith.js new file mode 100644 index 0000000..d8b3df5 --- /dev/null +++ b/node_modules/lodash/fp/useWith.js @@ -0,0 +1 @@ +module.exports = require('./overArgs'); diff --git a/node_modules/lodash/fp/util.js b/node_modules/lodash/fp/util.js new file mode 100644 index 0000000..18c00ba --- /dev/null +++ b/node_modules/lodash/fp/util.js @@ -0,0 +1,2 @@ +var convert = require('./convert'); +module.exports = convert(require('../util')); diff --git a/node_modules/lodash/fp/value.js b/node_modules/lodash/fp/value.js new file mode 100644 index 0000000..555eec7 --- /dev/null +++ b/node_modules/lodash/fp/value.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('value', require('../value'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/valueOf.js b/node_modules/lodash/fp/valueOf.js new file mode 100644 index 0000000..f968807 --- /dev/null +++ b/node_modules/lodash/fp/valueOf.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('valueOf', require('../valueOf'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/values.js b/node_modules/lodash/fp/values.js new file mode 100644 index 0000000..2dfc561 --- /dev/null +++ b/node_modules/lodash/fp/values.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('values', require('../values'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/valuesIn.js b/node_modules/lodash/fp/valuesIn.js new file mode 100644 index 0000000..a1b2bb8 --- /dev/null +++ b/node_modules/lodash/fp/valuesIn.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('valuesIn', require('../valuesIn'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/where.js b/node_modules/lodash/fp/where.js new file mode 100644 index 0000000..3247f64 --- /dev/null +++ b/node_modules/lodash/fp/where.js @@ -0,0 +1 @@ +module.exports = require('./conformsTo'); diff --git a/node_modules/lodash/fp/whereEq.js b/node_modules/lodash/fp/whereEq.js new file mode 100644 index 0000000..29d1e1e --- /dev/null +++ b/node_modules/lodash/fp/whereEq.js @@ -0,0 +1 @@ +module.exports = require('./isMatch'); diff --git a/node_modules/lodash/fp/without.js b/node_modules/lodash/fp/without.js new file mode 100644 index 0000000..bad9e12 --- /dev/null +++ b/node_modules/lodash/fp/without.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('without', require('../without')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/words.js b/node_modules/lodash/fp/words.js new file mode 100644 index 0000000..4a90141 --- /dev/null +++ b/node_modules/lodash/fp/words.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('words', require('../words')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/wrap.js b/node_modules/lodash/fp/wrap.js new file mode 100644 index 0000000..e93bd8a --- /dev/null +++ b/node_modules/lodash/fp/wrap.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('wrap', require('../wrap')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/wrapperAt.js b/node_modules/lodash/fp/wrapperAt.js new file mode 100644 index 0000000..8f0a310 --- /dev/null +++ b/node_modules/lodash/fp/wrapperAt.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('wrapperAt', require('../wrapperAt'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/wrapperChain.js b/node_modules/lodash/fp/wrapperChain.js new file mode 100644 index 0000000..2a48ea2 --- /dev/null +++ b/node_modules/lodash/fp/wrapperChain.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('wrapperChain', require('../wrapperChain'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/wrapperLodash.js b/node_modules/lodash/fp/wrapperLodash.js new file mode 100644 index 0000000..a7162d0 --- /dev/null +++ b/node_modules/lodash/fp/wrapperLodash.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('wrapperLodash', require('../wrapperLodash'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/wrapperReverse.js b/node_modules/lodash/fp/wrapperReverse.js new file mode 100644 index 0000000..e1481aa --- /dev/null +++ b/node_modules/lodash/fp/wrapperReverse.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('wrapperReverse', require('../wrapperReverse'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/wrapperValue.js b/node_modules/lodash/fp/wrapperValue.js new file mode 100644 index 0000000..8eb9112 --- /dev/null +++ b/node_modules/lodash/fp/wrapperValue.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('wrapperValue', require('../wrapperValue'), require('./_falseOptions')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/xor.js b/node_modules/lodash/fp/xor.js new file mode 100644 index 0000000..29e2819 --- /dev/null +++ b/node_modules/lodash/fp/xor.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('xor', require('../xor')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/xorBy.js b/node_modules/lodash/fp/xorBy.js new file mode 100644 index 0000000..b355686 --- /dev/null +++ b/node_modules/lodash/fp/xorBy.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('xorBy', require('../xorBy')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/xorWith.js b/node_modules/lodash/fp/xorWith.js new file mode 100644 index 0000000..8e05739 --- /dev/null +++ b/node_modules/lodash/fp/xorWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('xorWith', require('../xorWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/zip.js b/node_modules/lodash/fp/zip.js new file mode 100644 index 0000000..69e147a --- /dev/null +++ b/node_modules/lodash/fp/zip.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('zip', require('../zip')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/zipAll.js b/node_modules/lodash/fp/zipAll.js new file mode 100644 index 0000000..efa8ccb --- /dev/null +++ b/node_modules/lodash/fp/zipAll.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('zipAll', require('../zip')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/zipObj.js b/node_modules/lodash/fp/zipObj.js new file mode 100644 index 0000000..f4a3453 --- /dev/null +++ b/node_modules/lodash/fp/zipObj.js @@ -0,0 +1 @@ +module.exports = require('./zipObject'); diff --git a/node_modules/lodash/fp/zipObject.js b/node_modules/lodash/fp/zipObject.js new file mode 100644 index 0000000..462dbb6 --- /dev/null +++ b/node_modules/lodash/fp/zipObject.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('zipObject', require('../zipObject')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/zipObjectDeep.js b/node_modules/lodash/fp/zipObjectDeep.js new file mode 100644 index 0000000..53a5d33 --- /dev/null +++ b/node_modules/lodash/fp/zipObjectDeep.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('zipObjectDeep', require('../zipObjectDeep')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fp/zipWith.js b/node_modules/lodash/fp/zipWith.js new file mode 100644 index 0000000..c5cf9e2 --- /dev/null +++ b/node_modules/lodash/fp/zipWith.js @@ -0,0 +1,5 @@ +var convert = require('./convert'), + func = convert('zipWith', require('../zipWith')); + +func.placeholder = require('./placeholder'); +module.exports = func; diff --git a/node_modules/lodash/fromPairs.js b/node_modules/lodash/fromPairs.js new file mode 100644 index 0000000..ee7940d --- /dev/null +++ b/node_modules/lodash/fromPairs.js @@ -0,0 +1,28 @@ +/** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ +function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; +} + +module.exports = fromPairs; diff --git a/node_modules/lodash/function.js b/node_modules/lodash/function.js new file mode 100644 index 0000000..b0fc6d9 --- /dev/null +++ b/node_modules/lodash/function.js @@ -0,0 +1,25 @@ +module.exports = { + 'after': require('./after'), + 'ary': require('./ary'), + 'before': require('./before'), + 'bind': require('./bind'), + 'bindKey': require('./bindKey'), + 'curry': require('./curry'), + 'curryRight': require('./curryRight'), + 'debounce': require('./debounce'), + 'defer': require('./defer'), + 'delay': require('./delay'), + 'flip': require('./flip'), + 'memoize': require('./memoize'), + 'negate': require('./negate'), + 'once': require('./once'), + 'overArgs': require('./overArgs'), + 'partial': require('./partial'), + 'partialRight': require('./partialRight'), + 'rearg': require('./rearg'), + 'rest': require('./rest'), + 'spread': require('./spread'), + 'throttle': require('./throttle'), + 'unary': require('./unary'), + 'wrap': require('./wrap') +}; diff --git a/node_modules/lodash/functions.js b/node_modules/lodash/functions.js new file mode 100644 index 0000000..9722928 --- /dev/null +++ b/node_modules/lodash/functions.js @@ -0,0 +1,31 @@ +var baseFunctions = require('./_baseFunctions'), + keys = require('./keys'); + +/** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ +function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); +} + +module.exports = functions; diff --git a/node_modules/lodash/functionsIn.js b/node_modules/lodash/functionsIn.js new file mode 100644 index 0000000..f00345d --- /dev/null +++ b/node_modules/lodash/functionsIn.js @@ -0,0 +1,31 @@ +var baseFunctions = require('./_baseFunctions'), + keysIn = require('./keysIn'); + +/** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ +function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); +} + +module.exports = functionsIn; diff --git a/node_modules/lodash/get.js b/node_modules/lodash/get.js new file mode 100644 index 0000000..8805ff9 --- /dev/null +++ b/node_modules/lodash/get.js @@ -0,0 +1,33 @@ +var baseGet = require('./_baseGet'); + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; +} + +module.exports = get; diff --git a/node_modules/lodash/groupBy.js b/node_modules/lodash/groupBy.js new file mode 100644 index 0000000..babf4f6 --- /dev/null +++ b/node_modules/lodash/groupBy.js @@ -0,0 +1,41 @@ +var baseAssignValue = require('./_baseAssignValue'), + createAggregator = require('./_createAggregator'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ +var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } +}); + +module.exports = groupBy; diff --git a/node_modules/lodash/gt.js b/node_modules/lodash/gt.js new file mode 100644 index 0000000..3a66282 --- /dev/null +++ b/node_modules/lodash/gt.js @@ -0,0 +1,29 @@ +var baseGt = require('./_baseGt'), + createRelationalOperation = require('./_createRelationalOperation'); + +/** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ +var gt = createRelationalOperation(baseGt); + +module.exports = gt; diff --git a/node_modules/lodash/gte.js b/node_modules/lodash/gte.js new file mode 100644 index 0000000..4180a68 --- /dev/null +++ b/node_modules/lodash/gte.js @@ -0,0 +1,30 @@ +var createRelationalOperation = require('./_createRelationalOperation'); + +/** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ +var gte = createRelationalOperation(function(value, other) { + return value >= other; +}); + +module.exports = gte; diff --git a/node_modules/lodash/has.js b/node_modules/lodash/has.js new file mode 100644 index 0000000..34df55e --- /dev/null +++ b/node_modules/lodash/has.js @@ -0,0 +1,35 @@ +var baseHas = require('./_baseHas'), + hasPath = require('./_hasPath'); + +/** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ +function has(object, path) { + return object != null && hasPath(object, path, baseHas); +} + +module.exports = has; diff --git a/node_modules/lodash/hasIn.js b/node_modules/lodash/hasIn.js new file mode 100644 index 0000000..06a3686 --- /dev/null +++ b/node_modules/lodash/hasIn.js @@ -0,0 +1,34 @@ +var baseHasIn = require('./_baseHasIn'), + hasPath = require('./_hasPath'); + +/** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ +function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); +} + +module.exports = hasIn; diff --git a/node_modules/lodash/head.js b/node_modules/lodash/head.js new file mode 100644 index 0000000..dee9d1f --- /dev/null +++ b/node_modules/lodash/head.js @@ -0,0 +1,23 @@ +/** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ +function head(array) { + return (array && array.length) ? array[0] : undefined; +} + +module.exports = head; diff --git a/node_modules/lodash/identity.js b/node_modules/lodash/identity.js new file mode 100644 index 0000000..2d5d963 --- /dev/null +++ b/node_modules/lodash/identity.js @@ -0,0 +1,21 @@ +/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +module.exports = identity; diff --git a/node_modules/lodash/inRange.js b/node_modules/lodash/inRange.js new file mode 100644 index 0000000..f20728d --- /dev/null +++ b/node_modules/lodash/inRange.js @@ -0,0 +1,55 @@ +var baseInRange = require('./_baseInRange'), + toFinite = require('./toFinite'), + toNumber = require('./toNumber'); + +/** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ +function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); +} + +module.exports = inRange; diff --git a/node_modules/lodash/includes.js b/node_modules/lodash/includes.js new file mode 100644 index 0000000..ae0deed --- /dev/null +++ b/node_modules/lodash/includes.js @@ -0,0 +1,53 @@ +var baseIndexOf = require('./_baseIndexOf'), + isArrayLike = require('./isArrayLike'), + isString = require('./isString'), + toInteger = require('./toInteger'), + values = require('./values'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ +function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); +} + +module.exports = includes; diff --git a/node_modules/lodash/index.js b/node_modules/lodash/index.js new file mode 100644 index 0000000..5d063e2 --- /dev/null +++ b/node_modules/lodash/index.js @@ -0,0 +1 @@ +module.exports = require('./lodash'); \ No newline at end of file diff --git a/node_modules/lodash/indexOf.js b/node_modules/lodash/indexOf.js new file mode 100644 index 0000000..3c644af --- /dev/null +++ b/node_modules/lodash/indexOf.js @@ -0,0 +1,42 @@ +var baseIndexOf = require('./_baseIndexOf'), + toInteger = require('./toInteger'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ +function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); +} + +module.exports = indexOf; diff --git a/node_modules/lodash/initial.js b/node_modules/lodash/initial.js new file mode 100644 index 0000000..f47fc50 --- /dev/null +++ b/node_modules/lodash/initial.js @@ -0,0 +1,22 @@ +var baseSlice = require('./_baseSlice'); + +/** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ +function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; +} + +module.exports = initial; diff --git a/node_modules/lodash/intersection.js b/node_modules/lodash/intersection.js new file mode 100644 index 0000000..a94c135 --- /dev/null +++ b/node_modules/lodash/intersection.js @@ -0,0 +1,30 @@ +var arrayMap = require('./_arrayMap'), + baseIntersection = require('./_baseIntersection'), + baseRest = require('./_baseRest'), + castArrayLikeObject = require('./_castArrayLikeObject'); + +/** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ +var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; +}); + +module.exports = intersection; diff --git a/node_modules/lodash/intersectionBy.js b/node_modules/lodash/intersectionBy.js new file mode 100644 index 0000000..31461aa --- /dev/null +++ b/node_modules/lodash/intersectionBy.js @@ -0,0 +1,45 @@ +var arrayMap = require('./_arrayMap'), + baseIntersection = require('./_baseIntersection'), + baseIteratee = require('./_baseIteratee'), + baseRest = require('./_baseRest'), + castArrayLikeObject = require('./_castArrayLikeObject'), + last = require('./last'); + +/** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ +var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, baseIteratee(iteratee, 2)) + : []; +}); + +module.exports = intersectionBy; diff --git a/node_modules/lodash/intersectionWith.js b/node_modules/lodash/intersectionWith.js new file mode 100644 index 0000000..63cabfa --- /dev/null +++ b/node_modules/lodash/intersectionWith.js @@ -0,0 +1,41 @@ +var arrayMap = require('./_arrayMap'), + baseIntersection = require('./_baseIntersection'), + baseRest = require('./_baseRest'), + castArrayLikeObject = require('./_castArrayLikeObject'), + last = require('./last'); + +/** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ +var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; +}); + +module.exports = intersectionWith; diff --git a/node_modules/lodash/invert.js b/node_modules/lodash/invert.js new file mode 100644 index 0000000..8c47950 --- /dev/null +++ b/node_modules/lodash/invert.js @@ -0,0 +1,42 @@ +var constant = require('./constant'), + createInverter = require('./_createInverter'), + identity = require('./identity'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ +var invert = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; +}, constant(identity)); + +module.exports = invert; diff --git a/node_modules/lodash/invertBy.js b/node_modules/lodash/invertBy.js new file mode 100644 index 0000000..3f4f7e5 --- /dev/null +++ b/node_modules/lodash/invertBy.js @@ -0,0 +1,56 @@ +var baseIteratee = require('./_baseIteratee'), + createInverter = require('./_createInverter'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ +var invertBy = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } +}, baseIteratee); + +module.exports = invertBy; diff --git a/node_modules/lodash/invoke.js b/node_modules/lodash/invoke.js new file mode 100644 index 0000000..97d51eb --- /dev/null +++ b/node_modules/lodash/invoke.js @@ -0,0 +1,24 @@ +var baseInvoke = require('./_baseInvoke'), + baseRest = require('./_baseRest'); + +/** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ +var invoke = baseRest(baseInvoke); + +module.exports = invoke; diff --git a/node_modules/lodash/invokeMap.js b/node_modules/lodash/invokeMap.js new file mode 100644 index 0000000..8da5126 --- /dev/null +++ b/node_modules/lodash/invokeMap.js @@ -0,0 +1,41 @@ +var apply = require('./_apply'), + baseEach = require('./_baseEach'), + baseInvoke = require('./_baseInvoke'), + baseRest = require('./_baseRest'), + isArrayLike = require('./isArrayLike'); + +/** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ +var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; +}); + +module.exports = invokeMap; diff --git a/node_modules/lodash/isArguments.js b/node_modules/lodash/isArguments.js new file mode 100644 index 0000000..8b9ed66 --- /dev/null +++ b/node_modules/lodash/isArguments.js @@ -0,0 +1,36 @@ +var baseIsArguments = require('./_baseIsArguments'), + isObjectLike = require('./isObjectLike'); + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); +}; + +module.exports = isArguments; diff --git a/node_modules/lodash/isArray.js b/node_modules/lodash/isArray.js new file mode 100644 index 0000000..88ab55f --- /dev/null +++ b/node_modules/lodash/isArray.js @@ -0,0 +1,26 @@ +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +module.exports = isArray; diff --git a/node_modules/lodash/isArrayBuffer.js b/node_modules/lodash/isArrayBuffer.js new file mode 100644 index 0000000..12904a6 --- /dev/null +++ b/node_modules/lodash/isArrayBuffer.js @@ -0,0 +1,27 @@ +var baseIsArrayBuffer = require('./_baseIsArrayBuffer'), + baseUnary = require('./_baseUnary'), + nodeUtil = require('./_nodeUtil'); + +/* Node.js helper references. */ +var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer; + +/** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ +var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + +module.exports = isArrayBuffer; diff --git a/node_modules/lodash/isArrayLike.js b/node_modules/lodash/isArrayLike.js new file mode 100644 index 0000000..0f96680 --- /dev/null +++ b/node_modules/lodash/isArrayLike.js @@ -0,0 +1,33 @@ +var isFunction = require('./isFunction'), + isLength = require('./isLength'); + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +module.exports = isArrayLike; diff --git a/node_modules/lodash/isArrayLikeObject.js b/node_modules/lodash/isArrayLikeObject.js new file mode 100644 index 0000000..6c4812a --- /dev/null +++ b/node_modules/lodash/isArrayLikeObject.js @@ -0,0 +1,33 @@ +var isArrayLike = require('./isArrayLike'), + isObjectLike = require('./isObjectLike'); + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +module.exports = isArrayLikeObject; diff --git a/node_modules/lodash/isBoolean.js b/node_modules/lodash/isBoolean.js new file mode 100644 index 0000000..a43ed4b --- /dev/null +++ b/node_modules/lodash/isBoolean.js @@ -0,0 +1,29 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]'; + +/** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ +function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); +} + +module.exports = isBoolean; diff --git a/node_modules/lodash/isBuffer.js b/node_modules/lodash/isBuffer.js new file mode 100644 index 0000000..c103cc7 --- /dev/null +++ b/node_modules/lodash/isBuffer.js @@ -0,0 +1,38 @@ +var root = require('./_root'), + stubFalse = require('./stubFalse'); + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Built-in value references. */ +var Buffer = moduleExports ? root.Buffer : undefined; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; + +/** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ +var isBuffer = nativeIsBuffer || stubFalse; + +module.exports = isBuffer; diff --git a/node_modules/lodash/isDate.js b/node_modules/lodash/isDate.js new file mode 100644 index 0000000..7f0209f --- /dev/null +++ b/node_modules/lodash/isDate.js @@ -0,0 +1,27 @@ +var baseIsDate = require('./_baseIsDate'), + baseUnary = require('./_baseUnary'), + nodeUtil = require('./_nodeUtil'); + +/* Node.js helper references. */ +var nodeIsDate = nodeUtil && nodeUtil.isDate; + +/** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ +var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + +module.exports = isDate; diff --git a/node_modules/lodash/isElement.js b/node_modules/lodash/isElement.js new file mode 100644 index 0000000..76ae29c --- /dev/null +++ b/node_modules/lodash/isElement.js @@ -0,0 +1,25 @@ +var isObjectLike = require('./isObjectLike'), + isPlainObject = require('./isPlainObject'); + +/** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ +function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); +} + +module.exports = isElement; diff --git a/node_modules/lodash/isEmpty.js b/node_modules/lodash/isEmpty.js new file mode 100644 index 0000000..3597294 --- /dev/null +++ b/node_modules/lodash/isEmpty.js @@ -0,0 +1,77 @@ +var baseKeys = require('./_baseKeys'), + getTag = require('./_getTag'), + isArguments = require('./isArguments'), + isArray = require('./isArray'), + isArrayLike = require('./isArrayLike'), + isBuffer = require('./isBuffer'), + isPrototype = require('./_isPrototype'), + isTypedArray = require('./isTypedArray'); + +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + setTag = '[object Set]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; +} + +module.exports = isEmpty; diff --git a/node_modules/lodash/isEqual.js b/node_modules/lodash/isEqual.js new file mode 100644 index 0000000..5e23e76 --- /dev/null +++ b/node_modules/lodash/isEqual.js @@ -0,0 +1,35 @@ +var baseIsEqual = require('./_baseIsEqual'); + +/** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ +function isEqual(value, other) { + return baseIsEqual(value, other); +} + +module.exports = isEqual; diff --git a/node_modules/lodash/isEqualWith.js b/node_modules/lodash/isEqualWith.js new file mode 100644 index 0000000..21bdc7f --- /dev/null +++ b/node_modules/lodash/isEqualWith.js @@ -0,0 +1,41 @@ +var baseIsEqual = require('./_baseIsEqual'); + +/** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ +function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; +} + +module.exports = isEqualWith; diff --git a/node_modules/lodash/isError.js b/node_modules/lodash/isError.js new file mode 100644 index 0000000..b4f41e0 --- /dev/null +++ b/node_modules/lodash/isError.js @@ -0,0 +1,36 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'), + isPlainObject = require('./isPlainObject'); + +/** `Object#toString` result references. */ +var domExcTag = '[object DOMException]', + errorTag = '[object Error]'; + +/** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ +function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); +} + +module.exports = isError; diff --git a/node_modules/lodash/isFinite.js b/node_modules/lodash/isFinite.js new file mode 100644 index 0000000..601842b --- /dev/null +++ b/node_modules/lodash/isFinite.js @@ -0,0 +1,36 @@ +var root = require('./_root'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsFinite = root.isFinite; + +/** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ +function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); +} + +module.exports = isFinite; diff --git a/node_modules/lodash/isFunction.js b/node_modules/lodash/isFunction.js new file mode 100644 index 0000000..907a8cd --- /dev/null +++ b/node_modules/lodash/isFunction.js @@ -0,0 +1,37 @@ +var baseGetTag = require('./_baseGetTag'), + isObject = require('./isObject'); + +/** `Object#toString` result references. */ +var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +module.exports = isFunction; diff --git a/node_modules/lodash/isInteger.js b/node_modules/lodash/isInteger.js new file mode 100644 index 0000000..66aa87d --- /dev/null +++ b/node_modules/lodash/isInteger.js @@ -0,0 +1,33 @@ +var toInteger = require('./toInteger'); + +/** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ +function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); +} + +module.exports = isInteger; diff --git a/node_modules/lodash/isLength.js b/node_modules/lodash/isLength.js new file mode 100644 index 0000000..3a95caa --- /dev/null +++ b/node_modules/lodash/isLength.js @@ -0,0 +1,35 @@ +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +module.exports = isLength; diff --git a/node_modules/lodash/isMap.js b/node_modules/lodash/isMap.js new file mode 100644 index 0000000..44f8517 --- /dev/null +++ b/node_modules/lodash/isMap.js @@ -0,0 +1,27 @@ +var baseIsMap = require('./_baseIsMap'), + baseUnary = require('./_baseUnary'), + nodeUtil = require('./_nodeUtil'); + +/* Node.js helper references. */ +var nodeIsMap = nodeUtil && nodeUtil.isMap; + +/** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ +var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + +module.exports = isMap; diff --git a/node_modules/lodash/isMatch.js b/node_modules/lodash/isMatch.js new file mode 100644 index 0000000..9773a18 --- /dev/null +++ b/node_modules/lodash/isMatch.js @@ -0,0 +1,36 @@ +var baseIsMatch = require('./_baseIsMatch'), + getMatchData = require('./_getMatchData'); + +/** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ +function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); +} + +module.exports = isMatch; diff --git a/node_modules/lodash/isMatchWith.js b/node_modules/lodash/isMatchWith.js new file mode 100644 index 0000000..187b6a6 --- /dev/null +++ b/node_modules/lodash/isMatchWith.js @@ -0,0 +1,41 @@ +var baseIsMatch = require('./_baseIsMatch'), + getMatchData = require('./_getMatchData'); + +/** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ +function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); +} + +module.exports = isMatchWith; diff --git a/node_modules/lodash/isNaN.js b/node_modules/lodash/isNaN.js new file mode 100644 index 0000000..7d0d783 --- /dev/null +++ b/node_modules/lodash/isNaN.js @@ -0,0 +1,38 @@ +var isNumber = require('./isNumber'); + +/** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ +function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; +} + +module.exports = isNaN; diff --git a/node_modules/lodash/isNative.js b/node_modules/lodash/isNative.js new file mode 100644 index 0000000..f0cb8d5 --- /dev/null +++ b/node_modules/lodash/isNative.js @@ -0,0 +1,40 @@ +var baseIsNative = require('./_baseIsNative'), + isMaskable = require('./_isMaskable'); + +/** Error message constants. */ +var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.'; + +/** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); +} + +module.exports = isNative; diff --git a/node_modules/lodash/isNil.js b/node_modules/lodash/isNil.js new file mode 100644 index 0000000..79f0505 --- /dev/null +++ b/node_modules/lodash/isNil.js @@ -0,0 +1,25 @@ +/** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ +function isNil(value) { + return value == null; +} + +module.exports = isNil; diff --git a/node_modules/lodash/isNull.js b/node_modules/lodash/isNull.js new file mode 100644 index 0000000..c0a374d --- /dev/null +++ b/node_modules/lodash/isNull.js @@ -0,0 +1,22 @@ +/** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ +function isNull(value) { + return value === null; +} + +module.exports = isNull; diff --git a/node_modules/lodash/isNumber.js b/node_modules/lodash/isNumber.js new file mode 100644 index 0000000..cd34ee4 --- /dev/null +++ b/node_modules/lodash/isNumber.js @@ -0,0 +1,38 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var numberTag = '[object Number]'; + +/** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ +function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); +} + +module.exports = isNumber; diff --git a/node_modules/lodash/isObject.js b/node_modules/lodash/isObject.js new file mode 100644 index 0000000..1dc8939 --- /dev/null +++ b/node_modules/lodash/isObject.js @@ -0,0 +1,31 @@ +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +module.exports = isObject; diff --git a/node_modules/lodash/isObjectLike.js b/node_modules/lodash/isObjectLike.js new file mode 100644 index 0000000..301716b --- /dev/null +++ b/node_modules/lodash/isObjectLike.js @@ -0,0 +1,29 @@ +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +module.exports = isObjectLike; diff --git a/node_modules/lodash/isPlainObject.js b/node_modules/lodash/isPlainObject.js new file mode 100644 index 0000000..2387373 --- /dev/null +++ b/node_modules/lodash/isPlainObject.js @@ -0,0 +1,62 @@ +var baseGetTag = require('./_baseGetTag'), + getPrototype = require('./_getPrototype'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +module.exports = isPlainObject; diff --git a/node_modules/lodash/isRegExp.js b/node_modules/lodash/isRegExp.js new file mode 100644 index 0000000..76c9b6e --- /dev/null +++ b/node_modules/lodash/isRegExp.js @@ -0,0 +1,27 @@ +var baseIsRegExp = require('./_baseIsRegExp'), + baseUnary = require('./_baseUnary'), + nodeUtil = require('./_nodeUtil'); + +/* Node.js helper references. */ +var nodeIsRegExp = nodeUtil && nodeUtil.isRegExp; + +/** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ +var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + +module.exports = isRegExp; diff --git a/node_modules/lodash/isSafeInteger.js b/node_modules/lodash/isSafeInteger.js new file mode 100644 index 0000000..2a48526 --- /dev/null +++ b/node_modules/lodash/isSafeInteger.js @@ -0,0 +1,37 @@ +var isInteger = require('./isInteger'); + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ +function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; +} + +module.exports = isSafeInteger; diff --git a/node_modules/lodash/isSet.js b/node_modules/lodash/isSet.js new file mode 100644 index 0000000..ab88bdf --- /dev/null +++ b/node_modules/lodash/isSet.js @@ -0,0 +1,27 @@ +var baseIsSet = require('./_baseIsSet'), + baseUnary = require('./_baseUnary'), + nodeUtil = require('./_nodeUtil'); + +/* Node.js helper references. */ +var nodeIsSet = nodeUtil && nodeUtil.isSet; + +/** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ +var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + +module.exports = isSet; diff --git a/node_modules/lodash/isString.js b/node_modules/lodash/isString.js new file mode 100644 index 0000000..627eb9c --- /dev/null +++ b/node_modules/lodash/isString.js @@ -0,0 +1,30 @@ +var baseGetTag = require('./_baseGetTag'), + isArray = require('./isArray'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); +} + +module.exports = isString; diff --git a/node_modules/lodash/isSymbol.js b/node_modules/lodash/isSymbol.js new file mode 100644 index 0000000..dfb60b9 --- /dev/null +++ b/node_modules/lodash/isSymbol.js @@ -0,0 +1,29 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var symbolTag = '[object Symbol]'; + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); +} + +module.exports = isSymbol; diff --git a/node_modules/lodash/isTypedArray.js b/node_modules/lodash/isTypedArray.js new file mode 100644 index 0000000..da3f8dd --- /dev/null +++ b/node_modules/lodash/isTypedArray.js @@ -0,0 +1,27 @@ +var baseIsTypedArray = require('./_baseIsTypedArray'), + baseUnary = require('./_baseUnary'), + nodeUtil = require('./_nodeUtil'); + +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + +module.exports = isTypedArray; diff --git a/node_modules/lodash/isUndefined.js b/node_modules/lodash/isUndefined.js new file mode 100644 index 0000000..377d121 --- /dev/null +++ b/node_modules/lodash/isUndefined.js @@ -0,0 +1,22 @@ +/** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ +function isUndefined(value) { + return value === undefined; +} + +module.exports = isUndefined; diff --git a/node_modules/lodash/isWeakMap.js b/node_modules/lodash/isWeakMap.js new file mode 100644 index 0000000..8d36f66 --- /dev/null +++ b/node_modules/lodash/isWeakMap.js @@ -0,0 +1,28 @@ +var getTag = require('./_getTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var weakMapTag = '[object WeakMap]'; + +/** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ +function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; +} + +module.exports = isWeakMap; diff --git a/node_modules/lodash/isWeakSet.js b/node_modules/lodash/isWeakSet.js new file mode 100644 index 0000000..e628b26 --- /dev/null +++ b/node_modules/lodash/isWeakSet.js @@ -0,0 +1,28 @@ +var baseGetTag = require('./_baseGetTag'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var weakSetTag = '[object WeakSet]'; + +/** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ +function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; +} + +module.exports = isWeakSet; diff --git a/node_modules/lodash/iteratee.js b/node_modules/lodash/iteratee.js new file mode 100644 index 0000000..61b73a8 --- /dev/null +++ b/node_modules/lodash/iteratee.js @@ -0,0 +1,53 @@ +var baseClone = require('./_baseClone'), + baseIteratee = require('./_baseIteratee'); + +/** Used to compose bitmasks for cloning. */ +var CLONE_DEEP_FLAG = 1; + +/** + * Creates a function that invokes `func` with the arguments of the created + * function. If `func` is a property name, the created function returns the + * property value for a given element. If `func` is an array or object, the + * created function returns `true` for elements that contain the equivalent + * source properties, otherwise it returns `false`. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Util + * @param {*} [func=_.identity] The value to convert to a callback. + * @returns {Function} Returns the callback. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true })); + * // => [{ 'user': 'barney', 'age': 36, 'active': true }] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, _.iteratee(['user', 'fred'])); + * // => [{ 'user': 'fred', 'age': 40 }] + * + * // The `_.property` iteratee shorthand. + * _.map(users, _.iteratee('user')); + * // => ['barney', 'fred'] + * + * // Create custom iteratee shorthands. + * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) { + * return !_.isRegExp(func) ? iteratee(func) : function(string) { + * return func.test(string); + * }; + * }); + * + * _.filter(['abc', 'def'], /ef/); + * // => ['def'] + */ +function iteratee(func) { + return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG)); +} + +module.exports = iteratee; diff --git a/node_modules/lodash/join.js b/node_modules/lodash/join.js new file mode 100644 index 0000000..45de079 --- /dev/null +++ b/node_modules/lodash/join.js @@ -0,0 +1,26 @@ +/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeJoin = arrayProto.join; + +/** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ +function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); +} + +module.exports = join; diff --git a/node_modules/lodash/kebabCase.js b/node_modules/lodash/kebabCase.js new file mode 100644 index 0000000..8a52be6 --- /dev/null +++ b/node_modules/lodash/kebabCase.js @@ -0,0 +1,28 @@ +var createCompounder = require('./_createCompounder'); + +/** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ +var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); +}); + +module.exports = kebabCase; diff --git a/node_modules/lodash/keyBy.js b/node_modules/lodash/keyBy.js new file mode 100644 index 0000000..acc007a --- /dev/null +++ b/node_modules/lodash/keyBy.js @@ -0,0 +1,36 @@ +var baseAssignValue = require('./_baseAssignValue'), + createAggregator = require('./_createAggregator'); + +/** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ +var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); +}); + +module.exports = keyBy; diff --git a/node_modules/lodash/keys.js b/node_modules/lodash/keys.js new file mode 100644 index 0000000..d143c71 --- /dev/null +++ b/node_modules/lodash/keys.js @@ -0,0 +1,37 @@ +var arrayLikeKeys = require('./_arrayLikeKeys'), + baseKeys = require('./_baseKeys'), + isArrayLike = require('./isArrayLike'); + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); +} + +module.exports = keys; diff --git a/node_modules/lodash/keysIn.js b/node_modules/lodash/keysIn.js new file mode 100644 index 0000000..a62308f --- /dev/null +++ b/node_modules/lodash/keysIn.js @@ -0,0 +1,32 @@ +var arrayLikeKeys = require('./_arrayLikeKeys'), + baseKeysIn = require('./_baseKeysIn'), + isArrayLike = require('./isArrayLike'); + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); +} + +module.exports = keysIn; diff --git a/node_modules/lodash/lang.js b/node_modules/lodash/lang.js new file mode 100644 index 0000000..a396216 --- /dev/null +++ b/node_modules/lodash/lang.js @@ -0,0 +1,58 @@ +module.exports = { + 'castArray': require('./castArray'), + 'clone': require('./clone'), + 'cloneDeep': require('./cloneDeep'), + 'cloneDeepWith': require('./cloneDeepWith'), + 'cloneWith': require('./cloneWith'), + 'conformsTo': require('./conformsTo'), + 'eq': require('./eq'), + 'gt': require('./gt'), + 'gte': require('./gte'), + 'isArguments': require('./isArguments'), + 'isArray': require('./isArray'), + 'isArrayBuffer': require('./isArrayBuffer'), + 'isArrayLike': require('./isArrayLike'), + 'isArrayLikeObject': require('./isArrayLikeObject'), + 'isBoolean': require('./isBoolean'), + 'isBuffer': require('./isBuffer'), + 'isDate': require('./isDate'), + 'isElement': require('./isElement'), + 'isEmpty': require('./isEmpty'), + 'isEqual': require('./isEqual'), + 'isEqualWith': require('./isEqualWith'), + 'isError': require('./isError'), + 'isFinite': require('./isFinite'), + 'isFunction': require('./isFunction'), + 'isInteger': require('./isInteger'), + 'isLength': require('./isLength'), + 'isMap': require('./isMap'), + 'isMatch': require('./isMatch'), + 'isMatchWith': require('./isMatchWith'), + 'isNaN': require('./isNaN'), + 'isNative': require('./isNative'), + 'isNil': require('./isNil'), + 'isNull': require('./isNull'), + 'isNumber': require('./isNumber'), + 'isObject': require('./isObject'), + 'isObjectLike': require('./isObjectLike'), + 'isPlainObject': require('./isPlainObject'), + 'isRegExp': require('./isRegExp'), + 'isSafeInteger': require('./isSafeInteger'), + 'isSet': require('./isSet'), + 'isString': require('./isString'), + 'isSymbol': require('./isSymbol'), + 'isTypedArray': require('./isTypedArray'), + 'isUndefined': require('./isUndefined'), + 'isWeakMap': require('./isWeakMap'), + 'isWeakSet': require('./isWeakSet'), + 'lt': require('./lt'), + 'lte': require('./lte'), + 'toArray': require('./toArray'), + 'toFinite': require('./toFinite'), + 'toInteger': require('./toInteger'), + 'toLength': require('./toLength'), + 'toNumber': require('./toNumber'), + 'toPlainObject': require('./toPlainObject'), + 'toSafeInteger': require('./toSafeInteger'), + 'toString': require('./toString') +}; diff --git a/node_modules/lodash/last.js b/node_modules/lodash/last.js new file mode 100644 index 0000000..cad1eaf --- /dev/null +++ b/node_modules/lodash/last.js @@ -0,0 +1,20 @@ +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; +} + +module.exports = last; diff --git a/node_modules/lodash/lastIndexOf.js b/node_modules/lodash/lastIndexOf.js new file mode 100644 index 0000000..dabfb61 --- /dev/null +++ b/node_modules/lodash/lastIndexOf.js @@ -0,0 +1,46 @@ +var baseFindIndex = require('./_baseFindIndex'), + baseIsNaN = require('./_baseIsNaN'), + strictLastIndexOf = require('./_strictLastIndexOf'), + toInteger = require('./toInteger'); + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ +function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); +} + +module.exports = lastIndexOf; diff --git a/node_modules/lodash/lodash.js b/node_modules/lodash/lodash.js new file mode 100644 index 0000000..4131e93 --- /dev/null +++ b/node_modules/lodash/lodash.js @@ -0,0 +1,17209 @@ +/** + * @license + * Lodash + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.21'; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function', + INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + + /** Used to match leading whitespace. */ + var reTrimStart = /^\s+/; + + /** Used to match a single whitespace character. */ + var reWhitespace = /\s/; + + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + + /** + * Used to validate the `validate` option in `_.template` variable. + * + * Forbids characters which could potentially change the meaning of the function argument definition: + * - "()," (modification of function parameters) + * - "=" (default value) + * - "[]{}" (destructuring of function parameters) + * - "/" (beginning of a comment) + * - whitespace + */ + var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /*--------------------------------------------------------------------------*/ + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); + + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); + } + + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); + } + + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; + } + + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + + /** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ + function baseTrim(string) { + return string + ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') + : string; + } + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); + } + + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } + + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } + + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ + function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; + + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } + + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } + + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; + } + + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + } else if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + } + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + stack || (stack = new Stack); + if (isObject(srcValue)) { + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || isFunction(objValue)) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } + + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = arrayMap(iteratees, function(iteratee) { + if (isArray(iteratee)) { + return function(value) { + return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee); + } + } + return iteratee; + }); + } else { + iteratees = [identity]; + } + + var index = -1; + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } + + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } + + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + var low = 0, + high = array == null ? 0 : array.length; + if (high === 0) { + return 0; + } + + value = iteratee(value); + var valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } + + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); + } + + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } + + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; + + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } + + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; + } + + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } + + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } + + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision && nativeIsFinite(number)) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } + + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; + + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return new Ctor; + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return new Ctor; + + case symbolTag: + return cloneSymbol(object); + } + } + + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Gets the value at `key`, unless `key` is "__proto__" or "constructor". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + if (key === 'constructor' && typeof object[key] === 'function') { + return; + } + + if (key == '__proto__') { + return; + } + + return object[key]; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); + + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); + + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } + + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } + + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); + + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } + + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } + + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } + + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); + + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); + + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; + + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; + + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); + }); + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; + + return { 'done': done, 'value': value }; + } + + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } + + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); + + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } + }); + + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); + } + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + clearTimeout(timerId); + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } + + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } + + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); + + return func(value); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = baseTrim(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; + }); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; + }, constant(identity)); + + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); + + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); + + var index = -1, + length = path.length; + + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } + + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); + + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } + + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); + } + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); + + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); + + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': '